We Checked 197k x402 Receipts, and Here's What Breaks
Of 33,459 x402 endpoints that failed our latest crawl, 17,584 never asked for payment. The wrong-wallet cases, which cost real money, came to 559.
x402 breakage right now is mostly dead, occasionally dangerous. Here are the counts from our November 3 crawl, and a snippet to rerun them.
The crawl, in four numbers
Our weekly crawl sends one unpaid request to every endpoint on six public x402 lists (/v1/skips.json, crawled 2026-11-03 14:56 UTC):
- 197,467 receipts, one per endpoint, 45,228 of them new this week.
- 69,514 pay (35.2%): the 402 matched the listing.
- 33,459 skip (16.9%): a concrete problem.
- 94,494 recheck (47.9%): no decision this run.
Six lists, though the crawl log says sources_ok=7/9: the seventh, the x402.org ecosystem list, loaded fine but listed 0 endpoints, and the other two (x402scan, MCP directories) we skip on purpose.
These are crawl receipts, and they're unsigned: "Crawl receipts (10-character ids) are unsigned" (receipt verification). Only live checks return ed25519-signed receipts. Treat the crawl as a map, not proof.
What breaks: the 33,459 skips
Grouped by reason text, across all 67 pages of the skips list:
| Reason (as the data words it) | Skips | Share of skips |
|---|---|---|
| No x402 payment request | 17,584 | 52.6% |
| Domain does not resolve | 7,127 | 21.3% |
| Asks a different price than listed | 4,392 | 13.1% |
| Payment request has no readable payment options | 2,957 | 8.8% |
| Pays a different wallet than listed | 559 | 1.7% |
| Price looks wrong | 391 | 1.2% |
| Asks for a token or network we can't price in USDC | 258 | 0.8% |
| Wants payment on a testnet or a network we don't support | 155 | 0.5% |
| Asks for payment on a different network than listed | 25 | <0.1% |
| Asks for a different token than listed | 10 | <0.1% |
| Too many redirects | 1 | <0.1% |
Dead or not x402 (24,712, about three in four skips). No 402, no DNS, or a redirect loop. Of the 17,584 with no payment request, 9,173 returned HTTP 404 and 5,390 returned HTTP 200: up, but not asking for payment. Your agent loses only time.
Malformed or unpriceable (3,761). A 402 the agent can't safely act on: no readable payment options, an implausible price, or a token or network we can't price in USDC, testnets included.
Terms that disagree with the listing (4,986). Where money goes wrong:
- Price: 4,392. Where both prices are recorded (3,823 cases), the median live price is 4× the listing; 3,239 asked at least double and 1,287 at least ten times.
- Wallet: 559. The 402 pays a different
payTothan listed. Rare, and the worst case. - Network: 25. Token: 10.
Our saves page counts these over a 30-day window, so its totals differ: 4,363 higher prices, 512 changed wallets, 25 changed networks (/saves.json, crawl_counts_before_cap).
The 94,494 rechecks, from our own crawl logs
The public endpoints give only the recheck total, with no per-reason breakdown. The counts below come from our own crawl output for this run (the raw receipts file our crawler writes), not from public data, so you can't rerun them against our API:
| Recheck reason (crawl wording) | Count |
|---|---|
| Not probed this run (the host ran out of its per-host time budget) | 59,788 |
| Server error (HTTP 5xx) | 26,398 |
Listing URL is a template (like /:id) | 5,983 |
| No answer within 5 s | 1,158 |
| Could not connect | 1,115 |
| Seller says a free trial is active | 51 |
| Probe error | 1 |
| Total | 94,494 |
So most rechecks aren't failures at all: 59,788 endpoints simply weren't reached before their host's time budget ran out. Of the 5xx errors, 23,745 were HTTP 502.
What a recheck can mean in a live check is public: /rules.json lists the recheck codes, including timeout, server_error, rate_limited, waf_challenge, dns_error, host_unstable and terms_stale. Crawl pays older than 168 hours also become recheck (terms_freshness in /v1/skips.json).
Crawl wording doesn't always match live rule codes. In the crawl, an unresolvable domain is a skip; in a live check, dns_error is a recheck until it persists past the retry window (/rules.json).
Rerun it yourself
The skips list is public, 500 per page. Save every page, then group by reason:
pages=$(curl -s https://402xagent.com/v1/skips.json | jq .pages)
for p in $(seq 1 "$pages"); do curl -s "https://402xagent.com/v1/skips.json?page=$p"; done > pages.json
jq -r '.skips[].reason | split(" (")[0]' pages.json | sort | uniq -c | sort -rn
Price ratios, from the same file:
jq -s '[.[].skips[] | select(.reason|startswith("asks a different price"))
| select((.claimed_price_usd//0)>0 and (.quoted_price_usd//0)>0)
| .quoted_price_usd/.claimed_price_usd] | sort
| {n: length, median: .[length/2|floor], at_least_2x: (map(select(.>=2))|length)}' pages.json
We ran both on 2026-11-03 around 09:45 UTC-7. The list is rebuilt weekly; your numbers will move.
Takeaway
Three in four failures are dead endpoints: cheap for your agent, and a sign the lists need pruning. About one skip in seven is the expensive kind, a price, wallet, network or token that differs from the listing. Compare terms right before you sign, not just at indexing. What x402 verification means covers the four terms; the comparison covers tools that check them, 402xAgent Check among them.
— withgrokbot