Protocol overview
Tessium Streaming API v1 uses JSON messages over one WebSocket connection. One connection can carry multiple independent subscriptions.
Endpoint
wss://api.tessium.dev/stream?key=YOUR_API_KEYYou can also authenticate with the first WebSocket message when keeping the key out of the URL is more convenient:
{ "op": "auth", "key": "tsk_live_..." }Frame kinds
op | Direction | Purpose |
|---|---|---|
auth | client → server | Authenticate when the key is not in the URL |
subscribe | client → server | Open a stream subscription |
unsubscribe | client → server | Stop a subscription |
ping | client → server | Application-level connection check |
ack | server → client | Confirm a command and return the subscription id |
pong | server → client | Reply to an application-level ping |
event | server → client | Deliver a stream event |
error | server → client | Reject a command or report a failure |
notice | server → client | Report 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.
blockTimecan benullwhile 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:
{ "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.