Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
196 commits
Select commit Hold shift + click to select a range
a327811
the plan-band doc said the opposite of the code, and GetBlock's archi…
Flotapponnier Sep 30, 2026
96f34b2
the tier selector reads its label from the spec, so a cost bench stop…
Flotapponnier Sep 30, 2026
6aa2164
the chain registry had cosmos-hub twice, so /chains listed it twice (…
Flotapponnier Sep 30, 2026
a34aa83
eleven comments that described something the code does not do, and fo…
Flotapponnier Sep 30, 2026
81dd013
28 hub share cards were being generated and never used (#2738)
Flotapponnier Sep 30, 2026
58039be
five more capital sections say which kind of nothing they are, and on…
Flotapponnier Sep 30, 2026
f15c5be
the two blob proxies are ungated on purpose, and nothing said so (#2740)
Flotapponnier Sep 30, 2026
b9ae47f
crm: a 24 h window next to the 7 d one, on every figure at once (#2742)
Flotapponnier Sep 30, 2026
5757665
crm: the delta column said w/w under a 24 h window (#2743)
Flotapponnier Sep 30, 2026
a50d72a
sync dev with main after the speed test and orphan-page releases
Flotapponnier Sep 30, 2026
06eef42
sync dev with main after the speed test fixes
Flotapponnier Sep 30, 2026
fc27727
sync dev with main after the nav gate fix
Flotapponnier Sep 30, 2026
092b81d
the dashboard's agent numbers counted our own probes and missed every…
Flotapponnier Sep 30, 2026
e712f6a
sync dev with main after the Brave hint
Flotapponnier Sep 30, 2026
07c3f8c
every outbound link says it came from here (#2753)
Flotapponnier Sep 30, 2026
b245b67
rpc-cost: a dedicated node priced every chain tab, including ones it …
Flotapponnier Sep 30, 2026
ac59dff
a contact page, and the mailto stops being invisible (#2755)
Flotapponnier Oct 1, 2026
c978809
sync dev with main after the contact page
Flotapponnier Oct 1, 2026
ecc3396
a docs page, so the Docs group in the nav finally has one (#2757)
Flotapponnier Oct 1, 2026
b163ad3
/docs and /contact were the only two pages with no share card (#2760)
Flotapponnier Oct 1, 2026
4294bd3
/docs gets the methodology layout and a contents list (#2762)
Flotapponnier Oct 1, 2026
ca0bc42
the app directory needs a privacy policy and terms, and both were 404…
Flotapponnier Oct 1, 2026
d7a0778
the favicon told Google not to index it (#2771)
Flotapponnier Oct 1, 2026
b7eae06
an endpoint that answers 1 % of the time was published as absent (#2779)
Flotapponnier Oct 2, 2026
c4fbb9e
89 specs stated a count their own list contradicted (#2782)
Flotapponnier Oct 2, 2026
519a6c6
six chain RPC benches that nobody answers (#2784)
Flotapponnier Oct 2, 2026
b491e9c
/favicon.ico answered 404, the one path every crawler tries (#2787)
Flotapponnier Oct 2, 2026
73ef624
the sitemap expiry guard never fired, because the rows have no status…
Flotapponnier Oct 2, 2026
d330dd2
OKX's DEX feed is open after all, on a channel their docs do not ment…
Flotapponnier Oct 3, 2026
6ae0b65
the BNB column was measuring BNB's block time, not the providers (#2792)
Flotapponnier Oct 3, 2026
2c86b44
"1 token today" read as a surveyed field, when the screen had four ca…
Flotapponnier Oct 4, 2026
a9e0fb4
hyperliquid publishes a leaderboard whose own fields contradict each …
Flotapponnier Oct 4, 2026
591b0d2
Birdeye's trades socket was open the whole time, on a host their docs…
Flotapponnier Oct 4, 2026
d8fb936
the headline said Binance where the row measures Binance Wallet (#2803)
Flotapponnier Oct 4, 2026
f9343ef
one oversized URL stopped protocol-pf-ratio for 5.6 days, and it read…
Flotapponnier Oct 4, 2026
abf7716
bring bench 001 on dev up to what production runs (#2808)
Flotapponnier Oct 4, 2026
0d92ac2
port the race pool-scope fix to dev (#2810)
Flotapponnier Oct 4, 2026
f3cde8e
port the race follow-ups to dev (#2813)
Flotapponnier Oct 4, 2026
ce5b20d
port the Solana floor copy to dev (#2816)
Flotapponnier Oct 4, 2026
28b0b55
port the corrected race bullet to dev (#2818)
Flotapponnier Oct 5, 2026
a2fd50f
Hyperliquid has published half a day since 22 September and we summed…
Flotapponnier Oct 5, 2026
949e0a2
rpc-cost: the three findings the audit left standing (#2821)
Flotapponnier Oct 5, 2026
9232bfb
a cross-chain relayer was being counted as a DEX aggregator (#2823)
Flotapponnier Oct 6, 2026
a474d3a
port the deploy path filter to dev (#2825)
Flotapponnier Oct 6, 2026
8d2e54d
free plans tie at $0, so bench 282 was ranking them by their overage …
Flotapponnier Oct 6, 2026
3c3b85b
un-gate bench 283: the aliases it pins are live (#2827)
Flotapponnier Oct 6, 2026
5ad6445
bench 284: what eight models earn net of the asset they traded (#2829)
Flotapponnier Oct 6, 2026
d5d4ce8
five of bench 284's six ledger columns were querying a label that did…
Flotapponnier Oct 6, 2026
fd7559b
bench 284's panel queries matched two series each, so prom refused to…
Flotapponnier Oct 6, 2026
03d7e36
aggregate_filters cannot pin a dimension to "all", so pin it in the m…
Flotapponnier Oct 6, 2026
6235be3
tag the trading-agents hub cache so a worker publish reaches it (#2833)
Flotapponnier Oct 6, 2026
5135b73
the trading-agents meta description was 186 characters (#2834)
Flotapponnier Oct 6, 2026
7b76aee
the Solana tab was empty, because a workload already belongs to a cha…
Flotapponnier Oct 6, 2026
7d237e6
the free-tier board gave dRPC a Solana allowance three lines under th…
Flotapponnier Oct 6, 2026
32a9cc4
tag the bridge hub cache so a worker publish reaches it (#2836)
Flotapponnier Oct 6, 2026
1d7c512
a free allowance has no single value, so the board publishes the span…
Flotapponnier Oct 6, 2026
2bd285c
bench 284 ranked eight agents without saying the ranking means nothin…
Flotapponnier Oct 6, 2026
7b51b0f
a floating period after the t statistic (#2839)
Flotapponnier Oct 6, 2026
2454768
the Solana tab crowned the one row the catalogue refuses to rank (#2840)
Flotapponnier Oct 6, 2026
16932ba
bench 284 could not tell a retired arena from a running one (#2841)
Flotapponnier Oct 6, 2026
0bf009a
four benches came off Dune, and the method was the bug, not the vendo…
Flotapponnier Oct 7, 2026
128d159
I crowned pump.fun's zero take rate an hour ago and it does not hold …
Flotapponnier Oct 7, 2026
bf86fd2
the withheld cell still won the tab, because the gate answered the wr…
Flotapponnier Oct 7, 2026
7c37171
the widest spread on bench 284 is not the returns, it is how much the…
Flotapponnier Oct 7, 2026
cf6b2cd
two missing logos were two wrong slugs, and one of them hid Padre (#2…
Flotapponnier Oct 7, 2026
6b172b8
bench 284 called them frontier models without saying frontier of when…
Flotapponnier Oct 7, 2026
9be7674
the product links were right once the slugs were, and two had no page…
Flotapponnier Oct 7, 2026
9bcff78
the last bare chip: HyperEVM (#2849)
Flotapponnier Oct 7, 2026
24a87ea
bench 284 rendered a leaderboard while its own copy said not to read …
Flotapponnier Oct 7, 2026
0878301
release bench 284 and /trading-agents to production (#2851)
Flotapponnier Oct 7, 2026
42442fc
the four terminal benches go to production, two under honest slugs (#…
Flotapponnier Oct 7, 2026
df56c7d
two benches went public still telling readers they were Solana only (…
Flotapponnier Oct 7, 2026
cb23a2c
everything on /trading-apps reads one source now (#2857)
Flotapponnier Oct 7, 2026
8cb6cf7
ten chains into the rpc probe matrix: katana, superseed, tempo, 0g, n…
Flotapponnier Oct 7, 2026
92772a9
bench 205 stopped being a second measurement, so it stops being a sec…
Flotapponnier Oct 7, 2026
698ce08
ten new RPC benches: katana, superseed, tempo, 0g, neo x, tac, zigcha…
Flotapponnier Oct 7, 2026
0aa7b98
the FOMO card said "#1 on 23 of 11 benchmarks" (#2861)
Flotapponnier Oct 7, 2026
d9c78d8
the ten new chain logos were favicons, not SVGs (#2863)
Flotapponnier Oct 7, 2026
9f86639
the biggest day on /products was measuring feed coverage, not activit…
Flotapponnier Oct 7, 2026
38fa519
the coverage check was a max, so one late file hid a cut-off day (#2866)
Flotapponnier Oct 7, 2026
7391db8
the ten new RPC pages showed a blank chip for the chain's own endpoin…
Flotapponnier Oct 7, 2026
d4b05ff
measure the two endpoints the chains' own docs list and we did not (#…
Flotapponnier Oct 7, 2026
3629ddf
read whole Hyperliquid days off our own node instead of half ones off…
Flotapponnier Oct 7, 2026
fbd54cf
the window is mostly whole days now, so the page should stop shouting…
Flotapponnier Oct 7, 2026
696c126
tests for the fill reducer (#2875)
Flotapponnier Oct 7, 2026
64d514c
MetaMask's second builder address was documented and not counted (#2876)
Flotapponnier Oct 7, 2026
eadaf56
back out the MetaMask address merge on dev too (#2879)
Flotapponnier Oct 7, 2026
288f048
bench 201's slug promised Solana and the bench opens on all chains (#…
Flotapponnier Oct 7, 2026
e75ac08
the chart tooltip was sliced off at the top edge on the tallest bar (…
Flotapponnier Oct 8, 2026
adbac96
the product dashboard was still locked at 30d (#2884)
Flotapponnier Oct 8, 2026
701acac
version the snapshot keys, and stop the worker writing one by hand (#…
Flotapponnier Oct 8, 2026
8b0e30e
QuickNode was not on an enterprise tier and we said so on nine pages …
Flotapponnier Oct 8, 2026
5bb0de7
they gave us endpoints to benchmark, which is not sponsorship (#2890)
Flotapponnier Oct 8, 2026
8212352
keyed cohort: trace whether each probe reuses its connection (#2892)
Flotapponnier Oct 8, 2026
adda1a2
77 specs claimed the probe was non-cacheable by design. It is not. (#…
Flotapponnier Oct 8, 2026
f07eec8
GetBlock told us their endpoints are Enterprise and we wrote Starter …
Flotapponnier Oct 8, 2026
db4a3e4
port today's keyed work to dev, which is the branch the worker builds…
Flotapponnier Oct 8, 2026
efc17d4
port the connection priming and the cold-row logo aliases to dev (#2906)
Flotapponnier Oct 8, 2026
0cd6c2d
warm / cold belongs next to the numbers, not in the access row (#2907…
Flotapponnier Oct 8, 2026
d3ef59c
port the BUILD_REF cache breaker to dev (#2909)
Flotapponnier Oct 8, 2026
86edc2a
Chainstack sent their own mark, so use it (#2910)
Flotapponnier Oct 9, 2026
62b1de3
official URLs on product pages: 157 added, 30 repaired, 4 phantom pag…
Flotapponnier Oct 9, 2026
80ed623
unblock the deploy gate, drop the Blast link, rename XPLA to CONX (#2…
Flotapponnier Oct 9, 2026
139c9ea
the official link was there and nobody could see it (#2917)
Flotapponnier Oct 9, 2026
73555e4
the bench said seven relays and one of them no longer exists (#2919)
Flotapponnier Oct 9, 2026
58258bb
bench 025 has been measuring three oracles while saying four (#2920)
Flotapponnier Oct 9, 2026
57584a5
the cost board ranked five providers at $0 above its own leader (#2922)
Flotapponnier Oct 9, 2026
ff983aa
grade each oracle feed against its own published promise, not a unifo…
Flotapponnier Oct 9, 2026
c56ce58
bench 282 priced three volumes, and every reader is at a fourth (#2927)
Flotapponnier Oct 9, 2026
e72dccf
Ankr does serve Robinhood Chain, it just will not serve us (#2925)
Flotapponnier Oct 9, 2026
c2613ee
three answer pages recommend an endpoint that was switched off (#2926)
Flotapponnier Oct 9, 2026
0a96a58
Dwellir joins the private cohort on the eight EVM chains (#2928)
Flotapponnier Oct 9, 2026
9ca1420
Ethereum Classic was down to one provider because two endpoints had d…
Flotapponnier Oct 9, 2026
8fd792a
Ethereum Classic was down to one provider because two endpoints had d…
Flotapponnier Oct 9, 2026
ace675d
every logo is revalidated on every page view, and /capital has 158 of…
Flotapponnier Oct 9, 2026
e3dd32b
audit of benches 282 and 283 against the providers' own docs (#2930)
Flotapponnier Oct 9, 2026
994c7b8
five RPC pages were measuring endpoints that had stopped answering (#…
Flotapponnier Oct 9, 2026
71e34aa
3.5 MB of logos on one page, for circles drawn at 22 pixels (#2938)
Flotapponnier Oct 9, 2026
e49c261
a live harness cannot be rebuilt, and the data API hub links at three…
Flotapponnier Oct 9, 2026
0a678fd
two blank panels, OnFinality's published weights, and the last four l…
Flotapponnier Oct 10, 2026
e8a3260
freshness asked Prometheus 98 times per fill, now once (#2942)
Flotapponnier Oct 10, 2026
c2c1b2e
bench 283 names the two allowances it cannot verify (#2941)
Flotapponnier Oct 10, 2026
7bcf2c8
the break-even query could not parse, Best $0 held the strip, and a p…
Flotapponnier Oct 10, 2026
139a168
prod read hub snapshots from a store the worker never writes (#2945)
Flotapponnier Oct 11, 2026
77f1311
two endpoints went paid or rate-limited and the page rendered that as…
Flotapponnier Oct 11, 2026
e16678c
the BNB intro still credited two providers that were just removed (#2…
Flotapponnier Oct 11, 2026
9f18236
add Papertrade to the perp cohort, and leave it out of the volume ben…
Flotapponnier Oct 12, 2026
6434640
the worker kept ranking rows the harness had withdrawn, with no end d…
Flotapponnier Oct 12, 2026
5b4d90d
route Papertrade's other three metrics, not just volume (#2953)
Flotapponnier Oct 12, 2026
d6b85b4
Helius said its price was sales-gated, the free-tier panel was blank,…
Flotapponnier Oct 12, 2026
f70a199
two bench pages shipped 3,000 swaps to show 50, and the hub drew 104 …
Flotapponnier Oct 12, 2026
873c867
four-figure leverage says nothing without the room it leaves (#2958)
Flotapponnier Oct 12, 2026
cafb85d
bench 295 published Papertrade's buffer as its room, and had no lever…
Flotapponnier Oct 12, 2026
6f27dce
a reader's bug report goes to Telegram instead of a Slack channel (#2…
Flotapponnier Oct 12, 2026
8f636f8
the venue card normalized its slug for the link and not for the logo …
Flotapponnier Oct 12, 2026
410c281
the threshold says when a position closes, not how far price has to m…
Flotapponnier Oct 12, 2026
22ef8d0
no single fee rate holds a fee on the gain and a fee on notional, so …
Flotapponnier Oct 12, 2026
8132de9
the crawler's copy of the table claimed a 100% success rate on a benc…
Flotapponnier Oct 13, 2026
2419544
head-lag reads Serialized from its new stream engine (#2966)
Flotapponnier Oct 13, 2026
b6ff8f9
the cost tool stated the crossover in a sentence; now it draws it (#2…
Flotapponnier Oct 13, 2026
347a4a8
Blast is shutting down, and leaves every bench it was on (#2971)
Flotapponnier Oct 13, 2026
7c3a954
the sitemap listed chains a bench had dropped until the worker caught…
Flotapponnier Oct 13, 2026
34b2c57
/products/blast answers 410 now that the chain left every bench (#2975)
Flotapponnier Oct 13, 2026
5a3fa1b
every disk signal on the HL node box watched the volume that was fine…
Flotapponnier Oct 13, 2026
6ddd51e
Validation Cloud joins the keyed RPC cohort on the six chains it serv…
Flotapponnier Oct 14, 2026
d24d99c
Validation Cloud reports Singapore on Robinhood and Arc too, like the…
Flotapponnier Oct 14, 2026
b41f2ef
the cold-start arm reaches /rpc, and dwellir-cold stops being a page …
Flotapponnier Oct 14, 2026
41dfdea
Validation Cloud on its last three chains, and the prose finally name…
Flotapponnier Oct 14, 2026
239c6a4
a probe can lie about which continent it is on, and nothing noticed f…
Flotapponnier Oct 14, 2026
649c818
a WebSocket bench per chain for the keyed cohort, racing providers on…
Flotapponnier Oct 15, 2026
19294fb
head-lag: a stalled Serialized socket was scored as 100 s of provider…
Flotapponnier Oct 15, 2026
9aeb4cd
head-lag: Serialized can read its own monitor lines at /logs/serializ…
Flotapponnier Oct 15, 2026
575f4b3
WebSocket cohort to 66 cells, and Validation Cloud's plan is disclose…
Flotapponnier Oct 15, 2026
24877db
Alchemy leaves the WebSocket benches: we were spending its account, n…
Flotapponnier Oct 15, 2026
e02ac72
bench 016 solana-tx-landing is back, with a wallet list that was wron…
Flotapponnier Oct 15, 2026
f1e87dd
the WebSocket race reaches /rpc, as a fourth cohort and not a fourth …
Flotapponnier Oct 15, 2026
f3835cb
the Archive column leaves the three cohorts that never measured it (#…
Flotapponnier Oct 16, 2026
75a0e29
rpc-cost: Dwellir is priced, Instanodes leaves, Validation Cloud is o…
Flotapponnier Oct 16, 2026
df3fa75
products: the five bench-282 plan slugs fold into their vendor's page…
Flotapponnier Oct 16, 2026
1e37aa2
/rpc can be read one region at a time, which is what the board was fo…
Flotapponnier Oct 16, 2026
d11bdc7
arc and robinhood publish their Singapore cells, and stop calling a (…
Flotapponnier Oct 16, 2026
b3ac9de
rpc-cost opens on one slider and an archive checkbox (#3000)
Flotapponnier Oct 16, 2026
e40fcb0
record the p95, which was missing for no reason at all (#3001)
Flotapponnier Oct 16, 2026
7443478
rpc-cost: the calculator gets a chart and clickable rows; AWS and Goo…
Flotapponnier Oct 16, 2026
425c6eb
the p95 reaches /rpc, per edge location, and the tails stop being (#3…
Flotapponnier Oct 16, 2026
b2c6a2e
both rpc-hub cache keys move for the p95 shape (#3004)
Flotapponnier Oct 16, 2026
ef7840b
the block-push arm gets its p95, which costs one line per provider (#…
Flotapponnier Oct 16, 2026
1515c96
rpc-cost audit fixes: per-workload grid, honest copy, panel carry gua…
Flotapponnier Oct 16, 2026
03af352
rpc-cost: the nine drifting pricing artifacts re-read (#3007)
Flotapponnier Oct 16, 2026
00ff87e
rpc-cost audit round 2: no rank for the reference cohort, unverified …
Flotapponnier Oct 16, 2026
c9e4c20
the Geo selector moves into the table's own header bar (#3009)
Flotapponnier Oct 16, 2026
da1ca1e
rpc-cost: calculator without the chart, three missing logos, audit ro…
Flotapponnier Oct 16, 2026
4ff6c11
the Errors column was empty because `tier` was being summed away (#3011)
Flotapponnier Oct 16, 2026
9755c50
a day the node cannot replay can be rebuilt, and must not then read a…
Flotapponnier Oct 16, 2026
b54acc2
port to dev: bench 282 is ungated (released to main in #3012) (#3013)
Flotapponnier Oct 16, 2026
40a6ebe
the WebSocket cohort stops hiding, stops reading as broken, and start…
Flotapponnier Oct 16, 2026
9fcc6d2
the 0 ms was 0.3 ms, rounded away (#3015)
Flotapponnier Oct 16, 2026
fc98648
the speedtest knew what was wrong and whispered it (#3016)
Flotapponnier Oct 16, 2026
058b572
the speedtest warned about Brave Shields while running fine in Brave …
Flotapponnier Oct 16, 2026
461bb13
the WebSocket arm goes from 138 million messages a month to about six…
Flotapponnier Oct 17, 2026
150739d
port main's MCP and privacy work to dev, before a merge can undo it (…
Flotapponnier Oct 17, 2026
f2fcc64
catch dev up with main, so the release is a fast-forward and not a fight
Flotapponnier Oct 17, 2026
621b513
Merge pull request #3020 from ChainBench/release/catch-up-with-main
Flotapponnier Oct 17, 2026
227be6e
two release pages shipped 62 characters of a 155 character snippet (#…
Flotapponnier Oct 17, 2026
915ce62
the two release blockers the SEO audit found: a headline the page dis…
Flotapponnier Oct 17, 2026
2341cb3
the audit's remaining majors, and the minors that were about truth (#…
Flotapponnier Oct 17, 2026
05685ac
the second audit round: a provider that never connects, a socket that…
Flotapponnier Oct 17, 2026
f9dcb22
a take rate measured on 0.003% of the volume printed beside it (#3027)
Flotapponnier Oct 17, 2026
43ab72f
Add Route (Robinhood Chain) to evm-quote-latency and token-quote-cove…
micahalp Oct 17, 2026
bf5841b
terminal-activity: a 63.9% take rate is a misattribution, not a price…
Flotapponnier Oct 17, 2026
088f6aa
terminal-activity: the same 63.9% was on a second board, via the wind…
Flotapponnier Oct 17, 2026
b3db27a
Route gets its mark and its product page content (#3031)
Flotapponnier Oct 18, 2026
90da41d
evm-quote-latency: the region selector the page already promised (#3032)
Flotapponnier Oct 18, 2026
d1c1d7f
Catch up dev with main, so the release PR is mergeable again
Flotapponnier Oct 18, 2026
e240d2f
Merge pull request #3033 from ChainBench/chore/catch-up-main
Flotapponnier Oct 18, 2026
437e60b
Drop Validation Cloud from the keyed cohort: every probe returns 401 …
Flotapponnier Oct 18, 2026
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
14 changes: 12 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,18 @@
# Leave unset locally — the spec files already embed their URL.
# PROMETHEUS_URL=https://prometheus-production-0859.up.railway.app

# Optional. Slack incoming webhook for the /api/report bug-report route.
# When unset the route silently no-ops.
# Where /api/report delivers a reader's bug report. Telegram is tried first
# and Slack is the fallback; with neither set the route answers 503 and the
# form says reporting is not configured.
#
# TELEGRAM_CHAT_ID is the destination, not the bot: send the bot any message,
# then read it from
# https://api.telegram.org/bot<token>/getUpdates -> result[].message.chat.id
# A personal chat id is a positive integer; a group's is negative.
# TELEGRAM_BOT_TOKEN=123456:AA...
# TELEGRAM_CHAT_ID=123456789
#
# Legacy. Still honoured when Telegram is unset.
# SLACK_REPORT_WEBHOOK_URL=https://hooks.slack.com/services/...

# Optional. Live-page WebSocket relay. Public (NEXT_PUBLIC_) so it's baked
Expand Down
19 changes: 15 additions & 4 deletions benchmarks/arbitrum-rpc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
slug: arbitrum-rpc
number: "045"
title: "Arbitrum RPC endpoints: free public URLs and private API-key providers by latency"
seo_title: "Arbitrum RPC endpoints: public and private, ranked by latency"
seo_title: "Arbitrum RPC endpoints: public and private, by latency"
seo_description: "{{best_name}} leads free Arbitrum RPC at {{best_p50}} (p50, 24h); URLs for all {{count}} no-key endpoints. {{best_name:tier:keyed}} leads the private (API-key) cohort at {{best_p50:tier:keyed}}."
subtitle: HTTP round-trip latency for eth_getBlockByNumber against every free, no-key public Arbitrum RPC endpoint (probed every 60 seconds) and, under the Access selector (Private), against the API-key endpoints of Alchemy, Chainstack, GetBlock and QuickNode (every 120 seconds), from 3 regions. The two cohorts are ranked separately, never against each other.
subtitle: HTTP round-trip latency for eth_getBlockByNumber against every free, no-key public Arbitrum RPC endpoint (probed every 60 seconds) and, under the Access selector (Private), against the API-key endpoints of Alchemy, Chainstack, GetBlock, QuickNode and Dwellir (every 120 seconds), from 3 regions. The two cohorts are ranked separately, never against each other.

category: RPCs
status: live
Expand All @@ -17,15 +17,15 @@ seo_intro: |
Arbitrum is the second-largest cohort in the cluster: {{count}} no-key providers including the Arbitrum Foundation's own `arb1.arbitrum.io/rpc`, and one of the few chains where Lava and MeowRPC still compete on a free tier. Foundation endpoints are documented best-effort, and our data shows what that means in practice: a median of {{p50:arbitrum-official}} with a p99 of {{p99:arbitrum-official}} over the last 24 hours. Every provider answers the identical `eth_getBlockByNumber` probe every 60 seconds from us-east, eu-west and Singapore.

abstract: |
Arbitrum: {{count}} free public RPC endpoints answering `eth_getBlockByNumber` every 60 seconds from us-east, eu-west and Singapore, ranked by 24h median. {{best_name}} leads at {{best_p50}}; the chain-official endpoint measures {{p50:arbitrum-official}}. The same page carries the private cohort (API key), Alchemy, Chainstack, GetBlock and QuickNode on their keyed Arbitrum endpoints every 120 seconds: switch the Access selector; {{best_name:tier:keyed}} leads it at {{best_p50:tier:keyed}}.
Arbitrum: {{count}} free public RPC endpoints answering `eth_getBlockByNumber` every 60 seconds from us-east, eu-west and Singapore, ranked by 24h median. {{best_name}} leads at {{best_p50}}; the chain-official endpoint measures {{p50:arbitrum-official}}. The same page carries the private cohort (API key), Alchemy, Chainstack, GetBlock, QuickNode and Dwellir on their keyed Arbitrum endpoints every 120 seconds: switch the Access selector; {{best_name:tier:keyed}} leads it at {{best_p50:tier:keyed}}.
We measure the round-trip latency of a single, identical RPC call (`eth_getBlockByNumber`) against every no-key public Arbitrum endpoint that sustains continuous probing, {{count}} providers, every 60 seconds, from us-east, eu-west and Singapore. The harness also classifies every response (ok / http_err / jsonrpc_err / stale / timeout) and audits archive depth every 5 minutes, so the leaderboard rewards sustained, honest availability rather than a fast error message. The cross-chain view lives on the parent rpc-capabilities benchmark; this page is the Arbitrum-scoped answer with per-region breakdowns as a first-class dimension.

methodology:
- "Cadence: every 60 seconds per provider, from each of 3 probe regions (us-east Virginia, eu-west Amsterdam, sgp Singapore). Headline p50/p90/p99 aggregate across all 3 regions via Prometheus `avg(quantile_over_time(...))`; per-region breakdowns are first-class on this page via the region tabs."
- "Payload: `{\"jsonrpc\":\"2.0\",\"id\":<rotating>,\"method\":\"eth_getBlockByNumber\",\"params\":[\"latest\",false]}`. Plain HTTP POST, identical for every endpoint, no API key in any request. The request id rotates, but that does not guarantee a cache miss: many caches normalise `id` away. Measured 2026-10-08, fixed and rotating ids answer within 2 to 4 percent of each other."
- "Latency measurement, call-result classification (`ok`, `http_err`, `jsonrpc_err`, `stale`, `timeout`) and the archive-depth audit follow the cluster method documented on [rpc-capabilities](https://openchainbench.com/benchmarks/rpc-capabilities#methodology); this page is the Arbitrum-scoped view of the same harness, with the same exclusion rules."
- "Chain scope: every query on this page is pinned to chain=\"arbitrum\". Provider coverage: {{count}} no-key public-read endpoints live today, each listed with its URL in the endpoints table on this page. Exclusions follow the cluster-wide rules documented on the parent benchmark."
- "Private cohort (Access selector, Private): Alchemy, Chainstack, GetBlock and QuickNode probed on their keyed Arbitrum endpoints every 120 seconds from the same 3 regions, same call (eth_getBlockByNumber, rotating id), same ok / http_err / jsonrpc_err / stale / timeout classification."
- "Private cohort (Access selector, Private): Alchemy, Chainstack, GetBlock, QuickNode and Dwellir probed on their keyed Arbitrum endpoints every 120 seconds from the same 3 regions, same call (eth_getBlockByNumber, rotating id), same ok / http_err / jsonrpc_err / stale / timeout classification."
- "Keys live in the probe environment, never in the repo. Plan tiers, disclosed: Alchemy: a Free plan key (30M CU per month, 300 compute units per second), the tier any reader gets; Alchemy states free and paid keys share one routing; Chainstack: a Global Node on the Growth plan; QuickNode: an endpoint on a Build plan ($49 per month), shared fleet; GetBlock: an endpoint on the Enterprise plan, shared by the three probe regions. Chainstack, GetBlock and QuickNode provided their endpoints."
- "Dwellir plan tier, disclosed: a Developer plan key ($49 per month, 25 million API responses, 100 responses per second; 1 RPC response = 1 API credit, no compute units). Shared nodes, the same product a reader buys. Dwellir publishes no Solana endpoint, so it is absent from that page rather than shown as unavailable."
- "GetBlock regional pairing: each probe region uses GetBlock's nearest endpoint, us-east to New York, eu-west to Frankfurt, sgp to Singapore. Alchemy, Chainstack and QuickNode publish one routed entry point per chain instead, which in the general case does land a probe on a nearby node. Some of any gap between the two arrangements is deployment topology rather than node speed, and a deployment in one of these regions would see the same benefit GetBlock's endpoint gives the probe."
Expand Down Expand Up @@ -252,6 +252,7 @@ providers:
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="alchemy",chain="arbitrum",tier="keyed"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="alchemy",chain="arbitrum",tier="keyed"})
p95: avg(ocb:rpc_latency_milliseconds:p95_24h{provider="alchemy",chain="arbitrum",tier="keyed"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="alchemy",chain="arbitrum",tier="keyed"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="alchemy",chain="arbitrum",tier="keyed"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="alchemy",chain="arbitrum",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="alchemy",chain="arbitrum",tier="keyed"})
Expand All @@ -276,6 +277,7 @@ providers:
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="chainstack",chain="arbitrum",tier="keyed"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="chainstack",chain="arbitrum",tier="keyed"})
p95: avg(ocb:rpc_latency_milliseconds:p95_24h{provider="chainstack",chain="arbitrum",tier="keyed"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="chainstack",chain="arbitrum",tier="keyed"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="chainstack",chain="arbitrum",tier="keyed"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="chainstack",chain="arbitrum",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="chainstack",chain="arbitrum",tier="keyed"})
Expand All @@ -300,6 +302,7 @@ providers:
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="getblock",chain="arbitrum",tier="keyed"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="getblock",chain="arbitrum",tier="keyed"})
p95: avg(ocb:rpc_latency_milliseconds:p95_24h{provider="getblock",chain="arbitrum",tier="keyed"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="getblock",chain="arbitrum",tier="keyed"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="getblock",chain="arbitrum",tier="keyed"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="getblock",chain="arbitrum",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="getblock",chain="arbitrum",tier="keyed"})
Expand All @@ -324,6 +327,7 @@ providers:
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="quicknode",chain="arbitrum",tier="keyed"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="quicknode",chain="arbitrum",tier="keyed"})
p95: avg(ocb:rpc_latency_milliseconds:p95_24h{provider="quicknode",chain="arbitrum",tier="keyed"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="quicknode",chain="arbitrum",tier="keyed"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="quicknode",chain="arbitrum",tier="keyed"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="quicknode",chain="arbitrum",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="quicknode",chain="arbitrum",tier="keyed"})
Expand All @@ -348,6 +352,7 @@ providers:
queries:
p50: avg(ocb:rpc_latency_milliseconds:p50_24h{provider="dwellir",chain="arbitrum",tier="keyed"})
p90: avg(ocb:rpc_latency_milliseconds:p90_24h{provider="dwellir",chain="arbitrum",tier="keyed"})
p95: avg(ocb:rpc_latency_milliseconds:p95_24h{provider="dwellir",chain="arbitrum",tier="keyed"})
p99: avg(ocb:rpc_latency_milliseconds:p99_24h{provider="dwellir",chain="arbitrum",tier="keyed"})
mean: avg(ocb:rpc_latency_milliseconds:mean_24h{provider="dwellir",chain="arbitrum",tier="keyed"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir",chain="arbitrum",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir",chain="arbitrum",tier="keyed"})
Expand All @@ -372,6 +377,7 @@ providers:
queries:
p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="alchemy",chain="arbitrum",tier="keyed"})
p90: avg(ocb:rpc_latency_cold_milliseconds:p90_24h{provider="alchemy",chain="arbitrum",tier="keyed"})
p95: avg(ocb:rpc_latency_cold_milliseconds:p95_24h{provider="alchemy",chain="arbitrum",tier="keyed"})
p99: avg(ocb:rpc_latency_cold_milliseconds:p99_24h{provider="alchemy",chain="arbitrum",tier="keyed"})
mean: avg(ocb:rpc_latency_cold_milliseconds:mean_24h{provider="alchemy",chain="arbitrum",tier="keyed"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="alchemy",chain="arbitrum",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="alchemy",chain="arbitrum",tier="keyed"})
Expand All @@ -395,6 +401,7 @@ providers:
queries:
p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="chainstack",chain="arbitrum",tier="keyed"})
p90: avg(ocb:rpc_latency_cold_milliseconds:p90_24h{provider="chainstack",chain="arbitrum",tier="keyed"})
p95: avg(ocb:rpc_latency_cold_milliseconds:p95_24h{provider="chainstack",chain="arbitrum",tier="keyed"})
p99: avg(ocb:rpc_latency_cold_milliseconds:p99_24h{provider="chainstack",chain="arbitrum",tier="keyed"})
mean: avg(ocb:rpc_latency_cold_milliseconds:mean_24h{provider="chainstack",chain="arbitrum",tier="keyed"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="chainstack",chain="arbitrum",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="chainstack",chain="arbitrum",tier="keyed"})
Expand All @@ -418,6 +425,7 @@ providers:
queries:
p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="getblock",chain="arbitrum",tier="keyed"})
p90: avg(ocb:rpc_latency_cold_milliseconds:p90_24h{provider="getblock",chain="arbitrum",tier="keyed"})
p95: avg(ocb:rpc_latency_cold_milliseconds:p95_24h{provider="getblock",chain="arbitrum",tier="keyed"})
p99: avg(ocb:rpc_latency_cold_milliseconds:p99_24h{provider="getblock",chain="arbitrum",tier="keyed"})
mean: avg(ocb:rpc_latency_cold_milliseconds:mean_24h{provider="getblock",chain="arbitrum",tier="keyed"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="getblock",chain="arbitrum",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="getblock",chain="arbitrum",tier="keyed"})
Expand All @@ -441,6 +449,7 @@ providers:
queries:
p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="quicknode",chain="arbitrum",tier="keyed"})
p90: avg(ocb:rpc_latency_cold_milliseconds:p90_24h{provider="quicknode",chain="arbitrum",tier="keyed"})
p95: avg(ocb:rpc_latency_cold_milliseconds:p95_24h{provider="quicknode",chain="arbitrum",tier="keyed"})
p99: avg(ocb:rpc_latency_cold_milliseconds:p99_24h{provider="quicknode",chain="arbitrum",tier="keyed"})
mean: avg(ocb:rpc_latency_cold_milliseconds:mean_24h{provider="quicknode",chain="arbitrum",tier="keyed"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="quicknode",chain="arbitrum",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="quicknode",chain="arbitrum",tier="keyed"})
Expand All @@ -464,6 +473,7 @@ providers:
queries:
p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="arbitrum",tier="keyed"})
p90: avg(ocb:rpc_latency_cold_milliseconds:p90_24h{provider="dwellir",chain="arbitrum",tier="keyed"})
p95: avg(ocb:rpc_latency_cold_milliseconds:p95_24h{provider="dwellir",chain="arbitrum",tier="keyed"})
p99: avg(ocb:rpc_latency_cold_milliseconds:p99_24h{provider="dwellir",chain="arbitrum",tier="keyed"})
mean: avg(ocb:rpc_latency_cold_milliseconds:mean_24h{provider="dwellir",chain="arbitrum",tier="keyed"})
success: sum(ocb:rpc_call:ok_rate_24h{provider="dwellir",chain="arbitrum",tier="keyed"}) / sum(ocb:rpc_call:rate_24h{provider="dwellir",chain="arbitrum",tier="keyed"})
Expand All @@ -479,3 +489,4 @@ providers:
- region: ap-southeast
p50: avg(ocb:rpc_latency_cold_milliseconds:p50_24h{provider="dwellir",chain="arbitrum",tier="keyed",region="sgp"})
series: avg(avg_over_time(rpc_latency_cold_milliseconds{provider="dwellir",chain="arbitrum",tier="keyed",region="sgp"}[1h]))

Loading
Loading