Skip to content

Protocol overview ​

Tessium Streaming API v1 uses JSON messages over one WebSocket connection. One connection can carry multiple independent subscriptions.

Endpoint ​

text
wss://api.tessium.dev/stream?key=YOUR_API_KEY

You can also authenticate with the first WebSocket message when keeping the key out of the URL is more convenient:

json
{ "op": "auth", "key": "tsk_live_..." }

Frame kinds ​

opDirectionPurpose
authclient → serverAuthenticate when the key is not in the URL
subscribeclient → serverOpen a stream subscription
unsubscribeclient → serverStop a subscription
pingclient → serverApplication-level connection check
ackserver → clientConfirm a command and return the subscription id
pongserver → clientReply to an application-level ping
eventserver → clientDeliver a stream event
errorserver → clientReject a command or report a failure
noticeserver → clientReport non-fatal stream state

See Frames for complete command envelopes, Cursor & replay for reconnect behavior, Detail levels for payload tiers, and Errors & notices for every machine-readable code.

Delivery model ​

  • Only successful Solana transactions are streamed.
  • Every non-candle event has a common transaction envelope.
  • blockTime can be null while block time is not yet available; Tessium does not hold the event back while waiting for it.
  • A token subscription and a wallet subscription can both emit an event for the same trade. They are separate subscriptions, not duplicates.
  • Client messages are limited to 64 KB.
  • Frames are sent uncompressed, so the size you see in an event is the size on the connection.

Keeping the connection alive ​

The server sends a WebSocket ping every 20 seconds. Most client libraries answer it for you, and as long as something arrives from your side — a pong or any command — the connection stays open.

If nothing arrives for 60 seconds, the connection closes with a ping_timeout notice. The usual cause is not a broken network but a proxy between you and us that swallows protocol-level pings. There is an application-level ping for exactly that case, and it refreshes the same timer:

json
{ "op": "ping", "id": 3 }

Send it every 30 seconds or so if your library does not answer pings on its own, or if you have seen disconnects you could not explain.

Protocol version: v1. Reference snapshot: 31 July 2026.

Realtime Solana data API