AgentIndex · methodology
How we measure the agent economy
Every number on this site comes from something we independently measured or verified on-chain. This page documents each signal, where it comes from, and what it cannot tell you. All figures are recomputable from /data.json.
Provenance labels
Every field in our API carries one of four provenance labels:
We ran a live protocol probe and recorded the response. MCP handshakes, A2A card fetches, x402 challenges, and liveness history are all measured.
Read directly from a public blockchain via eth_getLogs or ownerOf(). USDC payment counts, ERC-8004 registrations, and wallet ownership are all on-chain facts — not publisher claims.
The same endpoint appears in 2+ independent registries we crawl separately (MCP Registry, Coinbase x402 Bazaar, Glama, ERC-8004, Virtuals ACP, Olas, etc). Self-listings excluded.
The publisher wrote this field themselves. We record it faithfully but never let it drive a score or a ✓ badge. Labelled to be honest about what we cannot independently verify.
On-chain verification
We scan Base mainnet USDC eth_getLogs nightly with a trailing 7-day window. Every Transfer event whose to address matches a listed x402 endpoint counts as an agent payment. Caveats:
- Window is 7 days — not cumulative. The number resets each week.
- 96% of current volume is one sender → one service (blockrun.ai). We publish distinct-payer counts alongside totals to make concentration visible.
- We match transfers by
payToaddress in the x402 Bazaar, not by inferring intent. A USDC transfer to the same address is counted even if unrelated.
Protocol detection
We run nightly probe campaigns against every indexed domain:
- MCP: JSON-RPC
initializehandshake. Confirmed = validprotocolVersion+serverInfoin the response. We then calltools/listusing the returnedmcp-session-id. - A2A:
GET /.well-known/agent.jsonreturning a parseable agent card with at least oneskill. - x402: Unauthenticated HTTP call returns 402 with a spec-valid
accepts[]body. We also compare live terms against the Bazaar’s cached price — 21% of live x402 endpoints disagree with their listed price. - ERC-8004: On-chain enumeration of the IdentityRegistry at
0x8004A169FB4a3325136EB29fA0ceB6D2e539a432on Base, Ethereum, and Arbitrum. - Virtuals ACP, Olas, Masumi: Native chain/API enumeration.
We honour robots.txt. 1,247 domains are counted in the index but unprobed because they disallow our crawler.
Liveness history
We append a row to endpoint_probes after every nightly probe pass. Uptime percentage = confirmed probes / total probes in the trailing 90 probes. This is the one figure a directory that only reads publisher claims cannot produce — it requires completing a handshake repeatedly over time.
Classification
Resource categories are assigned by a keyword/heuristic classifier (src/classify.js) running nightly. Current coverage: ~47% of resource listings carry a DCAT category. Sibling inheritance (3+ classified siblings → inherit the dominant category) covers a further 8%. The remaining 45% are unclassified — we do not guess.
Numbers we will not publish
A shorter list than it should be:
- Cumulative payment totals — we only see 7 days. Presenting a rolling window as a running total is what the old code did; this page exists in part because we fixed that.
- Ecosystem "growth" claims — our index is growing because we are adding crawl sources, not necessarily because the ecosystem is. We show raw counts and let you draw your own conclusion from the trend data.
- Scores from publisher self-reports — our 100-point trust score uses only measured signals (liveness, on-chain, corroboration, protocol richness). Self-declared fields contribute 0 points.
Data freshness
The crawler runs nightly at 03:30 UTC. Each page shows an "Updated" timestamp from the most recent snapshot. Machine-readable data: /data.json.
Questions about methodology? Open an issue or read the source at github.com/cengit1/agent-index.