Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions benchmarks/aggregator-head-lag.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ slug: aggregator-head-lag
number: "001"
title: Fastest crypto price API, live head lag across Mobula, Codex, GeckoTerminal
seo_title: "Fastest crypto price API 2026"
seo_description: "{{best_name}} leads fastest crypto price API at {{best_p50}} (p50, 24h). Mobula WebSocket, Codex GraphQL, GeckoTerminal REST live across Base, BNB, Solana."
seo_description: "Leader varies by chain: on Base {{best_name:chain:base}} at {{best_p50:chain:base}}, on Solana {{best_name:chain:solana}} at {{best_p50:chain:solana}}. Mobula WebSocket, Codex GraphQL, GeckoTerminal REST benchmarked live."
subtitle: Wall-clock head lag in seconds from on-chain swap event to API emission, measured live for Mobula, Codex and GeckoTerminal on Base, BNB Chain, Solana and Robinhood Chain.

per_chain_explainer:
Expand Down Expand Up @@ -70,13 +70,13 @@ methodology:
- "Cardinality: 3 aggregators × 4 chains × 3 regions = 36 active series."

findings:
- "Across the unfiltered cross-chain aggregate the leader is {{best_name}} at {{best_p50}} (p50, 24 h) over {{count}} measured providers, but that headline number mixes chains with very different baseline cadences (Solana 400 ms slots vs Base/BNB 2-3 s blocks) so the per-chain breakdown below is what to read for an integration decision."
- "No single provider leads on every chain. On Base the leader is {{best_name:chain:base}} at {{best_p50:chain:base}} (p50, 24 h); on Solana it is {{best_name:chain:solana}} at {{best_p50:chain:solana}}; on BNB Chain it is {{best_name:chain:bnb}} at {{best_p50:chain:bnb}}; on Robinhood Chain it is {{best_name:chain:robinhood}} at {{best_p50:chain:robinhood}}. Chains have different baseline cadences (Solana 400 ms slots vs Base/BNB 2-3 s blocks), so the per-chain numbers are what matters for an integration decision."
- "On Solana the leader is {{best_name:chain:solana}} at {{best_p50:chain:solana}} (p50, 24 h); the trailer is {{worst_name:chain:solana}} at {{worst_p50:chain:solana}}. Slot cadence is sub-second, so any second-scale aggregate latency is on the provider's pipeline, not the chain."
- "On Base the leader is {{best_name:chain:base}} at {{best_p50:chain:base}} (p50, 24 h); the trailer is {{worst_name:chain:base}} at {{worst_p50:chain:base}}. Base targets a 2 s block cadence, so head lag here measures pipeline latency on top of the chain's natural block interval."
- "On BNB Chain the leader is {{best_name:chain:bnb}} at {{best_p50:chain:bnb}} (p50, 24 h); the trailer is {{worst_name:chain:bnb}} at {{worst_p50:chain:bnb}}. BNB's ~3 s blocks set the floor; the spread between leader and trailer is the provider-side delta."
- "{{name:mobula}} returns {{p50:mobula}} (p50, 24 h) cross-chain. WebSocket feeds compress latency by pushing events the moment the harness emits them rather than waiting for the next poll cycle, which is the architectural reason real-time integrations prefer them over REST."
- "{{name:codex}} clocks {{p50:codex}} (p50, 24 h) cross-chain. GraphQL subscriptions are a server-push pattern in practice and cluster near WebSocket performance on liquid pools, but tail latency tends to widen on long-tail tokens with sparse events."
- "{{name:geckoterminal}} sits at {{p50:geckoterminal}} (p50, 24 h) cross-chain. REST polling adds the poll interval to every read, so head lag tracks the publisher's chosen cadence rather than raw infrastructure speed."
- "{{name:mobula}} leads on three of four chains. WebSocket feeds compress latency by pushing events the moment the harness emits them rather than waiting for the next poll cycle, which is the architectural reason real-time integrations prefer them over REST."
- "{{name:codex}} leads on Base at {{best_p50:chain:base}} (p50, 24 h). GraphQL subscriptions are a server-push pattern in practice and cluster near WebSocket performance on liquid pools, but tail latency tends to widen on long-tail tokens with sparse events."
- "{{name:geckoterminal}} trails on every chain. REST polling adds the poll interval to every read, so head lag tracks the publisher's chosen cadence rather than raw infrastructure speed."
- "p99 is the integration-grade number. The gap between p50 and {{p99:mobula}} / {{p99:codex}} / {{p99:geckoterminal}} is what a live UI feels when a chain spikes or a region's path degrades."

source: https://github.com/ChainBench/OpenChainBench/tree/main/harnesses/aggregator-head-lag
Expand All @@ -94,7 +94,7 @@ prometheus:

faq:
- q: "Which crypto data API has the lowest latency right now?"
a: "It depends on the chain, because each chain's base block cadence sets a different floor. On Solana the leader is {{best_name:chain:solana}} at {{best_p50:chain:solana}} (p50, 24 h). On Base it's {{best_name:chain:base}} at {{best_p50:chain:base}}. On BNB Chain it's {{best_name:chain:bnb}} at {{best_p50:chain:bnb}}. The unfiltered cross-chain aggregate puts {{best_name}} on top at {{best_p50}}, but that ranking is influenced by chain mix as much as by provider pipeline speed - read the per-chain numbers if you're picking a provider for a specific chain."
a: "It depends on the chain, because each chain's base block cadence sets a different floor. On Solana the leader is {{best_name:chain:solana}} at {{best_p50:chain:solana}} (p50, 24 h). On Base it's {{best_name:chain:base}} at {{best_p50:chain:base}}. On BNB Chain it's {{best_name:chain:bnb}} at {{best_p50:chain:bnb}}. On Robinhood Chain it's {{best_name:chain:robinhood}} at {{best_p50:chain:robinhood}}. Pick a provider based on the chain you are integrating, not a cross-chain average."
- q: "What is head lag in a crypto data feed?"
a: "Head lag is the wall-clock interval between a transaction landing in a confirmed block on chain and the same transaction appearing on the data provider's feed. A provider with 200 ms head lag pushes the event a fifth of a second after it settled; a provider with 6 s head lag pushes it after six seconds. The number controls how live a trading UI, a chart or a PnL tracker actually feels when the underlying chain moves."
- q: "Is WebSocket faster than REST for crypto market data?"
Expand All @@ -106,12 +106,12 @@ faq:
- q: "Which data provider should I pick for a real-time trading interface?"
a: "Read both the p50 and the p99 columns. p50 tells the typical experience, p99 tells the worst minute a user will see when a chain spikes or a region's path degrades. A 500 ms p50 with a 30 s p99 means most of the time the UI feels snappy and once per minute it stutters. The leaderboard splits both, plus the success rate column flags providers whose feed dropped during the measurement window."

# Chain filter tabs above the chart. The "all" option leaves queries
# unscoped (cross-chain aggregate); the others inject chain="<value>" into
# every PromQL selector via lib/spec.ts:injectChainFilter.
# Chain filter tabs above the chart. No "all" option: prom.scalar takes
# result[0] from multi-series vectors, which is alphabetically chain="base",
# so a cross-chain aggregate silently shows Base data for every provider and
# gives Codex (Base leader) a false global #1. Per-chain tabs only.
dimensions:
chain:
- { value: all, label: All chains }
- { value: base, label: Base }
- { value: bnb, label: BNB Chain }
- { value: solana, label: Solana }
Expand Down
Loading