STAT-API

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

slatesdfs.slates
DFS contest slate. A slate is one operator + one league + a fixed game pool + scoring rules; users build lineups against it.
GET/api/v1/dfs/slates
Requires one of: operator_id + date — requests satisfying none of these return 400.
Parameters
operator_idquerybigintoptional
Filter to all slates for a single DFS operator: 1 DraftKings, 2 FanDuel, 3 Yahoo.
datequerydateoptional
Slate calendar date in US Eastern time (YYYY-MM-DD), derived from start_time.
leaguequerystringoptional
League — code (NFL, NBA, MLB, NHL, GOLF; case-insensitive) or numeric league id. Resolves via main.leagues.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return 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/json
GET/api/v1/dfs/slates/{id}
Parameters
idpathbigintrequired
Primary 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_settingsdfs.slate_settings
The 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_settings
Parameters
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return 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/json
GET/api/v1/dfs/slate_settings/{id}
Parameters
idpathbigintrequired
Primary 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_gamesdfs.slate_games
Many-to-many bridge between a DFS slate and the sport games included in its pool.
GET/api/v1/dfs/slate_games
Requires one of: slate_id — requests satisfying none of these return 400.
Parameters
slate_idquerybigintoptional
Filter to the games in a single slate pool.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return 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/json
GET/api/v1/dfs/slate_games/{id}
Parameters
idpathbigintrequired
Primary 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_playersdfs.slate_players
Player 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_players
Requires one of: slate_id — requests satisfying none of these return 400.
Parameters
slate_idquerybigintoptional
Filter to the player pool of a single slate.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return 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/json
GET/api/v1/dfs/slate_players/{id}
Parameters
idpathbigintrequired
Primary 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_statsdfs.game_stats
Per-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_stats
Parameters
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return 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/json
503Coming soon — handler returns 503 until data is wired in.
GET/api/v1/dfs/game_stats/{id}
Parameters
idpathbigintrequired
Primary 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_statsdfs.player_stats
Per-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_stats
Parameters
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return 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/json
503Coming soon — handler returns 503 until data is wired in.
GET/api/v1/dfs/player_stats/{id}
Parameters
idpathbigintrequired
Primary 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_projectionsdfs.slate_player_projections
Fantasy-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_projections
Requires one of: slate_player_id — requests satisfying none of these return 400.
Parameters
slate_player_idquerybigintoptional
Filter to all source projections for a single slate-player.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return 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/json
GET/api/v1/dfs/slate_player_projections/{id}
Parameters
idpathbigintrequired
Primary 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_sourcesdfs.slate_projection_sources
A registered projection provider for a slate (e.g., RotoGrinders consensus, an in-house model, a user upload).
GET/api/v1/dfs/slate_projection_sources
Parameters
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return 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/json
GET/api/v1/dfs/slate_projection_sources/{id}
Parameters
idpathbigintrequired
Primary 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_statsdfs.team_stats
Per-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_stats
Parameters
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return 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/json
503Coming soon — handler returns 503 until data is wired in.
GET/api/v1/dfs/team_stats/{id}
Parameters
idpathbigintrequired
Primary 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_entriesdfs.contest_user_lineup_player_entries
A 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_entries
Requires one of: contest_user_lineup_id — requests satisfying none of these return 400.
Parameters
contest_user_lineup_idquerybigintoptional
Filter to the player roster of a single submitted lineup.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return 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/json
GET/api/v1/dfs/contest_user_lineup_player_entries/{id}
Parameters
idpathbigintrequired
Primary 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_usersdfs.contest_users
A 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_users
Requires one of: operator_id — requests satisfying none of these return 400.
Parameters
operator_idquerybigintoptional
Filter to all contest entrants for a single DFS operator: 1 DraftKings, 2 FanDuel, 3 Yahoo.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return 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/json
GET/api/v1/dfs/contest_users/{id}
Parameters
idpathbigintrequired
Primary 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.
contestsdfs.contests
A 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/contests
Requires one of: slate_id — requests satisfying none of these return 400.
Parameters
slate_idquerybigintoptional
Filter to all contests run on a single slate.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return 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/json
GET/api/v1/dfs/contests/{id}
Parameters
idpathbigintrequired
Primary 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_lineupsdfs.contest_user_lineups
A 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_lineups
Requires one of: contest_id or contest_user_id — requests satisfying none of these return 400.
Parameters
contest_idquerybigintoptional
Filter to every lineup submitted to a single contest.
contest_user_idquerybigintoptional
Filter to every lineup an entrant submitted.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return 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/json
GET/api/v1/dfs/contest_user_lineups/{id}
Parameters
idpathbigintrequired
Primary 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.