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

GET/api/chains

Every 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

GET/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

GET/api/selectors

The 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

GET/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

GET/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

GET/api/contract/{chainId}/{address}/runtime

Runtime bytecode straight from eth_getCode, with its size and keccak hash.

→ { isContract, bytecode, bytecodeSize, codeHash }

90/min

GET/api/contract/{chainId}/{address}/proxy

Read 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

GET/api/contract/{chainId}/{address}/logs

Recent 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

GET/api/contract/{chainId}/{address}/bundle

Chain head, runtime bytecode, proxy resolution and decoded logs in one response. One round trip instead of four.

→ { head, runtime, proxy, logs }

90/min

GET/api/contract/{chainId}/{address}/analysis

The 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

GET/api/chain/{chainId}/head

Current head block for a chain, as hex and as a number.

→ { chainId, headBlock, headBlockNumber }

90/min

Swap

POST/api/swap/quote

Best 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

GET/api/swap/tokens

Search 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

POST/api/swap/transaction

Unsigned 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

POST/api/swap/prices

Batched 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.