The 400 you didn't pay for
2026-08-28. In wave 5 of our paid census, 99 endpoints answered a real, authorized USDC payment with HTTP 400. We first reported that as “sellers settle the payment and reject the request — money gone, no recourse.” Then we audited our own claim, twice, and both halves fell. This page is the corrected anatomy of the most common paid-call failure class on the network — and it is much better news than what we first published.
First finding: the contract was published all along
We made one unpaid request to every active listing and kept the entire
402 challenge instead of extracting a price from it. 97 of the 99
rejected purchases had declared their required parameters, machine-readably,
inside the very challenge we paid against — 87 with fields marked
required, 10 in a declared shape without the marker. Only 2
declared nothing. Our buyer read the price out of the challenge and nothing
else, then paid against a contract it never looked at.
This is not one seller's habit; it is the network's norm. Across all
1,675 active listings: 82% (1,366) carry the
extensions.bazaar block in-band (challenge body and/or the
v2 payment-required header); 463 declare a genuine field-level
response-body schema; 934 declare their parameters in some
machine-readable shape; 36 hosts additionally serve schemas at
/.well-known/x402. Getting these numbers right cost us two
same-day corrections — our first derivation undercounted because our
own collector truncated 27% of the challenges — and both corpora are
retained. Dated entries on /methodology.
Second finding: the money mostly never moved
“Paid” in our verdict names recorded that a signed payment authorization was attached to the request. Our scout's error path never consulted the chain to see whether the seller actually settled it. So we audited retroactively against Base, and validated the instrument in both directions first: the query finds all six known delivered settlements at the same addresses and windows, so its zeros are real absences.
96 of the 99 rejected calls never settled. They cost nothing. Three are chain-confirmed settled-then-rejected: $0.0045 in total. The same audit across our first census (405 rejected paid attempts, 164 listings, 2026-08-16–21): 241 rows chain-proven unsettled at addresses that passed a positive control; 124 remain unknown (no control transaction at the current address — reported as unknown, not folded into either side); at most 34 rows, ≤$0.452, may have genuinely settled — an upper bound that also absorbs settlements from delivered calls whose proof was missing at attempt time. A single operator accounts for 21 of those 34 ceiling rows.
The conclusion we did not expect: on a rejected request, most x402 sellers decline the money. Conditional settlement — debated in the ecosystem as a future protocol feature — is already, in large part, how deployed sellers behave. The real capital loss to this failure class, project-wide, is tenths of a cent plus a bounded residue.
Who fixes what
Buyers: read the contract before paying. Our scout now refuses to
pay when a challenge declares required parameters the call omits
(declared_params_unmet, shipped 2026-08-27) — one unpaid
request, decode the challenge, check the declared inputs, refuse on a
mismatch. Paddock's verify_before_pay is the same rule as a
product, and they have taken our pinned list of the 99 to run their
pre-payment check against; the disagreements will be the interesting rows.
Sellers: let a bare probe reach the challenge. The cleanest fix we
watched happen: anchor-x402's param-validation guard was firing on unpaid
requests, so a bare GET got a 400 instead of the 402 challenge and 12
listings sat failing here. Reported 2026-08-26; fixed at the
source within a day — the guard now runs only when a payment is
attached, so discovery works and no one is charged for a call that cannot
succeed. The operator's own words: a prober reading a wrong response as
broken “is the correct read of a wrong response.”
Protocol: conditional settlement for the residue. For the small set that does settle before validating, moving on-chain settlement after the handler's 200 makes a malformed call cost the buyer nothing. The working group is discussing exactly this; our numbers say the residue is real but small, and the larger win is buyers using the pre-flight that 82% of the network already publishes.
The operators, by the record
We name the concentrations because the record clears more than it
accuses. x402.ottoai.services (30 of the 99): every route declared
its parameters, and none of the 30 settled — the seller took nothing
for calls it rejected. vibesprings.net (11): all 11 declared
required parameters we failed to send; none settled; the operator was told
the same day and the fault-share is ours. 2s.io (10) and
api.onesource.io (5): parameters declared (onesource's typed with
enums and defaults, without a required marker — which is
what first fooled our extractor); no settlements found. The three
chain-confirmed settled-then-rejected calls belong to two hosts and total
less than half a cent.
What this does not establish
Declaration status was measured 2026-08-27, one day after the wave; middleware does not usually grow schemas overnight, but the day matters and is stated. Where several endpoints share one payment address, per-call settlement attribution is impossible from the chain; our verdicts are per-address with positive controls, and every group without a control is reported unknown. The 34-row ceiling is an upper bound, not a count. And none of this measures response quality — delivery and settlement, not truth.
Data & replication
The pinned list of the 99 — one row per endpoint with declared inputs, the seller's error body, and settlement status — is at wave5-endpoints.json, CC-BY-4.0, byte-identical to the copy shared in the x402 working group. Machine-readable twin of this report: JSON. Method and the full correction trail: /methodology; census data: the first report. This page was wrong twice before it was right; the trail is the point.
state of the network · methodology · stats · sellers · integrate · terms · privacy