---
title: Market Data Flow
description: Discover a market, build an L2 order book, apply WebSocket updates, recover sequence gaps, and reconnect without losing state.
---

Use REST to discover markets or read a point-in-time book. Use WebSockets to keep a local order book current.

| Need | Interface |
| --- | --- |
| Find markets and tickers | [`GET /markets`](/api-reference/markets/listmarkets) |
| Read one current L2 order book | [`GET /markets/{ticker}/orderbook`](/api-reference/markets/getmarketorderbook) |
| Maintain a live L2 order book | [WebSocket API](/websocket-api) |

## 1. Choose a Market

Call REST `GET /markets`, then keep the `ticker` for each market you want to follow over WebSocket. Prices are YES-side dollar values. Quantities are contract quantities.

## 2. Connect

Open the [WebSocket endpoint for your environment](/quick-start#choose-api-endpoints). Authenticate the HTTP upgrade with an API key signature and select the exact `udx.json.<YYYY-MM-DD>` subprotocol published in AsyncAPI. See [Authentication](/authentication#authenticate-a-websocket-connection) and [Versioning](/versioning#websocket-versioning).

## 3. Subscribe

Send one subscribe command for the tickers you want:

```json
{
  "id": 1,
  "cmd": "subscribe",
  "params": {
    "channels": ["orderbook"],
    "tickers": ["UDX-EXAMPLE-MARKET"],
    "level": "L2",
    "depth": 25
  }
}
```

UDX first returns a `subscribed` response with one subscription ID (`sid`) per ticker. It then sends an `orderbook_snapshot` for each subscription. Replace your local book with that snapshot.

Each `sid` has its own sequence beginning at `1`. Track sequence numbers independently when one command subscribes to multiple markets.

## 4. Apply Updates

Each `orderbook_update` contains absolute replacements for one or more price levels:

- set the level to the supplied quantity; or
- remove the level when the quantity is `0`.

Apply an update only when its `seq` is exactly one greater than the last message for that `sid`. Reapplying the same `(sid, seq)` has no effect.

## 5. Recover a Gap

If a sequence number skips ahead, stop applying updates for that `sid` and request a new snapshot:

```json
{
  "id": 2,
  "cmd": "snapshot",
  "params": {
    "sids": [7]
  }
}
```

The returned `orderbook_snapshot` uses the subscription's next sequence number. Replace the complete local book, record that sequence, then resume applying later updates.

## 6. Reconnect

Subscriptions do not survive a disconnected session. Reconnect with a new signature, subscribe again, and replace local state with each new initial snapshot.

:::note[WebSocket reference]
See [Subscribe to Order Book Updates](/websocket-api/market-data/receivesubscribecommand), [Stream Order Book Data](/websocket-api/market-data/sendorderbookdata), and [Request Order Book Snapshots](/websocket-api/market-data/receivesnapshotcommand) for complete message schemas and error responses.
:::
