How we counted
One request/second, limit=200/page, iterated against
api.cdp.coinbase.com/platform/v2/x402/discovery/resources
until the last page returned fewer than
limit items. No authentication, no
payment, no state mutation. 173 pages. The endpoint reported
pagination.total = 34,587; the fetch pulled
item_count = 34,587;
truncated = false. Raw bytes were
hashed (raw_sha256 in
snapshot_meta.json)
before any derivation. Per-listing fields were then rolled up into
the aggregates summarised below — host concentration, network
split, scheme usage, price distribution, recency, field
completeness — plus a seeded 100-URL liveness probe
(sample_seed=20261005, single GET,
5s timeout). Full method and the inference rules are in
METHOD.md.
Every headline number below is a named key in
summary.json; the parenthetical
citations point at the key path. We also keep an own-disclosure
panel at the end because a self-published census shouldn’t
hide what it finds about the publisher.
Update — weekly delta
2026-10-06. The dataset page now publishes a recurring Weekly delta section alongside this fixed baseline. The latest week (2026-10-05) reports 35,007 listings (+420 vs. this baseline), the top-1 host share at 39.46% (+0.48pp), and HHI on hosts at 0.160796 (+0.003683). The findings below are the 2026-10-05T17:13Z baseline reading — unchanged; the weekly companion is the recurring recomputation against the same source endpoint, published to a dated subpath per week.
Finding 1 — One host holds 38.98% of the entire index.
market.datapackvibe.com accounts
for 13,481 of the 34,587 listings —
38.98% on its own
(host_summary.top1_host). The top
ten hosts together hold 57.91%
(host_summary.top10_share).
Herfindahl–Hirschman on listings per host is
0.1571
(host_summary.hhi_host) —
concentrated but not single-vendor. 2,122 distinct hosts in total
(host_summary.distinct_hosts).
The practical read: a lot of what looks like “a 34,587-row bazaar” is one publisher’s catalog, and a lot of the rest is a long thin tail. If you are evaluating a listing, the host is a load-bearing field — not the row count.
Finding 2 — A 100-URL seeded probe returned 1% HTTP 200, 40% HTTP 402, 47% HTTP 405, 7% net error.
We drew a seeded random sample of 100 resource URLs (seed
20261005), issued a single HTTP
GET at each with a 5-second timeout, and recorded the status
(liveness_probe.status_distribution).
The breakdown:
| Status | Count | Meaning |
|---|---|---|
| 200 OK | 1 | Free tier or a non-challenging GET path. |
| 402 Payment Required | 40 | The correct x402 payment challenge on an unauthenticated GET. |
| 405 Method Not Allowed | 47 | Resource is POST-only; the 402 handshake never fires on a GET. |
| 401 / 404 (other 4xx) | 5 | Auth-required or path-not-found; no challenge served. |
| Network error | 7 | DNS / timeout / TLS error — the host didn’t answer. |
This is a lower-bound liveness measurement. It does not say any
particular listing delivers what it advertises after
payment — a 402 is a challenge, not a receipt. But the three
populations the probe can separate (answers with a challenge /
answers but not on GET / doesn’t answer at all) are already
very different cohorts, and only 1 in 100 returned
a 2xx on an unauthenticated GET
(liveness_probe.pct_http_2xx = 1.0).
Finding 3 — The median listed price is $0.01. 83.55% price at or below one cent.
Of the 34,587 listings, 34,490 carry an inferable
USD price
(price_summary.items_with_derivable_usd_price);
the remaining 97 either denominate in a non-USD-pegged asset or
omit a decimals field. Across the priced subset:
- Median: $0.01 (
price_summary.median_usd). - P90: $0.03, P99: $0.945001, max: $1,000 (
price_summary.p90_usd/p99_usd/max_usd). - 83.55% price at ≤ $0.01 — 28,817 of 34,490 priced listings (
items_le_1cent_pct_of_priced). - 96.55% price at ≤ $0.10 (
items_le_10cent_pct_of_priced). - 99.32% price at ≤ $1.00 (
items_le_1dollar_pct_of_priced).
The modal x402 unit is a microtransaction. SaaS-seat pricing is a rounding error in this catalog, and the single max value of $1,000 is almost certainly a one-shot workload or a mis-flagged batch unit, not a $1,000-per-call list price.
Finding 4 — 99.47% of listings accept at least one mainnet; Base dominates.
99.47% of the 34,587 listings carry at least one
mainnet in their accepts[] array
(network_summary.items_mainnet_share);
93.14% are mainnet-only (no testnet
accepts entry at all). The modal
payment network, by a wide margin, is Base mainnet
(CAIP-2 eip155:8453) with
35,534 of 59,803
accepts[] entries. Solana mainnet
is second (7,359), then Polygon mainnet (3,313),
Arbitrum One (2,527), Base Sepolia (2,362), and Optimism mainnet
(1,178). The index spans 47 distinct CAIP-2
network identifiers in total
(network_summary.distinct_networks_in_accepts)
— including XRPL, Stellar pubnet, Algorand mainnet, and
multiple less-common EVM chains.
Finding 5 — Only 32 of 34,587 listings are MCP-type (0.09%).
The resource-type split
(type_distribution) is
34,555 http and 32 mcp. MCP-type
listings are 0.093% of the index — a
rounding error. If you came here looking for the Bazaar as an MCP
distribution channel, it isn’t one; the Bazaar is
overwhelmingly a catalog of classical HTTP endpoints you call
directly over x402.
Finding 6 — The index is young. 58.4% of listings were updated in the last 7 days.
recency.age_buckets_pct_of_total
reports 58.4% of listings carry a
lastUpdated within 7 days of the
fetch window, 16.93% within 24 hours, and only
0.05% older than 90 days. The catalog is being
actively refreshed, which is consistent with the host-concentration
finding above — the top publisher almost certainly batch-rolls
its catalog on a short cadence. Field completeness is high on
descriptive fields
(description_present_pct = 99.82,
tags_present_pct = 80.74) and
middling on identity-bearing fields
(service_name_present_pct = 44.4).
What this means for an agent choosing x402 services
Listing is not liveness. 34,587 rows exist in the Bazaar; a seeded random probe at those rows returned a 2xx on 1 in 100 and a correct x402 payment challenge on 40 in 100. Half of the probed listings never got to the 402 handshake on a GET at all. A buyer-side agent evaluating these services has to answer three separate questions — is it advertised, does it answer, does it deliver after payment — and the Bazaar listing itself only addresses the first.
Listing is not identity. The host field is a URL,
not a counterparty. 38.98% of the index resolves to a single host;
another ~19% resolves to the next nine. Walking a listing to a
registry-owned identity (the ERC-8004 publisher that owns the
pay_to) is a separate layer, and
the overlap between “listed in the Bazaar” and
“registered as an ERC-8004 agent” is a cross-dataset
join — see the companion
ERC-8004
four-chain census for the on-chain population.
The gap between the three layers is the verification work.
Our own disclosure — zero listings resolve to onchainagentintel.io.
summary.json.ours_listed.count = 0.
We publish /.well-known/x402.json
on our own domain and have not registered with the Bazaar as of the
fetch window. Publishing /.well-known
is not sufficient on its own — the Bazaar is populated via a
separate submission flow — and we state that plainly here
because a self-published dataset shouldn’t hide a disclosure
that reflects on the publisher. The full note is in
ours_listed.notes.
Reproducing this report
Every number above is a named key in
summary.json
(7,031 bytes). The underlying per-listing rows are in
dataset.csv
(34,587 rows, 21 columns). The schema.org Dataset metadata is in
dataset.jsonld.
The 100-URL probe trace is in
liveness_probe.json.
File hashes are pinned in
SHA256SUMS.
Everything is CC BY 4.0.