diff --git a/benchmarks/network-coverage.yml b/benchmarks/network-coverage.yml
index 4e1468c5..3ae529d1 100644
--- a/benchmarks/network-coverage.yml
+++ b/benchmarks/network-coverage.yml
@@ -3,8 +3,8 @@
slug: network-coverage
number: "005"
title: Onchain data API with most networks supported
-seo_title: "Crypto data API with the most blockchains supported in 2026: Codex, GeckoTerminal, Mobula live"
-seo_description: "Live blockchain coverage leaderboard. How many mainnets each onchain data API (Mobula, Codex, GeckoTerminal) officially supports right now, audited every six hours against their public network endpoints."
+seo_title: "Crypto data API with the most blockchains supported in 2026: Mobula, Codex, GeckoTerminal, Covalent, CoinPaprika, CoinStats, Sim by Dune live"
+seo_description: "Live blockchain coverage leaderboard. How many mainnets each onchain data API (Mobula, Codex, GeckoTerminal, Covalent/GoldRush, CoinPaprika, CoinStats, Sim by Dune) officially supports right now, audited every six hours against their public network endpoints."
subtitle: Number of blockchains each major onchain data provider officially supports.
category: Aggregators
status: live
@@ -32,19 +32,24 @@ seo_intro: |
abstract: |
We benchmark how many networks each major onchain data provider lists
in its public "supported networks" endpoint. The harness fetches the
- official listing every six hours from GeckoTerminal, Codex and Mobula,
- deduplicates by chain id and counts. Mainnet only, testnets are
- excluded because providers list them inconsistently and the comparison
- is meant to reflect what a builder can integrate against in production.
- Coverage breadth is one dimension of a data provider's product, not a
- ranking on quality. Latency, freshness and metadata completeness are
- measured separately by benches № 001 and № 004.
+ official listing every six hours from seven providers (GeckoTerminal,
+ Codex, Mobula, CoinPaprika, Covalent/GoldRush, CoinStats and Sim by
+ Dune), deduplicates by chain id and counts. Mainnet only,
+ testnets are excluded because providers list them inconsistently and
+ the comparison is meant to reflect what a builder can integrate against
+ in production. Coverage breadth is one dimension of a data provider's
+ product, not a ranking on quality. Latency, freshness and metadata
+ completeness are measured separately by benches № 001 and № 004.
methodology:
- "Source: each provider's public supported-networks endpoint."
- "GeckoTerminal: GET /api/v2/networks (paginated, no auth)."
- "Codex: GraphQL `getNetworks` query at https://graph.codex.io/graphql with an official API key."
- "Mobula: GET /api/1/blockchains with an Authorization API key."
+ - "CoinPaprika: GET /v1/contracts (no auth) — list of platforms supported for contract lookup."
+ - "Covalent / GoldRush: GET /v1/chains/ with a Bearer API key; testnets filtered via `is_testnet`."
+ - "CoinStats: GET /wallet/blockchains with X-API-KEY."
+ - "Sim by Dune: GET /v1/evm/supported-chains (no auth) — EVM only, mainnets filtered via the `mainnet` tag."
- "Cadence: full refresh every 6 hours."
- "Counting: a provider's network is counted once per unique chain id; mainnet only."
- "Failures (network errors, rate limits, auth errors) leave the previous count in place and increment a fetch_errors counter. the page falls back to its last successful sample."
@@ -77,7 +82,9 @@ faq:
a: "Any chain a provider lists as a queryable production environment, identified by a unique chain id. Ethereum mainnet, Solana mainnet, Base, Arbitrum, BNB Chain, Bitcoin and so on each count once regardless of how the provider labels them internally. Bridged variants of a token on different chains are not the same chain. The chain id is the deduplication key."
# Real metrics exposed by the network-coverage harness:
-# networks_supported_total{provider="geckoterminal"|"codex"|"mobula"}
+# networks_supported_total{provider="geckoterminal"|"codex"|"mobula"|
+# "coinpaprika"|"covalent"|
+# "coinstats"|"sim-dune"}
# -> gauge, the unique-chain count from the latest successful refresh.
# network_supported{provider, chain_id, slug, name} -> gauge (1 per
# network; useful for diff queries on the site if we add a
@@ -122,3 +129,55 @@ providers:
success: clamp_max(networks_supported_total{provider="mobula"} > bool 0, 1)
sample_size: networks_supported_total{provider="mobula"}
series: networks_supported_total{provider="mobula"}
+
+ - slug: coinpaprika
+ name: CoinPaprika
+ tag: Market data API
+ formula: "Count of platform slugs returned by CoinPaprika's public `/v1/contracts` endpoint, refreshed every 6 hours."
+ queries:
+ p50: networks_supported_total{provider="coinpaprika"}
+ p90: networks_supported_total{provider="coinpaprika"}
+ p99: networks_supported_total{provider="coinpaprika"}
+ mean: networks_supported_total{provider="coinpaprika"}
+ success: clamp_max(networks_supported_total{provider="coinpaprika"} > bool 0, 1)
+ sample_size: networks_supported_total{provider="coinpaprika"}
+ series: networks_supported_total{provider="coinpaprika"}
+
+ - slug: covalent
+ name: Covalent
+ tag: GoldRush multichain data
+ formula: "Count of unique mainnet chains returned by Covalent's `/v1/chains/` endpoint with `is_testnet=false`, refreshed every 6 hours."
+ queries:
+ p50: networks_supported_total{provider="covalent"}
+ p90: networks_supported_total{provider="covalent"}
+ p99: networks_supported_total{provider="covalent"}
+ mean: networks_supported_total{provider="covalent"}
+ success: clamp_max(networks_supported_total{provider="covalent"} > bool 0, 1)
+ sample_size: networks_supported_total{provider="covalent"}
+ series: networks_supported_total{provider="covalent"}
+
+ - slug: coinstats
+ name: CoinStats
+ tag: Portfolio + market data
+ formula: "Count of blockchains returned by CoinStats's `/wallet/blockchains` endpoint, refreshed every 6 hours."
+ queries:
+ p50: networks_supported_total{provider="coinstats"}
+ p90: networks_supported_total{provider="coinstats"}
+ p99: networks_supported_total{provider="coinstats"}
+ mean: networks_supported_total{provider="coinstats"}
+ success: clamp_max(networks_supported_total{provider="coinstats"} > bool 0, 1)
+ sample_size: networks_supported_total{provider="coinstats"}
+ series: networks_supported_total{provider="coinstats"}
+
+ - slug: sim-dune
+ name: Sim by Dune
+ tag: EVM data API (Dune Sim)
+ formula: "Count of EVM chains tagged `mainnet` in Sim by Dune's `/v1/evm/supported-chains` endpoint, refreshed every 6 hours. EVM-only."
+ queries:
+ p50: networks_supported_total{provider="sim-dune"}
+ p90: networks_supported_total{provider="sim-dune"}
+ p99: networks_supported_total{provider="sim-dune"}
+ mean: networks_supported_total{provider="sim-dune"}
+ success: clamp_max(networks_supported_total{provider="sim-dune"} > bool 0, 1)
+ sample_size: networks_supported_total{provider="sim-dune"}
+ series: networks_supported_total{provider="sim-dune"}
diff --git a/public/logos/coinpaprika.svg b/public/logos/coinpaprika.svg
new file mode 100644
index 00000000..122b7608
--- /dev/null
+++ b/public/logos/coinpaprika.svg
@@ -0,0 +1 @@
+
diff --git a/public/logos/coinstats.svg b/public/logos/coinstats.svg
new file mode 100644
index 00000000..dd88ae09
--- /dev/null
+++ b/public/logos/coinstats.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/logos/covalent.svg b/public/logos/covalent.svg
new file mode 100644
index 00000000..76d2cfce
--- /dev/null
+++ b/public/logos/covalent.svg
@@ -0,0 +1,7 @@
+
+
diff --git a/src/lib/logo-manifest.ts b/src/lib/logo-manifest.ts
index 8d29dc6c..afc7ee58 100644
--- a/src/lib/logo-manifest.ts
+++ b/src/lib/logo-manifest.ts
@@ -124,6 +124,11 @@ const RAW: Record = {
"pump-portal": "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/logos/pump-portal.svg",
quicknode: "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/logos/quicknode.svg",
"the-graph": "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/logos/the-graph.svg",
+
+ // ─── network-coverage bench providers (bench № 005 expansion) ───
+ coinpaprika: "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/logos/coinpaprika.svg",
+ covalent: "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/logos/covalent.svg",
+ coinstats: "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/logos/coinstats.svg",
};
// Asset-symbol aliases used by perp-fees as chain dimension values.
@@ -159,6 +164,9 @@ const ALIASES: Record = {
"arbitrum-official": "arbitrum",
"avalanche-official": "avalanche",
"optimism-official": "optimism",
+
+ // Sim by Dune is Dune's onchain-data product — reuses Dune's brand mark.
+ "sim-dune": "dune",
};
export function logoPath(slug: string): string | null {