orderbook_snapshot
Snapshot-only book feed for UIs. The first message per market is a full
orderbook_snapshot frame. After that the venue re-emits a full snapshot for
each subscribed market about 5 times per second (snapshot_interval_ms, default
200, matching the venue Tick). No orderbook_delta frames are sent on this
channel, replace your local book from each snapshot. update_subscription with
action: "get_snapshot" re-emits a full book immediately without waiting for the
next Tick.
The channel name and the frame
type are both orderbook_snapshot.
Subscribe with channels: ["orderbook_snapshot"]; each data frame has
"type": "orderbook_snapshot".orderbook_delta
Bot / reconstruction feed. The first message per market is a full
orderbook_snapshot. After that you get deltas:
qty is the new aggregate at that price level, not a change to apply. Set
the level to qty; do not add. A qty of 0 means the level is now empty.Per-order data is never published, this is an aggregated L2 book.trades
Public tape entries as they print, including a path of direct, mint or
merge. Only tick_yes is sent (pips); the NO price is 10000 - tick_yes.
user
The private channel. Subscribe with no market_ids; it is scoped to your key’s
account automatically, and there is no parameter that could point it at another
user.
It carries order lifecycle events, fills with their ledger entries, position
changes, and balance updates, including the reservation and fee accounting that
the order placement response deliberately omits.
A client that folds this stream holds a correct live copy of its orders,
positions and balances without ever polling. That is the intended way to run a
bot.
Continuity is tracked by a per-user channel_seq rather than the envelope
seq, and unlike the public channels it supports replay, so a brief
disconnection does not force you to re-read everything over REST.
oracle
Global, unauthenticated public channel. No market_ids. Pushes reference-price
ticks from every feed as they arrive from the oracle fold:
price is the median price in units of 1e-8 USD, as a decimal string. feed
names the asset the tick belongs to: 0 = BTC, 1 = gold (XAU), 2 = WTI crude.
fresh_source_count is per-tick and per-feed: BTC medians up to five CEX perp
streams, while gold and crude come from a single QFEX underlier and report 1.
Read GET /v1/oracle/price?feed=N once at mount for that asset’s baseline,
then fold live frames. Note the REST body does not echo the feed — only the
WebSocket frame names it.
An asset whose session is closed simply stops producing frames on this channel.
Absence of ticks is not a disconnect. Confirm with
GET /v1/oracle/price?feed=N, which answers price: "0" when the feed is dark.
See Series, assets, and categories.rounds
Global, unauthenticated public channel. No market_ids. Pushes round lifecycle
events for all nine series - create, open (with strike), freeze
(with settle_price), settle (with winner):
action, market_id, seq_ref, ts,
round_number, generation, category — and then only the fields its
action defines: strike on open, settle_price + fresh_source_count on
freeze, winner + yes_payout on settle. create carries the base fields
only.
category is the series id (1–9). It is how you narrow this channel to the
asset and cadence you care about:
GET /v1/markets?status=trading (and GET /v1/rounds/{market_id}) once
at mount, then fold live frames. Field names match the REST round object where
they overlap. Do not treat GET /v1/rounds?limit=1 as the live slot — with
nine series it is whichever series opened most recently. See
Series, assets, and categories.