Etherscan API V2
Overview
Use this skill to fetch onchain data from Etherscan-compatible explorers using the unified V2 API.
Core model:
- One base URL:
https://api.etherscan.io/v2/api - One API key
- Switch chains via
chainid
Explorer URLs relevant to this workspace:
- Ethereum mainnet:
https://etherscan.io/ - Ethereum hoodi:
https://hoodi.etherscan.io/ - Taiko mainnet:
https://taikoscan.io/ - Taiko hoodi:
https://hoodi.taikoscan.io/
Read first:
references/network-map.mdreferences/endpoint-cheatsheet.mdreferences/rate-limits.mdreferences/explorer-url-patterns.md
Required Inputs
Collect these before querying:
ETHERSCAN_API_KEY- Target
chainid - Address / tx hash / block range
- Endpoint intent (activity, logs, source, ABI, status)
Deterministic Workflow
- Pick
chainidfromreferences/network-map.md. - Choose endpoint by intent from
references/endpoint-cheatsheet.md. - Build request on
https://api.etherscan.io/v2/apiwith required params. - Parse
status,message,result. - If contract endpoint returns proxy metadata (
Proxy == "1"), followImplementation. - For large history, paginate (
page,offset) and/or narrow block ranges.
Method Selection
| Goal | Module / Action |
|---|---|
| Address normal tx history | account / txlist |
| Address internal tx history | account / txlistinternal |
| ERC20 transfer history | account / tokentx |
| Event logs | logs / getLogs |
| Contract ABI | contract / getabi |
| Contract source + proxy fields | contract / getsourcecode |
| Contract deployer + creation tx | contract / getcontractcreation |
| Tx execution status | transaction / getstatus |
| Tx receipt status | transaction / gettxreceiptstatus |
Quick Commands
Set key once:
export ETHERSCAN_API_KEY="<your_key>"
Get ABI (Taiko mainnet example):
curl -s "https://api.etherscan.io/v2/api?chainid=167000&module=contract&action=getabi&address=<contract>&apikey=$ETHERSCAN_API_KEY"
Get source + proxy metadata (Taiko hoodi example):
curl -s "https://api.etherscan.io/v2/api?chainid=167013&module=contract&action=getsourcecode&address=<contract>&apikey=$ETHERSCAN_API_KEY"
Get address activity in block window:
curl -s "https://api.etherscan.io/v2/api?chainid=1&module=account&action=txlist&address=<address>&startblock=<from>&endblock=<to>&page=1&offset=100&sort=desc&apikey=$ETHERSCAN_API_KEY"
Get logs for a contract in block window:
curl -s "https://api.etherscan.io/v2/api?chainid=560048&module=logs&action=getLogs&address=<contract>&fromBlock=<from>&toBlock=<to>&page=1&offset=1000&apikey=$ETHERSCAN_API_KEY"
Proxy-Aware Contract Handling
When getsourcecode returns:
Proxy: "1"- non-empty
Implementation
then:
- Keep runtime call target as proxy address.
- Fetch ABI/source from implementation address.
- Decode selectors against implementation ABI.
- Re-check implementation before privileged write analysis.
Safety Rails
Never skip these checks:
- Always set correct
chainid; wrong chain silently yields wrong context. - Respect plan limits and add client-side throttling/retries.
- Treat
status: "0"as non-success even with HTTP 200. - For analytics windows, lock
startblock/endblockexplicitly. - For logs, remember
offsetmax is 1000 per query and paginate. - Keep retries idempotent and resume scans from stored cursors/block checkpoints.
Expected Output
Return:
- exact URL/query used (without exposing secret key)
- chain (
chainid+ explorer) - endpoint (
module/action) - parsed status/result summary
- proxy follow-up decisions (
Proxy,Implementation) when contract-related