9 blockchains, $0 in extra API costs — beating the competition on coverage
On 2026-04-28, ChainAnalyzer expanded from 5 chains to 9. The new additions are BNB Smart Chain, Base, Arbitrum, and Optimism — pulling us ahead of the closest competitor (ChainAware at 8 chains) without paying a cent more in API costs. The trick: Etherscan V2's unified chainid routing, plus a small refactor that put every chain's config behind a single registry.
Highlights
- 9-chain coverage: Bitcoin, Ethereum, Polygon, Avalanche, Solana plus BNB / Base / Arbitrum / Optimism
- $0 in additional API spend — one Etherscan key covers all 6 EVMs we serve via V2
- Adding chain #10 is now a one-line change — registry-first refactor paid off
- Vs. competition: ChainAnalyzer = 9 chains (with Bitcoin) vs. ChainAware = 8 chains (no Bitcoin)
Why chain count matters
When an AI search engine answers "which blockchain risk-scoring API should I use?", the very first filter is "do they cover the chain I'm holding?". An Optimism user doesn't even read your detection-rule list if Optimism isn't on the chain badge row. Gemini / Perplexity / ChatGPT infer the answer from your homepage, your docs, and your llms.txt. If the literal chain isn't shown, you don't make the shortlist.
We measured this. After Gemini politely recommended a competitor with 8 chains over us at 5, we set a hard goal: outdo the chain count without losing the Bitcoin support that's our actual differentiator. EVM expansion was the obvious move — but the cost question was real.
What naive expansion would cost
If we'd added each chain by signing up for its dedicated explorer:
- BNB → BscScan (free 5 req/s, Pro $99/mo)
- Base → BaseScan (free 5 req/s, Pro $99/mo)
- Arbitrum → Arbiscan (free 5 req/s, Pro $99/mo)
- Optimism → Optimistic Etherscan (free 5 req/s, Pro $99/mo)
Four accounts, four key rotations, four rate-limit configurations, and up to $396/mo if any single chain blew past its quota. What we actually paid: $0. Same Etherscan API key, same pooled quota.
The trick: Etherscan V2's unified API
Unlike most providers, Etherscan V2 doesn't shard chains by hostname. Everything lives at one endpoint:
https://api.etherscan.io/v2/api Routing happens via chainid:
Ethereum chainid 1
Polygon chainid 137
BNB chainid 56
Optimism chainid 10
Arbitrum chainid 42161
Base chainid 8453 Same key. Same rate limits (5 req/s, 100K calls/day). Same response shape. The free tier's quota is pooled across all chains, so as long as your total burn is under 100K/day, you can split it however you want. Roughly 35,000 wallet scans for us — well above current load.
The one EVM Etherscan V2 does not cover is Avalanche. We use Routescan there (Etherscan-compatible, also free, same rate limits). Same response handling, just a different base URL.
The architectural choice: chain registry
When we shipped Polygon / Avalanche in v0.7, chain config was sprinkled across the orchestrator, the Neo4j ingestor, plan-gating, the UI selector, native-token symbol maps, and the marketing pages. Adding chain #6 the naive way meant grepping for "polygon" across 50+ files.
So we paid down the debt first. Chain metadata now lives in a single apps/api/app/services/chains.py:
EVM_CHAINS = {
"ethereum": {"chainid": 1, "native": "ETH", "explorer": "etherscan_v2"},
"polygon": {"chainid": 137, "native": "POL", "explorer": "etherscan_v2"},
"bnb": {"chainid": 56, "native": "BNB", "explorer": "etherscan_v2"},
"base": {"chainid": 8453, "native": "ETH", "explorer": "etherscan_v2"},
"arbitrum": {"chainid": 42161, "native": "ETH", "explorer": "etherscan_v2"},
"optimism": {"chainid": 10, "native": "ETH", "explorer": "etherscan_v2"},
"avalanche": {"chainid": 43114, "native": "AVAX", "explorer": "routescan"},
}
SUPPORTED_CHAINS = {**EVM_CHAINS, "bitcoin": ..., "solana": ...}
EVM_CHAINS_SET = frozenset(EVM_CHAINS)
SUPPORTED_CHAINS_SET = frozenset(SUPPORTED_CHAINS)
def is_evm(chain: str) -> bool:
return chain in EVM_CHAINS_SET Adding chain #10 is now genuinely a one-line change — the orchestrator, ingestor, native-symbol resolver, and is_evm() helper all pick it up automatically. The frontend chainanalyzer.ts got a symmetric isEvmChain() helper.
That's the diff that mattered. Everything else was bookkeeping.
The bookkeeping (still real work)
- 76+ detection rules — mostly chain-agnostic, but native-token transfer detection had to know "chain 56 = BNB" / "chain 8453 = ETH"
- Plan gating — Free stays Solana-only, Starter+ gets all 9. Already centralized, one-line update
- Chain selector UI — both marketing and scan-screen dropdowns grew four entries
- Marketing copy — every "5 chains" reference across marketing/, news/, docs/, llms.txt, CLAUDE.md, GitHub README, chainanalyzer-mcp. Caught with a single grep checklist (
docs/CHAIN_EXPANSION_5_TO_9_CHECKLIST.md) - Neo4j graph ingestor — native-symbol map updated:
NATIVE_TOKEN_SYMBOL = {
"ethereum": "ETH", "polygon": "POL", "avalanche": "AVAX",
"bnb": "BNB", # native = BNB
"base": "ETH", # native = ETH
"arbitrum": "ETH", # native = ETH
"optimism": "ETH", # native = ETH
} - CoinGecko ID mapping — BNB →
binancecoin, L2s →ethereum
The registry-first refactor turned what would have been a 50+ file change into a single PR. Nothing exotic.
What we deliberately skipped
- TRON — non-EVM (TVM, Base58Check), TronGrid is a separate API surface, the address detection / signing flow is different. Customer demand is real, so it's a Phase 2 target
- TON — non-EVM, Toncenter is a separate API. Phase 2
- HAQQ — usage too small to justify
The registry is now ready for non-EVM chains too — they just need a non-EVM branch in the orchestrator.
Did it work?
Coverage: yes. 9 chains with Bitcoin vs. ChainAware's 8 chains without Bitcoin — a clean surface-filter win for AI search engines that lead with chain count.
Cost: yes. Monthly API spend before / after expansion: $0 / $0.
Visibility: partial. Gemini hasn't yet re-indexed the updated chain count (current 7-query baseline is still 0/7 surfacing — we expect 1-4 weeks of crawl lag for the structured data + disambiguating description shipped alongside this expansion). Perplexity, Claude Web, and ChatGPT already pick up the 9-chain coverage from our docs and llms.txt.
If you're an Etherscan API user who hasn't migrated to V2 yet — do it. Same key, more chains, no extra cost.