What was measured
For each seller in our census we took the routes that answer GET with a real 402 —
the ones a seller advertises as paid — and sent the same route a POST with an empty
JSON body and no payment. A working seller answers 402 plus a challenge either way.
This page is the result of 137 such requests across 78 hosts, first measured
2026-10-30 and re-run 2026-11-14.
POST status codes (137 requests)
| code | meaning for the buyer | count | share |
|---|---|---|---|
| 402 | Payment Required — the route is payable by the other verb too | 42 | 30.7% |
| 405 | Method Not Allowed — the route exists but refuses POST | 45 | 32.8% |
| 404 | Not Found — the paid route disappears for POST | 49 | 35.8% |
| 401 | Unauthorized — answered, but not with a challenge | 1 | 0.7% |
Per-host verdict (78 hosts)
| verdict | definition | hosts |
|---|---|---|
serves_post_402 | every route we POSTed returned 402 | 22 |
post_405 | at least one route answered 405 Method Not Allowed | 28 |
post_other | answered, but not with a paywall (404/401/200) | 28 |
Fifteen days later: 0 sellers fixed
We first ran this on 2026-10-30. All 78 of those hosts answered again on
2026-11-14. Hosts whose verdict changed: 1. agents.dyoeway.org moved post_other → post_405
Hosts that started answering POST with a real 402, and did not before: 0.
That is the finding. This is not a transient server bug — it is how these servers were
written, it survives two weeks of uptime, and the sellers do not know. Every one of them is
losing the buyers whose client picks POST, and there is no error on their side
because a 405 looks like a client mistake, not a missing paywall.
Reproduce it
No client library, no key, no payment. Take any route a seller charges for and change the verb:
curl -s -o /dev/null -w '%{http_code}\n' -X POST \
-H 'Content-Type: application/json' -d '{}' \
https://<seller>/<their-paid-route>
402 means they sell to agents. 405 means they sell to curl -X GET. 404 means the route they published does not exist for the verb an agent tool chose.
Who does answer POST (22 hosts, named because they pass)
We name sellers that passed. We do not name the ones that failed: their page may have changed since we probed it, and naming them would be a claim we cannot keep current.
402cron.comagent-ready.devagent.connskill.comagent.pocket.networkagent402.toolsagentbit.appagentforge-taupe.vercel.appagi.apify.comai-data-marketplace-1042299154756.us-central1.run.appapi.agentwork.runapi.anchor-x402.comapi.chit402.comapi.grid-hub.appapi.insumermodel.comapi.loopholetape.comapi.macaroonnetwork.comapi.marketintelligenceapi.comapi.robinx.ioapi.verdixapi.comapi.vetpulse.theaslangroupllc.comapi.xfuel.apparbipulse.theaslangroupllc.com
Our own server had this defect
Before pointing at anyone else we ran the same check against our own paid routes. Every
GET route charged correctly and every POST to the same path returned
405 — a free bypass for any client that picked the other verb. Fixed 2026-10-30: POST twins for
every paid GET route, so the unpaid POST now gets the same 402 and the same price. Re-verified
by a daily selftest, and you can check it yourself right now:
for m in GET POST; do curl -s -o /dev/null -w "$m %{http_code}\n" -X $m \
-H 'Content-Type: application/json' -d '{}' https://03s9tr085tfe5agke0tpqng34o.ingress.quanglong.org/x402/feed; done
Want this run against your own host? The $49 audit probes every paid route with both verbs, maps each finding to the exact change, and re-runs after you ship. Open an audit · price list · what we have earned, published
One person runs this desk. Measurements are published whether or not they flatter us.
Method: 137 POST requests with an empty JSON body, 15s timeout,
8 workers, browser user-agent, no payment header. Source rows: one per host in
x402_post_probe.jsonl, reproducible with
scripts/x402_post_probe.py. Page generated 2026-11-14 18:57 UTC.