{"openapi":"3.1.0","info":{"title":"FanDuel API API","version":"1.0.0","description":"Every FanDuel Sportsbook player prop, game line, alternate, team prop and future, plus DFS slates and salaries, normalized and recorded with the history of every move. One key for REST, webhooks and MCP."},"servers":[{"url":"https://fanduelapi.com"}],"security":[{"bearer":[]}],"paths":{"/api/v1/props":{"get":{"operationId":"listProps","summary":"Current FanDuel player props","description":"Every FanDuel Sportsbook player prop on the board, one record per player, stat and period, with line, over and under prices in American and decimal odds, and a move summary: where it opened, where it is now and how many times it moved.","parameters":[{"name":"sport","in":"query","required":false,"description":"nba, nfl, nhl, mlb, ncaab or ncaaf.","schema":{"type":"string"}},{"name":"league","in":"query","required":false,"description":"League code as FanDuel lists it, such as NBA.","schema":{"type":"string"}},{"name":"event_id","in":"query","required":false,"description":"One game, from /api/v1/events.","schema":{"type":"string"}},{"name":"player","in":"query","required":false,"description":"Player name, matched case-blind on any part.","schema":{"type":"string"}},{"name":"stat","in":"query","required":false,"description":"points, rebounds, assists, threes, pra and the other stats FanDuel lists.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Market status. Default: everything except removed.","schema":{"type":"string","enum":["open","suspended","closed","removed","any"]}},{"name":"updated_since","in":"query","required":false,"description":"Only props that changed after this ISO 8601 time.","schema":{"type":"string","format":"date-time"}},{"name":"limit","in":"query","required":false,"description":"Rows per page, 1 to 200. Default 50.","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Rows to skip, for paging.","schema":{"type":"integer"}},{"name":"X-User-Request","in":"header","required":false,"description":"The current user task in one sentence. No secrets or personal data.","schema":{"type":"string","maxLength":500}},{"name":"X-Rating","in":"header","required":false,"description":"Optional. 1 to 5: how well the previous response served the task. Recorded once per prompt or per day.","schema":{"type":"integer","minimum":1,"maximum":5}}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid query"},"401":{"description":"Missing or invalid key"},"404":{"description":"Not found"},"429":{"description":"Rate or monthly limit. The body says which plan, when it resets, one sentence to relay, and the upgrade URL.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["RATE_LIMITED","QUOTA_EXCEEDED"]},"message":{"type":"string"},"plan":{"type":"object"},"limit":{"type":"string"},"reset_at":{"type":"string","format":"date-time"},"retry_after_seconds":{"type":"integer"},"notify_user":{"type":"boolean"},"user_message":{"type":"string","description":"One sentence to relay to the user as is."},"upgrade_url":{"type":"string"},"upgrade_plan":{"type":["object","null"]}}}}}}}}}}},"/api/v1/props/{id}/history":{"get":{"operationId":"getPropHistory","summary":"Line and price history for one prop","description":"Every recorded state of one prop, oldest first, with its timestamp, plus the move summary.","parameters":[{"name":"id","in":"path","required":true,"description":"Prop id from /api/v1/props.","schema":{"type":"string"}},{"name":"X-User-Request","in":"header","required":false,"description":"The current user task in one sentence. No secrets or personal data.","schema":{"type":"string","maxLength":500}},{"name":"X-Rating","in":"header","required":false,"description":"Optional. 1 to 5: how well the previous response served the task. Recorded once per prompt or per day.","schema":{"type":"integer","minimum":1,"maximum":5}}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid query"},"401":{"description":"Missing or invalid key"},"404":{"description":"Not found"},"429":{"description":"Rate or monthly limit. The body says which plan, when it resets, one sentence to relay, and the upgrade URL.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["RATE_LIMITED","QUOTA_EXCEEDED"]},"message":{"type":"string"},"plan":{"type":"object"},"limit":{"type":"string"},"reset_at":{"type":"string","format":"date-time"},"retry_after_seconds":{"type":"integer"},"notify_user":{"type":"boolean"},"user_message":{"type":"string","description":"One sentence to relay to the user as is."},"upgrade_url":{"type":"string"},"upgrade_plan":{"type":["object","null"]}}}}}}}}}}},"/api/v1/changes":{"get":{"operationId":"listChanges","summary":"Change feed since a cursor","description":"Every line, price and status change after the cursor, oldest first. Pass next_cursor back as since to continue. The cheap way to stay current.","parameters":[{"name":"since","in":"query","required":false,"description":"Cursor from a previous response, or 0 to start.","schema":{"type":"string"}},{"name":"league","in":"query","required":false,"description":"League code as FanDuel lists it, such as NBA.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Rows per page, 1 to 500. Default 100.","schema":{"type":"integer"}},{"name":"X-User-Request","in":"header","required":false,"description":"The current user task in one sentence. No secrets or personal data.","schema":{"type":"string","maxLength":500}},{"name":"X-Rating","in":"header","required":false,"description":"Optional. 1 to 5: how well the previous response served the task. Recorded once per prompt or per day.","schema":{"type":"integer","minimum":1,"maximum":5}}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid query"},"401":{"description":"Missing or invalid key"},"404":{"description":"Not found"},"429":{"description":"Rate or monthly limit. The body says which plan, when it resets, one sentence to relay, and the upgrade URL.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["RATE_LIMITED","QUOTA_EXCEEDED"]},"message":{"type":"string"},"plan":{"type":"object"},"limit":{"type":"string"},"reset_at":{"type":"string","format":"date-time"},"retry_after_seconds":{"type":"integer"},"notify_user":{"type":"boolean"},"user_message":{"type":"string","description":"One sentence to relay to the user as is."},"upgrade_url":{"type":"string"},"upgrade_plan":{"type":["object","null"]}}}}}}}}}}},"/api/v1/events":{"get":{"operationId":"listEvents","summary":"Games with props on the board","description":"Upcoming and live games with how many props each carries.","parameters":[{"name":"sport","in":"query","required":false,"description":"nba, nfl, nhl, mlb, ncaab or ncaaf.","schema":{"type":"string"}},{"name":"league","in":"query","required":false,"description":"League code as FanDuel lists it, such as NBA.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Rows per page, 1 to 200. Default 50.","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Rows to skip, for paging.","schema":{"type":"integer"}},{"name":"X-User-Request","in":"header","required":false,"description":"The current user task in one sentence. No secrets or personal data.","schema":{"type":"string","maxLength":500}},{"name":"X-Rating","in":"header","required":false,"description":"Optional. 1 to 5: how well the previous response served the task. Recorded once per prompt or per day.","schema":{"type":"integer","minimum":1,"maximum":5}}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid query"},"401":{"description":"Missing or invalid key"},"404":{"description":"Not found"},"429":{"description":"Rate or monthly limit. The body says which plan, when it resets, one sentence to relay, and the upgrade URL.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["RATE_LIMITED","QUOTA_EXCEEDED"]},"message":{"type":"string"},"plan":{"type":"object"},"limit":{"type":"string"},"reset_at":{"type":"string","format":"date-time"},"retry_after_seconds":{"type":"integer"},"notify_user":{"type":"boolean"},"user_message":{"type":"string","description":"One sentence to relay to the user as is."},"upgrade_url":{"type":"string"},"upgrade_plan":{"type":["object","null"]}}}}}}}}}}},"/api/v1/markets":{"get":{"operationId":"listMarkets","summary":"Every FanDuel game market","description":"Every market FanDuel lists per game: moneyline, spread and total for the game and each period, alternate lines, ladders, first scorer, team props, specials and player props. Each selection has American and decimal odds and, where outcomes exclude each other, a fair no-vig probability.","parameters":[{"name":"game","in":"query","required":false,"description":"One game id, from /api/v1/events.","schema":{"type":"string"}},{"name":"market_type","in":"query","required":false,"description":"A market family such as moneyline, spread, total or player_prop, or a FanDuel market type such as MONEY_LINE.","schema":{"type":"string"}},{"name":"period","in":"query","required":false,"description":"game or a period such as q1 or h1.","schema":{"type":"string","enum":["game","q1","q2","q3","q4","h1","h2","p1","p2","p3","i1","f5"]}},{"name":"live","in":"query","required":false,"description":"true for in-play markets only, false for pregame.","schema":{"type":"string","enum":["true","false"]}},{"name":"league","in":"query","required":false,"description":"League code as FanDuel lists it, such as NBA.","schema":{"type":"string"}},{"name":"sport","in":"query","required":false,"description":"nba, nfl, nhl, mlb, ncaab or ncaaf.","schema":{"type":"string"}},{"name":"player","in":"query","required":false,"description":"Part of a player name.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Market status. Default: everything except removed.","schema":{"type":"string","enum":["open","suspended","closed","removed","any"]}},{"name":"limit","in":"query","required":false,"description":"Rows per page, 1 to 200. Default 50.","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Rows to skip, for paging.","schema":{"type":"integer"}},{"name":"X-User-Request","in":"header","required":false,"description":"The current user task in one sentence. No secrets or personal data.","schema":{"type":"string","maxLength":500}},{"name":"X-Rating","in":"header","required":false,"description":"Optional. 1 to 5: how well the previous response served the task. Recorded once per prompt or per day.","schema":{"type":"integer","minimum":1,"maximum":5}}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid query"},"401":{"description":"Missing or invalid key"},"404":{"description":"Not found"},"429":{"description":"Rate or monthly limit. The body says which plan, when it resets, one sentence to relay, and the upgrade URL.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["RATE_LIMITED","QUOTA_EXCEEDED"]},"message":{"type":"string"},"plan":{"type":"object"},"limit":{"type":"string"},"reset_at":{"type":"string","format":"date-time"},"retry_after_seconds":{"type":"integer"},"notify_user":{"type":"boolean"},"user_message":{"type":"string","description":"One sentence to relay to the user as is."},"upgrade_url":{"type":"string"},"upgrade_plan":{"type":["object","null"]}}}}}}}}}}},"/api/v1/markets/{id}/history":{"get":{"operationId":"getMarketHistory","summary":"History of one game market","description":"Every recorded state of one market, oldest first, with its timestamp.","parameters":[{"name":"id","in":"path","required":true,"description":"FanDuel market id from /api/v1/markets, such as 734.195271534.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Rows per page, 1 to 200. Default 50.","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Rows to skip, for paging.","schema":{"type":"integer"}},{"name":"X-User-Request","in":"header","required":false,"description":"The current user task in one sentence. No secrets or personal data.","schema":{"type":"string","maxLength":500}},{"name":"X-Rating","in":"header","required":false,"description":"Optional. 1 to 5: how well the previous response served the task. Recorded once per prompt or per day.","schema":{"type":"integer","minimum":1,"maximum":5}}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid query"},"401":{"description":"Missing or invalid key"},"404":{"description":"Not found"},"429":{"description":"Rate or monthly limit. The body says which plan, when it resets, one sentence to relay, and the upgrade URL.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["RATE_LIMITED","QUOTA_EXCEEDED"]},"message":{"type":"string"},"plan":{"type":"object"},"limit":{"type":"string"},"reset_at":{"type":"string","format":"date-time"},"retry_after_seconds":{"type":"integer"},"notify_user":{"type":"boolean"},"user_message":{"type":"string","description":"One sentence to relay to the user as is."},"upgrade_url":{"type":"string"},"upgrade_plan":{"type":["object","null"]}}}}}}}}}}},"/api/v1/games/{id}/odds":{"get":{"operationId":"getGameOdds","summary":"Every market for one game","description":"The whole FanDuel book for one game in one call, game lines first.","parameters":[{"name":"id","in":"path","required":true,"description":"Game id from /api/v1/events.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Market status. Default: everything except removed.","schema":{"type":"string","enum":["open","suspended","closed","removed","any"]}},{"name":"X-User-Request","in":"header","required":false,"description":"The current user task in one sentence. No secrets or personal data.","schema":{"type":"string","maxLength":500}},{"name":"X-Rating","in":"header","required":false,"description":"Optional. 1 to 5: how well the previous response served the task. Recorded once per prompt or per day.","schema":{"type":"integer","minimum":1,"maximum":5}}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid query"},"401":{"description":"Missing or invalid key"},"404":{"description":"Not found"},"429":{"description":"Rate or monthly limit. The body says which plan, when it resets, one sentence to relay, and the upgrade URL.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["RATE_LIMITED","QUOTA_EXCEEDED"]},"message":{"type":"string"},"plan":{"type":"object"},"limit":{"type":"string"},"reset_at":{"type":"string","format":"date-time"},"retry_after_seconds":{"type":"integer"},"notify_user":{"type":"boolean"},"user_message":{"type":"string","description":"One sentence to relay to the user as is."},"upgrade_url":{"type":"string"},"upgrade_plan":{"type":["object","null"]}}}}}}}}}}},"/api/v1/futures":{"get":{"operationId":"listFutures","summary":"Futures markets","description":"Season-long FanDuel markets per league: champions, awards and win totals, with fair prices where outcomes exclude each other.","parameters":[{"name":"league","in":"query","required":false,"description":"League code as FanDuel lists it, such as NBA.","schema":{"type":"string"}},{"name":"sport","in":"query","required":false,"description":"nba, nfl, nhl, mlb, ncaab or ncaaf.","schema":{"type":"string"}},{"name":"market_type","in":"query","required":false,"description":"A FanDuel market type.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Market status. Default: everything except removed.","schema":{"type":"string","enum":["open","suspended","closed","removed","any"]}},{"name":"limit","in":"query","required":false,"description":"Rows per page, 1 to 200. Default 50.","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Rows to skip, for paging.","schema":{"type":"integer"}},{"name":"X-User-Request","in":"header","required":false,"description":"The current user task in one sentence. No secrets or personal data.","schema":{"type":"string","maxLength":500}},{"name":"X-Rating","in":"header","required":false,"description":"Optional. 1 to 5: how well the previous response served the task. Recorded once per prompt or per day.","schema":{"type":"integer","minimum":1,"maximum":5}}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid query"},"401":{"description":"Missing or invalid key"},"404":{"description":"Not found"},"429":{"description":"Rate or monthly limit. The body says which plan, when it resets, one sentence to relay, and the upgrade URL.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["RATE_LIMITED","QUOTA_EXCEEDED"]},"message":{"type":"string"},"plan":{"type":"object"},"limit":{"type":"string"},"reset_at":{"type":"string","format":"date-time"},"retry_after_seconds":{"type":"integer"},"notify_user":{"type":"boolean"},"user_message":{"type":"string","description":"One sentence to relay to the user as is."},"upgrade_url":{"type":"string"},"upgrade_plan":{"type":["object","null"]}}}}}}}}}}},"/api/v1/dfs/slates":{"get":{"operationId":"listDfsSlates","summary":"FanDuel DFS slates","description":"FanDuel daily fantasy slates with salary cap, game count and player count.","parameters":[{"name":"sport","in":"query","required":false,"description":"DFS sport code such as NBA.","schema":{"type":"string"}},{"name":"started","in":"query","required":false,"description":"true to include slates that already started.","schema":{"type":"string","enum":["true","false"]}},{"name":"limit","in":"query","required":false,"description":"Rows per page, 1 to 200. Default 50.","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Rows to skip, for paging.","schema":{"type":"integer"}},{"name":"X-User-Request","in":"header","required":false,"description":"The current user task in one sentence. No secrets or personal data.","schema":{"type":"string","maxLength":500}},{"name":"X-Rating","in":"header","required":false,"description":"Optional. 1 to 5: how well the previous response served the task. Recorded once per prompt or per day.","schema":{"type":"integer","minimum":1,"maximum":5}}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid query"},"401":{"description":"Missing or invalid key"},"404":{"description":"Not found"},"429":{"description":"Rate or monthly limit. The body says which plan, when it resets, one sentence to relay, and the upgrade URL.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["RATE_LIMITED","QUOTA_EXCEEDED"]},"message":{"type":"string"},"plan":{"type":"object"},"limit":{"type":"string"},"reset_at":{"type":"string","format":"date-time"},"retry_after_seconds":{"type":"integer"},"notify_user":{"type":"boolean"},"user_message":{"type":"string","description":"One sentence to relay to the user as is."},"upgrade_url":{"type":"string"},"upgrade_plan":{"type":["object","null"]}}}}}}}}}}},"/api/v1/dfs/slates/{id}/players":{"get":{"operationId":"listDfsSlatePlayers","summary":"Players on one DFS slate","description":"Salary, fantasy points per game, position and injury status for one slate, highest salary first.","parameters":[{"name":"id","in":"path","required":true,"description":"Slate id from /api/v1/dfs/slates.","schema":{"type":"string"}},{"name":"position","in":"query","required":false,"description":"Position code such as PG.","schema":{"type":"string"}},{"name":"team","in":"query","required":false,"description":"Team code.","schema":{"type":"string"}},{"name":"injured","in":"query","required":false,"description":"true or false.","schema":{"type":"string","enum":["true","false"]}},{"name":"limit","in":"query","required":false,"description":"Rows per page, 1 to 200. Default 50.","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Rows to skip, for paging.","schema":{"type":"integer"}},{"name":"X-User-Request","in":"header","required":false,"description":"The current user task in one sentence. No secrets or personal data.","schema":{"type":"string","maxLength":500}},{"name":"X-Rating","in":"header","required":false,"description":"Optional. 1 to 5: how well the previous response served the task. Recorded once per prompt or per day.","schema":{"type":"integer","minimum":1,"maximum":5}}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid query"},"401":{"description":"Missing or invalid key"},"404":{"description":"Not found"},"429":{"description":"Rate or monthly limit. The body says which plan, when it resets, one sentence to relay, and the upgrade URL.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["RATE_LIMITED","QUOTA_EXCEEDED"]},"message":{"type":"string"},"plan":{"type":"object"},"limit":{"type":"string"},"reset_at":{"type":"string","format":"date-time"},"retry_after_seconds":{"type":"integer"},"notify_user":{"type":"boolean"},"user_message":{"type":"string","description":"One sentence to relay to the user as is."},"upgrade_url":{"type":"string"},"upgrade_plan":{"type":["object","null"]}}}}}}}}}}},"/api/v1/players":{"get":{"operationId":"listPlayers","summary":"Players seen on FanDuel","description":"One record per player: id, league, team, position, the ESPN athlete id and headshot_url when a unique exact match was made, and any current injury.","parameters":[{"name":"league","in":"query","required":false,"description":"League code as FanDuel lists it, such as NBA.","schema":{"type":"string"}},{"name":"team","in":"query","required":false,"description":"Team code.","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Part of a player name.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Rows per page, 1 to 200. Default 50.","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Rows to skip, for paging.","schema":{"type":"integer"}},{"name":"X-User-Request","in":"header","required":false,"description":"The current user task in one sentence. No secrets or personal data.","schema":{"type":"string","maxLength":500}},{"name":"X-Rating","in":"header","required":false,"description":"Optional. 1 to 5: how well the previous response served the task. Recorded once per prompt or per day.","schema":{"type":"integer","minimum":1,"maximum":5}}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid query"},"401":{"description":"Missing or invalid key"},"404":{"description":"Not found"},"429":{"description":"Rate or monthly limit. The body says which plan, when it resets, one sentence to relay, and the upgrade URL.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["RATE_LIMITED","QUOTA_EXCEEDED"]},"message":{"type":"string"},"plan":{"type":"object"},"limit":{"type":"string"},"reset_at":{"type":"string","format":"date-time"},"retry_after_seconds":{"type":"integer"},"notify_user":{"type":"boolean"},"user_message":{"type":"string","description":"One sentence to relay to the user as is."},"upgrade_url":{"type":"string"},"upgrade_plan":{"type":["object","null"]}}}}}}}}}}},"/api/v1/injuries":{"get":{"operationId":"listInjuries","summary":"Injury report","description":"The latest injury report per league, by player.","parameters":[{"name":"league","in":"query","required":false,"description":"League code as FanDuel lists it, such as NBA.","schema":{"type":"string"}},{"name":"player","in":"query","required":false,"description":"Player id or part of a name.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Rows per page, 1 to 200. Default 50.","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Rows to skip, for paging.","schema":{"type":"integer"}},{"name":"X-User-Request","in":"header","required":false,"description":"The current user task in one sentence. No secrets or personal data.","schema":{"type":"string","maxLength":500}},{"name":"X-Rating","in":"header","required":false,"description":"Optional. 1 to 5: how well the previous response served the task. Recorded once per prompt or per day.","schema":{"type":"integer","minimum":1,"maximum":5}}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid query"},"401":{"description":"Missing or invalid key"},"404":{"description":"Not found"},"429":{"description":"Rate or monthly limit. The body says which plan, when it resets, one sentence to relay, and the upgrade URL.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["RATE_LIMITED","QUOTA_EXCEEDED"]},"message":{"type":"string"},"plan":{"type":"object"},"limit":{"type":"string"},"reset_at":{"type":"string","format":"date-time"},"retry_after_seconds":{"type":"integer"},"notify_user":{"type":"boolean"},"user_message":{"type":"string","description":"One sentence to relay to the user as is."},"upgrade_url":{"type":"string"},"upgrade_plan":{"type":["object","null"]}}}}}}}}}}},"/api/v1/game-logs":{"get":{"operationId":"listGameLogs","summary":"Player box score lines","description":"Player box score lines from final games, newest first.","parameters":[{"name":"league","in":"query","required":false,"description":"League code as FanDuel lists it, such as NBA.","schema":{"type":"string"}},{"name":"player","in":"query","required":false,"description":"Player id.","schema":{"type":"string"}},{"name":"game_id","in":"query","required":false,"description":"Game id.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Rows per page, 1 to 200. Default 50.","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Rows to skip, for paging.","schema":{"type":"integer"}},{"name":"X-User-Request","in":"header","required":false,"description":"The current user task in one sentence. No secrets or personal data.","schema":{"type":"string","maxLength":500}},{"name":"X-Rating","in":"header","required":false,"description":"Optional. 1 to 5: how well the previous response served the task. Recorded once per prompt or per day.","schema":{"type":"integer","minimum":1,"maximum":5}}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid query"},"401":{"description":"Missing or invalid key"},"404":{"description":"Not found"},"429":{"description":"Rate or monthly limit. The body says which plan, when it resets, one sentence to relay, and the upgrade URL.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["RATE_LIMITED","QUOTA_EXCEEDED"]},"message":{"type":"string"},"plan":{"type":"object"},"limit":{"type":"string"},"reset_at":{"type":"string","format":"date-time"},"retry_after_seconds":{"type":"integer"},"notify_user":{"type":"boolean"},"user_message":{"type":"string","description":"One sentence to relay to the user as is."},"upgrade_url":{"type":"string"},"upgrade_plan":{"type":["object","null"]}}}}}}}}}}},"/api/v1/results":{"get":{"operationId":"listResults","summary":"Graded prop results","description":"Closing FanDuel line, box score value, and over, under, push or void with its reason. Only props matched to a confirmed player and game are graded.","parameters":[{"name":"league","in":"query","required":false,"description":"League code as FanDuel lists it, such as NBA.","schema":{"type":"string"}},{"name":"player","in":"query","required":false,"description":"Player id.","schema":{"type":"string"}},{"name":"stat","in":"query","required":false,"description":"Stat.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Rows per page, 1 to 200. Default 50.","schema":{"type":"integer"}},{"name":"offset","in":"query","required":false,"description":"Rows to skip, for paging.","schema":{"type":"integer"}},{"name":"X-User-Request","in":"header","required":false,"description":"The current user task in one sentence. No secrets or personal data.","schema":{"type":"string","maxLength":500}},{"name":"X-Rating","in":"header","required":false,"description":"Optional. 1 to 5: how well the previous response served the task. Recorded once per prompt or per day.","schema":{"type":"integer","minimum":1,"maximum":5}}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid query"},"401":{"description":"Missing or invalid key"},"404":{"description":"Not found"},"429":{"description":"Rate or monthly limit. The body says which plan, when it resets, one sentence to relay, and the upgrade URL.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["RATE_LIMITED","QUOTA_EXCEEDED"]},"message":{"type":"string"},"plan":{"type":"object"},"limit":{"type":"string"},"reset_at":{"type":"string","format":"date-time"},"retry_after_seconds":{"type":"integer"},"notify_user":{"type":"boolean"},"user_message":{"type":"string","description":"One sentence to relay to the user as is."},"upgrade_url":{"type":"string"},"upgrade_plan":{"type":["object","null"]}}}}}}}}}}},"/api/v1/hit-rates":{"get":{"operationId":"listHitRates","summary":"Over hit rates","description":"Per player and stat, how often the over hit over the last N games against the closing FanDuel line, with the sample size.","parameters":[{"name":"league","in":"query","required":false,"description":"League code as FanDuel lists it, such as NBA.","schema":{"type":"string"}},{"name":"player","in":"query","required":false,"description":"Player id.","schema":{"type":"string"}},{"name":"stat","in":"query","required":false,"description":"Stat.","schema":{"type":"string"}},{"name":"games","in":"query","required":false,"description":"Last N graded games.","schema":{"type":"integer"}},{"name":"X-User-Request","in":"header","required":false,"description":"The current user task in one sentence. No secrets or personal data.","schema":{"type":"string","maxLength":500}},{"name":"X-Rating","in":"header","required":false,"description":"Optional. 1 to 5: how well the previous response served the task. Recorded once per prompt or per day.","schema":{"type":"integer","minimum":1,"maximum":5}}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid query"},"401":{"description":"Missing or invalid key"},"404":{"description":"Not found"},"429":{"description":"Rate or monthly limit. The body says which plan, when it resets, one sentence to relay, and the upgrade URL.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["RATE_LIMITED","QUOTA_EXCEEDED"]},"message":{"type":"string"},"plan":{"type":"object"},"limit":{"type":"string"},"reset_at":{"type":"string","format":"date-time"},"retry_after_seconds":{"type":"integer"},"notify_user":{"type":"boolean"},"user_message":{"type":"string","description":"One sentence to relay to the user as is."},"upgrade_url":{"type":"string"},"upgrade_plan":{"type":["object","null"]}}}}}}}}}}},"/api/v1/watches":{"get":{"summary":"List Watches","description":"A player prop you track, with the line or price move that should alert you.","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","maximum":200}},{"name":"offset","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Invalid key"},"429":{"description":"Rate or quota limit"}}},"post":{"summary":"Create a Watch","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Watch"}}}},"responses":{"201":{"description":"Created"},"402":{"description":"Record limit"},"422":{"description":"Invalid"}}}},"/api/v1/watches/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"get":{"summary":"Read a Watch","responses":{"200":{"description":"OK"},"404":{"description":"Not found"}}},"patch":{"summary":"Update a Watch","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Watch"}}}},"responses":{"200":{"description":"OK"},"404":{"description":"Not found"}}},"delete":{"summary":"Delete a Watch","responses":{"204":{"description":"Deleted"},"404":{"description":"Not found"}}}},"/api/v1/stream":{"get":{"summary":"Stream changes (Server-Sent Events)","description":"Events: hello, change (id = cursor), checkpoint (id = how far the feed was read), gap (resume older than the retained feed), reconnect. Resume with the Last-Event-ID header. Free is delayed 300 s. Concurrent connections are capped per plan.","parameters":[{"name":"since","in":"query","required":false,"description":"Cursor to resume after, if Last-Event-ID cannot be sent.","schema":{"type":"string"}},{"name":"league","in":"query","required":false,"description":"Comma list, e.g. NBA,NFL.","schema":{"type":"string"}},{"name":"kinds","in":"query","required":false,"description":"Comma list of new, line_move, price_move, status_change, removed.","schema":{"type":"string"}}],"responses":{"200":{"description":"text/event-stream"},"400":{"description":"Invalid cursor or filter"},"401":{"description":"Invalid key"},"402":{"description":"Plan or full archive required"},"429":{"description":"Rate or quota limit"}}}},"/api/v1/export":{"get":{"summary":"Export props or history for a date range","description":"CSV or NDJSON, streamed, paged by cursor while X-Has-More is true. Developer and up, or a full archive on any plan. X-Rows, X-Next-Cursor, X-Archive-Rows-Spent and X-Archive-Rows-Remaining are provisional: they are set before the body streams and describe the page as planned. Archive rows are charged as the body is read. If the archive balance is spent elsewhere or revoked during the download, the body ends early with one error line instead of the remaining rows: in CSV the last line is '#error,<code>,next_cursor=<cursor>'; in NDJSON the last line is {\"error\":{\"code\":...,\"message\":...,\"next_cursor\":...}}. Clients must not parse the error line as data. Page on from the error line's next_cursor when one is present, otherwise from X-Next-Cursor.","parameters":[{"name":"kind","in":"query","required":false,"description":"history (default) or props.","schema":{"type":"string"}},{"name":"format","in":"query","required":false,"description":"csv (default) or ndjson.","schema":{"type":"string"}},{"name":"from","in":"query","required":true,"description":"Start, inclusive. ISO 8601 date or time.","schema":{"type":"string"}},{"name":"to","in":"query","required":true,"description":"End, exclusive. At most 366 days after from.","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"X-Next-Cursor from the previous page.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Rows per page, up to 10000.","schema":{"type":"integer","maximum":10000}},{"name":"league","in":"query","required":false,"description":"League code.","schema":{"type":"string"}},{"name":"sport","in":"query","required":false,"description":"Sport.","schema":{"type":"string"}},{"name":"event_id","in":"query","required":false,"description":"One game.","schema":{"type":"string"}}],"responses":{"200":{"description":"text/csv or application/x-ndjson"},"400":{"description":"Invalid query"},"401":{"description":"Invalid key"},"402":{"description":"Plan or full archive required"},"429":{"description":"Rate or quota limit"}}}},"/api/v1/training-set":{"get":{"summary":"Training set: open line, closing line and moves per prop","description":"One row per prop whose game started in the range. Closing line is the last observation at or before the start. meta.graded is false until results are graded.","parameters":[{"name":"from","in":"query","required":true,"description":"Start, inclusive. ISO 8601 date or time.","schema":{"type":"string"}},{"name":"to","in":"query","required":true,"description":"End, exclusive. At most 366 days after from.","schema":{"type":"string"}},{"name":"format","in":"query","required":false,"description":"json (default), csv or ndjson.","schema":{"type":"string"}},{"name":"cursor","in":"query","required":false,"description":"meta.next_cursor from the previous page.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Rows per page, up to 5000.","schema":{"type":"integer","maximum":5000}},{"name":"league","in":"query","required":false,"description":"League code.","schema":{"type":"string"}},{"name":"sport","in":"query","required":false,"description":"Sport.","schema":{"type":"string"}},{"name":"stat","in":"query","required":false,"description":"Stat.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"400":{"description":"Invalid query"},"401":{"description":"Invalid key"},"402":{"description":"Plan or full archive required"},"429":{"description":"Rate or quota limit"}}}},"/api/v1/webhooks":{"get":{"summary":"List webhook endpoints","responses":{"200":{"description":"OK"},"401":{"description":"Invalid key"}}},"post":{"summary":"Register a webhook endpoint","description":"Plans that include webhooks. Up to five HTTPS endpoints on public addresses. The signing secret is returned once. Deliveries are signed X-Webhook-Signature: t=<unix>,v1=<HMAC-SHA256 of t.body>.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri"},"description":{"type":"string","maxLength":120},"kinds":{"type":"array","items":{"type":"string"}},"leagues":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"201":{"description":"Created, with secret"},"402":{"description":"Plan does not include webhooks"},"409":{"description":"Five endpoints already"},"422":{"description":"URL refused"}}}},"/api/v1/webhooks/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"delete":{"summary":"Delete a webhook endpoint","responses":{"204":{"description":"Deleted"},"404":{"description":"Not found"}}}},"/api/v1/webhooks/{id}/deliveries":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"get":{"summary":"Delivery log of an endpoint","parameters":[{"name":"before","in":"query","required":false,"description":"Delivery id to page back from.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Up to 200.","schema":{"type":"integer","maximum":200}}],"responses":{"200":{"description":"OK"}}}},"/api/v1/agent/signup":{"post":{"operationId":"startAgentSignup","summary":"Start a Free account for a person, from an agent","description":"Sends the person a verification email. When they approve it in the browser, the agent collects a Free key from /api/v1/agent/token. Rate limited per IP and per email; disposable addresses are refused.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","use_case"],"properties":{"email":{"type":"string","format":"email","description":"The person's own email address. Ask them; never invent one."},"use_case":{"type":"string","description":"What they are building, in their words or one of the onboarding options."},"sports":{"type":"string","description":"Which sports matter most."},"agent":{"type":"string","description":"Name of the agent or client making the request."}}}}}},"security":[],"responses":{"202":{"description":"Verification email sent; poll the token endpoint"},"422":{"description":"Invalid or disposable email, or missing use_case"},"429":{"description":"Too many signups for this network or email"},"503":{"description":"Signup unavailable"}}}},"/api/v1/agent/token":{"post":{"operationId":"finishAgentSignup","summary":"Collect the key once the person approves","description":"Poll every interval seconds with the device_code from the signup call. Returns the key exactly once after approval.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["device_code"],"properties":{"device_code":{"type":"string","description":"device_code from /api/v1/agent/signup."}}}}}},"security":[],"responses":{"200":{"description":"The key, shown once"},"400":{"description":"authorization_pending, slow_down or expired_token"},"404":{"description":"Unknown device_code"},"410":{"description":"Already collected"}}}},"/api/v1/feedback":{"post":{"operationId":"sendFeedback","summary":"Tell the team what is missing","description":"Needs no key and costs no quota. A valid key attributes it.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["kind","message"],"properties":{"kind":{"type":"string","enum":["missing_feature","missing_data","bug","other"]},"message":{"type":"string"},"contact":{"type":"string"}}}}}},"security":[],"responses":{"201":{"description":"Received"},"422":{"description":"Invalid"}}}}},"components":{"schemas":{"Watch":{"type":"object","additionalProperties":false,"required":["player","stat"],"properties":{"player":{"type":"string","description":"Player name as FanDuel lists it"},"stat":{"type":"string","enum":["points","rebounds","assists","threes","pra","other"],"description":"Which prop market"},"line":{"type":"number","description":"Line you want to be told about"},"note":{"type":"string","description":"Why you are watching it"}}}},"securitySchemes":{"bearer":{"type":"http","scheme":"bearer"}}}}