Skip to main content
For new Console integrations, use authenticated venue order books. That guide includes HMAC connection code, subscriptions, limits and the shared Polymarket/Predict.fun message format. Your organisation needs an eligible paid plan, venue access and a Market Data credential with stream.read. Create an account in Console and follow the quickstart.

Legacy Terminal frame reference

The remaining reference describes the older /orderbook-feed/ws payload format used by Terminal integrations. That route has a separate access contract; it is not the HMAC endpoint for new Console clients. The authenticated routes above return the unified channel, venue, asset and type envelope described in venue order books. Do not apply the legacy frame parser or 120-assets-per-connection limit below to the authenticated API. Keep existing integrations on their documented protocol until you deliberately migrate both authentication and message handling.

Frames

Order-book frames are forwarded from the venue verbatim and are identified by an event_type field. Incremental events arrive as JSON objects. The initial book snapshot arrives either as a JSON array containing one book object, or as a bare object, and you must handle both. The array form is what we see in practice; the bare object can reach you as the replay of a cached book. Normalise with Array.isArray(msg) ? msg : [msg]. There is a third shape, and it is the one that breaks parsers: an asset with no book can answer with [[]] — an array containing one empty array, no object at all. It is neither a book nor a bare object, and it does not produce a no_book frame: it is a message from the venue, so it cancels the timer described below. After normalising, skip anything that is not an object:

book

A full snapshot of the order book, sent on subscribe and re-sent to late joiners.

price_change

Incremental level updates. Apply each entry in price_changes to your local book by asset_id and side.
A size of "0" means the level was removed. best_bid and best_ask give you the top of book without recomputing it.

last_trade_price

A lightweight update for a running price display: carries an asset_id at the top level and the price of the latest fill. There is no best_bid_ask frame. The top of book is delivered as the best_bid and best_ask fields inside each price_changes[] entry of a price_change frame — see above.

tick_size_change

Emitted when the venue changes a market’s minimum price increment. Carries an asset_id at the top level. Rare, but a client that switches on event_type should not treat it as unknown.

no_book

Emitted by Bravado when no message at all arrives from the venue for a subscribed asset within 8 seconds of opening the upstream connection, so your UI can render an empty state instead of hanging:
This is the one frame Bravado originates rather than forwarding from the venue.
It measures silence, not the absence of a book. The timer is cancelled by the first upstream message of any kind — including an empty frame that carries no book, and including a frame Bravado then discards. An asset that receives chatter but never a book therefore produces no no_book, and a client waiting for one waits forever. Do not use it as “this market has no book”; use it as “nothing came back”. The timer is re-armed only when the upstream connection is re-opened.

Limits

  • 120 assets per connection. Additional sub requests past the cap are ignored.
  • Upstreams are shared and ref-counted, so subscribing to a popular asset does not open a new upstream connection.

Health