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

# Odds Futures Channel - Outright Betting Odds Stream

> High-throughput realtime futures odds via WebSocket. Stream season-long and outright betting odds from multiple bookmakers with orderbook depth for exchanges.

## What it streams

Realtime odds updates for long-term or season-based markets (“futures”), scoped to a `futureId`.
Each update contains one or more prices per outcome, per bookmaker.

Odds are grouped by `bookmaker` and keyed by participant within each bookmaker.

***

## Routing

* Entity key: `payload.futureId`
* Filters: `sportIds`, `tournamentIds`, `futureIds`, `bookmakers`
* Bookmaker-gated: ✅ Yes

***

## Delivery semantics

Same conflation model as the [odds channel](/websocket/channels/odds#delivery-semantics): updates for the same `oddsId` within a fixed \~10 ms batching window are collapsed to the newest value.

* **No state is lost** — the final value of every price move is always delivered
* Intermediate ticks superseded within a window are not delivered — treat it as a state stream, not a ledger

> Need full price movement or closing line value? Use the REST [Historical Odds & CLV](/api-reference/concepts#historical-odds-and-clv) endpoints (`/futures/odds/historical`, `/futures/odds/clv`).

***

## Payload structure

oddsId:

```
<futureId>:<bookmaker>:<futureOutcomeId>:<participantId>
```

`futureOutcomeId` identifies the side and line within the market. Participant-keyed markets (`winner`, `topscorer`, `relegation`, `mvp`) own no outcome rows and carry the sentinel `0` — the selection is the participant. Decomposed markets (Yes / No, Over / Under) carry a real `futureOutcomeId` per side per line.

Treat `oddsId` as an opaque string and read values from the explicit fields below rather than splitting it. See [Future odds IDs](/api-reference/concepts#future-odds-ids).

***

## outcome object (full schema)

Each entry in the `oddsFutures` map is an **outcome**, similar to the one used in the `odds` channel.

| Field                | Type              | Description                                                         |                                     |
| -------------------- | ----------------- | ------------------------------------------------------------------- | ----------------------------------- |
| `bookmaker`          | `string`          | Bookmaker slug (e.g. `"stake"`, `"pinnacle"`, `"polymarket"`)       |                                     |
| `futureOutcomeId`    | `integer`         | Side and line within the market — `0` for participant-keyed markets |                                     |
| `participantId`      | `integer \| null` | Participant (team/player) the odds apply to                         |                                     |
| `price`              | `number`          | Decimal odds                                                        |                                     |
| `active`             | `boolean`         | Whether the outcome is currently available                          |                                     |
| `bookmakerOutcomeId` | `string \| null`  | Bookmaker-native outcome ID                                         |                                     |
| `bookmakerChangedAt` | `integer \| null` | Bookmaker-provided update timestamp (ms)                            |                                     |
| `priceFractional`    | \`string          | \`                                                                  | Fractional odds (e.g. `"5/2"`)      |
| `priceAmerican`      | \`integer         | \`                                                                  | American odds (e.g. `+200`, `-120`) |
| `limit`              | `number \| null`  | Max allowed stake (if applicable)                                   |                                     |
| `betslip`            | `string \| null`  | Optional bookmaker betslip/deeplink info                            |                                     |
| `meta`               | `object \| null`  | Bookmaker-specific metadata (e.g. ladders, ticks)                   |                                     |
| `changedAt`          | `integer`         | Epoch milliseconds (UTC) when received by the gateway               |                                     |

***

## Example: traditional bookmaker odds for futures

```json theme={null}
{
  "channel": "oddsFutures",
  "type": "UPDATE",
  "payload": {
    "futureId": "id11028543137888",
    "oddsFutures": {
      "stake": {
        "id11028543137888:stake:0:5432": {
          "bookmaker": "stake",
          "futureOutcomeId": 0,
          "participantId": 5432,
          "price": 4.25,
          "active": true,
          "priceAmerican": +325,
          "priceFractional": "13/4",
          "limit": 500,
          "changedAt": 1766940100000
        }
      }
    }
  },
  "ts": 1766940100023,
  "entryId": "1766940100023-456"
}
```

***

## Example: prediction market odds with orderbook metadata

```json theme={null}
{
  "channel": "oddsFutures",
  "type": "UPDATE",
  "payload": {
    "futureId": "id11028543137888",
    "oddsFutures": {
      "polymarket": {
        "id11028543137888:polymarket:0:5432": {
          "bookmaker": "polymarket",
          "futureOutcomeId": 0,
          "participantId": 5432,
          "price": 3.25,
          "active": true,
          "bookmakerOutcomeId": "abc123xyz",
          "limit": 50,
          "meta": {
            "back": [
              { "price": 3.25, "size": 20 },
              { "price": 3.10, "size": 40 }
            ],
            "lay": [
              { "price": 3.40, "size": 15 }
            ]
          },
          "changedAt": 1766940123456
        }
      }
    }
  },
  "ts": 1766940123458,
  "entryId": "1766940123458-501"
}
```

***

## Implementation guidance

* Always use the `oddsId` as the unique ID for odds — as an opaque string, not a parseable one
* Normalize prices as needed (decimal → American, etc.)
* Join `futureId` to:
  * [`futures`](/websocket/channels/futures)
  * [`bookmakersFutures`](/websocket/channels/bookmakersFutures)
* Use `active=false` to pause display or betting logic
* Preserve all fields in `meta` even if unused (for forward compatibility)
