BlogDevelopment
Solana WebSocket vs polling for token launches
Polling RPC for new pools burns quota and still misses the opening milliseconds. A launches stream pushes the event when the pool appears — with a structured payload you can act on.
Launch snipers and indexers care about the same instant: a new pool or mint becomes tradable. Polling getProgramAccounts or scanning signatures is simple to write and late in production. A push stream is early on the wire and cheaper when Solana is busy.
The tradeoff is not “WebSocket is always better.” It is that polling encodes a bet about how often the world changes. Launches do not arrive on a schedule. They cluster. Your poller either wastes quota in the quiet or arrives late in the storm.
The real cost of polling
- A fixed interval either wastes calls in quiet periods or misses the window you care about
- Public RPC rate limits show up exactly when
launchescluster - You still decode the create instruction after you find the signature
- Backoff logic fights the chain instead of following it
- Multiple workers polling the same program multiply load without multiplying edge
Teams often respond by shrinking the poll interval until the RPC provider throttles them. That is not a strategy — it is rent on someone else’s fair-use policy. The fix is to stop asking “is there a new pool yet?” on a timer.
What a launch event should contain
A useful launch payload is not “something happened in this slot.” It names the venue, the mint or pool identifiers you need to trade or index, and enough context to ignore noise. If your handler still starts with raw instruction bytes, you have only moved the poll into a websocket costume.
- Venue or program identity so routing logic does not guess
- Mint / pool identifiers your execution path already understands
- Timestamps you can order against other streams without local clock drift
- Optional metadata you can drop — never a requirement to decode IDLs mid-hot-path
Push the launch, then filter
Subscribe to the launches stream, optionally narrow by venue, and handle one structured message. Tessium documents event shapes in the docs and lists covered venues on the Coverage page, so you know which launchpads already feed the socket before you wire alerts.
- Subscribe once; do not open a new RPC poller per venue
- Filter server-side when you only care about a subset of launchpads
- Keep a dead-letter path for events you cannot trade yet — do not block the socket
- Measure time from event receipt to order attempt, not time since your last poll tick
A practical migration path
Leave historical backfill on RPC or an archive. Move the live path — “tell me when a new pool exists” — to a launches subscription. Most bots get the biggest reliability win from that single cutover, before they touch wallet-scoped trades or candles.
Run both paths in shadow mode for a day if you need confidence: log poll discoveries next to stream events and compare timestamps. When the stream is consistently earlier and complete for your venues, delete the poller. Keeping both “just in case” usually means the poller still burns quota forever.
When polling still belongs in the stack
Use polling for catch-up after a long disconnect, for rare admin checks, or for programs Tessium does not cover yet. Do not use it as the primary sensor for competitive launch detection. Sensors should push; archives should answer questions.
If a teammate insists on keeping a “backup poller,” give it a slow interval and a hard kill switch after the stream proves coverage. A forever backup poller is just the old architecture with better branding.