orderbook_delta
publicchannel:
orderbook_deltawss://api.staging.sphx.io/v1/wsChanged price levels for one instrument's book, applied client-side
in event_seq order on top of an initial snapshot (the server sends
a full-book bootstrap frame on subscribe, then changed levels only).
Emitted only when a level actually moved — a quiet channel means a
quiet book; gap detection is purely via event_seq (on a gap,
re-snapshot via GET /v1/instruments/{id}/orderbook).
Subscribe params: instrument_id (required).
Subscribe
{ "op": "subscribe", "channel": "orderbook_delta", "params": { "instrument_id": 1000 }
| Param | Type | Required | Notes |
|---|---|---|---|
instrument_id | integer · int64 | ✓ | The instrument to stream |
Events
book_changed
One frame per book mutation: only the levels that moved.
| Field | Type | Required | Description |
|---|---|---|---|
instrument_id | integer · int64 | ✓ | |
event_seq | integer · int64 | ✓ | Cluster sequence number — monotonic; drives gap detection and REST/WS joins. |
changes[] | array of objects | ✓ | Only the levels that moved; new_count 0 removes the level. |
changes[].side | yes_bid · no_bid | ✓ | YES-collapsed book sides (margined asks project as no_bid at MAX−p). |
changes[].price_pips | integer | ✓ | |
changes[].new_count | integer | ✓ |
Example frame
{
"channel": "orderbook_delta",
"event": "book_changed",
"data": {
"instrument_id": 1000,
"event_seq": 1057,
"changes": [
{
"side": "yes_bid",
"price_pips": 3900,
"new_count": 120
},
{
"side": "no_bid",
"price_pips": 6100,
"new_count": 0
}
]
}
}