Your agent only sees tools that work.

Every tool in the catalog has been tested with a real call. The ones that fail are hidden from discovery, not listed with a warning. One balance for all of them, and we add nothing to what a call costs.

npx groats@latest register

Paste that into Claude Code, Cursor or Codex. Your agent registers itself. You are never asked to copy a key.

Two moments, and only one of them is yours

  1. 0s You paste one line your agent

    npx groats@latest register

  2. ~10s Your agent has a key and is reading the catalog your agent

    No browser. Nothing pasted. It can search and inspect all 106 callable tools straight away, and it never sees the 16 we quarantined.

  3. when it first needs to spend It asks you to claim the account you

    One sign-in with Google or GitHub, about twenty seconds. That releases the $1 free credit.

  4. next call The call goes through your agent

    And the answer says what the provider returned, what we judged it to be, and whether your balance moved.

Why the filter exists

16 of 122
tools we paid to call took the money and returned nothing usable
MEASURED 2026-09-22 (#101): 133 paid Calls, $1.274702 of real USDC, each one matched to its transfer on Base. Evidence in docs/research/data/absorbed-cost-101-calls.json; judged by src/campaign/judged-outcome.ts, the one rule the census and the receipts read too.
8 of 16
of those are the listing's own declared parameters, not a broken service
MEASURED: read off each Provider's own response body. Every one of them answers a healthy 402, so liveness probing cannot see it.
10.00%
is what the incumbent adds to every call
CITED (#88), from the incumbent's own published FAQ: "10% on top of the underlying provider price", checked against the provider's own live x402 price.
0%
added to what a call costs
DECIDED (#12): Price equals Provider Cost exactly. Our revenue sits on the Top-up, never the Call.

We found that by paying for the calls ourselves: $0.0770 of the bill was for calls that returned nothing, and none of it was billed to anyone. 637 of 695 endpoints answer a healthy 402, which is all a liveness check can see — which is why a liveness check is not a test. Every figure on this site names how it was measured, and the method is published.

The part nobody else shows you

your agent can call these
106 of the 122 tools we paid to call
pro-api.coingecko.com/api/v3/x402/onchain/search/pools
healthy · 1 paid call, 0 failed · $0.0100

48 tools from this host are in the catalog.

x402.ottoai.services/fx-rates
healthy · 1 paid call, 0 failed · $0.0010

9 tools from this host are in the catalog.

api.nansen.ai/api/v1/tgm/who-bought-sold
healthy · 1 paid call, 0 failed · $0.0100

7 tools from this host are in the catalog.

agent402.tools/api/perp-funding
healthy · 1 paid call, 0 failed · $0.0020

3 tools from this host are in the catalog.

agents.allium.so/api/v1/developer/tokens
healthy · 1 paid call, 0 failed · $0.0300

3 tools from this host are in the catalog.

your agent never sees these
16 hidden, every one with its reason published
agent-proxy.alchemy.com/v1/x402/86b0ec6d1d0b3dc0/swap-al…
quarantined · 1 of 1 paid call failed · HTTP 400

The listing's own declared parameters are refused by the service. It returned: The input is invalid

api.loyalspark.online/x402-gateway/balance
quarantined · 1 of 1 paid call failed · HTTP 401

The listing needs a credential a discovery buyer cannot obtain. It returned: Missing or invalid API key. Use x-api-key header with your lsk_ key.

api.loyalspark.online/x402-gateway/merchant-profile
quarantined · 1 of 1 paid call failed · HTTP 401

The listing needs a credential a discovery buyer cannot obtain. It returned: Missing or invalid API key. Use x-api-key header with your lsk_ key.

api.loyalspark.online/x402-gateway/programs
quarantined · 1 of 1 paid call failed · HTTP 401

The listing needs a credential a discovery buyer cannot obtain. It returned: Missing or invalid API key. Use x-api-key header with your lsk_ key.

api.loyalspark.online/x402-gateway/recipient-api/balan…
quarantined · 1 of 1 paid call failed · HTTP 401

The listing needs a credential a discovery buyer cannot obtain. It returned: Missing or invalid API key. Use x-api-key with your rwk_ key (register via POST /recipient-api/register).

api.loyalspark.online/x402-gateway/recipient-api/redee…
quarantined · 1 of 1 paid call failed · HTTP 401

The listing needs a credential a discovery buyer cannot obtain. It returned: Missing or invalid API key. Use x-api-key with your rwk_ key (register via POST /recipient-api/register).

api.loyalspark.online/x402-gateway/recipient-api/rewar…
quarantined · 1 of 1 paid call failed · HTTP 401

The listing needs a credential a discovery buyer cannot obtain. It returned: Missing or invalid API key. Use x-api-key with your rwk_ key (register via POST /recipient-api/register).

api.loyalspark.online/x402-gateway/vouchers
quarantined · 1 of 1 paid call failed · HTTP 401

The listing needs a credential a discovery buyer cannot obtain. It returned: Missing or invalid API key. Use x-api-key header with your lsk_ key.

api.nansen.ai/api/v1/prediction-market/ohlcv
quarantined · 1 of 1 paid call failed · HTTP 422

The listing's own declared parameters are refused by the service. It returned: Required field 'body' is missing

api.nansen.ai/api/v1/tgm/position-intelligence
quarantined · 1 of 1 paid call failed · HTTP 422

The listing's own declared parameters are refused by the service. It returned: Required field 'body' is missing

api.x402node.dev/forex/convert/usd/cny/usd-cny
quarantined · 1 of 1 paid call failed · HTTP 200

The listing's own declared parameters are refused by the service. It returned: missing or invalid 'amount' query param, e.g. ?amount=100

vaaya.ai/api/run/firecrawl/scrape
quarantined · 1 of 1 paid call failed · HTTP 400

The listing's own declared parameters are refused by the service. It returned: upstream 400: {"success":false,"code":"BAD_REQUEST","error":"Bad Request","details":[{"code":"invalid_value","values":["markdown","html","rawHtml","rawBase64","

x402.ottoai.services/portfolio
quarantined · 1 of 1 paid call failed · HTTP 400

The listing's own declared parameters are refused by the service. It returned: userId parameter is required (wallet address)

x402.ottoai.services/token-price
quarantined · 1 of 1 paid call failed · HTTP 400

The listing's own declared parameters are refused by the service. It returned: missing-param

x402.ottoai.services/token-security
quarantined · 1 of 1 paid call failed · HTTP 400

The listing's own declared parameters are refused by the service. It returned: Address parameter is required

x402.tavily.com/search
quarantined · 1 of 1 paid call failed · HTTP 422

The provider refused the request it published. It returned: Request failed with status code 400

Hidden from discovery, never deleted, and retested at our expense — the moment a retest succeeds, the tool is restored. Each quarantined tool shows the status and the words the provider itself returned for the call we paid for. Every tool on either side was reached with a real paid call in the run of 2026-09-22; that run is one snapshot, so a tool that failed its call here is held out of discovery and kept under retest rather than judged for all time. Tool Health is read from the running record of a tool's calls, never fixed by a single one.

A separate 16 of those paid calls came back correct but empty, and not one of them counted against a tool. A tool that truthfully answers "none" is working, and we say so here rather than on a page nobody opens.

A third list you will not find here: 11 tools we paid to test and then did not list, because the provider's terms have no stated path. We would rather the catalog be smaller than carry a listing the provider never sanctioned, so neither column names one.

MEASURED 2026-09-22 (#101): 133 paid Calls, $1.274702 of real USDC, each one matched to its transfer on Base. Evidence in docs/research/data/absorbed-cost-101-calls.json; judged by src/campaign/judged-outcome.ts, the one rule the census and the receipts read too.

What this costs

On a call

$0.00

You pay what the provider charges, to the cent. We add nothing to a call. A call we judge a failure never touches your balance.

On a top-up

5% + $0.30

Added on top, never taken out. Ask for $10.00, pay $10.80, spend $10.00. Minimum top-up is $5.00.

That works out at 11.0% at the $5.00 minimum and 8.0% at the $10.00 the form starts at, falling toward 5% as you top up more without ever reaching a flat 5%.

See the full arithmetic, including our own fee →