{"id":3560,"date":"2026-09-28T15:34:34","date_gmt":"2026-09-28T15:34:34","guid":{"rendered":"https:\/\/nownodes.io\/blog\/?p=3560"},"modified":"2026-09-28T15:34:35","modified_gmt":"2026-09-28T15:34:35","slug":"low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check","status":"publish","type":"post","link":"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/","title":{"rendered":"Low-Latency WebSocket RPC for Ethereum and Solana: How It Works and What to Check"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A WebSocket connection keeps one channel open between your app and a blockchain endpoint, so the endpoint pushes new blocks, logs and account changes to you instead of waiting to be asked. HTTP polling works the other way round: your code asks every few seconds and mostly hears &#8220;nothing new.&#8221; For anything that has to react to a new Ethereum block or Solana slot, a persistent connection is the standard tool, and it is what people mean when they search for low-latency WebSocket RPC for Ethereum and Solana.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Speed is only half the question, though. The most reliable WebSocket RPC for production is the one that keeps delivering after a drop, and reliability here depends on how you reconnect and backfill as much as on the provider. This guide covers how the protocol differs from HTTP, which subscriptions each chain offers, what drives delay, how providers compare on documented limits, and how to test one before you depend on it.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"what-is-a-wss-endpoint-and-how-does-it-differ-from-requestresponse-access\">What Is a WSS Endpoint and How Does It Differ From Request-Response Access?<\/h2>\n\n\n<p class=\"wp-block-paragraph\">A WSS endpoint is a <code>wss:\/\/<\/code> address that upgrades a normal web connection into a long-lived, two-way channel. Once it is open, the client sends JSON-RPC requests and the node sends notifications back on the same connection, without a new handshake each time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">NOWNodes documents the split plainly: <a href=\"https:\/\/docs.nownodes.io\/websocket-wss-api\">HTTP RPC processes each request independently and the client must poll, while WSS keeps a continuous connection and pushes events when they occur<\/a>. The trade-off is state. Subscriptions live on the connection, so they need more care than a stateless request.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><\/th><th>HTTP RPC<\/th><th>WebSocket (WSS)<\/th><\/tr><\/thead><tbody><tr><td>Connection model<\/td><td>New request per call<\/td><td>One persistent connection<\/td><\/tr><tr><td>Who starts a message<\/td><td>Always the client<\/td><td>Client or node<\/td><\/tr><tr><td>Typical use<\/td><td>Reads, one-off calls, sending transactions<\/td><td>Live blocks, logs, account changes<\/td><\/tr><tr><td>Failure mode<\/td><td>A failed request is retried<\/td><td>A dropped connection silently ends every subscription<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The last row matters most in production, and the second half of this guide returns to it. A dropped socket does not raise an error on its own; it just goes quiet.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"who-needs-realtime-subscriptions\">Who Needs Real-Time Subscriptions?<\/h2>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/09\/image-62-1024x683.png\" alt=\"\" class=\"wp-image-3562\" srcset=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/09\/image-62-1024x683.png 1024w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/09\/image-62-300x200.png 300w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/09\/image-62-768x512.png 768w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/09\/image-62.png 1536w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Four groups account for most WebSocket traffic: wallets, monitoring and analytics tools, trading and MEV bots, and event-driven backends. Each uses the feed for a different reason.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Wallets and notification services<\/strong> update balances and alert users when a transfer confirms, without polling every address.<\/li>\n\n\n\n<li><strong>Monitoring and analytics tools<\/strong> follow block production and aggregate confirmed transactions as they land.<\/li>\n\n\n\n<li><strong>Trading and MEV bots<\/strong> act on new blocks, pending transactions or account changes, where seconds decide the outcome.<\/li>\n\n\n\n<li><strong>Event-driven backends<\/strong> run a job when a contract emits a specific log, such as a deposit or a liquidation.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Bots are the audience for whom timing is a hard requirement rather than a convenience. Geth&#8217;s own documentation is direct about what subscriptions are and are not for: <a href=\"https:\/\/geth.ethereum.org\/docs\/interacting-with-geth\/rpc\/pubsub\" rel=\"nofollow noopener noreferrer\">notifications are sent for current events and not for past events, so use cases that cannot afford to miss any notifications are probably not well served by subscriptions alone<\/a>. That sentence, from the go-ethereum authors, shapes the production design covered below.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"which-subscriptions-does-each-chain-offer\">Which Subscriptions Does Each Chain Offer?<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Ethereum exposes three main streams through <code>eth_subscribe<\/code>, and Solana exposes a separate family of <code>*Subscribe<\/code> methods. They are not interchangeable, and neither chain&#8217;s methods work on the other.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"ethereum-ethsubscribe\">Ethereum: <code>eth_subscribe<\/code><\/h3>\n\n\n<p class=\"wp-block-paragraph\">Ethereum&#8217;s subscription API is defined in the <a href=\"https:\/\/geth.ethereum.org\/docs\/interacting-with-geth\/rpc\/pubsub\" rel=\"nofollow noopener noreferrer\">go-ethereum documentation<\/a>. The three types most apps use are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>newHeads<\/code><\/strong> fires each time a new block header is appended to the chain, including during reorganizations, so one height can produce more than one header.<\/li>\n\n\n\n<li><strong><code>logs<\/code><\/strong> returns logs from newly imported blocks that match an address and topic filter. After a reorganization, logs on the old chain are resent with <code>removed: true<\/code>, which your code must treat as a retraction.<\/li>\n\n\n\n<li><strong><code>newPendingTransactions<\/code><\/strong> streams transactions entering the pending pool, before they are in a block.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Two of these have dedicated guides on this blog: <a href=\"https:\/\/nownodes.io\/blog\/how-to-fetch-smart-contract-events-using-the-ethereum-blockchain-api\">contract event logs<\/a> and <a href=\"https:\/\/nownodes.io\/blog\/how-to-access-ethereum-mempool\">the Ethereum mempool<\/a>. The Ethereum execution API specification also lists <code>eth_subscribe<\/code> and confirms that <a href=\"https:\/\/ethereum.github.io\/execution-apis\/next\/api\/methods\/eth_subscribe\" rel=\"nofollow noopener noreferrer\">removed logs are pushed with <code>removed: true<\/code><\/a>.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"solana-pubsub-methods-and-commitment\">Solana: PubSub methods and commitment<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Solana&#8217;s <a href=\"https:\/\/solana.com\/docs\/rpc\/websocket\" rel=\"nofollow noopener noreferrer\">RPC WebSocket reference<\/a> lists the native methods. Three cover most needs:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>accountSubscribe<\/code><\/strong> notifies you when one account&#8217;s lamports or data change.<\/li>\n\n\n\n<li><strong><code>logsSubscribe<\/code><\/strong> streams transaction log messages that match a filter.<\/li>\n\n\n\n<li><strong><code>slotSubscribe<\/code><\/strong> signals each time the validator processes a new slot.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Many of these accept a <code>commitment<\/code> parameter, and the same reference notes that subscriptions default to <code>finalized<\/code> when it is left out. That default changes what &#8220;real time&#8221; means.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Commitment<\/th><th>What it means<\/th><th>Trade-off<\/th><\/tr><\/thead><tbody><tr><td><code>processed<\/code><\/td><td>Node has seen the block<\/td><td>Earliest signal, can sit on a fork that is later dropped<\/td><\/tr><tr><td><code>confirmed<\/code><\/td><td>Supermajority has voted on the block<\/td><td>Balanced, a few slots behind <code>processed<\/code><\/td><\/tr><tr><td><code>finalized<\/code><\/td><td>Block is rooted by consensus<\/td><td>Safest, slowest<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Solana&#8217;s own guidance is that <a href=\"https:\/\/solana.com\/docs\/advanced\/confirmation\" rel=\"nofollow noopener noreferrer\">roughly 5% of blocks do not end up finalized, and that the gap between the latest confirmed and finalized block is typically at least 32 slots, about 13 seconds<\/a>. Picking <code>finalized<\/code> by accident can add more delay than any network hop.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"what-affects-delay-on-a-persistent-connection\">What Affects Delay on a Persistent Connection?<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Distance, infrastructure type, commitment level, filter size and connection handling all move the number more than the protocol itself does. No single figure applies to every setup, so this guide does not publish one.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Distance to the endpoint.<\/strong> Every network hop adds delay. A server in Frankfurt reading from a US endpoint pays that cost on each message.<\/li>\n\n\n\n<li><strong>Shared or dedicated infrastructure.<\/strong> Shared gateways serve many customers at once. Chainstack notes that on shared gateways a WebSocket can close with code 1006 and <code>ECONNRESET<\/code>, and suggests reconnect logic or a dedicated gateway.<\/li>\n\n\n\n<li><strong>Node sync and peering.<\/strong> A node that trails the network delivers old data quickly, which is worse than delivering current data a moment later.<\/li>\n\n\n\n<li><strong>Commitment level.<\/strong> On Solana this is the largest single lever, as the table above shows.<\/li>\n\n\n\n<li><strong>Filter and payload size.<\/strong> Unfiltered log or program streams are large. Alchemy warns that broad Solana streams, especially unfiltered <code>programSubscribe<\/code>, can produce very high bandwidth.<\/li>\n\n\n\n<li><strong>Connection reuse.<\/strong> Opening one connection and reusing it avoids repeated handshakes.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Chain timing sets a floor. Ethereum measures time in <a href=\"https:\/\/ethereum.org\/developers\/docs\/consensus-mechanisms\/pos\/block-proposal\/\" rel=\"nofollow noopener noreferrer\">12-second slots, with 32 slots making an epoch<\/a>, so a new block cannot arrive faster than the slot cadence allows. Solana slots are <a href=\"https:\/\/solana.com\/docs\/advanced\/confirmation\" rel=\"nofollow noopener noreferrer\">configured to last about 400 ms but may fluctuate between 400 and 600 ms<\/a>. Sub-second delivery therefore matters far more on Solana than on Ethereum.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vendors publish their own latency figures, and they are worth reading as claims rather than facts. Helius states that its Solana WebSocket is <a href=\"https:\/\/www.helius.dev\/docs\/rpc\/websocket\" rel=\"nofollow noopener noreferrer\">up to 200 ms faster than standard Agave RPC-based WebSockets<\/a>. NOWNodes lists a stream latency of under 200 ms on its <a href=\"https:\/\/nownodes.io\/grpc\">gRPC product page<\/a>, which is a separate product from WebSocket. Neither number substitutes for measuring your own route.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"which-providers-offer-streaming-access-on-both-chains\">Which Providers Offer Streaming Access on Both Chains?<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Several major providers offer WSS for both Ethereum and Solana, but they differ sharply in how they meter it, and most do not publish hard connection caps for every plan. The table below records only what each provider&#8217;s own documentation states. It compares WebSocket features and does not rank providers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Checked on 28 September 2026 against the linked official pages. &#8220;Not specified&#8221; means the cited page did not state a value.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Provider<\/th><th>WSS: Ethereum<\/th><th>WSS: Solana<\/th><th>Documented limits<\/th><th>Pricing model<\/th><\/tr><\/thead><tbody><tr><td><a href=\"https:\/\/docs.nownodes.io\/websocket-wss-api\">NOWNodes<\/a><\/td><td>Yes<\/td><td>Yes<\/td><td>Connection and subscription caps not specified. WebSocket not available on the Start plan (<a href=\"https:\/\/nownodes.io\/pricing\">pricing<\/a>)<\/td><td>Request allowance per plan, paid plans from Pro<\/td><\/tr><tr><td><a href=\"https:\/\/www.alchemy.com\/docs\/reference\/subscription-api\" rel=\"nofollow noopener noreferrer\">Alchemy<\/a><\/td><td>Yes<\/td><td>Yes (<a href=\"https:\/\/www.alchemy.com\/docs\/reference\/solana-subscription-api-endpoints.md\" rel=\"nofollow noopener noreferrer\">docs<\/a>)<\/td><td>100 connections on Free, 2,000 on other tiers, 1,000 subscriptions per connection<\/td><td>Billed by bandwidth delivered<\/td><\/tr><tr><td><a href=\"https:\/\/www.quicknode.com\/docs\/ethereum\/endpoints\" rel=\"nofollow noopener noreferrer\">QuickNode<\/a><\/td><td>Yes<\/td><td>Yes (<a href=\"https:\/\/www.quicknode.com\/docs\/solana\/endpoints\" rel=\"nofollow noopener noreferrer\">docs<\/a>)<\/td><td>Response size capped, value &#8220;subject to change&#8221;<\/td><td>Credits, per response received<\/td><\/tr><tr><td><a href=\"https:\/\/docs.chainstack.com\/docs\/evm-node-connection-http-vs-websocket\" rel=\"nofollow noopener noreferrer\">Chainstack<\/a><\/td><td>Yes<\/td><td>Yes (<a href=\"https:\/\/docs.chainstack.com\/reference\/solana-getting-started.md\" rel=\"nofollow noopener noreferrer\">docs<\/a>)<\/td><td>Connection caps not specified<\/td><td>Each pushed notification counts as one request unit<\/td><\/tr><tr><td><a href=\"https:\/\/www.ankr.com\/docs\/rpc-service\/pricing\" rel=\"nofollow noopener noreferrer\">Ankr<\/a><\/td><td>Premium plans<\/td><td>Paid plans only (<a href=\"https:\/\/docs.zan.top\/docs\/features\" rel=\"nofollow noopener noreferrer\">docs<\/a>)<\/td><td>Not specified<\/td><td>API credits per subscription and per notification<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Two providers are left out on purpose. Infura documents WebSocket subscriptions for Ethereum but <a href=\"https:\/\/docs.metamask.io\/services\/concepts\/websockets.md\" rel=\"nofollow noopener noreferrer\">does not list Solana among its supported networks<\/a>. Helius publishes detailed WebSocket limits, including <a href=\"https:\/\/www.helius.dev\/docs\/faqs\/websockets.md\" rel=\"nofollow noopener noreferrer\">5 simultaneous connections on Free and up to 1,000 on Professional<\/a>, but its documentation is Solana-specific, so it does not belong in a both-chains table.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"where-each-option-fits\">Where each option fits<\/h3>\n\n\n<ul class=\"wp-block-list\">\n<li><strong>NOWNodes<\/strong> covers both chains through one key, with WSS URLs in the form <code>wss:\/\/eth.nownodes.io\/wss\/{YOUR_API_KEY}<\/code> and <code>wss:\/\/sol.nownodes.io\/wss\/{YOUR_API_KEY}<\/code>. It lists WebSocket coverage across 30+ networks, so a team that expands to other chains does not change vendor. The limit to know: the free Start plan excludes WebSocket, and dedicated WSS nodes are available on request for networks or performance needs outside the shared plans.<\/li>\n\n\n\n<li><strong>Alchemy<\/strong> is the only one here that publishes explicit per-connection and per-tier caps, which makes capacity planning simpler. Bandwidth billing rewards tight filters and punishes broad streams.<\/li>\n\n\n\n<li><strong>QuickNode<\/strong> bills per response received, so cost tracks message volume. Its documentation states a response-size cap without giving the number.<\/li>\n\n\n\n<li><strong>Chainstack<\/strong> counts each pushed notification as one request unit, and offers a flat-fee Unlimited Node for sustained, high-volume subscriptions.<\/li>\n\n\n\n<li><strong>Ankr<\/strong> meters both the subscribe action and each notification, with Solana notifications priced higher than other chains, so noisy Solana streams cost more.<\/li>\n<\/ul>\n\n\n<h3 class=\"wp-block-heading\" id=\"how-nownodes-fits-into-the-picture\">How NOWNodes fits into the picture<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Beyond WebSocket, NOWNodes also offers gRPC streaming, which is a separate product covering 25+ chains, and dedicated nodes. Webhooks on the platform currently cover only address balance changes on a small set of UTXO chains, so they are not an alternative to WebSocket for Ethereum or Solana. The same account also includes the Blockbook-based WebSocket interfaces documented for several networks, which follow a different subscription model than the JSON-RPC methods described in this guide.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"how-do-you-test-a-streaming-provider-before-production\">How Do You Test a Streaming Provider Before Production?<\/h2>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"972\" height=\"1024\" src=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/09\/image-63-972x1024.png\" alt=\"\" class=\"wp-image-3563\" srcset=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/09\/image-63-972x1024.png 972w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/09\/image-63-285x300.png 285w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/09\/image-63-767x808.png 767w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/09\/image-63.png 1222w\" sizes=\"auto, (max-width: 972px) 100vw, 972px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Test the connection under the conditions you will run it in: same region, two providers side by side, your real filters. A vendor&#8217;s benchmark cannot tell you how your route performs.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Pick one region for the test client.<\/strong> Run it from the same data center or cloud region your production service will use.<\/li>\n\n\n\n<li><strong>Open two or more providers at once.<\/strong> Subscribe each to the same stream, for example <code>newHeads<\/code> on Ethereum or <code>slotSubscribe<\/code> on Solana.<\/li>\n\n\n\n<li><strong>Record arrival time for the same event.<\/strong> For a given block hash or slot number, note when each provider first delivers it. The difference between providers is your real latency gap.<\/li>\n\n\n\n<li><strong>Repeat over hours, not minutes.<\/strong> Include busy periods. Averages hide the slow tail.<\/li>\n\n\n\n<li><strong>Kill the connection on purpose.<\/strong> Measure how long reconnecting and re-subscribing takes, and whether any events are missed in between.<\/li>\n\n\n\n<li><strong>Apply your own filters.<\/strong> A <code>logs<\/code> subscription for one contract behaves very differently from an unfiltered one.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">A minimal Ethereum subscription against a NOWNodes endpoint looks like the example below. Replace <code>YOUR_API_KEY<\/code> with a key from your dashboard.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import WebSocket from \"ws\";\n\nconst ws = new WebSocket(\"wss:\/\/eth.nownodes.io\/wss\/YOUR_API_KEY\");\n\nws.on(\"open\", () =&gt; {\n  ws.send(JSON.stringify({\n    jsonrpc: \"2.0\",\n    id: 1,\n    method: \"eth_subscribe\",\n    params: &#91;\"newHeads\"]\n  }));\n});\n\nws.on(\"message\", (data) =&gt; {\n  console.log(Date.now(), data.toString());\n});<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For Solana, swap the URL to <code>wss:\/\/sol.nownodes.io\/wss\/YOUR_API_KEY<\/code> and send <code>slotSubscribe<\/code> with a <code>commitment<\/code> where the method accepts one. Log <code>Date.now()<\/code> on arrival so the two providers&#8217; timestamps can be compared afterwards.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"what-should-a-production-setup-include\">What Should a Production Setup Include?<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Assume every connection will drop, and design so that a drop loses nothing. The general practices, including heartbeats, backoff and session replay, are covered in the <a href=\"https:\/\/nownodes.io\/blog\/websocket-best-practices-for-production\">WebSocket production best practices guide<\/a>. Only the chain-specific points are covered here.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Re-create subscriptions after every reconnect.<\/strong> Geth states that subscriptions are coupled to a connection, and closing the connection removes all subscriptions created over it. Reconnecting alone restores nothing.<\/li>\n\n\n\n<li><strong>Backfill the gap over HTTP.<\/strong> On Ethereum, fetch the missed blocks by number after reconnecting. On Solana, fetch by slot, remembering that some slots produce no block. Notifications are never replayed for you.<\/li>\n\n\n\n<li><strong>Handle reorganizations.<\/strong> On Ethereum, treat a log with <code>removed: true<\/code> as a reversal. On Solana, choose a commitment level that matches how much rollback you can tolerate.<\/li>\n\n\n\n<li><strong>Keep a fallback provider.<\/strong> A second endpoint on a different provider protects you when one has an outage.<\/li>\n<\/ul>\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Conclusion<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Choosing a WebSocket provider is less about a headline speed number than about three practical questions: which commitment level or filter your workload needs, how the provider meters messages, and how your own route performs. Read the documented limits, test in your own region against at least two options, and build reconnection and backfill on day one. A subscription that silently stops is a bigger risk than one that is a few tens of milliseconds slower.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h3>\n\n<h3 class=\"wp-block-heading\" id=\"can-i-run-several-subscriptions-on-one-connection\">Can I run several subscriptions on one connection?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Yes. Both chains allow multiple subscriptions over a single WebSocket connection, and reusing one connection is usually better than opening many. Providers set their own caps, such as Alchemy&#8217;s 1,000 subscriptions per connection.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"do-subscriptions-consume-credits-or-requests\">Do subscriptions consume credits or requests?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Usually, yes, and the rules differ by provider. Some meter by message received, some by bandwidth, and some also charge for the subscribe action, so check the pricing model in the table above before you subscribe to a busy stream.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"how-does-websocket-compare-with-grpc-streaming-on-solana\">How does WebSocket compare with gRPC streaming on Solana?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Both push data as it happens. WebSocket carries JSON and is the simplest to adopt, while gRPC carries typed binary messages and suits high-volume pipelines. On NOWNodes the two are separate products, and gRPC is listed for 25+ chains.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"does-a-websocket-give-me-events-i-missed-while-disconnected\">Does a WebSocket give me events I missed while disconnected?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">No. Notifications describe current events only, so anything that happens during a disconnect must be recovered with a normal HTTP query after you reconnect.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A WebSocket connection keeps one channel open between your app and a blockchain endpoint, so the endpoint pushes new blocks, logs and account changes to you instead of waiting to be asked. HTTP polling works the other way round: your code asks every few seconds and mostly hears &#8220;nothing new.&#8221; For anything that has to [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":3561,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_eb_attr":"","_lmt_disableupdate":"","_lmt_disable":"","_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[102],"tags":[],"class_list":["post-3560","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev-report"],"blocksy_meta":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>WebSocket Endpoints for Ethereum &amp; Solana: Setup and Limits<\/title>\n<meta name=\"description\" content=\"How persistent WSS connections work on Ethereum and Solana, which subscriptions exist, what drives delay, and how to test a provider.URL slug\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WebSocket Endpoints for Ethereum &amp; Solana: Setup and Limits\" \/>\n<meta property=\"og:description\" content=\"How persistent WSS connections work on Ethereum and Solana, which subscriptions exist, what drives delay, and how to test a provider.URL slug\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/\" \/>\n<meta property=\"og:site_name\" content=\"NOWNodes Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-28T15:34:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-28T15:34:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/09\/text_1-18.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1200\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"\u0410nastasia\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nownodes\" \/>\n<meta name=\"twitter:site\" content=\"@nownodes\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u0410nastasia\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/\"},\"author\":{\"name\":\"\u0410nastasia\",\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/person\/0890ec68e813adecb93c18ee00e1e7a8\"},\"headline\":\"Low-Latency WebSocket RPC for Ethereum and Solana: How It Works and What to Check\",\"datePublished\":\"2026-09-28T15:34:34+00:00\",\"dateModified\":\"2026-09-28T15:34:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/\"},\"wordCount\":2175,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/nownodes.io\/blog\/#organization\"},\"articleSection\":[\"Dev Report\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/\",\"url\":\"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/\",\"name\":\"WebSocket Endpoints for Ethereum & Solana: Setup and Limits\",\"isPartOf\":{\"@id\":\"https:\/\/nownodes.io\/blog\/#website\"},\"datePublished\":\"2026-09-28T15:34:34+00:00\",\"dateModified\":\"2026-09-28T15:34:35+00:00\",\"description\":\"How persistent WSS connections work on Ethereum and Solana, which subscriptions exist, what drives delay, and how to test a provider.URL slug\",\"breadcrumb\":{\"@id\":\"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Blog\",\"item\":\"https:\/\/nownodes.io\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dev Report\",\"item\":\"https:\/\/nownodes.io\/blog\/category\/dev-report\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Low-Latency WebSocket RPC for Ethereum and Solana: How It Works and What to Check\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/nownodes.io\/blog\/#website\",\"url\":\"https:\/\/nownodes.io\/blog\/\",\"name\":\"NOWNodes Blog\",\"description\":\"Your first-to-go source of development guides, web3 analytics and most recent news about NOWNodes\",\"publisher\":{\"@id\":\"https:\/\/nownodes.io\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/nownodes.io\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/nownodes.io\/blog\/#organization\",\"name\":\"NOWNodes Blog\",\"url\":\"https:\/\/nownodes.io\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2024\/02\/cropped-New-Logo-NN.png\",\"contentUrl\":\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2024\/02\/cropped-New-Logo-NN.png\",\"width\":1164,\"height\":1164,\"caption\":\"NOWNodes Blog\"},\"image\":{\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/twitter.com\/nownodes\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/person\/0890ec68e813adecb93c18ee00e1e7a8\",\"name\":\"\u0410nastasia\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1de24ab8dcdd7ec30f6adaf78b56bc1eda421f87575b7e103c8fc3fc4420e833?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1de24ab8dcdd7ec30f6adaf78b56bc1eda421f87575b7e103c8fc3fc4420e833?s=96&d=mm&r=g\",\"caption\":\"\u0410nastasia\"},\"url\":\"https:\/\/nownodes.io\/blog\/author\/nasty-nownodes\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"WebSocket Endpoints for Ethereum & Solana: Setup and Limits","description":"How persistent WSS connections work on Ethereum and Solana, which subscriptions exist, what drives delay, and how to test a provider.URL slug","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/","og_locale":"en_US","og_type":"article","og_title":"WebSocket Endpoints for Ethereum & Solana: Setup and Limits","og_description":"How persistent WSS connections work on Ethereum and Solana, which subscriptions exist, what drives delay, and how to test a provider.URL slug","og_url":"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/","og_site_name":"NOWNodes Blog","article_published_time":"2026-09-28T15:34:34+00:00","article_modified_time":"2026-09-28T15:34:35+00:00","og_image":[{"width":2400,"height":1200,"url":"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/09\/text_1-18.jpg","type":"image\/jpeg"}],"author":"\u0410nastasia","twitter_card":"summary_large_image","twitter_creator":"@nownodes","twitter_site":"@nownodes","twitter_misc":{"Written by":"\u0410nastasia","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/#article","isPartOf":{"@id":"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/"},"author":{"name":"\u0410nastasia","@id":"https:\/\/nownodes.io\/blog\/#\/schema\/person\/0890ec68e813adecb93c18ee00e1e7a8"},"headline":"Low-Latency WebSocket RPC for Ethereum and Solana: How It Works and What to Check","datePublished":"2026-09-28T15:34:34+00:00","dateModified":"2026-09-28T15:34:35+00:00","mainEntityOfPage":{"@id":"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/"},"wordCount":2175,"commentCount":0,"publisher":{"@id":"https:\/\/nownodes.io\/blog\/#organization"},"articleSection":["Dev Report"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/","url":"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/","name":"WebSocket Endpoints for Ethereum & Solana: Setup and Limits","isPartOf":{"@id":"https:\/\/nownodes.io\/blog\/#website"},"datePublished":"2026-09-28T15:34:34+00:00","dateModified":"2026-09-28T15:34:35+00:00","description":"How persistent WSS connections work on Ethereum and Solana, which subscriptions exist, what drives delay, and how to test a provider.URL slug","breadcrumb":{"@id":"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nownodes.io\/blog\/low-latency-websocket-rpc-for-ethereum-and-solana-how-it-works-and-what-to-check\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Blog","item":"https:\/\/nownodes.io\/blog"},{"@type":"ListItem","position":2,"name":"Dev Report","item":"https:\/\/nownodes.io\/blog\/category\/dev-report"},{"@type":"ListItem","position":3,"name":"Low-Latency WebSocket RPC for Ethereum and Solana: How It Works and What to Check"}]},{"@type":"WebSite","@id":"https:\/\/nownodes.io\/blog\/#website","url":"https:\/\/nownodes.io\/blog\/","name":"NOWNodes Blog","description":"Your first-to-go source of development guides, web3 analytics and most recent news about NOWNodes","publisher":{"@id":"https:\/\/nownodes.io\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nownodes.io\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/nownodes.io\/blog\/#organization","name":"NOWNodes Blog","url":"https:\/\/nownodes.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nownodes.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2024\/02\/cropped-New-Logo-NN.png","contentUrl":"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2024\/02\/cropped-New-Logo-NN.png","width":1164,"height":1164,"caption":"NOWNodes Blog"},"image":{"@id":"https:\/\/nownodes.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/twitter.com\/nownodes"]},{"@type":"Person","@id":"https:\/\/nownodes.io\/blog\/#\/schema\/person\/0890ec68e813adecb93c18ee00e1e7a8","name":"\u0410nastasia","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nownodes.io\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1de24ab8dcdd7ec30f6adaf78b56bc1eda421f87575b7e103c8fc3fc4420e833?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1de24ab8dcdd7ec30f6adaf78b56bc1eda421f87575b7e103c8fc3fc4420e833?s=96&d=mm&r=g","caption":"\u0410nastasia"},"url":"https:\/\/nownodes.io\/blog\/author\/nasty-nownodes"}]}},"modified_by":"\u0410nastasia","_links":{"self":[{"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/posts\/3560","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/comments?post=3560"}],"version-history":[{"count":1,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/posts\/3560\/revisions"}],"predecessor-version":[{"id":3564,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/posts\/3560\/revisions\/3564"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/media\/3561"}],"wp:attachment":[{"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/media?parent=3560"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/categories?post=3560"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/tags?post=3560"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}