Get Odds
Get odds for upcoming and live events.
Credits: markets_count x regions_count (same formula as the-odds-api). Passing bookmakers= replaces the region count with one region-equivalent per ten books, rounded up and never below one, so eleven books and one market cost 2 credits, not 1.
Every sport key in GET /v1/sports is supported, including every soccer competition in that list, esports, and volleyball.
Regions: us, us2, uk, eu, fr, au, ca, mx, latam, br, asia. Use eu for Pinnacle and European bookmakers.
Markets: h2h (moneyline/3-way), spreads, totals, alternate_spreads, alternate_totals, outrights, and player_* / batter_* / pitcher_* / anytime_* / futures_* prop keys. That list is the WHOLE list this endpoint can return.
Markets served elsewhere are not billed here. A key this endpoint cannot emit is still accepted and the request is still answered (a valid derived market never 400s here, so a migrating client's pipeline is never aborted), but it is dropped from the markets x regions multiplier and costs nothing. The period keys (h2h_1st_half, spreads_1st_half, totals_1st_half, h2h_1st_quarter, h2h_1st_period, h2h_1st_5_innings, spreads_1st_5_innings, totals_1st_5_innings) are served by /v1/sports/{sport_key}/live/period_markets?period=1H&market=h2h and /v1/historical/sports/{sport_key}/period_markets. Team totals, BTTS, correct score, double chance, draw-no-bet and the racing keys are served by /v1/sports/{sport_key}/props?markets=<key>. Until 2026-09-05 /odds billed markets x regions for all of them and dropped them from the response (ticket #295).
What you were billed for. Every charged response carries x-markets-served, the market keys the charge covered. A servable key with no book pricing it right now still costs a credit and still appears there: that is coverage, not a gap. Keys we cannot serve here are listed in x-markets-unservable (billed zero) and routed by x-markets-served-elsewhere.
Filter by bookmaker: ?bookmakers=pinnacle,draftkings
Live only: ?live=true returns events that have already started (same cost as a normal call, no extra charge). For a dedicated in-play endpoint that exposes live-tagged player props alongside game lines, see /v1/sports/{sport_key}/live.
Shape tokens: ?include=slim drops raw_json from any row that carries one. ?include=raw returns the identifying fields plus the bookmakers tree and raw_json, dropping derived fields (canonical_event_id, sport_title, probable_pitchers, starting_lineups). Events on this endpoint do not currently carry a raw_json field, so slim returns the same fields as normalized here and raw differs from normalized only by the derived fields it drops.
Verified-at signal: every bookmaker's last_update is the freshest of (price-change, no-change verification heartbeat). On hot-cycle sources (Pinnacle, FanDuel) that means a maximum age around the 2-second poll interval, even if the price hasn't moved. Add ?include=verification to also receive:
- verified_at: the heartbeat timestamp (we polled and saw the same price)
- line_changed_at: the last actual price-move timestamp
- is_current: true iff verified_at is within the last 5 seconds
Combine with shape tokens, e.g. ?include=slim,verification.
Example: GET /v1/sports/soccer_epl/odds?regions=eu&markets=h2h,spreads&bookmakers=pinnacle
Request
- Base URL: https://parlay-api.com
- URL: https://parlay-api.com/v1/sports/{sport_key}/odds
- Auth: one of:
- API key in header X-API-Key
- API key in query parameter apiKey
- HTTP bearer
Path parameters
Query parameters
Comma-separated: us,us2,uk,eu,au. Default 'us'. iter_047 #420: was previously required (...). Made optional with 'us' default so consumers running pre-existing The-Odds-API-style code (which defaulted to us) don't 422.
Comma-separated: us,us2,uk,eu,au. Default 'us'. iter_047 #420: was previously required (...). Made optional with 'us' default so consumers running pre-existing The-Odds-API-style code (which defaulted to us) don't 422. Repeating this parameter is the same as the comma form: ?markets=h2h&markets=spreads and ?markets=h2h,spreads are one request, billed identically, and return the union. A value repeated across occurrences is counted once.
Comma-separated. Servable here: h2h, spreads, totals, alternate_spreads, alternate_totals, outrights, and any player_/batter_/pitcher_/anytime_/futures_* prop key. Any other key is still accepted and still answered, but it is NOT billed and returns nothing here: period keys (h2h_1st_half, totals_1st_5_innings, ...) belong to /v1/sports/{sport_key}/live/period_markets. The response says which keys were billed (x-markets-served), which were not (x-markets-unservable) and where those are served (x-markets-served-elsewhere).
Comma-separated. Servable here: h2h, spreads, totals, alternate_spreads, alternate_totals, outrights, and any player_/batter_/pitcher_/anytime_/futures_* prop key. Any other key is still accepted and still answered, but it is NOT billed and returns nothing here: period keys (h2h_1st_half, totals_1st_5_innings, ...) belong to /v1/sports/{sport_key}/live/period_markets. The response says which keys were billed (x-markets-served), which were not (x-markets-unservable) and where those are served (x-markets-served-elsewhere). Repeating this parameter is the same as the comma form: ?markets=h2h&markets=spreads and ?markets=h2h,spreads are one request, billed identically, and return the union. A value repeated across occurrences is counted once.
Comma-separated bookmaker keys (overrides regions)
Comma-separated bookmaker keys (overrides regions) Repeating this parameter is the same as the comma form: ?markets=h2h&markets=spreads and ?markets=h2h,spreads are one request, billed identically, and return the union. A value repeated across occurrences is counted once.
Comma-separated event IDs
Shortcut: events whose commence_time falls on this UTC date (YYYY-MM-DD). Sugar for commenceTimeFrom=<date>T00:00:00Z and commenceTimeTo=<date>T23:59:59Z. Explicit commenceTime* values win.
Comma-separated. Shape tokens: normalized (default, every field we build), slim (drops raw_json from any row that carries one), raw (the identifying fields plus the bookmakers tree and raw_json, dropping derived fields such as canonical_event_id, sport_title, probable_pitchers and starting_lineups). Events on this endpoint do not currently carry a raw_json field, so slim returns the same fields as normalized here and raw differs only by the derived fields it drops. Add 'verification' to include verified_at, line_changed_at, and is_current per bookmaker.
Include a link on eligible FanDuel game outcomes with a matching native quote observed within five minutes. Missing metadata is omitted; availability varies by market.
Include the native FanDuel selection ID as sid on eligible game outcomes. Missing or mismatched metadata is omitted.
Alias for include=verification. Adds verified_at, line_changed_at, and is_current per bookmaker.
Live games only (commence_time at or before now). Equivalent to passing commenceTimeTo=<now>. No extra cost.
Include in-progress games in the response (off by default; /odds is for pregame analysis). Set true to get both pregame and live in one call.
Response
Successful Response
Changes
No recorded changes to this operation across all 1 revision of this API.