JSON over HTTP
API
Everything this site can do, as an endpoint. No key, no signup, and the same routes the interface itself calls.
Every endpoint below is live, unauthenticated, and the same one this site’s own pages call. Responses are JSON. RPC-backed routes return 429 with { error: "rate_limited" } when the upstream provider throttles, and an invalid chain returns 400.
Every route is rate limited per client, per route group, and answers 429 with Retry-After plus X-RateLimit-* headers when you go over. The per-minute budget is listed against each endpoint below. Limits are held per server instance, so treat them as a floor rather than a guarantee.
Verified source, ABIs and compilation metadata are not re-served here — those come from Sourcify, and /api/sourcify/{...path} proxies it unchanged for browser callers that need CORS.
Contracts
/api/chainsEvery network indexed here, with a tradeable flag set where a verified Uniswap deployment exists — the same test the swap uses to build its network picker.
→ { chains[], count, tradeableCount }
240/min
/api/selector/{selector}Resolve a 4-byte function selector, 32-byte event topic0 or custom error signature against every verified ABI this site has indexed.
→ { selector, results[], count }
240/min
/api/selectorsThe selector index itself, ordered by how often each has been seen.
- type
- function | event | error, default function
- limit
- max 200, default 50
→ { type, selectors[], count, total }
240/min
/api/standards/{standard}Contracts detected as implementing a standard, read from the selectors in their ABI rather than any self-declaration.
- standard
- erc-20 | erc-721 | erc-1155 | erc-4626 | erc-165
- limit
- max 200, default 100
→ { standard, contracts[], count }
240/min
/api/twins/{codehash}Every indexed deployment sharing this runtime bytecode hash. A twin with verified source is how source is recovered for a contract that was never verified.
→ { codehash, twins[], count }
240/min
/api/contract/{chainId}/{address}/runtimeRuntime bytecode straight from eth_getCode, with its size and keccak hash.
→ { isContract, bytecode, bytecodeSize, codeHash }
90/min
/api/contract/{chainId}/{address}/proxyRead the EIP-1967 implementation, admin and beacon slots and report which proxy pattern, if any, is in use.
→ { isProxy, proxyPattern, implementation, admin, beacon }
90/min
/api/contract/{chainId}/{address}/logsRecent logs, decoded against the contract ABI — and against the implementation ABI when the address is a proxy.
- limit
- number of logs to return
- expand
- true to include decoded argument values
→ { headBlock, scanned, logs[] }
90/min
/api/contract/{chainId}/{address}/bundleChain head, runtime bytecode, proxy resolution and decoded logs in one response. One round trip instead of four.
→ { head, runtime, proxy, logs }
90/min
/api/contract/{chainId}/{address}/analysisThe derived profile of a contract — what it is, what it can do, and how much trust it deserves — computed from the Sourcify ABI, proxy slots and admin code. Standards conformance with per-selector evidence, capabilities, ownership risk signals, a 0–100 risk score and a plain-language summary.
→ { verified, kind, standards[], capabilities[], riskSignals[], riskScore, riskLevel, summary, proxy }
90/min
/api/chain/{chainId}/headCurrent head block for a chain, as hex and as a number.
→ { chainId, headBlock, headBlockNumber }
90/min
Swap
/api/swap/quoteBest quote across every Uniswap v3 fee tier and v4 pool, with the execution plan needed to build the transaction client-side. Rate limited to 120/min; responses cached 8s.
- chainId
- number
- tokenIn / tokenOut
- addresses
- amountIn
- string of base units
- slippageBps
- 0–5000, default 50
- engine
- uniswap-v3 | uniswap-v4 | auto
→ { quote } or { errorCode, message }
120/min
/api/swap/tokensSearch the token index by name, symbol or address, or resolve one address to its metadata — reading the ERC-20 contract when no list carries it.
- chainId
- number
- q
- search text
- address
- resolve one token
- limit
- max 100, default 50
→ { tokens[], total } or { token }
120/min
/api/swap/transactionUnsigned transactions for a swap: the approval to send first if the current allowance is short, then the swap itself. Nothing is signed or broadcast here and no key is accepted — the caller’s wallet approves and sends. The quote is recomputed server-side rather than accepted from the request, because a quote carries the execution plan the calldata is built from.
- chainId
- number
- account
- address that will send the transaction
- tokenIn / tokenOut
- addresses
- amountIn
- string of base units
- slippageBps
- 0–5000, default 50
- engine
- uniswap-v3 | uniswap-v4 | auto
→ { quote, approval, transaction, notes[] }
60/min
/api/swap/pricesBatched USD prices for up to 100 addresses on a chain. Display only.
- chainId
- number
- addresses
- string[]
→ { prices: { [address]: number } }
120/min
ChainTools indexes selectors and bytecode as contracts are looked up, so coverage reflects what has been inspected rather than a full chain scan.
