Skip to main content
The two global channels carry all nine series. oracle interleaves BTC, gold, and WTI ticks on one subscription; rounds interleaves lifecycle events from every series. Neither takes market_ids, and neither can be narrowed server-side. Filter on the feed and category fields that every frame carries, or you will paint whichever asset ticked last. See Series, assets, and categories.
ticker is not implemented. Subscribing to ticker returns command error wscode 4 (unknown channel). Use orderbook_snapshot for a periodic full book, or orderbook_delta when you need every level change.

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.
One subscription receives all three assets, interleaved. A 40-second capture is routinely several hundred ticks across three magnitudes. Branch on feed before you use price — a UI that does not will repaint a BTC chart with a gold print.
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):
Every frame carries the base fields — 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:
market_id alone is not enough to route a frame. Slots are recycled, and a recycled slot can reappear in a different series. Key on round_number, and use category to decide whether the frame is yours at all. A create frame reports category: 0 when it lands before the slot’s reference data.
Read 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.