Get Odds Coverage
What /v1/sports/{sport_key}/odds would actually serve you, per book.
Diagnostic endpoint, no credit charge. Call it before /odds to see which books are live for a sport, and to explain an /odds response you did not expect.
HOW IT STAYS HONEST. This handler does not describe /odds, it RUNS /odds: the same _odds_cache_key, the same cached_call in the same odds namespace with the same ttl, the same _compute_odds_body, the same odds_serving_window and the same _filter_toa_events. It shares /odds' cache entry rather than doubling the query cost, and parity is structural rather than aspirational: there is no second SQL statement here that can drift from the first one.
That drift is not hypothetical, it is what this endpoint used to be. Until 2026-09-08 the report came from its own statement with no commence-time predicate, no suppression filter, no unservable-source filter, no canonical_book_key fold and no /odds parameters at all. Measured against the live board on 2026-09-08: it advertised fanduel at 27 tennis fixtures and 972 h2h markets while /odds served fanduel 2 fixtures, because /odds is pregame-only by default and the report counted the in-play half too. On NFL it listed sixteen Unibet country skins as sixteen separate books at 17 games each, which /odds folds into one unibet, plus paf and atg, which /odds does not serve at all.
PARAMETERS. Every /odds parameter that changes WHICH events and books are served is accepted here and means the same thing: regions, markets, bookmakers, commenceTimeFrom, commenceTimeTo, date, eventIds, live, include_live. The ones that only change how the answer is FORMATTED (oddsFormat, dateFormat, include, verified) are not, because they cannot move a count. Defaults match /odds, so a bare call describes a bare /odds call.
WHAT THE NUMBERS MEAN, and what changed.
- total_games_covered is now the number of distinct events /odds would return under these parameters, which is the number you compare against len(response). It used to be max() over the per-source game counts, which is how a report could say 29 while /odds returned 1.
- total_games_pregame / total_games_in_play are the same board split by the two windows /odds offers, so a smaller served number explains itself. They overlap by the 5-minute grace /odds keeps on just-started games, and events that report no start time count as pregame because that is where /odds serves them.
- per source, games_covered counts fixtures on the SERVED board; games_pregame and games_in_play count the same book on the two halves. A book with games_covered: 0 and games_in_play: 40 is priced, just not in the window you asked for.
- markets_with_h2h / _spread / _total count the markets served, so they are bounded by the markets you requested: the default markets=h2h reports zero spreads and zero totals because /odds would return none.
- sources_count is the number of books with at least one served fixture. sources may list more than that, because a book that is priced only outside your window is listed with games_covered: 0 rather than hidden, which is the answer to "why is my book missing".
- latest_timestamp_ms is the freshest last_update on a private pulse-stamped copy of the served board. The cached body stays immutable, while a no-change verification heartbeat has the same freshness effect here as it does on /odds.
Request
- Base URL: https://parlay-api.com
- URL: https://parlay-api.com/v1/sports/{sport_key}/odds/coverage
- Auth: none declared
Path parameters
Query parameters
Comma-separated: us,us2,uk,eu,au. Same meaning and same default as /odds.
Comma-separated: us,us2,uk,eu,au. Same meaning and same default as /odds. 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 market keys. Same meaning and same default as /odds. The spread and total columns only count what you asked for.
Comma-separated market keys. Same meaning and same default as /odds. The spread and total columns only count what you asked for. 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). Same meaning as on /odds.
Comma-separated bookmaker keys (overrides regions). Same meaning as on /odds. 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.
Same meaning as on /odds. Your window wins over the pregame default.
Same meaning as on /odds. Your window wins over the pregame default.
Shortcut for commenceTimeFrom=<date>T00:00:00Z and commenceTimeTo=<date>T23:59:59Z, exactly as on /odds.
Comma-separated event IDs. Same filtering and cache semantics as /odds.
Report the in-play board only, exactly as /odds?live=true would serve it.
Report pregame and in-play together, exactly as /odds?include_live=true would serve it.
Only count a book's prices when its last_update is within this window.
Response
Successful Response
Changes
No recorded changes to this operation across all 1 revision of this API.