[{"key":"pinnacle","title":"Pinnacle","region":"eu","status":"active","regions":["eu"],"endpoints":["game_lines","live","props","period_markets","historical_period","historical"],"game_line_markets":["h2h","spreads","totals"],"example_paths":{"game_lines":"/v1/sports/americanfootball_nfl/odds?regions=eu&markets=h2h&bookmakers=pinnacle","live":"/v1/sports/americanfootball_nfl/odds?regions=eu&markets=h2h&bookmakers=pinnacle&live=true","props":"/v1/sports/soccer_epl/props?bookmakers=pinnacle","period_markets":"/v1/sports/americanfootball_nfl/live/period_markets?source=pinnacle&period=1H","historical_period":"/v1/historical/sports/americanfootball_nfl/period_markets?source=pinnacle&period=Q3&dateFrom=YYYY-MM-DD","historical":"/v1/historical/sports/americanfootball_nfl/odds?bookmakers=pinnacle&date=YYYY-MM-DD"},"freshness_path":"/v1/bookmakers/pinnacle/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"pinnacle","archive":"game_lines","rows_upper_bound":264261,"coverage_basis":"event_date","first_event_date":"2012-03-02","last_event_date":"2026-12-04"},{"source":"pinnacle_close","archive":"game_lines","suffix":"_close","rows_upper_bound":62363,"coverage_basis":"event_date","first_event_date":"2012-03-02","last_event_date":"2026-01-14"},{"source":"pinnacle_open","archive":"game_lines","suffix":"_open","rows_upper_bound":28879,"coverage_basis":"event_date","first_event_date":"2026-04-30","last_event_date":"2026-12-04"},{"source":"pinnacle","archive":"props","rows_upper_bound":1419066,"coverage_basis":"archive_write_time","first_row_at":"2026-04-14T11:59:09Z","last_row_at":"2026-08-23T21:32:48Z","days_since_last_row":0.5,"writing":true}],"examples":["pinnacle","pinnacle_close","pinnacle_open","pinnacle"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"draftkings","title":"DraftKings","region":"us","status":"active","regions":["us"],"endpoints":["game_lines","live","props","historical_period","historical"],"game_line_markets":["h2h","spreads","totals"],"example_paths":{"game_lines":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=draftkings","live":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=draftkings&live=true","props":"/v1/sports/baseball_mlb/props?bookmakers=draftkings","historical_period":"/v1/historical/sports/americanfootball_nfl/period_markets?source=draftkings&period=Q3&dateFrom=YYYY-MM-DD","historical":"/v1/historical/sports/americanfootball_nfl/odds?bookmakers=draftkings&date=YYYY-MM-DD"},"freshness_path":"/v1/bookmakers/draftkings/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"draftkings_an","archive":"game_lines","suffix":"_an","rows_upper_bound":22530,"coverage_basis":"event_date","first_event_date":"2023-10-24","last_event_date":"2026-09-07"},{"source":"draftkings","archive":"game_lines","rows_upper_bound":7863,"coverage_basis":"event_date","first_event_date":"2023-08-26","last_event_date":"2026-10-21"},{"source":"draftkings_open","archive":"game_lines","suffix":"_open","rows_upper_bound":395,"coverage_basis":"event_date","first_event_date":"2026-05-08","last_event_date":"2026-08-28"},{"source":"draftkings","archive":"props","rows_upper_bound":2795289,"coverage_basis":"archive_write_time","first_row_at":"2026-04-07T21:37:55Z","last_row_at":"2026-08-23T21:32:26Z","days_since_last_row":0.5,"writing":true}],"examples":["draftkings_an","draftkings","draftkings_open","draftkings"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"fanduel","title":"FanDuel","region":"us","status":"active","regions":["us"],"endpoints":["game_lines","live","props","historical_period","historical"],"game_line_markets":["h2h","spreads","totals"],"example_paths":{"game_lines":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=fanduel","live":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=fanduel&live=true","props":"/v1/sports/baseball_mlb/props?bookmakers=fanduel","historical_period":"/v1/historical/sports/americanfootball_nfl/period_markets?source=fanduel&period=Q3&dateFrom=YYYY-MM-DD","historical":"/v1/historical/sports/americanfootball_nfl/odds?bookmakers=fanduel&date=YYYY-MM-DD"},"freshness_path":"/v1/bookmakers/fanduel/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"fanduel_an","archive":"game_lines","suffix":"_an","rows_upper_bound":20430,"coverage_basis":"event_date","first_event_date":"2023-10-24","last_event_date":"2026-09-07"},{"source":"fanduel","archive":"game_lines","rows_upper_bound":3871,"coverage_basis":"event_date","first_event_date":"2026-02-08","last_event_date":"2026-12-26"},{"source":"fanduel_open","archive":"game_lines","suffix":"_open","rows_upper_bound":1383,"coverage_basis":"event_date","first_event_date":"2026-05-08","last_event_date":"2026-12-26"},{"source":"fanduel","archive":"props","rows_upper_bound":1399397,"coverage_basis":"archive_write_time","first_row_at":"2026-04-19T18:18:29Z","last_row_at":"2026-08-23T21:32:48Z","days_since_last_row":0.5,"writing":true}],"examples":["fanduel_an","fanduel","fanduel_open","fanduel"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"betmgm","title":"BetMGM","region":"us","status":"active","regions":["us"],"endpoints":["game_lines","live","props","historical_period","historical"],"game_line_markets":["h2h","spreads","totals"],"example_paths":{"game_lines":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=betmgm","live":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=betmgm&live=true","props":"/v1/sports/baseball_mlb/props?bookmakers=betmgm","historical_period":"/v1/historical/sports/americanfootball_nfl/period_markets?source=betmgm&period=Q3&dateFrom=YYYY-MM-DD","historical":"/v1/historical/sports/americanfootball_nfl/odds?bookmakers=betmgm&date=YYYY-MM-DD"},"freshness_path":"/v1/bookmakers/betmgm/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"betmgm_an","archive":"game_lines","suffix":"_an","rows_upper_bound":21293,"coverage_basis":"event_date","first_event_date":"2023-10-24","last_event_date":"2026-09-06"},{"source":"betmgm","archive":"game_lines","rows_upper_bound":10401,"coverage_basis":"event_date","first_event_date":"2025-07-25","last_event_date":"2026-12-26"},{"source":"betmgm_open","archive":"game_lines","suffix":"_open","rows_upper_bound":179,"coverage_basis":"event_date","first_event_date":"2026-05-08","last_event_date":"2026-08-28"},{"source":"betmgm","archive":"props","rows_upper_bound":946862,"coverage_basis":"archive_write_time","first_row_at":"2026-04-26T20:25:06Z","last_row_at":"2026-08-23T21:31:42Z","days_since_last_row":0.5,"writing":true}],"examples":["betmgm_an","betmgm","betmgm_open","betmgm"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"caesars","title":"Caesars","region":"us","status":"active","regions":["us"],"endpoints":["game_lines","live","props","historical_period","historical"],"game_line_markets":["h2h","spreads","totals"],"example_paths":{"game_lines":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=caesars","live":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=caesars&live=true","props":"/v1/sports/baseball_mlb/props?bookmakers=caesars","historical_period":"/v1/historical/sports/americanfootball_nfl/period_markets?source=caesars&period=Q3&dateFrom=YYYY-MM-DD","historical":"/v1/historical/sports/americanfootball_nfl/odds?bookmakers=caesars&date=YYYY-MM-DD"},"freshness_path":"/v1/bookmakers/caesars/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"caesars_an","archive":"game_lines","suffix":"_an","rows_upper_bound":22118,"coverage_basis":"event_date","first_event_date":"2023-10-24","last_event_date":"2026-09-07"},{"source":"caesars","archive":"game_lines","rows_upper_bound":4789,"coverage_basis":"event_date","first_event_date":"2018-08-25","last_event_date":"2026-10-21"},{"source":"caesars_open","archive":"game_lines","suffix":"_open","rows_upper_bound":178,"coverage_basis":"event_date","first_event_date":"2026-05-08","last_event_date":"2026-08-28"},{"source":"caesars","archive":"props","rows_upper_bound":651363,"coverage_basis":"archive_write_time","first_row_at":"2026-04-07T21:17:45Z","last_row_at":"2026-08-23T21:32:44Z","days_since_last_row":0.5,"writing":true}],"examples":["caesars_an","caesars","caesars_open","caesars"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"fanatics","title":"Fanatics Sportsbook","region":"us","status":"active","regions":["us"],"endpoints":["game_lines","live","props","historical"],"game_line_markets":["h2h","spreads","totals"],"example_paths":{"game_lines":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=fanatics","live":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=fanatics&live=true","props":"/v1/sports/baseball_mlb/props?bookmakers=fanatics","historical":"/v1/historical/sports/americanfootball_nfl/odds?bookmakers=fanatics&date=YYYY-MM-DD"},"freshness_path":"/v1/bookmakers/fanatics/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"fanatics_an","archive":"game_lines","suffix":"_an","rows_upper_bound":20999,"coverage_basis":"event_date","first_event_date":"2023-10-24","last_event_date":"2026-09-06"},{"source":"fanatics","archive":"game_lines","rows_upper_bound":1877,"coverage_basis":"event_date","first_event_date":"2026-02-08","last_event_date":"2026-10-21"},{"source":"fanatics_open","archive":"game_lines","suffix":"_open","rows_upper_bound":36,"coverage_basis":"event_date","first_event_date":"2026-05-08","last_event_date":"2026-05-16"},{"source":"fanatics","archive":"props","rows_upper_bound":227932,"coverage_basis":"archive_write_time","first_row_at":"2026-04-26T21:22:10Z","last_row_at":"2026-08-23T21:28:21Z","days_since_last_row":0.5,"writing":true}],"examples":["fanatics_an","fanatics","fanatics_open","fanatics"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"bet365","title":"bet365","region":"uk","status":"active","regions":["uk"],"endpoints":["game_lines","live","props","historical"],"game_line_markets":["h2h","spreads","totals"],"example_paths":{"game_lines":"/v1/sports/americanfootball_nfl/odds?regions=uk&markets=h2h&bookmakers=bet365","live":"/v1/sports/americanfootball_nfl/odds?regions=uk&markets=h2h&bookmakers=bet365&live=true","props":"/v1/sports/baseball_mlb/props?bookmakers=bet365","historical":"/v1/historical/sports/americanfootball_nfl/odds?bookmakers=bet365&date=YYYY-MM-DD"},"freshness_path":"/v1/bookmakers/bet365/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"bet365","archive":"game_lines","rows_upper_bound":211086,"coverage_basis":"event_date","first_event_date":"2005-07-29","last_event_date":"2026-10-21"},{"source":"bet365_close","archive":"game_lines","suffix":"_close","rows_upper_bound":10063,"coverage_basis":"event_date","first_event_date":"2025-07-25","last_event_date":"2026-04-30"},{"source":"bet365_an","archive":"game_lines","suffix":"_an","rows_upper_bound":3770,"coverage_basis":"event_date","first_event_date":"2023-10-24","last_event_date":"2026-06-28"},{"source":"bet365_open","archive":"game_lines","suffix":"_open","rows_upper_bound":34,"coverage_basis":"event_date","first_event_date":"2026-05-08","last_event_date":"2026-07-17"},{"source":"bet365","archive":"props","rows_upper_bound":1104227,"coverage_basis":"archive_write_time","first_row_at":"2026-04-19T19:31:39Z","last_row_at":"2026-08-23T21:32:37Z","days_since_last_row":0.5,"writing":true}],"examples":["bet365","bet365_close","bet365_an","bet365_open","bet365"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"betrivers","title":"BetRivers","region":"us","status":"active","regions":["us"],"endpoints":["game_lines","live","props","historical"],"game_line_markets":["h2h","spreads","totals"],"example_paths":{"game_lines":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=betrivers","live":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=betrivers&live=true","props":"/v1/sports/basketball_wnba/props?bookmakers=betrivers","historical":"/v1/historical/sports/americanfootball_nfl/odds?bookmakers=betrivers&date=YYYY-MM-DD"},"freshness_path":"/v1/bookmakers/betrivers/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"betrivers","archive":"game_lines","rows_upper_bound":3722,"coverage_basis":"event_date","first_event_date":"2026-02-08","last_event_date":"2026-10-20"},{"source":"betrivers_an","archive":"game_lines","suffix":"_an","rows_upper_bound":1376,"coverage_basis":"event_date","first_event_date":"2025-10-25","last_event_date":"2026-09-06"},{"source":"betrivers_open","archive":"game_lines","suffix":"_open","rows_upper_bound":177,"coverage_basis":"event_date","first_event_date":"2026-05-08","last_event_date":"2026-08-28"},{"source":"betrivers","archive":"props","rows_upper_bound":62802,"coverage_basis":"archive_write_time","first_row_at":"2026-04-26T20:25:39Z","last_row_at":"2026-08-23T21:32:48Z","days_since_last_row":0.5,"writing":true}],"examples":["betrivers","betrivers_an","betrivers_open","betrivers"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"pointsbet","title":"PointsBet","region":"us","status":"decommissioned","merged_into":"fanatics","note":"PointsBet's US operations were acquired by Fanatics in May 2024. Historical data through that date is still queryable via /v1/historical/.../closing-odds; for current pricing use bookmakers=fanatics.","regions":["us"],"endpoints":["game_lines","live","historical"],"game_line_markets":["h2h","spreads","totals"],"example_paths":{"game_lines":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=pointsbet","live":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=pointsbet&live=true","historical":"/v1/historical/sports/americanfootball_nfl/odds?bookmakers=pointsbet&date=YYYY-MM-DD"}},{"key":"bovada","title":"Bovada","region":"us","status":"active","regions":["us"],"endpoints":["game_lines","live","props"],"game_line_markets":["h2h","spreads","totals"],"example_paths":{"game_lines":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=bovada","live":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=bovada&live=true","props":"/v1/sports/baseball_mlb/props?bookmakers=bovada"},"freshness_path":"/v1/bookmakers/bovada/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"bovada","archive":"game_lines","rows_upper_bound":4229,"coverage_basis":"event_date","first_event_date":"2019-11-01","last_event_date":"2025-01-21"},{"source":"bovada","archive":"props","rows_upper_bound":6836880,"coverage_basis":"archive_write_time","first_row_at":"2026-04-07T21:15:29Z","last_row_at":"2026-08-23T21:32:36Z","days_since_last_row":0.5,"writing":true}],"examples":["bovada","bovada"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"novig","title":"Novig","region":"us","status":"active","regions":["us"],"endpoints":["game_lines","live","props","prediction","event_markets"],"game_line_markets":["h2h","spreads","totals"],"example_paths":{"game_lines":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=novig","live":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=novig&live=true","props":"/v1/sports/baseball_mlb/props?bookmakers=novig","prediction":"/v1/prediction-markets/americanfootball_nfl?sources=novig","event_markets":"/v1/event-markets/search?q=<your+query>&sources=novig"},"freshness_path":"/v1/bookmakers/novig/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"novig","archive":"props","rows_upper_bound":647655,"coverage_basis":"archive_write_time","first_row_at":"2026-04-07T21:21:29Z","last_row_at":"2026-08-23T21:32:35Z","days_since_last_row":0.5,"writing":true}],"examples":["novig"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"prophetx","title":"ProphetX","region":"us","status":"suppressed","note":"Suppressed: not served on any endpoint. Filtering to this key returns no rows.","regions":["us"],"endpoints":[]},{"key":"polymarket","title":"Polymarket","region":"global","status":"active","regions":["us","eu","uk","au","global"],"endpoints":["prediction","event_markets","props"],"example_paths":{"prediction":"/v1/prediction-markets/baseball_mlb?sources=polymarket","event_markets":"/v1/event-markets/search?q=<your+query>&sources=polymarket","props":"/v1/sports/americanfootball_nfl/props?bookmakers=polymarket"},"freshness_path":"/v1/bookmakers/polymarket/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"polymarket","archive":"game_lines","rows_upper_bound":13,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-08-20"},{"source":"polymarket","archive":"props","rows_upper_bound":555,"coverage_basis":"archive_write_time","first_row_at":"2026-05-13T11:12:53Z","last_row_at":"2026-08-23T21:07:55Z","days_since_last_row":0.5,"writing":true}],"examples":["polymarket","polymarket"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"kalshi","title":"Kalshi","region":"us","status":"active","regions":["us"],"endpoints":["prediction","event_markets"],"example_paths":{"prediction":"/v1/prediction-markets/baseball_mlb?sources=kalshi","event_markets":"/v1/event-markets/search?q=<your+query>&sources=kalshi"},"freshness_path":"/v1/bookmakers/kalshi/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"kalshi","archive":"props","rows_upper_bound":4433,"coverage_basis":"archive_write_time","first_row_at":"2026-05-13T04:35:46Z","last_row_at":"2026-08-23T21:32:47Z","days_since_last_row":0.5,"writing":true}],"examples":["kalshi"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"robinhood","title":"Robinhood Event Contracts","region":"us","status":"active","aliases_to":"kalshi","note":"Robinhood Event Contracts is a Kalshi white-label: same exchange, same prices. Query ?bookmakers=robinhood to filter to this surface (data is stored under source=kalshi).","regions":["us"],"freshness_path":"/v1/bookmakers/robinhood/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[],"examples":[],"note":"Measured in this deployment: the closing-odds archive serves no rows for this book under any source key, so no historical variant of its key exists. Live endpoints are unaffected."}},{"key":"prizepicks","title":"PrizePicks","region":"us","status":"active","regions":["us"],"endpoints":["props"],"example_paths":{"props":"/v1/sports/baseball_mlb/props?bookmakers=prizepicks"},"freshness_path":"/v1/bookmakers/prizepicks/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"prizepicks_mobile","archive":"props","rows_upper_bound":69116,"coverage_basis":"archive_write_time","first_row_at":"2026-05-11T06:45:05Z","last_row_at":"2026-05-20T18:25:07Z","days_since_last_row":95.7,"writing":false}],"examples":["prizepicks_mobile"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"ended","props_archive_coverage_end":"2026-05-20T18:25:07Z","props_archive_note":"This book's prop closing-line archive is NOT being written. The newest archived row is 2026-05-20T18:25:07Z and there are none after it, so historical prop queries dated later return nothing for this book. No resumption date is known and none is implied."}},{"key":"underdog","title":"Underdog","region":"us","status":"active","regions":["us"],"endpoints":["props"],"example_paths":{"props":"/v1/sports/americanfootball_nfl/props?bookmakers=underdog"},"freshness_path":"/v1/bookmakers/underdog/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"underdog","archive":"props","rows_upper_bound":1208081,"coverage_basis":"archive_write_time","first_row_at":"2026-04-10T05:47:57Z","last_row_at":"2026-08-23T21:32:37Z","days_since_last_row":0.5,"writing":true},{"source":"underdog_mobile","archive":"props","rows_upper_bound":4941,"coverage_basis":"archive_write_time","first_row_at":"2026-05-20T18:24:30Z","last_row_at":"2026-05-20T18:24:30Z","days_since_last_row":95.7,"writing":false}],"examples":["underdog","underdog_mobile"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"partial","props_archive_note":"Some feeds behind this book have stopped writing the prop archive: underdog_mobile last wrote 2026-05-20T18:24:30Z. The remaining feeds are still writing."}},{"key":"sleeper","title":"Sleeper","region":"us","status":"active","regions":["us"],"endpoints":["props"],"example_paths":{"props":"/v1/sports/baseball_mlb/props?bookmakers=sleeper"},"freshness_path":"/v1/bookmakers/sleeper/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[],"examples":[],"note":"Measured in this deployment: the closing-odds archive serves no rows for this book under any source key, so no historical variant of its key exists. Live endpoints are unaffected."}},{"key":"fliff","title":"Fliff","region":"us","status":"active","regions":["us"],"endpoints":["props"],"example_paths":{"props":"/v1/sports/baseball_mlb/props?bookmakers=fliff"},"freshness_path":"/v1/bookmakers/fliff/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"fliff","archive":"game_lines","rows_upper_bound":701,"coverage_basis":"event_date","first_event_date":"2026-07-31","last_event_date":"2026-08-23"},{"source":"fliff","archive":"props","rows_upper_bound":281906,"coverage_basis":"archive_write_time","first_row_at":"2026-04-18T03:28:53Z","last_row_at":"2026-08-23T21:30:37Z","days_since_last_row":0.5,"writing":true}],"examples":["fliff","fliff"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"parlayplay","title":"ParlayPlay","region":"us","status":"suppressed","note":"Suppressed: not served on any endpoint. Filtering to this key returns no rows.","regions":["us"],"endpoints":[]},{"key":"betr","title":"Betr","region":"us","status":"inactive","note":"Confirmed zero rows in every source-bearing table in production (scripts/hetzner/catalog_truth_check.py). Advertised active with capability props but querying bookmakers=betr always returns HTTP 200 empty; not yet added to SUPPRESSED_SOURCES, so this is a status-only correction, not a suppression.","regions":["us"],"endpoints":["props"],"example_paths":{"props":"/v1/sports/basketball_nba/props?bookmakers=betr"}},{"key":"hardrock","title":"Hard Rock","region":"us","status":"active","regions":["us"],"endpoints":["game_lines","live","props"],"game_line_markets":["h2h","spreads","totals"],"example_paths":{"game_lines":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=hardrock","live":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=hardrock&live=true","props":"/v1/sports/baseball_mlb/props?bookmakers=hardrock"},"freshness_path":"/v1/bookmakers/hardrock/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"hardrock","archive":"game_lines","rows_upper_bound":2074,"coverage_basis":"event_date","first_event_date":"2026-05-10","last_event_date":"2026-09-15"},{"source":"hardrock_an","archive":"game_lines","suffix":"_an","rows_upper_bound":4,"coverage_basis":"event_date","first_event_date":"2026-04-26","last_event_date":"2026-04-30"},{"source":"hardrock","archive":"props","rows_upper_bound":345276,"coverage_basis":"archive_write_time","first_row_at":"2026-04-26T21:22:10Z","last_row_at":"2026-08-23T21:32:26Z","days_since_last_row":0.5,"writing":true}],"examples":["hardrock","hardrock_an","hardrock"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"parx","title":"Parx","region":"us","status":"active","regions":["us"],"endpoints":["game_lines","live","props"],"game_line_markets":["h2h","spreads","totals"],"example_paths":{"game_lines":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=parx","live":"/v1/sports/americanfootball_nfl/odds?regions=us&markets=h2h&bookmakers=parx&live=true","props":"/v1/sports/baseball_mlb/props?bookmakers=parx"},"freshness_path":"/v1/bookmakers/parx/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"parx","archive":"game_lines","rows_upper_bound":3386,"coverage_basis":"event_date","first_event_date":"2026-02-08","last_event_date":"2026-10-20"},{"source":"parx_an","archive":"game_lines","suffix":"_an","rows_upper_bound":8,"coverage_basis":"event_date","first_event_date":"2026-04-05","last_event_date":"2026-04-30"},{"source":"parx","archive":"props","rows_upper_bound":194991,"coverage_basis":"archive_write_time","first_row_at":"2026-04-26T20:25:39Z","last_row_at":"2026-08-23T21:32:26Z","days_since_last_row":0.5,"writing":true}],"examples":["parx","parx_an","parx"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"pick6","title":"Pick6 (DraftKings)","region":"us","status":"active","regions":["us"],"endpoints":["props"],"example_paths":{"props":"/v1/sports/baseball_mlb/props?bookmakers=pick6"},"freshness_path":"/v1/bookmakers/pick6/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"pick6","archive":"props","rows_upper_bound":43,"coverage_basis":"archive_write_time","first_row_at":"2024-05-13T17:15:14Z","last_row_at":"2026-05-07T22:25:40Z","days_since_last_row":108.5,"writing":false}],"examples":["pick6"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"ended","props_archive_coverage_end":"2026-05-07T22:25:40Z","props_archive_note":"This book's prop closing-line archive is NOT being written. The newest archived row is 2026-05-07T22:25:40Z and there are none after it, so historical prop queries dated later return nothing for this book. No resumption date is known and none is implied."}},{"key":"bwin","title":"Bwin","region":"eu","status":"active","regions":["eu"],"endpoints":["game_lines","live"],"game_line_markets":["h2h","spreads","totals"],"example_paths":{"game_lines":"/v1/sports/americanfootball_nfl/odds?regions=eu&markets=h2h&bookmakers=bwin","live":"/v1/sports/americanfootball_nfl/odds?regions=eu&markets=h2h&bookmakers=bwin&live=true"},"freshness_path":"/v1/bookmakers/bwin/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"bwin","archive":"game_lines","rows_upper_bound":1365,"coverage_basis":"event_date","first_event_date":"2026-05-03","last_event_date":"2026-09-09"},{"source":"bwin_open","archive":"game_lines","suffix":"_open","rows_upper_bound":1162,"coverage_basis":"event_date","first_event_date":"2026-05-07","last_event_date":"2026-09-09"},{"source":"bwin","archive":"props","rows_upper_bound":14592,"coverage_basis":"archive_write_time","first_row_at":"2026-05-03T17:59:11Z","last_row_at":"2026-08-23T21:27:36Z","days_since_last_row":0.5,"writing":true}],"examples":["bwin","bwin_open","bwin"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"unibet","title":"Unibet","region":"eu","status":"active","regions":["eu"],"endpoints":["game_lines","live"],"game_line_markets":["h2h"],"example_paths":{"game_lines":"/v1/sports/americanfootball_nfl/odds?regions=eu&markets=h2h&bookmakers=unibet","live":"/v1/sports/americanfootball_nfl/odds?regions=eu&markets=h2h&bookmakers=unibet&live=true"},"freshness_path":"/v1/bookmakers/unibet/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"unibet_fr","archive":"game_lines","rows_upper_bound":3049,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_fr_open","archive":"game_lines","suffix":"_open","rows_upper_bound":2957,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet","archive":"game_lines","rows_upper_bound":2375,"coverage_basis":"event_date","first_event_date":"2026-05-07","last_event_date":"2026-12-26"},{"source":"unibet_open","archive":"game_lines","suffix":"_open","rows_upper_bound":2289,"coverage_basis":"event_date","first_event_date":"2026-05-07","last_event_date":"2026-12-26"},{"source":"unibet_be","archive":"game_lines","rows_upper_bound":2211,"coverage_basis":"event_date","first_event_date":"2026-06-28","last_event_date":"2026-12-26"},{"source":"unibet_nl","archive":"game_lines","rows_upper_bound":2211,"coverage_basis":"event_date","first_event_date":"2026-06-28","last_event_date":"2026-12-26"},{"source":"unibet_be_open","archive":"game_lines","suffix":"_open","rows_upper_bound":2125,"coverage_basis":"event_date","first_event_date":"2026-06-28","last_event_date":"2026-12-26"},{"source":"unibet_nl_open","archive":"game_lines","suffix":"_open","rows_upper_bound":2125,"coverage_basis":"event_date","first_event_date":"2026-06-28","last_event_date":"2026-12-26"},{"source":"unibet_au","archive":"game_lines","rows_upper_bound":2074,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_de","archive":"game_lines","rows_upper_bound":2074,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_dk","archive":"game_lines","rows_upper_bound":2074,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_ee","archive":"game_lines","rows_upper_bound":2074,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_fi","archive":"game_lines","rows_upper_bound":2074,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_ie","archive":"game_lines","rows_upper_bound":2074,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_it","archive":"game_lines","rows_upper_bound":2074,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_no","archive":"game_lines","rows_upper_bound":2074,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_ro","archive":"game_lines","rows_upper_bound":2074,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_se","archive":"game_lines","rows_upper_bound":2074,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_au_open","archive":"game_lines","suffix":"_open","rows_upper_bound":1988,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_de_open","archive":"game_lines","suffix":"_open","rows_upper_bound":1988,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_dk_open","archive":"game_lines","suffix":"_open","rows_upper_bound":1988,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_ee_open","archive":"game_lines","suffix":"_open","rows_upper_bound":1988,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_fi_open","archive":"game_lines","suffix":"_open","rows_upper_bound":1988,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_ie_open","archive":"game_lines","suffix":"_open","rows_upper_bound":1988,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_it_open","archive":"game_lines","suffix":"_open","rows_upper_bound":1988,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_no_open","archive":"game_lines","suffix":"_open","rows_upper_bound":1988,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_ro_open","archive":"game_lines","suffix":"_open","rows_upper_bound":1988,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet_se_open","archive":"game_lines","suffix":"_open","rows_upper_bound":1988,"coverage_basis":"event_date","first_event_date":"2026-07-08","last_event_date":"2026-12-26"},{"source":"unibet","archive":"props","rows_upper_bound":5350,"coverage_basis":"archive_write_time","first_row_at":"2026-05-03T17:20:15Z","last_row_at":"2026-08-23T21:32:16Z","days_since_last_row":0.5,"writing":true},{"source":"unibet_be","archive":"props","rows_upper_bound":4849,"coverage_basis":"archive_write_time","first_row_at":"2026-05-20T02:44:44Z","last_row_at":"2026-08-23T21:32:12Z","days_since_last_row":0.5,"writing":true},{"source":"unibet_nl","archive":"props","rows_upper_bound":4844,"coverage_basis":"archive_write_time","first_row_at":"2026-05-20T02:42:29Z","last_row_at":"2026-08-23T21:32:12Z","days_since_last_row":0.5,"writing":true},{"source":"unibet_fr","archive":"props","rows_upper_bound":4699,"coverage_basis":"archive_write_time","first_row_at":"2026-07-08T20:31:10Z","last_row_at":"2026-08-23T21:32:12Z","days_since_last_row":0.5,"writing":true},{"source":"unibet_de","archive":"props","rows_upper_bound":3238,"coverage_basis":"archive_write_time","first_row_at":"2026-07-08T20:31:10Z","last_row_at":"2026-08-23T21:32:12Z","days_since_last_row":0.5,"writing":true},{"source":"unibet_dk","archive":"props","rows_upper_bound":3238,"coverage_basis":"archive_write_time","first_row_at":"2026-07-08T20:31:10Z","last_row_at":"2026-08-23T21:32:12Z","days_since_last_row":0.5,"writing":true},{"source":"unibet_ee","archive":"props","rows_upper_bound":3238,"coverage_basis":"archive_write_time","first_row_at":"2026-07-08T20:31:10Z","last_row_at":"2026-08-23T21:32:12Z","days_since_last_row":0.5,"writing":true},{"source":"unibet_fi","archive":"props","rows_upper_bound":3238,"coverage_basis":"archive_write_time","first_row_at":"2026-07-08T20:31:10Z","last_row_at":"2026-08-23T21:32:12Z","days_since_last_row":0.5,"writing":true},{"source":"unibet_ie","archive":"props","rows_upper_bound":3238,"coverage_basis":"archive_write_time","first_row_at":"2026-07-08T20:31:10Z","last_row_at":"2026-08-23T21:32:12Z","days_since_last_row":0.5,"writing":true},{"source":"unibet_no","archive":"props","rows_upper_bound":3238,"coverage_basis":"archive_write_time","first_row_at":"2026-07-08T20:31:10Z","last_row_at":"2026-08-23T21:32:12Z","days_since_last_row":0.5,"writing":true},{"source":"unibet_ro","archive":"props","rows_upper_bound":3238,"coverage_basis":"archive_write_time","first_row_at":"2026-07-08T20:31:10Z","last_row_at":"2026-08-23T21:32:12Z","days_since_last_row":0.5,"writing":true},{"source":"unibet_se","archive":"props","rows_upper_bound":3238,"coverage_basis":"archive_write_time","first_row_at":"2026-07-08T20:31:10Z","last_row_at":"2026-08-23T21:32:12Z","days_since_last_row":0.5,"writing":true},{"source":"unibet_au","archive":"props","rows_upper_bound":3233,"coverage_basis":"archive_write_time","first_row_at":"2026-07-08T20:31:10Z","last_row_at":"2026-08-23T21:32:12Z","days_since_last_row":0.5,"writing":true},{"source":"unibet_it","archive":"props","rows_upper_bound":3233,"coverage_basis":"archive_write_time","first_row_at":"2026-07-08T20:31:10Z","last_row_at":"2026-08-23T21:32:12Z","days_since_last_row":0.5,"writing":true}],"examples":["unibet_fr","unibet_fr_open","unibet","unibet_open","unibet_be","unibet_nl","unibet_be_open","unibet_nl_open","unibet_au","unibet_de","unibet_dk","unibet_ee","unibet_fi","unibet_ie","unibet_it","unibet_no","unibet_ro","unibet_se","unibet_au_open","unibet_de_open","unibet_dk_open","unibet_ee_open","unibet_fi_open","unibet_ie_open","unibet_it_open","unibet_no_open","unibet_ro_open","unibet_se_open","unibet","unibet_be","unibet_nl","unibet_fr","unibet_de","unibet_dk","unibet_ee","unibet_fi","unibet_ie","unibet_no","unibet_ro","unibet_se","unibet_au","unibet_it"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"unibet_be","title":"Unibet (BE)","region":"eu","status":"active","regions":["eu"],"endpoints":["game_lines","live"],"game_line_markets":["h2h"],"example_paths":{"game_lines":"/v1/sports/americanfootball_nfl/odds?regions=eu&markets=h2h&bookmakers=unibet_be","live":"/v1/sports/americanfootball_nfl/odds?regions=eu&markets=h2h&bookmakers=unibet_be&live=true"},"freshness_path":"/v1/bookmakers/unibet_be/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"unibet_be","archive":"game_lines","rows_upper_bound":2211,"coverage_basis":"event_date","first_event_date":"2026-06-28","last_event_date":"2026-12-26"},{"source":"unibet_be_open","archive":"game_lines","suffix":"_open","rows_upper_bound":2125,"coverage_basis":"event_date","first_event_date":"2026-06-28","last_event_date":"2026-12-26"},{"source":"unibet_be","archive":"props","rows_upper_bound":4849,"coverage_basis":"archive_write_time","first_row_at":"2026-05-20T02:44:44Z","last_row_at":"2026-08-23T21:32:12Z","days_since_last_row":0.5,"writing":true}],"examples":["unibet_be","unibet_be_open","unibet_be"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"unibet_nl","title":"Unibet (NL)","region":"eu","status":"active","regions":["eu"],"endpoints":["game_lines","live"],"game_line_markets":["h2h"],"example_paths":{"game_lines":"/v1/sports/americanfootball_nfl/odds?regions=eu&markets=h2h&bookmakers=unibet_nl","live":"/v1/sports/americanfootball_nfl/odds?regions=eu&markets=h2h&bookmakers=unibet_nl&live=true"},"freshness_path":"/v1/bookmakers/unibet_nl/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"unibet_nl","archive":"game_lines","rows_upper_bound":2211,"coverage_basis":"event_date","first_event_date":"2026-06-28","last_event_date":"2026-12-26"},{"source":"unibet_nl_open","archive":"game_lines","suffix":"_open","rows_upper_bound":2125,"coverage_basis":"event_date","first_event_date":"2026-06-28","last_event_date":"2026-12-26"},{"source":"unibet_nl","archive":"props","rows_upper_bound":4844,"coverage_basis":"archive_write_time","first_row_at":"2026-05-20T02:42:29Z","last_row_at":"2026-08-23T21:32:12Z","days_since_last_row":0.5,"writing":true}],"examples":["unibet_nl","unibet_nl_open","unibet_nl"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"pmu","title":"PMU","region":"fr","status":"active","regions":["fr","eu"],"endpoints":["game_lines","live"],"game_line_markets":["h2h"],"example_paths":{"game_lines":"/v1/sports/soccer_france_ligue_one/odds?regions=eu&markets=h2h&bookmakers=pmu","live":"/v1/sports/soccer_france_ligue_one/odds?regions=eu&markets=h2h&bookmakers=pmu&live=true"},"freshness_path":"/v1/bookmakers/pmu/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"pmu","archive":"game_lines","rows_upper_bound":2063,"coverage_basis":"event_date","first_event_date":"2026-05-07","last_event_date":"2026-12-26"},{"source":"pmu_open","archive":"game_lines","suffix":"_open","rows_upper_bound":1991,"coverage_basis":"event_date","first_event_date":"2026-05-07","last_event_date":"2026-12-26"},{"source":"pmu","archive":"props","rows_upper_bound":4885,"coverage_basis":"archive_write_time","first_row_at":"2026-05-03T18:56:28Z","last_row_at":"2026-08-23T21:32:12Z","days_since_last_row":0.5,"writing":true}],"examples":["pmu","pmu_open","pmu"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"betclic","title":"Betclic","region":"fr","status":"suppressed","note":"Suppressed: not served on any endpoint. Filtering to this key returns no rows.","regions":["fr","eu"],"endpoints":[]},{"key":"winamax","title":"Winamax","region":"fr","status":"suppressed","note":"Suppressed: not served on any endpoint. Filtering to this key returns no rows.","regions":["fr","eu"],"endpoints":[]},{"key":"betrivers_ca","title":"BetRivers (CA)","region":"ca","status":"active","regions":["ca"],"endpoints":["game_lines","live"],"game_line_markets":["h2h"],"example_paths":{"game_lines":"/v1/sports/americanfootball_nfl/odds?regions=ca&markets=h2h&bookmakers=betrivers_ca","live":"/v1/sports/americanfootball_nfl/odds?regions=ca&markets=h2h&bookmakers=betrivers_ca&live=true"},"freshness_path":"/v1/bookmakers/betrivers_ca/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"betrivers_ca","archive":"game_lines","rows_upper_bound":1912,"coverage_basis":"event_date","first_event_date":"2026-06-28","last_event_date":"2026-09-18"},{"source":"betrivers_ca_open","archive":"game_lines","suffix":"_open","rows_upper_bound":1846,"coverage_basis":"event_date","first_event_date":"2026-06-28","last_event_date":"2026-09-18"},{"source":"betrivers_ca","archive":"props","rows_upper_bound":4564,"coverage_basis":"archive_write_time","first_row_at":"2026-05-20T02:40:47Z","last_row_at":"2026-08-23T21:32:12Z","days_since_last_row":0.5,"writing":true}],"examples":["betrivers_ca","betrivers_ca_open","betrivers_ca"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"rushbet","title":"RushBet","region":"latam","status":"active","regions":["latam"],"endpoints":["game_lines","live"],"game_line_markets":["h2h"],"example_paths":{"game_lines":"/v1/sports/americanfootball_nfl/odds?regions=latam&markets=h2h&bookmakers=rushbet","live":"/v1/sports/americanfootball_nfl/odds?regions=latam&markets=h2h&bookmakers=rushbet&live=true"},"freshness_path":"/v1/bookmakers/rushbet/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"rushbet","archive":"game_lines","rows_upper_bound":3185,"coverage_basis":"event_date","first_event_date":"2026-06-28","last_event_date":"2026-12-26"},{"source":"rushbet_open","archive":"game_lines","suffix":"_open","rows_upper_bound":3093,"coverage_basis":"event_date","first_event_date":"2026-06-28","last_event_date":"2026-12-26"},{"source":"rushbet","archive":"props","rows_upper_bound":6297,"coverage_basis":"archive_write_time","first_row_at":"2026-05-20T02:46:09Z","last_row_at":"2026-08-23T21:32:12Z","days_since_last_row":0.5,"writing":true}],"examples":["rushbet","rushbet_open","rushbet"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"betway","title":"Betway","region":"uk","status":"active","note":"UK product (UKGC), captured over the node mesh. What it carries, measured on production over one hour on 2026-08-02: soccer only, filed under soccer_other, and game-line rather than player markets (Handicap 3-Way 293 rows, Win/Draw/Win 183, Double Chance 106, Total Goals 92, Both Teams To Score 64, Draw No Bet 32, Total Cards 18, Total Corners 16, team totals). Those rows live in prop_snapshots, so they reach the surfaces that include game lines; betway wrote nothing to odds_snapshots in the retained window, so /odds returns no betway events, and it has no player props, so a plain /props call returns none either. Its Handicap 3-Way rows are withheld from two-sided spreads on purpose: they are European three-way handicaps and pairing them as a 2-way market prices at 130-138%. Distinct from Betway Africa (ZA/NG/GH/KE), a separate default-off source this key does not serve.","regions":["uk"],"freshness_path":"/v1/bookmakers/betway/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"betway","archive":"game_lines","rows_upper_bound":162712,"coverage_basis":"event_date","first_event_date":"2005-07-29","last_event_date":"2026-08-23"},{"source":"betway","archive":"props","rows_upper_bound":585119,"coverage_basis":"archive_write_time","first_row_at":"2026-07-09T20:35:07Z","last_row_at":"2026-08-23T21:32:23Z","days_since_last_row":0.5,"writing":true}],"examples":["betway","betway"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"tenbet","title":"10bet","region":"uk","status":"active","note":"10bet GB (sportswidget.10bet.co.uk), captured from the London node because the book geo-fences to the UK. Measured on production over one hour on 2026-08-02: 2,500 servable player-prop rows across four leagues, and 5,925 servable rows across 67 leagues once game lines are included, mostly soccer plus basketball, ice hockey and American football. It is the only source of fouls props on soccer_usa_mls alongside PrizePicks. It wrote nothing to odds_snapshots in the retained window, so /odds returns no 10bet events; its rows arrive through prop_snapshots. Stored under `tenbet` because a book key cannot begin with a digit everywhere one is used. Accepted aliases: 10bet, ten_bet. Its `soccer_virtual` sport key is the book's computer-generated board, tagged as its own key rather than filed under a real league, and it is filtered out of the sold archive.","regions":["uk"],"endpoints":["props"],"example_paths":{"props":"/v1/sports/soccer_conmebol_copa_sudamericana/props?bookmakers=tenbet"},"freshness_path":"/v1/bookmakers/tenbet/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"tenbet","archive":"game_lines","rows_upper_bound":39212,"coverage_basis":"event_date","first_event_date":"2026-06-19","last_event_date":"2026-10-23"},{"source":"tenbet","archive":"props","rows_upper_bound":4874176,"coverage_basis":"archive_write_time","first_row_at":"2026-07-09T23:19:40Z","last_row_at":"2026-08-23T21:32:33Z","days_since_last_row":0.5,"writing":true}],"examples":["tenbet","tenbet"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"zebet","title":"ZEbet","region":"fr","status":"merged","merged_into":"unibet","note":"ZEbet redirects to Unibet (Kindred / Unibet group) since 2026. Use bookmakers=unibet for the same pricing engine.","regions":["fr","eu"]},{"key":"fdj_parionssport","title":"FDJ ParionsSport (online)","region":"fr","status":"decommissioned","note":"FDJ wound down its online sportsbook in 2026. The brand survives only at retail terminals; no public consumer URL remains.","regions":["fr","eu"]},{"key":"netbet","title":"NetBet","region":"fr","status":"not_yet_integrated","note":"On the roadmap. Reach out if you need it sooner.","regions":["fr","eu"]},{"key":"bet99","title":"Bet99","region":"ca","status":"not_yet_integrated","note":"Quebec-licensed Canadian sportsbook. Requires CA egress (or compatible proxy). Accepted alias: bet_99.","regions":["ca"]},{"key":"sports_interaction","title":"Sports Interaction","region":"ca","status":"not_yet_integrated","note":"Ontario-regulated, Entain-operated. May share pricing engine with BetMGM Ontario; operator runs price-divergence comparison before relying on this as a distinct source. Accepted aliases: sportsinteraction, si.","regions":["ca"]},{"key":"powerplay","title":"PowerPlay","region":"ca","status":"not_yet_integrated","note":"Ontario-regulated. NSUS Group operator. Smaller volume than Bet99 / Sports Interaction but useful third Canadian price point for line-shopping detection. Accepted alias: power_play.","regions":["ca"]},{"key":"olg_prolineplus","title":"OLG ProLine+","region":"ca","status":"not_yet_integrated","note":"Ontario Lottery and Gaming Corporation sportsbook. Provincial monopoly; lines typically off-market with high vig (12-20% hold). Classified as monopoly_retail so downstream tools can exclude from best-line / arbitrage endpoints. Useful for retail-vs-sharp split analysis. Accepted aliases: olg, proline_plus, prolineplus.","regions":["ca"]},{"key":"theo","title":"Theo","region":"ca","status":"not_yet_integrated","note":"Private Ontario-licensed (AGCO) sportsbook operated by Theoretical Gaming, public surface theo.ca. Source plumbing ships behind THEO_ENABLED, default off; endpoint shape unconfirmed.","regions":["ca"]},{"key":"northstar_bets","title":"NorthStar Bets","region":"ca","status":"not_yet_integrated","note":"Bragg Gaming Group's Ontario-licensed (AGCO) book, the first homegrown Canadian media-affiliated sportsbook (Postmedia partnership), public surface northstarbets.ca. Source plumbing ships behind NORTHSTAR_BETS_ENABLED, default off; endpoint shape unconfirmed.","regions":["ca"]},{"key":"sportsbet_au","title":"Sportsbet (AU)","region":"au","status":"active","note":"Flutter Entertainment's Australian market leader. Peer to FanDuel US under Flutter group. What ships today is Australian thoroughbred racing via the Sydney node chain: win, head-to-head, top-N finish, insurance and betting-without markets, filed under sport_key horse_racing with the track as the event and the runner as the selection. AU game lines (AFL, NRL, cricket) are not carried yet; TAB and Ladbrokes AU are follow-ups. Accepted aliases: sportsbet, sportsbetau, sportsbet_australia.","regions":["au"],"freshness_path":"/v1/bookmakers/sportsbet_au/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"sportsbet_au","archive":"props","rows_upper_bound":16147,"coverage_basis":"archive_write_time","first_row_at":"2026-05-21T01:03:15Z","last_row_at":"2026-08-23T21:31:48Z","days_since_last_row":0.5,"writing":true}],"examples":["sportsbet_au"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"caliente","title":"Caliente","region":"mx","status":"not_yet_integrated","note":"Mexico's market-leading sportsbook (caliente.mx). Geo-fenced to Mexican residential traffic; requires MX-egress proxy. Accepted aliases: caliente_mx, caliente_mexico.","regions":["mx"]},{"key":"codere","title":"Codere","region":"latam","status":"not_yet_integrated","note":"Multi-country LATAM brand (Mexico, Spain, Argentina, Colombia, Panama, Uruguay) on a shared pricing engine. One ingest covers the LATAM long tail. Accepted alias: codere_mx.","regions":["latam"]},{"key":"sporttrade","title":"Sporttrade","region":"us","status":"not_yet_integrated","note":"Fixed-odds exchange, licensed in CO/NJ/IA/KY. Peer to Novig and ProphetX. On the roadmap; reach out at support@parlay-api.com if you need it sooner. Accepted aliases: sport_trade, sportstrade.","regions":["us"]},{"key":"superbook","title":"SuperBook","region":"us","status":"not_yet_integrated","note":"Westgate's sportsbook (NV/NJ/IA/CO/AZ). Known for sharp limits, a useful second anchor alongside Pinnacle for line-shopping. On the roadmap. Accepted alias: super_book.","regions":["us"]},{"key":"ballybet","title":"Bally Bet","region":"us","status":"not_yet_integrated","note":"Bally's Corporation sportsbook (MD/AZ/CO/IA/IN/MS/NJ/NY/OH/VA). On the roadmap. Accepted aliases: bally, bally_bet.","regions":["us"]},{"key":"maverick_games","title":"Maverick Games","region":"ca","status":"active","note":"Ontario-licensed (Shelgeyr Ontario Limited, AGCO GRSM1295653) sportsbook running on Pinnacle Solution's trading engine. Captured via the operator's anonymous public WebSocket (server-guest.data-streams.net) for sub-second h2h moneyline updates. Team names resolved via cross-reference with peer-source events (Pinnacle/FanDuel/etc.); placeholder team_<id> on rows where no peer match is yet available. Accepted alias: maverick.","regions":["ca"],"freshness_path":"/v1/bookmakers/maverick_games/freshness","historical_variants":{"measured":true,"measured_at":"2026-08-24T04:11:48Z","archive_sources":[{"source":"maverick_games","archive":"game_lines","rows_upper_bound":1254,"coverage_basis":"event_date","first_event_date":"2026-06-28","last_event_date":"2026-10-20"},{"source":"maverick_games_open","archive":"game_lines","suffix":"_open","rows_upper_bound":1115,"coverage_basis":"event_date","first_event_date":"2026-06-28","last_event_date":"2026-10-20"},{"source":"maverick_games","archive":"props","rows_upper_bound":320711,"coverage_basis":"archive_write_time","first_row_at":"2026-05-21T21:05:15Z","last_row_at":"2026-08-23T21:32:47Z","days_since_last_row":0.5,"writing":true}],"examples":["maverick_games","maverick_games_open","maverick_games"],"note":"Historical rows are not always filed under the live bookmaker key. Game-line archives use `<key>_open` (opening line) and `<key>_an` (archive-normalized close); some books archive under a feed-specific key such as `prizepicks_mobile`. Every key in `archive_sources` was measured in this deployment's archive and resolves back to this book; no other source string for it exists. `rows_upper_bound` is an upper bound on servable rows, not a promise: it counts every row filed under that key before the per-row simulated-fixture filter the read path also applies.","props_archive_status":"writing"}},{"key":"vbet","title":"VBET","region":"eu","status":"not_yet_integrated","note":"Maltese MGA-licensed sportsbook (SCGO Limited, MGA/B2C/292/2015) running on BetConstruct's Optimus trading engine (a Pinnacle Solution white-label). Sidecar WebSocket capture is live but the page-default subscriptions emit catalog metadata only; explicit per-match subscribe frames are required for tick odds. On the roadmap.","regions":["eu"]}]