Skip to main content
Everything that moves is pushed. Two transports, the same channels and the same frames: Use the WebSocket when a screen needs several channels (a token page wants trades, candles and the token). Use SSE for a single feed where a plain HTTP stream is simpler.

Channels

Payloads are the REST objects: a trade is a Trade, a candle a Candle, a launchpad row a TokenSummary. Details per channel: Channels.

Rules every channel follows

  • Snapshot, then changes. The first frame of a subscription is snapshot, so you never need a REST call next to a stream. Trades already in the snapshot are not sent again. A later snapshot on the same subscription replaces what you hold.
  • Push, not poll. Solana trades come straight from the chain, EVM trades from an indexer’s push feed, launchpad progress and native prices from push feeds too. Nothing is refreshed on a timer.
  • One source for chart and tape. Live candles and token ticks are built from the same trades the trades channel shows.
  • Falling behind is announced. A subscriber that cannot keep up gets a lagged frame with the number of frames it lost. The channel then catches up on its own: a fresh snapshot (right away on trades and launchpad, as soon as it is read again on candles, token and wallet), or a full update on prices.
  • Reconnects are yours. If the socket drops, open a new one and subscribe again: each subscription starts with a fresh snapshot, so nothing is lost.
  • A busy server refuses new connections, not open ones. At capacity, a new WebSocket or SSE connection answers 503 server_busy with Retry-After: 30; connections already open keep running. Reconnect after the wait, with backoff. See Live errors.

WebSocket

Ops and control frames

SSE

EventSource examples

Channels

Every frame, with examples