Public market prices use a separate socket: Market data.
Subscribe
Send one frame after the upgrade:INVALID_SUBSCRIPTION. A subscription your key may not use
closes with SUBSCRIPTION_DENIED. There is no unsubscribe: close the socket.
Frames
Every server frame is{ "channel": ..., "data": ... }.
event_type selects the shape of payload. Ignore event types you do not recognize.
Snapshot
The snapshot is your current state and the cursor it matches. Replace your local state with it, then apply events after that cursor. A class cut short is listed intruncated with the route that pages
the rest:
Apply events
- Delivery is at least once. Skip an event whose
event_idyou have seen, or whosecursor.sequenceis not above yours. - Apply events in
sequenceorder. Sequences skip numbers; a skipped number is not a gap. - Save the event’s
cursorafter you apply it.
Resume
Send your last applied cursor. Resuming needsreplay:read.
The stream is the only replay; there is no HTTP event log. The replay window is on
Limits.
Heartbeats, drain and reset
- Keepalive is WebSocket ping and pong, every
heartbeat_interval_ms. - On
drain, open a new connection, resume from your cursor, then close the old one. The server closes it withCONNECTION_DRAINbydeadline. - On
reset, discard local state and reconnect without a cursor.
retry says what
to do:

