DFS API Reference
Daily-fantasy contest data across operators — the slates (operator + league + game pool + scoring rules), their game pools, player pools with salaries and positions, projection sources and projections, and the contests with their entrants, submitted lineups, and per-lineup player rosters.
Main
slates
dfs.slatesDFS contest slate. A slate is one operator + one league + a fixed game pool + scoring rules; users build lineups against it.
GET/api/v1/dfs/slatesList slates for DFS
Requires one of:
operator_id + date — requests satisfying none of these return 400.Parameters
operator_idquerybigintoptionalFilter to all slates for a single DFS operator: 1 DraftKings, 2 FanDuel, 3 Yahoo.
datequerydateoptionalSlate calendar date in US Eastern time (YYYY-MM-DD), derived from start_time.
leaguequerystringoptionalLeague — code (NFL, NBA, MLB, NHL, GOLF; case-insensitive) or numeric league id. Resolves via main.leagues.
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/slates?operator_id=1&date=2026-01-01'Responses
200slates rows matching the declared filter set, wrapped in { slates, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.
application/jsonGET/api/v1/dfs/slates/{id}Get a single slate by id
Parameters
idpathbigintrequiredPrimary key (id) of the slate row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/slates/{pk_value}'Responses
200Single slate row.application/jsonshow example ▸
404Row not found.
slate_settings
dfs.slate_settingsThe scoring format and roster-construction ruleset a slate is built on — salary cap, position slots, and scoring rules per operator / league / game-type combination. A small reference table that many slates point at.
GET/api/v1/dfs/slate_settingsList slate_settings for DFS
Parameters
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/slate_settings?limit=3'Responses
200slate_settings rows matching the declared filter set, wrapped in { slate_settings, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.
application/jsonGET/api/v1/dfs/slate_settings/{id}Get a single slate_setting by id
Parameters
idpathbigintrequiredPrimary key (id) of the slate_setting row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/slate_settings/{pk_value}'Responses
200Single slate_setting row.application/jsonshow example ▸
404Row not found.
slate_games
dfs.slate_gamesMany-to-many bridge between a DFS slate and the sport games included in its pool.
GET/api/v1/dfs/slate_gamesList slate_games for DFS
Requires one of:
slate_id — requests satisfying none of these return 400.Parameters
slate_idquerybigintoptionalFilter to the games in a single slate pool.
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/slate_games?slate_id=1'Responses
200slate_games rows matching the declared filter set, wrapped in { slate_games, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.
application/jsonGET/api/v1/dfs/slate_games/{id}Get a single slate_game by id
Parameters
idpathbigintrequiredPrimary key (id) of the slate_game row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/slate_games/{pk_value}'Responses
200Single slate_game row.application/jsonshow example ▸
404Row not found.
slate_players
dfs.slate_playersPlayer pool for a DFS slate — one row per (slate, player, roster slot). Carries operator salary, positions, and any operator-side metadata.
GET/api/v1/dfs/slate_playersList slate_players for DFS
Requires one of:
slate_id — requests satisfying none of these return 400.Parameters
slate_idquerybigintoptionalFilter to the player pool of a single slate.
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/slate_players?slate_id=1'Responses
200slate_players rows matching the declared filter set, wrapped in { slate_players, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.
application/jsonGET/api/v1/dfs/slate_players/{id}Get a single slate_player by id
Parameters
idpathbigintrequiredPrimary key (id) of the slate_player row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/slate_players/{pk_value}'Responses
200Single slate_player row.application/jsonshow example ▸
404Row not found.
Stats
game_stats
dfs.game_statsPer-game results for the games in a slate's pool (coming soon).
⚠️ This endpoint is documented but not yet live. Calls return
503 until data is wired in.GET/api/v1/dfs/game_statsList game_stats for DFS
Parameters
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/game_stats?limit=3'Responses
200game_stats rows matching the declared filter set, wrapped in { game_stats, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.
application/json503Coming soon — handler returns 503 until data is wired in.
GET/api/v1/dfs/game_stats/{id}Get a single game_stat by id
Parameters
idpathbigintrequiredPrimary key (id) of the game_stat row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/game_stats/{pk_value}'Responses
200Single game_stat row.application/jsonshow example ▸
404Row not found.
503Coming soon — handler returns 503 until data is wired in.
player_stats
dfs.player_statsPer-player fantasy scoring results for a slate's games (coming soon — populated after the DFS stat loader ships).
⚠️ This endpoint is documented but not yet live. Calls return
503 until data is wired in.GET/api/v1/dfs/player_statsList player_stats for DFS
Parameters
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/player_stats?limit=3'Responses
200player_stats rows matching the declared filter set, wrapped in { player_stats, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.
application/json503Coming soon — handler returns 503 until data is wired in.
GET/api/v1/dfs/player_stats/{id}Get a single player_stat by id
Parameters
idpathbigintrequiredPrimary key (id) of the player_stat row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/player_stats/{pk_value}'Responses
200Single player_stat row.application/jsonshow example ▸
404Row not found.
503Coming soon — handler returns 503 until data is wired in.
slate_player_projections
dfs.slate_player_projectionsFantasy-points projection for one player in one slate from one source. Multiple sources produce multiple rows per (slate_player).
GET/api/v1/dfs/slate_player_projectionsList slate_player_projections for DFS
Requires one of:
slate_player_id — requests satisfying none of these return 400.Parameters
slate_player_idquerybigintoptionalFilter to all source projections for a single slate-player.
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/slate_player_projections?slate_player_id=1'Responses
200slate_player_projections rows matching the declared filter set, wrapped in { slate_player_projections, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.
application/jsonGET/api/v1/dfs/slate_player_projections/{id}Get a single slate_player_projection by id
Parameters
idpathbigintrequiredPrimary key (id) of the slate_player_projection row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/slate_player_projections/{pk_value}'Responses
200Single slate_player_projection row.application/jsonshow example ▸
404Row not found.
slate_projection_sources
dfs.slate_projection_sourcesA registered projection provider for a slate (e.g., RotoGrinders consensus, an in-house model, a user upload).
GET/api/v1/dfs/slate_projection_sourcesList slate_projection_sources for DFS
Parameters
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/slate_projection_sources?limit=3'Responses
200slate_projection_sources rows matching the declared filter set, wrapped in { slate_projection_sources, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.
application/jsonGET/api/v1/dfs/slate_projection_sources/{id}Get a single slate_projection_source by id
Parameters
idpathbigintrequiredPrimary key (id) of the slate_projection_source row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/slate_projection_sources/{pk_value}'Responses
200Single slate_projection_source row.application/jsonshow example ▸
404Row not found.
team_stats
dfs.team_statsPer-team fantasy-relevant results for a slate's games (coming soon).
⚠️ This endpoint is documented but not yet live. Calls return
503 until data is wired in.GET/api/v1/dfs/team_statsList team_stats for DFS
Parameters
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/team_stats?limit=3'Responses
200team_stats rows matching the declared filter set, wrapped in { team_stats, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.
application/json503Coming soon — handler returns 503 until data is wired in.
GET/api/v1/dfs/team_stats/{id}Get a single team_stat by id
Parameters
idpathbigintrequiredPrimary key (id) of the team_stat row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/team_stats/{pk_value}'Responses
200Single team_stat row.application/jsonshow example ▸
404Row not found.
503Coming soon — handler returns 503 until data is wired in.
Contests
contest_user_lineup_player_entries
dfs.contest_user_lineup_player_entriesA single roster slot within a submitted contest lineup — one slate player in one position, with the fantasy points they scored.
GET/api/v1/dfs/contest_user_lineup_player_entriesList contest_user_lineup_player_entries for DFS
Requires one of:
contest_user_lineup_id — requests satisfying none of these return 400.Parameters
contest_user_lineup_idquerybigintoptionalFilter to the player roster of a single submitted lineup.
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/contest_user_lineup_player_entries?contest_user_lineup_id=1'Responses
200contest_user_lineup_player_entries rows matching the declared filter set, wrapped in { contest_user_lineup_player_entries, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.
application/jsonGET/api/v1/dfs/contest_user_lineup_player_entries/{id}Get a single contest_user_lineup_player_entry by id
Parameters
idpathbigintrequiredPrimary key (id) of the contest_user_lineup_player_entry row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/contest_user_lineup_player_entries/{pk_value}'Responses
200Single contest_user_lineup_player_entry row.application/jsonshow example ▸
404Row not found.
contest_users
dfs.contest_usersA contest entrant — one operator-side user who submitted at least one lineup. Identified by the operator's user id, not a statview account.
GET/api/v1/dfs/contest_usersList contest_users for DFS
Requires one of:
operator_id — requests satisfying none of these return 400.Parameters
operator_idquerybigintoptionalFilter to all contest entrants for a single DFS operator: 1 DraftKings, 2 FanDuel, 3 Yahoo.
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/contest_users?operator_id=1'Responses
200contest_users rows matching the declared filter set, wrapped in { contest_users, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.
application/jsonGET/api/v1/dfs/contest_users/{id}Get a single contest_user by id
Parameters
idpathbigintrequiredPrimary key (id) of the contest_user row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/contest_users/{pk_value}'Responses
200Single contest_user row.application/jsonshow example ▸
404Row not found.
contests
dfs.contestsA DFS contest run on a slate — its entry fee, prize pool, entry caps, and type (GPP vs cash). One slate hosts many contests.
GET/api/v1/dfs/contestsList contests for DFS
Requires one of:
slate_id — requests satisfying none of these return 400.Parameters
slate_idquerybigintoptionalFilter to all contests run on a single slate.
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/contests?slate_id=1'Responses
200contests rows matching the declared filter set, wrapped in { contests, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.
application/jsonGET/api/v1/dfs/contests/{id}Get a single contest by id
Parameters
idpathbigintrequiredPrimary key (id) of the contest row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/contests/{pk_value}'Responses
200Single contest row.application/jsonshow example ▸
404Row not found.
contest_user_lineups
dfs.contest_user_lineupsA single lineup submitted to a contest by an entrant, with its finishing rank, total fantasy points, and winnings where the contest has settled.
GET/api/v1/dfs/contest_user_lineupsList contest_user_lineups for DFS
Requires one of:
contest_id or contest_user_id — requests satisfying none of these return 400.Parameters
contest_idquerybigintoptionalFilter to every lineup submitted to a single contest.
contest_user_idquerybigintoptionalFilter to every lineup an entrant submitted.
limitqueryintegeroptionaldefault 50Page size. Defaults to 50; max 200.
from_idquerybigintoptionalReturn rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/contest_user_lineups?contest_id=1'Responses
200contest_user_lineups rows matching the declared filter set, wrapped in { contest_user_lineups, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.
application/jsonGET/api/v1/dfs/contest_user_lineups/{id}Get a single contest_user_lineup by id
Parameters
idpathbigintrequiredPrimary key (id) of the contest_user_lineup row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS --compressed \
-H 'Authorization: Bearer YOUR_API_KEY' \
'https://api.stat-api.com/api/v1/dfs/contest_user_lineups/{pk_value}'Responses
200Single contest_user_lineup row.application/jsonshow example ▸
404Row not found.