One call checks any wallet on 37 chains and returns a yes or no, signed so anyone can verify it offline. Boolean, not balance: you never see what the wallet holds.
curl -X POST https://api.insumermodel.com/v1/attest \ -H "Content-Type: application/json" \ -H "X-API-Key: YOUR_API_KEY" \ -d '{ "wallet": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "conditions": [{ "type": "token_balance", "contractAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "chainId": 8453, "threshold": "1" }] }'
// Node 18+, save as app.mjs (ES module) const res = await fetch("https://api.insumermodel.com/v1/attest", { method: "POST", headers: { "Content-Type": "application/json", "X-API-Key": "YOUR_API_KEY" }, body: JSON.stringify({ wallet: "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", conditions: [{ type: "token_balance", chainId: 8453, threshold: "1", contractAddress: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" }] }) }); console.log((await res.json()).data.attestation.pass);
import requests res = requests.post("https://api.insumermodel.com/v1/attest", headers={"X-API-Key": "YOUR_API_KEY"}, json={"wallet": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "conditions": [{"type": "token_balance", "chainId": 8453, "threshold": "1", "contractAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}]}) print(res.json()["data"]["attestation"]["pass"])
{
"ok": true,
"data": {
"attestation": {
"id": "ATST-7F2A9E3B1C8D4056",
"pass": true,
"results": [{ "met": true, "conditionHash": "0x3f9c…", … }]
},
"sig": "Rujc69…", "kid": "insumer-attest-v2",
"pqSig": "Xk1…", "pqKid": "insumer-attest-pq1"
}
}
The work you would otherwise build and maintain for every chain yourself, plus a signed record others can trust long after the call. One call does it.
The wallet's state on any of 37 chains, with the block, slot or ledger it was read at. A read that does not complete is refused, never guessed.
Your conditions, up to ten per call, on any mix of chains. Every result carries the exact condition it was judged against.
A yes or no per condition, signed twice: ES256, which standard libraries check today, and ML-DSA-65, a post-quantum signature, for records that must outlast it. Anyone can check both against our public keys.
Good for access for up to 30 minutes. Good as evidence for as long as you hold it: checkable offline, years later, against a saved copy of our public keys. We cannot reproduce it later, so the signed result is your record.
Boolean, not balance. Your system asks “does this wallet hold at least 100 USDC?” and gets yes or no, never the amount.
Token gating is a subset. Condition-based access is the category. What wallet auth is →
POST /v1/attest1 creditCheck up to ten conditions across 37 chains: holdings, NFTs, attestations, account code (plain key, EIP-7702 delegation or contract), and agent standing (ERC-8004 registration, ERC-7710 delegation). A signed yes or no for each.
Conditions →POST /v1/trust3 creditsSend only an address. Get a signed fact profile: 155 checks across 27 chains in 10 dimensions (up to 176 across 29 in 14 with optional Solana, XRPL, Bitcoin and Tron wallets). Facts, not a score.
Trust profiles →The rest of the API is built on these two: discount codes and agent commerce formats (ACP, UCP) for platforms, keys and credits, and discovery. API reference →
Verification runs on your side against published keys. Nothing goes back to us for a verdict.
kid on each response.// ES module (e.g. verify.mjs). npm install insumer-verify @noble/post-quantum (the second package adds the post-quantum check) import { verifyAttestation } from "insumer-verify"; // pass the full API response const result = await verifyAttestation(response, { jwksUrl: "https://api.insumermodel.com/v1/jwks" }); console.log(result.valid); // true
# pip install "insumer-verify[pq]" from insumer_verify import verify_attestation # pass the full API response result = verify_attestation(response, jwks_url="https://api.insumermodel.com/v1/jwks") print(result["valid"]) # True
Your agent is about to pay a counterparty it has never met. Is this wallet registered as the agent it claims to be? Did a principal delegate this authority, and is that delegation still valid? What does the wallet hold right now?
Each is a single POST with no account and no key: send the request with no credentials, get a 402 quote, pay from five cents of USDC on Base, Polygon, Arbitrum, Arc or Solana, retry. x402 moves the money. InsumerAPI checks the conditions.
Your users hold assets across 37 chains. One call checks the condition, so you can unlock the feature, price the tier, or open the door, and you learn yes or no, never what is in the wallet.
A free key by email in two seconds, a card subscription, or prepaid credits in USDC.
Connect by URL. No install, no key. Ten tools on a shared daily allowance.
https://api.insumermodel.com/mcp
27 tools on your own key, or pay per call.
npx -y mcp-server-insumer
Six skills for coding agents that read the SKILL.md format.
npx skills add insumerapi/insumer-agent-skills
Check any result offline. Same checks, same test vectors, two languages.
npm install insumer-verify
A toolkit for Python agents.
pip install langchain-insumer
A tool spec and a plugin.
pip install llama-index-tools-insumer
Two IETF Internet-Drafts, work in the ERC, UCP and A2A communities, and a public spec with test vectors.
Standards work →
Secrets and AgentsWhy AI agents cannot hold secrets, and how the blockchain becomes the way they prove anything. By Douglas C. Borthwick.
10 verifications plus 100 requests a day. A key by email, no card.
Volume tiers down to $0.02. Card or USDC.
No key, no account. x402 in USDC on five networks.