One round trip, every time
Independent contracts, different protocols. Every read in an expression is batched into a single Multicall3 call per chain.
1 request4 reads1 round trip
One HTTP call returns typed, decoded contract state from Ethereum, Base, BNB Chain, and Polygon. No SDK, no RPC key management, no proxy detection to write yourself.
cel.bind(d, token.decimals(), {
"name": token.name(),
"symbol": token.symbol(),
"decimals": string(formatUnits(d, 0)),
"totalSupply": string(formatUnits(token.totalSupply(), d))
})Free tier: 60 units/min, no credit card
Every EVM read you write by hand repeats the same four problems.
You copy an ABI from Etherscan, or generate one from a verified source, just to call one method.
The contract is a proxy. Your ABI is for the implementation. eth_call on the wrong address returns 0x, not an error.
Ten reads means ten calls, unless you wire up Multicall3 yourself and manage its return-decoding by hand.
eth_call hands back raw hex. You decode it against the ABI, cast the ints, and scale the decimals yourself, for every field.
Point at an address and an expression. evmquery resolves the ABI, unwinds EIP-1967/UUPS/Beacon/Diamond proxies, and batches every read into one Multicall3 round trip per chain.
evmquery resolves the implementation ABI automatically from the verified source.
EIP-1967, UUPS, Beacon, and Diamond proxies are unwound before the call executes.
Multicall3 batches every read in an expression into a single call per chain.
Same query engine, three surfaces — call it from your backend, your coding assistant, or a no-code workflow.
curl -s -X POST https://api.evmquery.com/api/v1/query \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"chain": "evm_ethereum",
"schema": { "contracts": { "usdc": { "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" } } },
"expression": "formatUnits(usdc.balanceOf(\"0x...\"), usdc.decimals())"
}'Read any EVM contract without wiring providers, ABIs, or decoders by hand.
Independent contracts, different protocols. Every read in an expression is batched into a single Multicall3 call per chain.
1 request4 reads1 round trip
Read state by address. No ABI files, ever.
BigInt, address, struct: decoded and ready.
{ "value": "37192124", "type": "sol_int" }
EIP-1967, transparent, beacon: resolved automatically.
resolved via EIP-1967 slot
The same expression language on every surface. Learn it once, query from anywhere.
No, but you can keep them for writes and signing. evmquery only replaces the read path: ABI resolution, proxy unwinding, and batching.
Every query is a documented REST call with a plain JSON response. There's no proprietary SDK lock-in on the response shape, so migrating back to viem or ethers is a matter of re-implementing the same calls, not unwinding a custom format.
Ethereum, Base, BNB Smart Chain, and Polygon today, with more chains on the roadmap.
Blockscout and Bitquery are indexed data layers: they've already crawled the chain, so they're strongest at explorer-style lookups and DEX/wallet analytics. evmquery is a contract-logic query layer: you point it at any verified contract, including ones nobody has indexed yet, and it resolves the ABI, unwinds proxies, and batches the calls into one typed response server-side. Reach for evmquery when the read is a specific contract's own state; an indexer is the better fit for broad wallet or trade history.
Free tier: 60 units/min, no credit card.