> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cdp.coinbase.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Coinbase Derivatives: Predictions WebSocket Channels

Each channel sends data frames for its subscriptions. Subscribe with the [Subscribe](/derivatives-predictions/websocket/commands#subscribe) command. The frame envelope, sequencing, and number formats are on [Overview](/derivatives-predictions/websocket/overview#data-frames).

> **Channels**
>
> * [Ticker channel](#ticker-channel): Best prices, sizes, and statistics per instrument.
> * [Trade channel](#trade-channel): Public trades.
> * [Orderbook channel](#orderbook-channel): Order book snapshot and price level changes, up to 10 levels per side.
> * [Instrument lifecycle channel](#instrument-lifecycle-channel): Instrument creations and updates.
> * [Event lifecycle channel](#event-lifecycle-channel): Event creations and updates.

## Ticker channel

Current best prices, sizes, and statistics for each subscribed instrument. A frame is sent whenever any field changes. Frame `type` is `ticker`.

| Field | Type | Description |
| :- | :- | :- |
| `ticker` | String | Instrument ticker, or `null`. |
| `id` | String | Numeric instrument ID. |
| `last_price` | String | Price of the most recent trade. `null` if no trades yet. |
| `yes_bid_price` | String | Best bid for YES contracts. `null` if no resting bids. |
| `yes_ask_price` | String | Best ask for YES contracts. `null` if no resting asks. |
| `yes_bid_size` | String | Quantity at the best bid. `null` if no resting bids. |
| `yes_ask_size` | String | Quantity at the best ask. `null` if no resting asks. |
| `last_trade_size` | String | Contracts traded in the most recent trade. `null` if no trades yet. |
| `open_interest` | String | Number of open contracts. Always present; `null` when unknown. |
| `total_volume` | String | Cumulative contracts traded. Always present; `null` when unknown. |
| `ts_ms` | Integer | Unix epoch milliseconds of the update. |

Example ticker frame:

```json theme={null}
{
  "type": "ticker",
  "sid": 3,
  "seq": 7,
  "msg": {
    "ticker": "NFL-GAMEWINNER-26NOV28LARSF-LAR",
    "id": "598471892347",
    "last_price": "0.590",
    "yes_bid_price": "0.580",
    "yes_ask_price": "0.600",
    "yes_bid_size": "300.00",
    "yes_ask_size": "150.00",
    "last_trade_size": "25.00",
    "open_interest": "1500.00",
    "total_volume": "4500.00",
    "ts_ms": 1795812345678
  }
}
```

Example ticker frame for an instrument that has not traded and has no resting orders:

```json theme={null}
{
  "type": "ticker",
  "sid": 3,
  "seq": 8,
  "msg": {
    "ticker": "NFL-GAMEWINNER-26NOV28LARSF-SF",
    "id": "598471892348",
    "last_price": null,
    "yes_bid_price": null,
    "yes_ask_price": null,
    "yes_bid_size": null,
    "yes_ask_size": null,
    "last_trade_size": null,
    "open_interest": null,
    "total_volume": null,
    "ts_ms": 1795812345901
  }
}
```

## Trade channel

Public trades, sent immediately after each execution. Frame `type` is `trade`.

| Field | Type | Description |
| :- | :- | :- |
| `trade_id` | String | Trade ID. Unique per execution; use it to deduplicate. |
| `ticker` | String | Instrument ticker, or `null`. |
| `id` | String | Numeric instrument ID. |
| `yes_last_price` | String | Trade price of the YES contract. |
| `no_last_price` | String | Trade price of the NO contract. Always `1.000` minus `yes_last_price`. |
| `size` | String | Contracts traded. |
| `taker_side` | String | Outcome the aggressor took: `yes` or `no`. `null` when the side cannot be expressed as an outcome, for example an opening fill. |
| `ts_ms` | Integer | Unix epoch milliseconds of the trade. |

Example trade frame:

```json theme={null}
{
  "type": "trade",
  "sid": 4,
  "seq": 12,
  "msg": {
    "trade_id": "598471900021",
    "ticker": "NFL-GAMEWINNER-26NOV28LARSF-LAR",
    "id": "598471892347",
    "yes_last_price": "0.590",
    "no_last_price": "0.410",
    "size": "25.00",
    "taker_side": "yes",
    "ts_ms": 1795812345678
  }
}
```

## Orderbook channel

Order book depth, up to 10 price levels per side. The server sends an `orderbook_snapshot` for each subscribed instrument, then `orderbook_delta` frames. Both frame types carry `seq`.

### Orderbook snapshot

The snapshot is authoritative for the subscription. Replace any local book for that instrument with it.

| Field | Type | Description |
| :- | :- | :- |
| `ticker` | String | Instrument ticker, or `null`. |
| `id` | String | Numeric instrument ID. |
| `yes_price` | Array of arrays | Up to 10 resting YES bids, best price first. Each entry is a `[price, quantity]` pair of strings. |
| `no_price` | Array of arrays | Up to 10 resting NO bids, best price first. Each entry is a `[price, quantity]` pair of strings. |

The snapshot does not carry `ts_ms`. A side with no resting bids is an empty array.

Example orderbook snapshot frame:

```json theme={null}
{
  "type": "orderbook_snapshot",
  "sid": 1,
  "seq": 1,
  "msg": {
    "ticker": "NFL-GAMEWINNER-26NOV28LARSF-LAR",
    "id": "598471892347",
    "yes_price": [
      ["0.580", "300.00"],
      ["0.560", "333.00"]
    ],
    "no_price": [
      ["0.400", "150.00"],
      ["0.380", "146.00"]
    ]
  }
}
```

### Orderbook delta

Each delta carries the absolute quantity now resting at one price level. Replace the level with this value; do not add or subtract.

| Field | Type | Description |
| :- | :- | :- |
| `ticker` | String | Instrument ticker, or `null`. |
| `id` | String | Numeric instrument ID. |
| `last_price` | String | Price of the level being updated. |
| `level_quantity` | String | Absolute quantity now resting at the level. `0.00` means the level is removed. |
| `side` | String | `yes` or `no`. |
| `ts_ms` | Integer | Unix epoch milliseconds of the event that caused the update. |

Example orderbook delta frame. The YES level at `0.580` now holds `246.00`:

```json theme={null}
{
  "type": "orderbook_delta",
  "sid": 1,
  "seq": 2,
  "msg": {
    "ticker": "NFL-GAMEWINNER-26NOV28LARSF-LAR",
    "id": "598471892347",
    "last_price": "0.580",
    "level_quantity": "246.00",
    "side": "yes",
    "ts_ms": 1795812345678
  }
}
```

## Instrument lifecycle channel

Instrument CREATE and UPDATE changes for all instruments. Deletions are not sent. Frame `type` is `instrument_lifecycle`.

| Field | Type | Description |
| :- | :- | :- |
| `type` | String | `instrument_lifecycle` |
| `sid` | Integer | Subscription ID. |
| `msg` | Object | The complete Instrument resource after the change. It has the fields of the Instruments REST resource except `open_interest`, `total_volume`, and `updated_time`. `expected_open_time` and `expected_close_time` are omitted when not set. `msg.id` is a string. |

Example instrument lifecycle frame:

```json theme={null}
{
  "type": "instrument_lifecycle",
  "sid": 5,
  "msg": {
    "id": "598471892347",
    "ticker": "NFL-GAMEWINNER-26NOV28LARSF-LAR",
    "series_ticker": "NFL-GAMEWINNER",
    "event_ticker": "26NOV28LARSF",
    "group_ticker": "NFL-GAMEWINNER-26NOV28LARSF",
    "title": "Rams win",
    "proposition": "Los Angeles Rams win the game.",
    "disclaimers": "Professional football players may not trade this instrument",
    "contract_size": "1.00",
    "price_level_structure": "LINEAR_CENT",
    "fractional_enabled": true,
    "min_order_size": "0.05",
    "position_limit_per_instrument": "25000.00",
    "speedbump_ms": null,
    "status": "OPEN",
    "list_time": 1795730000000,
    "open_time": 1795750000000,
    "close_time": null,
    "expected_open_time": 1795750000000,
    "expected_close_time": 1795914000000,
    "settlement_outcome": null,
    "settlement_value": null,
    "settlement_time": null,
    "additional_metadata": {
      "contract_type": "MONEYLINE",
      "period": "FULL_GAME",
      "unit": null,
      "subject": {
        "type": "TEAM",
        "code": "LAR",
        "name": "Los Angeles Rams"
      }
    }
  }
}
```

## Event lifecycle channel

Event CREATE and UPDATE changes for all events. Frame `type` is `event_lifecycle`.

| Field | Type | Description |
| :- | :- | :- |
| `type` | String | `event_lifecycle` |
| `sid` | Integer | Subscription ID. |
| `msg` | Object | The Event resource after the change: the fields of the `GET /api/v1/events` REST response, plus `status` (`LISTED` or `DELISTED`). `msg.id` is a string. |

Example event lifecycle frame:

```json theme={null}
{
  "type": "event_lifecycle",
  "sid": 2,
  "msg": {
    "id": "498471892346",
    "created_at": 1782498528000,
    "updated_at": 1782498528000,
    "ticker": "26NOV28LARSF",
    "category": "SPORTS",
    "title": "Rams @ 49ers — Nov 28, 2026",
    "description": "NFL regular season game between the Los Angeles Rams and San Francisco 49ers.",
    "status": "LISTED",
    "additional_metadata": {
      "sport": "football",
      "league": "NFL",
      "season_year": 2026,
      "phase": "Regular",
      "venue": "Levi's Stadium",
      "participants": [
        "Los Angeles Rams",
        "San Francisco 49ers"
      ],
      "scheduled_start_time": 1795902000000,
      "source": [
        {
          "name": "stats_perform",
          "external_event_id": "30"
        },
        {
          "name": "optic_odds",
          "external_event_id": "20"
        }
      ]
    }
  }
}
```

Only publicly visible events are sent. An event that is not yet public does not appear; the change that makes it public is sent.

> [!NOTE]
>
> Lifecycle channels send only changes that occur after you subscribe. To get current state, read it from the REST API first, then subscribe for later changes. Lifecycle frames do not carry `seq`.
