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

# GET /odds — Current Prices for a Single Match

> GET /v1/pinnacle/odds returns every current selection for one match, with prices, market names, betting cutoffs, stake limits, and per-market versions for deduplication.

Returns every bettable outcome currently priced for one match, flattened into [selections](/passthrough/selection-object). Each selection includes its current price, betting cutoff, and the maximum risk stake accepted for that market. By default the response also includes the match's derivatives (specials — correct score, winning margin, and similar) as a `specials[]` array of the same shape, so one request returns the whole game. This is the same payload a WebSocket `snapshot` frame carries.

```text theme={null}
GET https://passthrough.sportrix.ai/v1/pinnacle/odds?match=1632570636
```

**Scope:** `odds` · **Sportsbook grant:** `pinnacle`

## Query parameters

| Parameter  | Type    | Required | Description                                                                                              |
| ---------- | ------- | -------- | -------------------------------------------------------------------------------------------------------- |
| `match`    | integer | **Yes**  | Match id from [`GET /matches`](/passthrough/matches)                                                     |
| `specials` | boolean | No       | Include the match's derivatives in `specials[]`. Defaults to `true`. Pass `false` for the main book only |

A missing, zero, or unparseable `match` returns `400`.

<Note>
  `specials` is honored only when `match` is a top-level matchup. Requesting `/odds` for an id that is itself a special returns just that special, with no nested `specials[]`.
</Note>

## Request

```bash theme={null}
curl "https://passthrough.sportrix.ai/v1/pinnacle/odds?match=1632570636" \
  -H "X-API-Key: sk_your_api_key_here"
```

## Response

```json theme={null}
{
  "match_id": 1632570636,
  "sport_id": 12,
  "type": "matchup",
  "parent_id": 0,
  "special": "",
  "league_id": 100,
  "league_name": "CS2 - ESL Pro League",
  "home": "T1",
  "away": "FURIA",
  "start_time": "2026-07-27T18:00:00Z",
  "status": "started",
  "is_live": true,
  "ts": 1785110400123,
  "selections": [
    {
      "market_key": "s;0;m",
      "market_name": "Match - Money Line",
      "period": 0,
      "bet_name": "T1",
      "price": -120,
      "decimal": 1.833,
      "status": "unlocked",
      "version": 100,
      "cutoff_at": "2026-07-27T19:00:00Z",
      "limit": 1000
    },
    {
      "market_key": "s;0;m",
      "market_name": "Match - Money Line",
      "period": 0,
      "bet_name": "FURIA",
      "price": -106,
      "decimal": 1.943,
      "status": "unlocked",
      "version": 100,
      "cutoff_at": "2026-07-27T19:00:00Z",
      "limit": 1000
    },
    {
      "market_key": "s;1;ou;2.5",
      "market_name": "Map 1 - Total",
      "period": 1,
      "bet_name": "Over 2.5",
      "line": 2.5,
      "price": -101,
      "decimal": 1.99,
      "status": "unlocked",
      "version": 214,
      "cutoff_at": "2026-07-27T19:00:00Z",
      "limit": 225
    }
  ],
  "specials": [
    {
      "match_id": 1632570912,
      "sport_id": 12,
      "type": "special",
      "parent_id": 1632570636,
      "special": "Map 1 - Correct Score",
      "league_id": 100,
      "league_name": "CS2 - ESL Pro League",
      "home": "",
      "away": "",
      "start_time": "2026-07-27T18:00:00Z",
      "status": "started",
      "is_live": true,
      "ts": 1785110400123,
      "selections": [
        {
          "market_key": "sp;1632570912;m",
          "market_name": "Correct Score",
          "period": 1,
          "bet_name": "16-14",
          "price": 850,
          "decimal": 9.5,
          "status": "unlocked",
          "version": 42,
          "cutoff_at": "2026-07-27T19:00:00Z",
          "limit": 100
        }
      ]
    }
  ]
}
```

### Top-level fields

| Field         | Type    | Description                                                                                                                                                                                                                                                                                                                               |
| ------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `match_id`    | integer | The match id you requested                                                                                                                                                                                                                                                                                                                |
| `sport_id`    | integer | Sport this match belongs to                                                                                                                                                                                                                                                                                                               |
| `type`        | string  | `matchup` or `special`                                                                                                                                                                                                                                                                                                                    |
| `parent_id`   | integer | For a special, the matchup it derives from. `0` on a regular matchup                                                                                                                                                                                                                                                                      |
| `special`     | string  | For a special, its description. Empty string on a regular matchup                                                                                                                                                                                                                                                                         |
| `league_id`   | integer | League id                                                                                                                                                                                                                                                                                                                                 |
| `league_name` | string  | League name                                                                                                                                                                                                                                                                                                                               |
| `home`        | string  | Home side name. Empty on specials                                                                                                                                                                                                                                                                                                         |
| `away`        | string  | Away side name. Empty on specials                                                                                                                                                                                                                                                                                                         |
| `start_time`  | string  | Scheduled start, ISO 8601 UTC                                                                                                                                                                                                                                                                                                             |
| `status`      | string  | The sportsbook's status string                                                                                                                                                                                                                                                                                                            |
| `is_live`     | boolean | Whether the match is in play                                                                                                                                                                                                                                                                                                              |
| `ts`          | integer | Epoch milliseconds when SportriX last applied a change to this match                                                                                                                                                                                                                                                                      |
| `selections`  | array   | Every current selection, including its `cutoff_at` and per-market `limit`. See the [Selection object](/passthrough/selection-object)                                                                                                                                                                                                      |
| `specials`    | array   | The match's derivatives, one entry per special with the same top-level shape (its own `match_id`, `selections`, and a `parent_id` pointing at the requested match). Present on a top-level matchup unless `specials=false` was passed. Empty array when the game has no derivatives; omitted when the requested match is itself a special |

<Note>
  Unlike the match list, `parent_id` and `special` are always present here — as `0` and `""` on a regular matchup. Branch on `type`, not on whether the field exists.
</Note>

## Specials are included by default

A sportsbook models derivatives — correct score, winning margin, alternate totals, and similar — as separate matchups with their own selections. Because the parent match's book does not carry them, a caller who did not know to ask was silently getting a partial game. `GET /odds` now returns the whole game in one request: the parent's own selections at the top level, and each derivative as an entry in `specials[]`.

Every entry in `specials[]` has the same shape as the top-level response — including its own `match_id`, `type: "special"`, `parent_id` pointing back at the requested match, `selections`, and its own `ts`. Apply the same [market versioning rules](/passthrough/overview#prices-and-market-versions) per selection.

If you only want the main book — for example, when you already stream specials separately over the WebSocket — pass `specials=false`:

```bash theme={null}
curl "https://passthrough.sportrix.ai/v1/pinnacle/odds?match=1632570636&specials=false" \
  -H "X-API-Key: sk_your_api_key_here"
```

With `specials=false`, the `specials` field is omitted from the response.

## Locked markets are still returned

A market the sportsbook has closed or suspended in play is **not removed** from the response. Its selections come back with `"status": "locked"` and their last known price.

<Warning>
  Never treat a `locked` price as bettable. The price is the last one seen before the market closed, kept so you can keep rendering the board rather than blanking it.
</Warning>

## Snapshot, not a subscription

This endpoint reads the in-memory book at the moment of the request. It is the right tool for a one-off read or for reconciling after a stream gap, but it is not a substitute for the [live stream](/passthrough/stream) — polling it will always be slower than the push, and the prices can change between your request and your next one.

## Errors

| Status | Body                                        | Cause                                 |
| ------ | ------------------------------------------- | ------------------------------------- |
| `400`  | `{"error": "match query param required"}`   | `match` missing, zero, or unparseable |
| `401`  | `{"error": "invalid or inactive API key"}`  | Missing, unknown, or inactive key     |
| `403`  | `{"error": "missing required scope: odds"}` | Key lacks the `odds` scope            |
| `404`  | `{"error": "unknown match"}`                | No such match in the book             |
| `503`  | `{"error": "auth backend unavailable"}`     | Authentication backend unreachable    |

<Note>
  A `404` means the match is not in the book **right now**. That covers an id that never existed, one that has finished and been pruned, and one the sportsbook removed. It is not distinguishable from the response.
</Note>
