Wallet auth API

Send a wallet and a condition.
Get a signed boolean.

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.

Just an email. No dashboard. No password. A working key in 2 seconds.
Save this key now. It is already in the code on the right: copy it and run it. Usage and top-ups at /developers/account/.
10 free verifications plus 100 requests a day. No credit card.
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"])
Response USDC on Base, at least 1
{
  "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"
  }
}
How it works

Read. Evaluate. Sign. Keep.

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.

01

Read

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.

02

Evaluate

Your conditions, up to ten per call, on any mix of chains. Every result carries the exact condition it was judged against.

03

Sign

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.

04

Keep

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.

Raw RPC response
balance: 18,392.33
vs
InsumerAPI response
met: true

Boolean, not balance. Your system asks “does this wallet hold at least 100 USDC?” and gets yes or no, never the amount.

No secrets to steal. No password, API key or shared secret from your users. The check reads on-chain state.
No identity to verify. No KYC, no email, no login. It asks what a wallet holds, not who owns it.
No credentials to rotate. The next check reflects the wallet as it is now. No revocation lists, no refresh.

Token gating is a subset. Condition-based access is the category. What wallet auth is →

The primitive

Two core endpoints. Signed output.

POST /v1/attest1 credit

Check 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 credits

Send 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 →

Verify it yourself

Every result checks out without us.

Verification runs on your side against published keys. Nothing goes back to us for a verdict.

  • Public keys at /.well-known/jwks.json, matched by the kid on each response.
  • A post-quantum signature (ML-DSA-65) beside every attestation and trust-profile signature, over the same bytes, with the key binding anchored on Base.
  • 27 published test vectors and the State Attestation Spec, so any verifier can be checked.
  • Optional Merkle proofs (EIP-1186) that tie a balance to the block itself.
// 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
Two kinds of caller

Humans build with a key. Agents pay per call.

You're building an agent

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.

You're building a product

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.

Works with your stack

Connect in one line. Or no lines.

Hosted MCP server

Connect by URL. No install, no key. Ten tools on a shared daily allowance.

https://api.insumermodel.com/mcp

MCP server

27 tools on your own key, or pay per call.

npx -y mcp-server-insumer

Agent skills

Six skills for coding agents that read the SKILL.md format.

npx skills add insumerapi/insumer-agent-skills

Verifier

Check any result offline. Same checks, same test vectors, two languages.

npm install insumer-verify

LangChain

A toolkit for Python agents.

pip install langchain-insumer

LlamaIndex and ElizaOS

A tool spec and a plugin.

pip install llama-index-tools-insumer

All SDKs, listings and the OpenAPI spec →

In production

Built on InsumerAPI.

Standards

Two IETF Internet-Drafts, work in the ERC, UCP and A2A communities, and a public spec with test vectors.

Standards work →
Secrets and Agents book cover Secrets and AgentsWhy AI agents cannot hold secrets, and how the blockchain becomes the way they prove anything. By Douglas C. Borthwick.
Pricing

Start free. Pay as you grow.

Free

$0

10 verifications plus 100 requests a day. A key by email, no card.

Prepaid credits

from $0.04/call

Volume tiers down to $0.02. Card or USDC.

Pay per call

from $0.05/call

No key, no account. x402 in USDC on five networks.