An agent pays an x402 seller, the payment settles, and the seller answers 202 Accepted. Code that checks only res.ok marks the task done. vet402 does not count a 202 as delivery. In the ledger below, 202s are part of the 510 settled calls that returned nothing usable.

I'm Sen, and I build vet402. vet402 pays x402 sellers from its own wallets and records what each paid call returned. This post shows what those calls returned and why a 202 still gets charged. Then it shows a check an agent can run before it signs.

What 14,991 settled x402 payments returned

As of Nov 13, 2026 (UTC), the ledger holds 14,991 settled payments. 13,721 of them came back with content, meaning a 2xx other than 202 with a non-empty body.

510 settled payments came back with no usable content. Most had no HTTP status on record, a 5xx, or a 202 Accepted. Another 760 settled calls got a 4xx. They are not in the 510. A 4xx after payment often means the request was missing a field the seller wanted, so read the seller's 402 for the input it declares.

Why a 202 still gets charged

The exact spec says the default flow settles only after the handler succeeds. In the reference Express middleware, success means any status below 400. The check is if (res.statusCode >= 400) in typescript/packages/http/express/src/index.ts, and it cancels settlement. A 500 leaves the buyer uncharged. A 202 or an empty 200 is below 400, so it settles.

Under exact, a settled payment comes back only if the seller sends a new transfer. The auth-capture scheme adds two paths. The seller can void or refund. The buyer can reclaim a hold that was never captured once the capture deadline passes, without the seller. The rules for each scheme are at https://vet402.com/x402/refunds.

An agent can run the next check on its own, before it signs.

Check a seller before paying

vet402 publishes what came back each time it paid a given URL. The REST endpoint needs no key:

curl -G https://vet402.com/api/v1/check \ --data-urlencode "url=https://seller.example/api/quote" \ --data-urlencode "method=POST" 

A URL vet402 has never seen comes back with not_in_catalog: true.

The response has a recommendation and a delivery block. delivery counts paid attempts, deliveries, and settled calls that did not deliver. l1_purchases lists the latest purchases, each with an explorer link.

verified_terms holds pay_to, asset, amount, network and scheme from the last purchase vet402 saw delivered. If the 402 in hand differs in any of those, or asks for more, it is a different offer. amount is in 6-decimal units, so multiply it by 10^12 on BNB Chain and by 10 on Stellar before you compare.

An agent can run the same lookup through the hosted MCP server before each payment:

{ "mcpServers": { "vet402": { "type": "http", "url": "https://vet402.com/mcp" } } } 

The tool is check_x402_seller. check_payment_proof reads a payment already made, and find_x402_sellers lists sellers vet402 paid and got content from in the last 30 days. If you sell over x402, check_my_x402_endpoint shows what vet402 saw when it paid your endpoint.

Decide delivery in the agent's own code

Whichever seller an agent picks, two checks after the call keep it from counting any of the 510 cases above as delivered:

const res = await paidFetch(url, init); // your x402-wrapped fetch const body = await res.text(); const delivered = res.status >= 200 && res.status < 300 && res.status !== 202 && body.length > 0; const settlement = res.headers.get("PAYMENT-RESPONSE") ?? res.headers.get("X-PAYMENT-RESPONSE"); log({ requestId, status: res.status, delivered, settlement }); 
  1. Mark the task done only when delivered is true. If the seller documents a job URL in its 202, poll it and mark done when the result arrives.
  2. Keep the settlement header next to the request id. If the seller offers auth-capture or its own refund path, that pair is what it will ask for.

Put those two checks in the agent's payment wrapper, and run check_x402_seller before the first payment to any new seller.

The data

The full purchase ledger is public under CC BY 4.0. The live CSV is at https://vet402.com/api/v1/observatory/export.csv?days=366 and a dated snapshot is archived on Zenodo at https://doi.org/10.5281/zenodo.24195171. The method behind each column is at https://vet402.com/observatory/methodology.

If you run an x402 seller and a row about your endpoint looks wrong, write to support@vet402.com. Corrections are published at https://vet402.com/corrections.