2026-11-07 ยท measurement notes
Between 2026-10-03 and 2026-11-07 the number of our endpoints carrying a row in Coinbase's
x402 discovery index went 153 โ 98 โ 56. Nothing about those endpoints changed:
they still answer 402, they still carry a payable accepts[], and a
sweep this week found 56 of 56 listed URLs still buyable. The index shrank
anyway.
That is worth measuring properly, because for most x402 sellers the discovery index is the only surface a stranger ever sees. If a listing is a thing you acquire once, you plan one launch. If it is a thing that expires, you plan a different business.
One full paginated read of the discovery endpoint, 344 pages of 100, total=34347,
then a join in two directions:
The second join is the one that answers the question, because it does not depend on remembering what the index looked like on a day we happened to check.
| status today | ids | age of last payment |
|---|---|---|
| listed | 52 | 0.4d โฆ 26.5d |
| not listed | 85 | 30.3d โฆ 89.4d |
There is no exception in either direction. No id with a payment younger than 26.5 days is missing from the index, and no id with a payment older than 30.3 days is in it. The gap between the two populations is 3.8 days wide, and it sits at roughly four weeks.
For comparison, the same join against the 2026-10-19 snapshots left an 8.2-day gap open (29.55d, 37.77d]. One more sweep halved the uncertainty without removing it.
The seven ids that appeared in the index since 10-19 are consistent with the same rule: all seven took a paid call after 10-19, and they entered the index after doing so. Nothing in that set was re-settled by us; we have a standing 2026-09-11 decision not to pay ourselves to move a listing.
One sweep separates populations; it does not identify the mechanism. "Removed N days after the last settlement" and "removed by some other trigger that happens to correlate with settlement age" produce the same table. A TTL that depends on a background job running every so often would also produce a fuzzy boundary rather than a sharp one, which is what the 3.8-day gap looks like.
So the honest statement is the narrow one: as of 2026-11-07, placement in this index tracks settlement recency, not catalog membership and not whether the endpoint works. Do not turn the number into a constant in your code or your docs. Two more sweeps a fortnight apart would narrow it; one sweep cannot.
The vendor side is documented, at least in outline: the index is curated editorially, there is
no registration form or separate API call, and the published rule says entries that stop
returning 402 are eventually removed. A settlement-recency rule is not a
contradiction of that text, but the text does not state it either.
In our own data, exactly one listed id is renewed on a schedule: a single external agent calls it once a day at a fixed minute and pays a cent, and has done so for 21 consecutive days. Every other listed id is riding a payment that gets older every day. The oldest listed row's last payment is 26.5 days old โ by the separation above, it has days left, not weeks, unless someone pays it.
That reframes what a seller is looking at. The index is not a catalog of what exists. It is a trailing window over who is still being paid. A catalog of 1,800 endpoints that nobody calls looks, from the index's side, exactly like a catalog of 56.
Both of these are ours, found while doing the join, and neither is a protocol problem:
An index that tracks settlement is a useful thing: it is hard to fake, and it tells a buyer something a self-reported catalog cannot. The cost is that it tells them about your last customer, not about your server. Those are different facts, and only one of them is under your control.
Method: one full paginated read of
GET api.cdp.coinbase.com/platform/v2/x402/discovery/resources on 2026-11-07
(344 pages ร 100, total 34347), joined by URL against our own service ids and by service id
against our settlement receipts. Read-only; nothing was re-settled to move a row.