---
title: "List Odds"
method: GET
path: "/v1/sports/{sport_key}/odds"
tags: ["Events & Odds"]
---

# List Odds

`GET /v1/sports/{sport_key}/odds`

## Request

- Base URL: `https://api.prop-line.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.prop-line.com/v1/sports/{sport_key}/odds`
- Auth: one of:
  - API key in header `X-API-Key`
  - API key in query parameter `apiKey`

Bulk odds for a sport. Filter by market keys (comma-separated).

Served through a short-TTL single-flight cache — this is the single
highest-volume read path (48% of peak-hour traffic on the 2026-08-08 record
day) and the response is tier-independent. See api/odds_cache.py for the
TTL rationale. No `session` dependency: the loader opens its own read
session so a cancelled leader request can't poison coalesced callers.

Returns a pre-rendered `Response`, so FastAPI skips `response_model`
validation and re-serialization on the hot path — that step measured
0.22-0.48s of BLOCKING event-loop time per ~2 MB response and was being paid
on cache HITS too. `response_model` is kept for the OpenAPI schema only;
`odds_cache.render_odds_json` reproduces its output byte for byte (see that
function before changing any model in this response tree).

## Path parameters

- `sport_key` string, required

## Query parameters

- `markets` string
- `bookmakers` string, nullable: Comma-separated bookmaker keys (e.g. 'draftkings,fanduel'). Omitted = all books. Matches the-odds-api's `bookmakers` param.
- `period` string, nullable: Game-period filter. Omitted = full-game markets only (backwards-compatible default). Pass a comma-separated list of canonical codes (e.g. 'q1,q2' or 'h1') to filter to specific periods. Pass 'all' to include every period alongside full-game.
- `includeLinks` boolean: When true, each bookmaker block carries a `link` — that book's public event-page URL (plain navigation, no affiliate tagging). Only books with a verified URL template emit links (Bovada, DraftKings, FanDuel, BetMGM, Kalshi, Polymarket, Smarkets); others return null. Matches the-odds-api's `includeLinks` param.
- `includeBookIds` boolean: When true, each bookmaker block carries `book_event_id` (that book's own event identifier) and every outcome carries `book_outcome_id` (that book's own selection/contract id) plus `outcome_id` (PropLine's own canonical outcome id — the same value `line_movement` / `resolution` webhooks carry, so a push delivery joins onto exactly one REST row). Use these to join PropLine rows onto a book's native feed without matching on team names, players and lines. Kalshi ships both — the event ticker and the per-contract market ticker (e.g. KXMLBGAME-26AUG08NYYBOS-NYY). Books that don't publish a stable id return null. PropLine-specific; both fields are always present in the response shape and are null unless this param is set (same convention as `link`/`includeLinks`), so no existing consumer's parsing changes.
- `includeDepth` boolean: When true, every outcome carries `depth`: the order-book levels BEYOND the served price, best-first, each `{price, size}` (American odds; dollars a taker can spend at that level). Up to 50 levels for Polymarket, Polymarket US and Kalshi (Kalshi: a budgeted read, served only while under 3 minutes old and its top equals `price`), up to 3 for ProphetX; `[]` for every other book or an empty ladder. Omitted from the response unless set. PropLine-specific.
- `includePregameOnly` boolean: Books with no in-game feed stop updating when a game starts, so their prices freeze at the last pregame quote. By default those books are LEFT OUT of a game that is in progress (DFS books stay: their pregame line is the line they settle on). Set true to include them; each such book is flagged `pregame_only: true`. PropLine-specific.
- `includeRestricted` boolean: PrizePicks marks some projections over-only (its own `allowed_wager_types`), and in some states the Under is still available. By default the leg a projection's flag excludes is LEFT OUT. Set true to include it; every outcome whose book publishes the flag then carries `allowed_wager_types` ("over", "under_or_over"), so a leg is enterable everywhere only when its side is in that value. Omitted from the response unless set. PropLine-specific.
- `max_age` integer, nullable: Drop any market the book has not delivered in the last N seconds (its `last_update` is older than now minus N). A book left with no markets is dropped; on bulk /odds an event left with no books is dropped. Omitted = no age cut. PropLine-specific.

## Response `200`

Successful Response

- EventOddsOut[]
  - `home_team_key` string, nullable
  - `away_team_key` string, nullable
  - `home_team_id` string, nullable
  - `away_team_id` string, nullable
  - `home_team_logo_url` string, nullable
  - `away_team_logo_url` string, nullable
  - `id` string, required
  - `sport_key` string, required
  - `home_team` string, required
  - `away_team` string, required
  - `commence_time` string, date-time, required
  - `live` boolean
  - `is_outright` boolean
  - `tournament` string, nullable
  - `tour` string, nullable
  - `last_update` string, date-time, nullable
  - `merged_from_event_ids` string[], nullable
  - `bookmakers` BookmakerOut[], required
    - `key` string, required
    - `title` string, required
    - `last_update` string, date-time, nullable
    - `link` string, nullable
    - `app_link` string, nullable
    - `pregame_only` boolean
    - `book_event_id` string, nullable
    - `markets` MarketOut[], required
      - `key` string, required
      - `description` string
      - `last_update` string, date-time, required
      - `period` string, nullable
      - `suspended_at` string, date-time, nullable
      - `team` string, nullable
      - `line_type` string
      - `outcomes` OutcomeOut[], required
        - `name` string, required
        - `description` string, required
        - `price` integer, nullable, required
        - `point` number, nullable, required
        - `book_updated_at` string, date-time, nullable
        - `book_version` integer, nullable
        - `payout_multiplier` number, nullable
        - `dfs_odds_type` string, nullable
        - `last_change_at` string, date-time, nullable
        - `last_seen_at` string, date-time, nullable
        - `liquidity` number, nullable
        - `liquidity_updated_at` string, date-time, nullable
        - `depth` DepthLevelOut[], nullable
          - `price` integer, required
          - `size` number, nullable
        - `allowed_wager_types` string, nullable
        - `line_gap` number, nullable
        - `book_outcome_id` string, nullable
        - `book_outcome_id_ontario` string, nullable
        - `outcome_id` integer, nullable
        - `player_id` string, nullable
        - `side` string, nullable
        - `line_type` string, nullable

## Other responses

- `422`: Validation Error

## Changes

> 89 revisions in range; 4 not diffed.

- **2026-10-24** `a90053a73148`: 1 info
  - added the optional property `items/bookmakers/items/markets/items/outcomes/items/book_outcome_id_ontario` to the response with the `200` status
- **2026-10-17** `8db25901f2d5`: 2 info
  - added the new optional `query` request parameter `includeRestricted`
  - added the optional property `items/bookmakers/items/markets/items/outcomes/items/allowed_wager_types` to the response with the `200` status
- **2026-10-13** `6e3df8744e91`: 2 info
  - added the new optional `query` request parameter `includePregameOnly`
  - added the new optional `query` request parameter `max_age`
- **2026-10-01** `854f3fa56312`: 2 info
  - added the optional property `items/bookmakers/items/markets/items/line_type` to the response with the `200` status
  - added the optional property `items/bookmakers/items/markets/items/outcomes/items/line_type` to the response with the `200` status
- **2026-09-26** `56428841e90b`: 6 info
  - added the new optional `query` request parameter `includeDepth`
  - added the optional property `items/bookmakers/items/markets/items/outcomes/items/depth` to the response with the `200` status
  - added the optional property `items/bookmakers/items/markets/items/outcomes/items/side` to the response with the `200` status
  - added the optional property `items/is_outright` to the response with the `200` status
  - …2 more

[Operation history](https://skmtc.dev/prop-line/apis/player-props-api/changes/v1/sports/:sport_key/odds/get.md)

---

[API](https://skmtc.dev/prop-line/apis/player-props-api.md) - [All operations](https://skmtc.dev/prop-line/apis/player-props-api/llms.txt) - [OpenAPI document](https://skmtc.dev/prop-line/apis/player-props-api/revisions/d3654129ada4?raw)
