We Tested 945 Public RPC Endpoints. Half Don't Work.
Public RPC lists are how most developers find an endpoint: open Chainlist, copy the first URL, paste it into a config. The lists tell you an endpoint was added at some point. They do not tell you whether it works today.
So we tested all of them. On 2026-09-24 we took every keyless endpoint listed on Chainlist and chainid.network for the 65 EVM chains we serve (945 third-party URLs: 800 HTTP and 145 WebSocket) and ran the same checks against each one. 395 of the 800 HTTP endpoints answered correctly: 49.4%. Of the 145 WebSocket endpoints, 76 actually streamed a new block: 52.4%.
The full results, endpoint by endpoint, are on our public RPC leaderboard, re-run every week.
How we tested
Every HTTP endpoint got the same sequence:
eth_chainId, which must return the chain the list says it serves.eth_blockNumberthree times, for median latency and the head.- How far that head trails the best head seen for the chain in the same run.
eth_getLogsover 1,000 and then 10,000 blocks, filtered to one address.eth_getBalance128 and 1,000,000 blocks back, to see how much history it keeps.
Every WebSocket endpoint: eth_chainId, then eth_subscribe("newHeads"), and it passes only if a new block actually arrives within 15 seconds. On chains that produce blocks less often than that, an accepted subscription with no block yet is counted as inconclusive, not as a failure.
A few things to keep in mind about the numbers:
- One server, one run. Latency is from a single location. Head lag, limits and pass/fail are not location-dependent in the same way, but a flaky endpoint can pass one day and fail the next.
- Rate limits count as failures only after backoff. Calls are paced, and a rate-limited call is retried three times with increasing waits before we give up. 98 endpoints still refused. A client sending a request every few seconds might get through where our test did not; a real application under load will not.
- Our own endpoint is excluded from these totals. It is on the leaderboard, labelled, and measured in a separate pass (details at the end).
Why half of them fail
For the 405 HTTP endpoints that did not pass:
| Failure | Endpoints |
|---|---|
| Unreachable: DNS, TLS or connection refused | 111 |
| Rate limited, even after backoff | 98 |
| Other HTTP 4xx responses | 56 |
| HTTP 5xx and other server errors | 30 |
Answered eth_chainId, then failed eth_blockNumber |
25 |
| Monthly or daily usage limit already reached | 19 |
| Provider discontinued ("Blast API is no longer available") | 13 |
| Timeout | 13 |
| Other (invalid key, auth required, empty responses) | 40 |
The biggest groups tell a simple story: lists outlive endpoints. Domains lapse, providers shut down or move their free tier behind a signup, and the list entry stays. Thirteen URLs from one discontinued provider are still listed across chains. Others now answer "API key required", "invalid API key" or a usage-limit message, which is a reasonable business decision for the provider but a broken entry for anyone who copied it.
"Working" is not the same as "usable"
Of the 395 endpoints that answered correctly:
| Check | Result |
|---|---|
| Head within 3 blocks of the best | 201 (51%) |
| More than 100 blocks behind | 11 |
| Worst lag | 4,375,016 blocks behind |
eth_getLogs over 10,000 blocks accepted |
160 |
| Refused even 1,000 blocks | 164 |
| State readable 1,000,000 blocks back (archive depth) | 214 |
| No historical state at all (not even 128 blocks) | 110 |
| Median latency | 49 ms (p90: 172 ms) |
The lag numbers matter most, because a lagging node does not fail — it answers, confidently, with old data. An endpoint 4.4 million blocks behind returns a perfectly valid block number; it is just from long ago. If you read balances or wait for confirmations through a node like that, your application is wrong without any error to tell you so. Always compare eth_blockNumber against a second source, or check the latest block's timestamp against the clock.
The eth_getLogs split is the other trap. Two in five working endpoints (164 of 395) refuse a 1,000-block log query, which is small for any indexer or backfill. If your code was written against a generous endpoint and falls back to a stricter one, it will start failing with range errors you never saw in development.
WebSockets are worse than they look
Only 76 of 145 WebSocket endpoints delivered a block. Another 9 accepted the subscription on slow chains (Metis, Arbitrum Nova, HAQQ, Syscoin, Rootstock) that produced no block inside the window, so we count them as inconclusive. The other 60 failed:
| WebSocket failure | Endpoints |
|---|---|
| Could not connect, or timed out | 40 |
| Subscription rejected ("not available on free plan", "unsupported subscription") | 14 |
| Subscription accepted, then no block delivered (on chains with frequent blocks) | 4 |
| Other (chain ID errors) | 2 |
The rejected and silent groups are why "the socket connected" proves nothing. An endpoint can complete the handshake, answer eth_blockNumber, accept your subscription with a valid ID, and then send nothing. Your application sees a healthy connection and waits forever. The only real test is a delivered event. We covered the client-side pattern for this in reconnecting without losing events, and the specific errors are in eth_subscribe errors explained.
Which endpoints held up
Some providers' public endpoints passed nearly everywhere they are listed. Counting HTTP endpoints that answered correctly out of those listed:
| Provider | Working / listed |
|---|---|
| dRPC | 50 / 51 |
| PublicNode | 29 / 29 |
| Pocket Network | 26 / 27 |
| Sentio | 24 / 24 |
These are free, keyless endpoints, and they deserve credit for staying up across dozens of chains. They still come with the usual public-endpoint limits: per-IP rate limits, tight eth_getLogs caps on some chains, and shared capacity. For WebSocket, PublicNode streamed on 18 of 27 and Pocket Network on 13 of 15.
How to pick a public endpoint
Based on what failed:
- Test before you trust the list. Our RPC tester runs these checks on any endpoint from your browser: chain ID, head lag,
eth_getLogsrange, archive depth and whether its WebSocket really streams. - Check freshness, not just liveness. A lagging node is worse than a dead one because it fails silently.
- Configure two endpoints, not one. Most failures above are permanent (dead domains, discontinued providers), but rate limits are not, and a second endpoint turns an outage into a retry.
- Match the endpoint to the job. A wallet reading the latest balance can use almost any working endpoint. An indexer needs a generous
eth_getLogsrange and historical state; that eliminates most of the list. - Re-check periodically. Every failing entry here was added to a list by someone, presumably when it worked. Endpoints decay; the list does not update itself.
Our own endpoint, measured the same way
We ran our keyless endpoint through the same checks in a separate pass, so our rate limiter did not collide with the rest of the test. It answered correctly on 63 of 65 chains over HTTP. Over WebSocket it streamed on 45 of 65. On the other 20, either we have no WebSocket upstream for that chain or the subscription did not deliver during the test; each chain page shows our current measured WebSocket status rather than a blanket claim. Our keyless and free tiers are limited to 2 requests per second; paid plans start at 50.
The per-chain pages list every endpoint with its latency, lag, limits and WebSocket result, ours included. For example: Ethereum (33 of 80 listed HTTP endpoints working), Base (15 of 36) and BNB Smart Chain (36 of 47).
For what free endpoints can and cannot do at the plan level, see free RPC endpoints and their real limits and public RPC vs paid RPC. If you want one key that works across 86 chains with the limits published and measured, SwiftNodes has a free tier.
John Sullivan covers RPC infrastructure, node operations, and multi-chain development at SwiftNodes — what it actually takes to keep endpoints fast, fresh, and reliable across EVM and non-EVM networks.
Related posts
- Dedicated Node vs Shared RPC: When You Actually Need One
What a dedicated blockchain node buys you over a shared RPC endpoint, what it costs in 2026 (from $1,000/mo on GetBlock, ~$1,279/mo for Ethereum on Chainstack, custom quotes elsewhere), and the four signals that mean you need one.
- Public RPC vs Paid RPC: Latency, Reliability, and Limits
Free public RPC endpoints are perfect for learning and prototyping — and a liability in production. Here's the honest breakdown of where public RPC bites you (rate limits, downtime, deprecation, stale blocks, missing methods) and when paying for an endpoint actually earns its keep.
- Free RPC Endpoints in 2026: What 'Free' Actually Gets You
Public endpoints, provider free tiers, keyless access — 'free RPC' covers four very different deals with very different failure modes. A field guide to the real limits, from someone who operates against all of them.