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
Token balances, staking, governance power, NFT traits, DeFi positions · if it's onchain, it's a gate. You write the condition, evmquery returns true or false.
token.balanceOf(wallet) >= parseUnits("1000000", 6)Works over REST and MCP · Discord, your app, your backend
Most gating tools ship a fixed menu: holds token X, owns NFT Y. The moment your condition isn't on that list, you're stuck writing custom code.
Holds token X or owns NFT Y and nothing past that. Staking duration, LP positions, vesting schedules, voting power. None of it is on the menu.
A new contract means new setup. Proxies and custom ABIs silently break the check, and you find out when a real member gets locked out.
The gate lives inside someone's bot and role model. Your Discord rule can't guard your app, your airdrop, or your API.
“Staked more than 30 days” or “health factor above 1.5” forces you to write and host your own contract-reading backend.
Write the condition once and get true or false back, across any verified contract on Ethereum, Base, or BNB Smart Chain.
Balances, allowances, staking, governance power, NFT traits, DeFi health. If it's onchain, it's a gate.
AND, OR, thresholds, filters. Compose the exact rule you need in one expression, not a chain of integrations.
Paste an address. Proxies resolve automatically. No RPC keys, no per-token setup.
Even a gate reading several contracts resolves in a single Multicall3 round trip.
Returns a boolean over REST or MCP, so you guard a Discord role, an app route, an airdrop claim, or a waitlist and evmquery just decides.
curl -X POST https://api.evmquery.com/api/v1/query \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"chain": "evm_ethereum",
"schema": {
"contracts": { "token": { "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" } },
"context": { "wallet": "sol_address" }
},
"context": { "wallet": "0x40ec5B33f54e0E8A33A975908C5BA1c14e5BbbDf" },
"expression": "token.balanceOf(wallet) >= parseUnits(\"1000000\", 6)"
}'
# { "result": { "value": true, "type": "bool" } }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.
The free tier is fully self-serve. When the condition gets gnarly or you would rather not own the integration, we help you build it and wire it in.
Build and test gating conditions in a purpose-built expression editor, so you are not writing the rule blind.
We scope the gate with you and help wire it into your surface, instead of leaving the hard parts to self-serve.
A direct line for teams running gates in production, not just docs and a contact form.
Anything readable from a verified contract: token balances, staking positions, governance votes, NFT traits, DeFi health factors, LP positions. Write the condition as an expression and evmquery evaluates it.
Any surface you control. evmquery returns a plain boolean over REST or MCP, so you wire it into a Discord bot, your app's middleware, an airdrop claim flow, or a waitlist. You bring the surface.
No. A balance check is one expression among many. Combine multiple reads with AND and OR, add thresholds, or gate on something that has nothing to do with balances, like a vote or a health factor.
Paste the address. Proxies resolve automatically, so there's no ABI hunting or per-token onboarding before the gate works.
Ethereum, Base, and BNB Smart Chain today. If a contract is verified on one of these, it can be a gate condition.
Yes. Even a gate that reads several contracts resolves in a single batched Multicall3 round trip, so you can evaluate it on every request without stitching together multiple calls.
Free tier included. No credit card. Write your condition, get true or false.