Two endpoints, one price, no account
Sato Hub now sells two datasets over [x402](https://github.com/coinbase/x402/blob/main/specs/x402-specification-v2.md), and both are listed on [x402scan](https://www.x402scan.com/server/674a1df0-411c-46e1-b26a-80319f03decf):
- ▸`GET /api/x402/history/{slug}` — the daily Sato Score record for one listing: the score, its six components, GitHub stars, status and verification state per day, with the dates the score moved and whether each move was the project or a revision of our own method.
- ▸`GET /api/x402/agent-economy` — the weekly agent-economy series: one row per venue, chain, stage and week, from public chain reads. Rows are never summed across venues, chains or stages, and
nullmeans unknown, never zero.
Each call costs $0.005 in USDC on Base mainnet. There is no account, no API key and no signup. An agent asks, gets an HTTP 402 Payment Required with the price and the payee, signs a USDC authorization, and asks again.
``sh
curl -i https://satohub.ai/api/x402/history/coinbase-agentkit
# HTTP/2 402 — PAYMENT-REQUIRED names eip155:8453, USDC, $0.005
``
What stays free
Everything that was free is still free: the MCP server at https://satohub.ai/api/mcp, the catalog export at /api/export/index.json, the current week of agent-economy counts at /api/export/adoption.json, and one listing's daily score line on its /verify/<slug>/history page. What is sold is the per-day record behind that line and the weekly series — the parts that cannot be reconstructed after the fact.
A Sato Score measures how open, active and verifiable a project is. It is not a safety, quality or returns grade, and buying its history does not change that.
Three things that kept us out of x402 catalogues
Getting listed took three fixes. Each one failed quietly, so they are worth writing down for anyone selling over x402:
1. The Bazaar declaration was never sent. Our 402 went out with an empty extensions object, so a facilitator had nothing to catalogue. Discovery needs the Bazaar extension registered on the server and a declaration passed with each 402 ([Bazaar docs](https://github.com/coinbase/x402/blob/main/docs/extensions/bazaar.mdx)).
2. The description was too long. Coinbase's hosted facilitator rejects a payment whose resource.description runs past 500 characters, and reports it as a schema mismatch rather than a length limit ([x402-foundation/x402#2832](https://github.com/x402-foundation/x402/issues/2832)). Ours were 719 and 617. The payment now carries a short summary; the long text stays in the 402 body.
3. x402scan reads OpenAPI, not the well-known file. Its discovery reads /openapi.json at the origin root and expects an x-payment-info block and a 402 response on each paid operation ([discovery spec](https://www.x402scan.com/discovery/spec)). Its parser also stopped on our absolute-URL $refs, so the root copy of our [OpenAPI document](https://satohub.ai/openapi.json) inlines them.
Before we went to mainnet, one payment settled end to end on Base Sepolia through the same code path, and the transfer landed on-chain.
Try it
Point any x402 client at either URL above. For Coinbase's agentic wallet, that is npx awal x402 pay https://satohub.ai/api/x402/agent-economy. If you only want to look, the free MCP server answers the same questions about the index at no cost.
