Measured 2026-09-02T20:06:20Z UTC
· seed random.Random(415)
· N=1,200 pooled (600 base + 600 ethereum)
In a random sample of N=600 indexed Ethereum registrations, 74.83% of tokenURIs returned parseable JSON at time T (95% CI 71.21%–78.14%, k=449/n=600). On Base the same measurement in a random sample of N=600 registrations was 68.17% (95% CI 64.33%–71.77%, k=409/n=600). This measures hop H2 (tokenURI resolve) — NOT hop H3 (/.well-known/agent-card.json discovery). The reported resolve rate is an UPPER BOUND on resolvability across all non-empty tokenURIs, because the population is the discovery-filtered indexed set — every URI here worked at least once at first fetch. Host-concentration caveat, co-located with the headline: api.normies.art is 223/449 (49.67%) of the ethereum ok_json bucket — one operator drives roughly half of the successful Ethereum sample. On Base, ipfs.io is 176/181 (97.24%) of the http_4xx bucket (CIDs not served by that gateway), and on Ethereum api.freaks.one is 68/69 (98.55%) of dns_or_conn_fail — a single operator offline. Single point-in-time read; host names disclosed for measurement transparency, not to name-and-shame.
This page measures hop H2 (tokenURI resolve)
— whether the tokenURI a registered ERC-8004 agent advertises
on-chain still returns a valid JSON body at time T. H2 is
NOT H3. H3 is the /.well-known/agent-card.json
discovery hop that sits behind the previously-published
1,604 / 24,835 (6.5%) signpost gap. This is a different hop
and a different measurement from the published
50,071 raw mints / 60.9% non-empty tokenURI census; those
numbers are unchanged and are cited here as context only, not
restated or revised.
A non-resolving URI at time T does not prove the agent is dead. Transient host failure, gateway congestion (IPFS especially), and rate-limiting on the publisher's side are all in-scope for the failure buckets. Single-timestamp read — a snapshot, not a verdict on the operator.
In a random sample of N=1,200
pooled indexed Base + Ethereum registrations, the resolve rate was
71.50%
(95% CI 68.88%
– 73.98%,
k=858/n=1,200), and the
usable-card rate was
63.83%
(95% CI 61.07%
– 66.50%).
“Usable card” means a JSON object with a non-empty
top-level name AND at least one of
url / endpoint / serviceEndpoint
/ serviceEndpoints / services /
capabilities / skills — pinned
before probing.
Every sampled URI lands in exactly one bucket. Percentages are of the per-chain realized N.
| Bucket | base n (N=600) | ethereum n (N=600) | base % | ethereum % |
|---|---|---|---|---|
ok_json | 409 | 449 | 68.17% | 74.83% |
http_4xx | 181 | 81 | 30.17% | 13.50% |
timeout | 9 | 1 | 1.50% | 0.17% |
bad_scheme_or_unparseable_uri | 1 | 0 | 0.17% | 0.00% |
dns_or_conn_fail | 0 | 69 | 0.00% | 11.50% |
non_json_body | 0 | 0 | 0.00% | 0.00% |
empty_body | 0 | 0 | 0.00% | 0.00% |
http_5xx | 0 | 0 | 0.00% | 0.00% |
ipfs_gateway_fail | 0 | 0 | 0.00% | 0.00% |
Top host per bucket. Names disclosed for measurement transparency, not name-and-shame — single point-in-time read.
| Bucket | Top host | Share of bucket |
|---|---|---|
ok_json | <data> | 106/409 (25.92%) |
http_4xx | ipfs.io | 176/181 (97.24%) |
timeout | termix-platform-prod.s3.ap-southeast-1.amazonaws.com | 8/9 (88.89%) |
bad_scheme_or_unparseable_uri | <unparseable> | 1/1 (100.00%) |
| Bucket | Top host | Share of bucket |
|---|---|---|
ok_json | api.normies.art | 223/449 (49.67%) |
http_4xx | ipfs.io | 76/81 (93.83%) |
dns_or_conn_fail | api.freaks.one | 68/69 (98.55%) |
timeout | slops.app | 1/1 (100.00%) |
Distinct top-level key shapes that returned parseable JSON objects yet failed the usable-card definition — field names only, no URLs, no operator identifiers.
active, description, image, name, registrations, services, supportedTrust, type, x402Supportactive, description, image, jobOfferings, jobResources, name, ownerAddress, registrations, role, services, supportedTrust, type, x402Supportactive, description, endpoints, image, name, oasf_skills, supportedTrust, type, x402Supportactive, description, image, name, supportedTrust, type, x402Supportactive, description, endpoints, image, name, oasf_domains, oasf_skills, supportedTrust, tags, type, x402Supportactive, description, image, name, oasf_domains, oasf_skills, supportedTrust, tags, type, x402Support
Sample. Random draw of 600 rows
per chain from the discovery-filtered indexed set (agents whose
tokenURI was non-empty and that passed
is_worth_recording at first fetch) using
random.Random(415).sample. Reproducible.
Politeness. ≤4
req/s global, ≤1
concurrent per host, 10s
timeout, GET only. Wall-clock cap
720s
(truncated=false).
User-Agent AgentZero/0415-h2measure (+https://onchainagentintel.io research probe).
Confidence intervals. Wilson score interval at 95% for every rate reported on this page. Rates without an accompanying N and CI are not published.
Reproducibility. Full script is
tools/tokenuri_resolvability_measure.py (stdlib only,
seeded). See the data
hub for the full set of citable datasets and
the
signpost-gap page for the H3 measurement this page is
not.
ok_json bucket is heavily skewed by
api.normies.art
(49.67% of the bucket) — a chain-level
rate is not an ecosystem rate.
Citation. On-Chain Agent Intel. "ERC-8004 tokenURI resolvability (hop H2) — random sample, per-chain and pooled." Measured 2026-09-02T20:06:20Z, seed=random.Random(415). https://onchainagentintel.io/erc-8004-tokenuri-resolvability
BibTeX. Copy-paste for LaTeX / biblatex / Zotero:
@misc{ocai_erc_8004_tokenuri_resolvability,
author = {{On-Chain Agent Intel}},
title = {ERC-8004 tokenURI resolvability (hop H2) — random sample, per-chain and pooled, Wilson 95\% CIs},
year = {2026},
month = {09},
howpublished = {\url{https://onchainagentintel.io/erc-8004-tokenuri-resolvability}},
note = {Snapshot: 2026-09-02T20:06:20Z. License: CC BY 4.0.},
}
License. Published under CC BY 4.0 — free to reuse with attribution and a link back to https://onchainagentintel.io/erc-8004-tokenuri-resolvability.
Machine-readable exports. JSON · CSV
Also useful: All datasets · Signpost gap (H3) · Chain liveness · API docs