Events & Odds

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).

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)
  • Auth
    • API key in header X-API-Key
    • or API key in query parameter apiKey

Path parameters

sport_keystring required

Query parameters

marketsstring
bookmakersstring nullable

Comma-separated bookmaker keys (e.g. 'draftkings,fanduel'). Omitted = all books. Matches the-odds-api's bookmakers param.

periodstring 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.

includeLinksboolean

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.

includeBookIdsboolean

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.

includeDepthboolean

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.

includePregameOnlyboolean

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.

includeRestrictedboolean

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_ageinteger 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

Successful Response

home_team_keystring nullable
away_team_keystring nullable
home_team_idstring nullable
away_team_idstring nullable
home_team_logo_urlstring nullable
away_team_logo_urlstring nullable
idstring required
sport_keystring required
home_teamstring required
away_teamstring required
commence_timestring date-time required
liveboolean
is_outrightboolean
tournamentstring nullable
tourstring nullable
last_updatestring date-time nullable
merged_from_event_idsstring[] nullable

Changes

    • info

      added the optional property /////// to the response with the status

    • info

      added the new optional query request parameter includeRestricted

    • info

      added the optional property /////// to the response with the status