๐Ÿ“… Historical page. This content reflects minia2a as of its publication date and is kept for the record. Current model: x402 pay-per-call in USDC on Base only, 5 free trial calls per signed wallet, no credits and no top-up rail. โ†’ See current
โ† All posts

A marketplace listing is a lease, not a trophy

November 12, 2026

Six weeks ago we counted our rows in the CDP x402 Bazaar index: 153. This week the same count read 56. In between, the index itself nearly doubled.

DateBazaar resources (total)Our rows
2026-09-2919,126154
2026-10-0324,418153
2026-10-1925,80098
2026-11-0834,18856
2026-11-1233,65556

Read naively, that is a collapse: our share of the index went from about 0.8% to about 0.17%. Read correctly, it is something more boring and more useful. The rows that left are still selling.

The rows that dropped out still answer 402

We took the 49 URLs that disappeared from the index between the 19 October and 8 November snapshots and requested each one:

GET https://minia2a.uk/x402/<slug>
โ†’ 402 Payment Required, accepts[0].amount, payTo, network all present
49 / 49

Every one of them is payable, priced, and unchanged in behaviour. They are simply no longer findable through that index. The four most expensive endpoints we run โ€” integration-audit at $50, ai-audit at $20, payment-audit at $5, content-studio at $3 โ€” are all in the dropped set today, and all four still hand a buyer a valid challenge.

This is the distinction that costs builders the most time: can this endpoint be paid and can a stranger find this endpoint are two separate properties maintained by two different systems. A 402 is your code. A directory row is somebody else's crawler deciding you were recently interesting.

What actually writes the row

On 7 November we joined every service id of ours that had ever been paid (137 of them, no sampling) to its last payment, then grouped by presence in the index. One full paginated read, 344 pages.

In the index?RowsLast paid call, age at join
yes520.4 โ€“ 26.5 days
no8530.3 โ€“ 89.4 days

Zero exceptions in either direction. Nothing that had been paid within 26 days was missing; nothing paid more than 31 days ago was present. The boundary sits somewhere in a 3.8-day gap between the two populations.

This is an observed separation, not a proven TTL. One snapshot cannot distinguish "removed at exactly N days" from "some other trigger correlated with settlement age". A 3.8-day gap looks more like a periodic sweep than an exact expiry, and we do not write the 26.5 / 30.3 numbers into code or docs as constants. The only safe prediction is directional: rows age out, and a payment resets the clock.

The one listing that never ages out

In the same dataset, exactly one of our listings was being renewed on a schedule: an external agent pays 1ยข for x402-format-bytes every day around 04:30Z. It had done so 21 days running. Every other row was living on an ever-staler meal.

That is the whole mechanism in one line. Discovery surfaces of this kind are fed by settlement: the index row is a snapshot written when someone pays, and it carries the timestamp of that payment. Keep paying and the row stays current; stop and it drifts out roughly a month later. The catalog the buyer sees is a side effect of the payment stream, not a registry you join once.

The same mechanism explains something that looked like a bug earlier: 20 rows sat in the index advertising prices up to 5,000ร— below what the endpoint actually charged, and stayed that way for weeks. Of course they did. A row that only refreshes on payment refreshes never for endpoints nobody pays, in either direction.

What we did not do about it

The tempting fix is to pay yourself. A self-settlement resets the row, and at 1ยข it looks cheap. We did not do it, for three reasons:

If you do choose to pay for presence, budget it openly as marketing spend, keep it in a wallet you already exclude from customer metrics, and label it โ€” the same discipline you would apply to any paid placement. What you should not do is let it quietly inflate the numbers you report.

What a seller should actually check

The lesson we are applying to ourselves

We are not going to chase the index back up with self-payments. The count is a measurement of demand, and a measurement you can buy is not a measurement. What we can do is keep the underlying surface healthy โ€” every dropped row still answers 402 with a correct price, correct payee, and correct rail, which the parity check confirms for all 56 rows still listed and for the 49 that left โ€” and let the count say what it says.

If you run an endpoint on any x402 discovery surface, the question worth asking is not "am I listed". It is "when was I last paid, and what does that date predict about next month".

All figures above were read on the dates shown: catalogue totals from the Bazaar discovery index (paginated sweep, 258 / 342 / 336 pages), our row counts from the same sweeps, presence-vs-settlement join from our own payment ledger, and the 402 checks from plain unauthenticated GETs. Nothing above was estimated.

โ† All posts