Skip to main content
The clob.* channels carry the Polymarket CLOB (central limit order book) live feed. Radion proxies it over the same WebSocket as the on-chain channels, so you get order-book state, prices, and trades next to the confirmed chain events, on one connection. This is a separate channel family from the topic channels (trading, positions, and the rest). It differs in three ways:
  • Every clob channel requires a token_ids filter. You subscribe per outcome token. With no token_ids, the subscribe fails.
  • The data payload has no type discriminator. Each clob channel has one fixed payload shape. Topic channels put a snake_case type inside data; clob channels do not.
  • There is no pending feed. CLOB channels have no pending/confirmed concept — confirmed: false does not apply. The CLOB feed is off-chain order-book state, not pending transactions.

Channels

ChannelSends
clob.bookFull order-book snapshot: all bid and ask levels.
clob.pricesPrice-change batches: which levels moved, and the new best bid/ask.
clob.last_tradeThe last trade price and size for the token.
clob.midpointThe midpoint between best bid and best ask.
clob.tick_sizeTick-size changes for the token.
clob.best_bid_askThe best bid and best ask.
clob.prices is the CLOB price-change feed. It is not the removed derived prices topic channel — that one carried last-trade price ticks and no longer exists. clob.prices is unrelated and stays.

Subscribe

Every clob channel requires at least one token_ids value:
{
  "action": "subscribe",
  "id": "s1",
  "channel": "clob.book",
  "filters": {
    "token_ids": [
      "71321045679252212594626385532706912750332728571942532289631379312455583992563"
    ]
  }
}

Filters

FilterTypeRequiredDescription
token_idsstring[]YesOutcome token IDs as decimal strings. At least one, or the subscribe fails.
Clob channels accept only token_ids. wallets, market_ids, and min_usd are ignored here. See Filters for the combination rule.

Payloads

Each frame is a standard event frame: type: "event", your id, the channel name, and a data object. Unlike the topic channels, data carries no type field — the channel name already tells you the shape. In every payload, ids are strings (asset_id is a U256 decimal string, market is a 0x hex string), timestamp is a number, and prices and sizes are numbers. Fields marked optional may be absent.

clob.book

Full order-book snapshot for the token.
{
  "type": "event",
  "id": "s1",
  "channel": "clob.book",
  "data": {
    "asset_id": "71321045…992563",
    "market": "0x…",
    "timestamp": 1730000000,
    "bids": [{ "price": 0.52, "size": 1200 }],
    "asks": [{ "price": 0.54, "size": 800 }]
  }
}
FieldTypeDescription
asset_idstringOutcome token id (U256 decimal string).
marketstringMarket id (0x hex string).
timestampnumberFeed timestamp.
bidsLevel[]Bid levels. Each Level is { price, size } (numbers).
asksLevel[]Ask levels. Each Level is { price, size } (numbers).

clob.prices

A batch of level changes for a market, with the new best bid/ask per token.
{
  "type": "event",
  "id": "s1",
  "channel": "clob.prices",
  "data": {
    "market": "0x…",
    "timestamp": 1730000000,
    "changes": [
      {
        "asset_id": "71321045…992563",
        "price": 0.53,
        "size": 500,
        "best_bid": 0.52,
        "best_ask": 0.54
      }
    ]
  }
}
FieldTypeDescription
marketstringMarket id (0x hex string).
timestampnumberFeed timestamp.
changesPriceChange[]The changed levels. See below.
Each PriceChange:
FieldTypeOptionalDescription
asset_idstringNoOutcome token id.
pricenumberNoThe changed price level.
sizenumberYesNew size at the level.
best_bidnumberYesNew best bid for the token.
best_asknumberYesNew best ask for the token.

clob.last_trade

The last trade for the token.
{
  "type": "event",
  "id": "s1",
  "channel": "clob.last_trade",
  "data": {
    "asset_id": "71321045…992563",
    "market": "0x…",
    "price": 0.53,
    "size": 250,
    "timestamp": 1730000000
  }
}
FieldTypeOptionalDescription
asset_idstringNoOutcome token id.
marketstringNoMarket id (0x hex string).
pricenumberNoLast trade price.
sizenumberYesLast trade size.
timestampnumberNoFeed timestamp.

clob.midpoint

The midpoint between best bid and best ask.
{
  "type": "event",
  "id": "s1",
  "channel": "clob.midpoint",
  "data": {
    "asset_id": "71321045…992563",
    "market": "0x…",
    "midpoint": 0.53,
    "timestamp": 1730000000
  }
}
FieldTypeDescription
asset_idstringOutcome token id.
marketstringMarket id (0x hex string).
midpointnumberMidpoint price.
timestampnumberFeed timestamp.

clob.tick_size

A tick-size change for the token.
{
  "type": "event",
  "id": "s1",
  "channel": "clob.tick_size",
  "data": {
    "asset_id": "71321045…992563",
    "market": "0x…",
    "timestamp": 1730000000
  }
}
FieldTypeDescription
asset_idstringOutcome token id.
marketstringMarket id (0x hex string).
timestampnumberFeed timestamp.

clob.best_bid_ask

The best bid and best ask for the token.
{
  "type": "event",
  "id": "s1",
  "channel": "clob.best_bid_ask",
  "data": {
    "asset_id": "71321045…992563",
    "market": "0x…",
    "best_bid": 0.52,
    "best_ask": 0.54,
    "timestamp": 1730000000
  }
}
FieldTypeDescription
asset_idstringOutcome token id.
marketstringMarket id (0x hex string).
best_bidnumberBest bid price.
best_asknumberBest ask price.
timestampnumberFeed timestamp.

No pending feed

Clob channels have no pending/confirmed concept — confirmed: false does not apply. The pending feed streams pending on-chain transactions; the CLOB feed is off-chain order-book state, so there is nothing to mirror. See Mempool for the channels that do have a pending feed.
Last modified on July 5, 2026