STAT-API

DFS Data Dictionary

Rows in this schema point at an underlying sporting event through a polymorphic (league_code, competition_id) pair, resolved through the main.competitions view — competition_id is a team-sport games.id or a golf.tournaments.id.

Main

dfs.slate_settings10 fields· 1 refsendpoints →

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.

FieldTypeReferencesExampleDescription
idkeybigint——Primary Key
league_idbigint—2—
operator_idbigint→ main.operators2—
operator_setting_idstringnullable——The operator's own id for this format (DraftKings gameTypeId, FanDuel slateFormatId). Operators reuse these ids across versions and formats, so it is unique only together with operator, league, game type and valid_from.
contest_typeinteger—0Contest structure code (0 = Tournament / GPP, 1 = Cash game / Double-up).
game_stylestringnullable—CLASSICOperator game style label.
ValuesCLASSICSINGLE_GAMEPICK_EMLATE_SWAPSHOW_DOWNFULL_ROSTERSHOW_DOWN_CAPTAIN_MODENON_LATE_SWAPSTARTING_5SINGLE_GAME_BOOSTSINGLE_GAME_V3WEEKENDSHOW_DOWN_CAPTAIN_MODE_SUPERFLEXFINAL_ROUND_ONLYSINGLE_GAME_DEPRECATEDSINGLE_GAME_V2-DEPRECATEDSINGLE_GAME_V2
game_typeinteger—0Contest format code (0 = Classic full-slate, 1 = Showdown / Single Game, 2 = Tiers).
namestring—Single Game 1.0Ruleset name (e.g. "Classic", "Showdown Captain Mode", "Single Game").
settingsjsonb—[object Object]Full ruleset as JSON: salary cap, roster slots, and the per-stat scoring rules (e.g. DK NBA: 1.25/rebound, 1.5/assist, double-double bonuses, CPT 1.5x). With this plus per-game box scores you can recompute any lineup's fantasy points exactly.
valid_fromdatenullable——First slate day (US Eastern) this version of the format applies to.
dfs.slates17 fields· 2 refsendpoints →

DFS contest slate. A slate is one operator + one league + a fixed game pool + scoring rules; users build lineups against it. Slate player and team projections are available directly on this slate resource or under the Projections section.

FieldTypeReferencesExampleDescription
idkeybigint——Primary Key
external_idbigint—16775Operator-side slate identifier (e.g., DraftKings contest group ID).
league_idbigint—2FK to the league this slate belongs to.
operator_idbigint→ main.operators2FK to the DFS operator (DraftKings, FanDuel, Yahoo, etc.).
operator_setting_idstringnullable——The operator's own id for the lineup setting this slate is played under — FanDuel states it as slateFormatId, DraftKings as lineupConfigurationId. Matches dfs.slate_settings.operator_setting_id. Text, because rotoql stores values like deprecated-5399. Never a key on its own: the operators reuse these ids across sports and versions, so resolution is (operator, league, this id) then the newest valid_from not after the slate date.
slate_setting_idbigint→ dfs.slate_settings33FK to slate_settings — the scoring format and roster constraints for this slate.
contest_countinteger——Number of contests on this slate (rows in dfs.contests). Counts lobby-only contests too, which never have lineups.
datedate—2026-02-24Calendar day of the slate in US Eastern time (DB-generated from start_time — read-only).
game_countinteger——Number of games in the slate pool (distinct games in dfs.slate_games). 0 when the slate has no linked games.
game_typestringnullable——Roster format of the slate, from its slate setting: classic (full roster), showdown (DraftKings Showdown Captain Mode — CPT at 1.5x salary and points), single_game (FanDuel Single Game — MVP at 1.5x points, no salary change), or tiers. Null when the setting states another format.
lineup_contest_countinteger——Number of contests on this slate with their lineups loaded (dfs.contests.lineups_status = available). 0 when no contest of the slate has a lineup file.
mainboolean—falseWhether this is the featured ("main") slate for this operator/league/day — at most one per (operator, league, date). Daily for NBA/MLB/NHL, Sundays for NFL, never for golf. Backfilled 2016-2026 on 2026-08-24 (docs/migrations/scripts/2026-08-24-dfs-slates-main-backfill.sql). Rows loaded after that date are not yet auto-flagged.
Valuesfalsetrue
namestringnullable—MainHuman-readable slate label (e.g., "Sunday Main", "Showdown: TB vs KC").
player_countinteger——Number of priced players in the slate pool (rows in dfs.slate_players).
start_timetimestamptz—2026-02-25T00:00:00.000ZLock time — first scheduled tip/kickoff of any game in the pool.
statestring——Lifecycle state of the slate in the Prelock / Started / Completed vocabulary, derived by the API on every read (browse.rs derive_dfs_lifecycle_state) from `status`: Upcoming → Prelock, Live → Started, Completed → Completed. `status` is the authoritative field; this one repeats it in the older vocabulary.
statusstring—CompletedAuthoritative slate lifecycle status: Upcoming (pre-lock), Live (in progress), Completed (all games final).
dfs.slate_games6 fields· 1 refsendpoints →

Many-to-many bridge between a DFS slate and the sport games included in its pool.

FieldTypeReferencesExampleDescription
idkeybigint——Primary Key
external_idstringnullable—59159Operator-side game identifier.
game_idbigint—2392Polymorphic reference to {nfl,nba,mlb}.games based on league_id
league_idbigint—2League key disambiguating the polymorphic game_id (nfl/nba/mlb/nhl).
slate_idbigint→ dfs.slates758FK to dfs.slates.
datajsonbnullable—[object Object]Operator-provided game metadata (teams, matchup type, and start time).
dfs.slate_players16 fields· 2 refsendpoints →

Player pool for a DFS slate — one row per (slate, player, roster slot). Carries operator salary, positions, and any operator-side metadata.

FieldTypeReferencesExampleDescription
idkeybigint——Primary Key
export_idstringnullable—108443-158854Operator player ID used for CSV export/import
external_idstringnullable—145319Operator player identifier in this slate.
league_idbigint—2League key disambiguating player_id.
player_idbigint—23Polymorphic FK to {nfl,nba,mlb,nhl}.players based on league_id.
slate_game_idbigint→ dfs.slate_games193FK to dfs.slate_games — the specific slate-game this player is rostered to.
slate_idbigint→ dfs.slates247FK to dfs.slates.
team_idbigintnullable—17Polymorphic FK to {league}.teams. Null for golfers and other player-only sports.
avg_pointsfloatnullable—14.4Average fantasy points from operator
display_namestringnullable—Jarred VanderbiltFull display name from operator
first_namestringnullable—JalenPlayer first name from operator
injury_detailsstringnullable——Injury body part/details
injury_statusstringnullable—oInjury status, lower case: il, o, q, d, p, dtd, na, ir, gtd (game-time decision), c19 (COVID-19 protocols, 2021-22 only). Empty when the operator listed the player as healthy.
Valuesoqgtd
last_namestringnullable—WilliamsPlayer last name from operator
positionstring—CPrimary position label per operator (e.g., RB, WR, PG, SP).
ValuesCPGCPTSGMVPPROSTARSFSG/SFPFSF/PFPG/SGPF/CPF/SFSF/SGSG/PGPG/SFC/PFPG/PF
salaryinteger—6000Operator-assigned DFS salary (whole dollars; e.g., 8400 = $8,400).

Stats

dfs.game_stats50 fields· 1 refsendpoints →

One row per game in a slate's pool: the game's total fantasy production for the slate's operator scoring format with home/away point totals, per-category point columns, and headline raw stats per side. Per-side category detail lives on team_stats. NFL today.

FieldTypeReferencesExampleDescription
idkeybigint——Primary Key
away_team_idbigint—19—
game_idbigint—42549—
home_team_idbigint—16—
league_idbigint—1—
operator_idbigint—2—
slate_idbigint→ dfs.slates124482—
away_fptsdecimalnullable—78.7600—
away_passing_ydsintegernullable—194—
away_ptsintegernullable—17—
away_rushing_ydsintegernullable—106—
away_total_ydsintegernullable—396—
away_turnoversintegernullable—1—
home_fptsdecimalnullable—119.7400—
home_passing_ydsintegernullable—275—
home_ptsintegernullable—17—
home_rushing_ydsintegernullable—96—
home_total_ydsintegernullable—367—
home_turnoversintegernullable—1—
player_countintegernullable—59—
scoring_formatstringnullable—classicOperator scoring format code (classic, showdown, single_game); null when the format has no fantasy scoring.
Valuesclassicsingle_gameshowdown
slate_datedate—2021-11-21—
total_blocked_kick_fptsdecimalnullable—0.0000—
total_defense_interception_fptsdecimalnullable—2.0000—
total_defensive_td_fptsdecimalnullable—0.0000—
total_extra_point_fptsdecimalnullable—3.0000—
total_field_goal_fptsdecimalnullable—10.0000—
total_field_goal_missed_fptsdecimalnullable—0.0000—
total_fptsdecimalnullable—201.1600—
total_fumble_lost_fptsdecimalnullable—0.0000—
total_fumble_recovery_fptsdecimalnullable—2.0000—
total_interception_fptsdecimalnullable—-1.0000—
total_passing_2pt_conversion_fptsdecimalnullable—0.0000—
total_passing_bonus_fptsdecimalnullable—0.0000—
total_passing_td_fptsdecimalnullable—12.0000—
total_passing_yds_fptsdecimalnullable—19.5600—
total_pts_allowed_fptsdecimalnullable—0.0000—
total_receiving_2pt_conversion_fptsdecimalnullable—0.0000—
total_receiving_bonus_fptsdecimalnullable—0.0000—
total_receiving_td_fptsdecimalnullable—18.0000—
total_receiving_yds_fptsdecimalnullable—48.9000—
total_reception_fptsdecimalnullable—21.5000—
total_return_td_fptsdecimalnullable—0.0000—
total_return_yds_fptsdecimalnullable—0.0000—
total_rushing_2pt_conversion_fptsdecimalnullable—0.0000—
total_rushing_bonus_fptsdecimalnullable—0.0000—
total_rushing_td_fptsdecimalnullable—6.0000—
total_rushing_yds_fptsdecimalnullable—20.8000—
total_sack_fptsdecimalnullable—4.0000—
total_safety_fptsdecimalnullable—0.0000—
dfs.player_stats74 fields· 1 refsendpoints →

One row per slate player: the slate context (slate, salary, position) joined to that player's per-game fantasy result for the slate's operator scoring format — total points, the per-category point columns, and the raw stats behind them. NFL today; other leagues follow as their fantasy engines land.

FieldTypeReferencesExampleDescription
idkeybigint——Primary Key
game_idbigintnullable—42306—
league_idbigint—1—
operator_idbigint—2—
player_idbigint—1183—
slate_idbigint→ dfs.slates124469—
team_idbigintnullable—28—
blocked_kick_fptsdecimalnullable—0.0000—
blocked_kicksintegernullable—0—
defense_interception_fptsdecimalnullable—0.0000—
defensive_interceptionsintegernullable—0—
defensive_sacksfloatnullable—0.0000Numeric — half-sacks exist. Player value for humans, team value for DST rows.
defensive_td_fptsdecimalnullable—0.0000—
defensive_tdsintegernullable—0—
extra_point_fptsdecimalnullable—0.0000—
extra_pts_madeintegernullable—0—
fantasy_ptsdecimalnullable—0.0000—
field_goal_fptsdecimalnullable—0.0000—
field_goal_missed_fptsdecimalnullable—0.0000—
field_goals_attemptedintegernullable—0—
field_goals_madeintegernullable—0—
field_goals_made_0_19integernullable—0—
field_goals_made_20_29integernullable—0—
field_goals_made_30_39integernullable—0—
field_goals_made_40_49integernullable—0—
field_goals_made_50_plusintegernullable—0—
fumble_lost_fptsdecimalnullable—0.0000—
fumble_recovery_fptsdecimalnullable—0.0000—
fumbles_recoveredintegernullable—0—
interception_fptsdecimalnullable—0.0000—
interception_return_tdsintegernullable—0—
interceptions_thrownintegernullable—0—
kick_return_tdsintegernullable—0—
kick_return_ydsintegernullable—0—
passing_2pt_conversion_fptsdecimalnullable—0.0000—
passing_2pt_conversionsintegernullable—0—
passing_bonus_fptsdecimalnullable—0.0000—
passing_td_fptsdecimalnullable—0.0000—
passing_tdsintegernullable—0—
passing_ydsintegernullable—0—
passing_yds_fptsdecimalnullable—0.0000—
positionstring—WR—
ValuesWRRBTEMVPQBCPTDKDST
pts_allowed_defintegernullable—16—
pts_allowed_dstintegernullable—16—
pts_allowed_fptsdecimalnullable—0.0000—
punt_return_tdsintegernullable—0—
punt_return_ydsintegernullable—0—
receiving_2pt_conversion_fptsdecimalnullable—0.0000—
receiving_2pt_conversionsintegernullable—0—
receiving_bonus_fptsdecimalnullable—0.0000—
receiving_fumbles_lostintegernullable—0—
receiving_td_fptsdecimalnullable—0.0000—
receiving_tdsintegernullable—0—
receiving_ydsintegernullable—0—
receiving_yds_fptsdecimalnullable—0.0000—
reception_fptsdecimalnullable—0.0000—
receptionsintegernullable—0—
return_td_fptsdecimalnullable—0.0000—
return_yds_fptsdecimalnullable—0.0000—
rushing_2pt_conversion_fptsdecimalnullable—0.0000—
rushing_2pt_conversionsintegernullable—0—
rushing_bonus_fptsdecimalnullable—0.0000—
rushing_fumbles_lostintegernullable—0—
rushing_td_fptsdecimalnullable—0.0000—
rushing_tdsintegernullable—0—
rushing_ydsintegernullable—0—
rushing_yds_fptsdecimalnullable—0.0000—
sack_fptsdecimalnullable—0.0000—
sack_fumbles_lostintegernullable—0—
safetiesintegernullable—0—
safety_fptsdecimalnullable—0.0000—
salaryinteger—6000—
scoring_formatstringnullable—classicOperator scoring format code (classic, showdown, single_game); null when the format has no fantasy scoring.
Valuesclassicsingle_gameshowdown
slate_datedate—2021-08-21—
dfs.team_stats61 fields· 1 refsendpoints →

One row per team per slate game: the team's summed fantasy production for the slate's operator scoring format — total points, per-category point columns, player count, and the team's raw box-score line. DST is included in the team total. NFL today.

FieldTypeReferencesExampleDescription
idkeybigint——Primary Key
game_idbigint—42549—
league_idbigint—1—
operator_idbigint—2—
opponent_team_idbigint—19—
slate_idbigint→ dfs.slates124482—
team_idbigint—19—
blocked_kick_fptsdecimalnullable—0.0000—
blocked_kicksintegernullable—0—
defense_interception_fptsdecimalnullable—0.0000—
defensive_interceptionsintegernullable—0—
defensive_sacksintegernullable—2—
defensive_td_fptsdecimalnullable—0.0000—
defensive_tdsintegernullable—0—
extra_point_fptsdecimalnullable—0.0000—
extra_pts_madeintegernullable—2—
fantasy_ptsdecimalnullable—95.9800—
field_goal_fptsdecimalnullable—0.0000—
field_goal_missed_fptsdecimalnullable—0.0000—
field_goals_attemptedintegernullable—2—
field_goals_madeintegernullable—1—
first_downsintegernullable—21—
fumble_lost_fptsdecimalnullable—0.0000—
fumble_recovery_fptsdecimalnullable—0.0000—
fumbles_lostintegernullable—0—
fumbles_recoveredintegernullable—0—
interception_fptsdecimalnullable—0.0000—
interceptions_thrownintegernullable—0—
is_homeboolean—true—
Valuestruefalse
kick_return_tdsintegernullable—0—
passing_2pt_conversion_fptsdecimalnullable—0.0000—
passing_bonus_fptsdecimalnullable—0.0000—
passing_td_fptsdecimalnullable—4.0000—
passing_ydsintegernullable—215—
passing_yds_fptsdecimalnullable—8.6000—
player_countintegernullable—30—
ptsintegernullable—17—
pts_allowed_defintegernullable—17—
pts_allowed_dstintegernullable—17—
pts_allowed_fptsdecimalnullable—1.0000—
punt_return_tdsintegernullable—0—
receiving_2pt_conversion_fptsdecimalnullable—0.0000—
receiving_bonus_fptsdecimalnullable—0.0000—
receiving_td_fptsdecimalnullable—6.0000—
receiving_ydsintegernullable—215—
receiving_yds_fptsdecimalnullable—21.5000—
reception_fptsdecimalnullable—11.5000—
return_td_fptsdecimalnullable—0.0000—
return_yds_fptsdecimalnullable—0.0000—
rushing_2pt_conversion_fptsdecimalnullable—0.0000—
rushing_bonus_fptsdecimalnullable—0.0000—
rushing_td_fptsdecimalnullable—0.0000—
rushing_ydsintegernullable—103—
rushing_yds_fptsdecimalnullable—10.3000—
sack_fptsdecimalnullable—2.0000—
safetiesintegernullable—0—
safety_fptsdecimalnullable—0.0000—
scoring_formatstringnullable—classicOperator scoring format code (classic, showdown, single_game); null when the format has no fantasy scoring.
Valuesclassicsingle_gameshowdown
slate_datedate—2021-11-21—
total_ydsintegernullable—396—
turnoversintegernullable—1—

Contests

dfs.contest_users4 fields· 1 refsendpoints →

A contest entrant — one operator-side user who submitted at least one lineup. Identified by the operator's user id, not a statview account.

FieldTypeReferencesExampleDescription
idkeybigint——Primary Key
external_idstring—younghoeOperator user ID
operator_idbigint→ main.operators1—
namestringnullable—younghoe—
dfs.contests27 fields· 2 refsendpoints →

A DFS contest run on a slate — its entry fee, prize pool, entry caps, type flags and lock time. One slate hosts many contests. Fill history lives in contest_snapshots; the payout ladder in contest_payouts.

FieldTypeReferencesExampleDescription
idkeybigint——Primary Key
external_idbigint—188369206Operator contest id, numeric. FanDuel: the tail of its composite id.
game_type_idintegernullable—70Operator game type: DraftKings gameTypeId (1 Classic, 96 Showdown Captain, …).
operator_external_idstringnullable—188369206The operator id exactly as served. FanDuel: "{fixtureListId}-{contestId}", which the API needs back verbatim. DraftKings: same as external_id.
operator_idbigint→ main.operators1FK to the operator. Denormalized from slates: 5,160 slate external_ids are shared between DraftKings and FanDuel, so every operator filter was a two-hop join.
slate_idbigint→ dfs.slates32347FK to the slate this contest runs on.
attributesjsonbnullable—[object Object]The operator's raw flag set, kept whole: IsStarred, IsWinnerTakeAll, Multiplier, IsBeginner, IsCasual, IsPrivate, League, …
contest_statestringnullable—CompletedLatest observed state: Upcoming, Live, Completed, Cancelled. DraftKings cs / contestState.
contest_typeinteger—0Contest structure code (0 = Tournament / GPP, 1 = Cash game / 50-50 / Double-up).
entry_countinteger—0Latest observed entries. The history is in contest_snapshots.
entry_feeinteger—100Entry fee in cents (e.g. 500 = $5.00, 2000 = $20.00). 0 for free contests.
first_seen_attimestamptznullable——First lobby observation.
game_countinteger——Number of games in the pool of the contest's slate (distinct games in dfs.slate_games). 0 when the slate has no linked games.
guaranteedboolean—trueWhether the prize pool is guaranteed regardless of entries filled.
Valuestruefalse
last_seen_attimestamptznullable——Last lobby observation. A contest absent from the lobby after this is cancelled or locked.
max_entriesinteger—100Maximum total entries the contest accepts. Latest observed.
max_entries_per_userinteger—1Maximum lineups a single entrant may submit.
namestring—50/50 Contest ($1 - Top 50% Win)Operator-facing contest name (e.g. "$5 NBA Mini-MAX").
paid_placesintegernullable—50Number of paying positions. FanDuel serves it in the lobby (prizes.count); DraftKings derives it from the ladder.
payout_typeintegernullable—1DraftKings pt. 1 on all paid contests; 2 marked the two $0 promo contests.
player_countinteger——Number of rows in the pool of the contest's slate (dfs.slate_players). On showdown and single-game slates a CPT or MVP row counts separately, so the number can be twice the players.
prize_poolinteger—2500Total prize pool in cents (e.g. 10000000 = $100,000.00). On qualifiers, includes ticket face value.
qualifierboolean—falseSatellite or qualifier — pays tickets or seats, not (only) cash. Excluded from field-size statistics.
Valuesfalsetrue
slate_statusstringnullable——Authoritative lifecycle status of the parent slate (Upcoming, Live, Completed), joined from dfs.slates.
start_timetimestamptznullable—2026-03-03T00:00:00.000ZThe contest's own lock time. A late-swap contest locks later than its slate.
statestring——Lifecycle state of the contest in the Prelock / Started / Completed vocabulary, derived by the API on every read (browse.rs derive_dfs_lifecycle_state) from the parent slate status: Upcoming → Prelock, Live → Started, Completed → Completed. `status` is the authoritative field; this one repeats it in the older vocabulary.
statusstringnullable——Authoritative lifecycle status of the parent slate (Upcoming, Live, Completed), joined from dfs.slates.
dfs.contest_payout_shapes11 fields· 1 refsendpoints →

One row per contest with a ladder: paid places, cash vs ticket totals, top prize, min-cash, and the ratios contest selection needs. Rake is not here — it needs entries at lock, from contest_snapshots.

FieldTypeReferencesExampleDescription
idkeybigint——Primary Key
contest_idbigint→ dfs.contests15822FK to the contest. Also the row id.
cash_linedecimal—0.2200paid_places / max_entries.
cash_totalinteger—6000000Total cash prizes in cents (e.g. 10000000 = $100,000.00).
min_cashinteger—2500Amount awarded on the last paying tier in cents (e.g. 1000 = $10.00).
min_cash_multipledecimal—1.6667min_cash / entry_fee. 2.0 on a double-up.
paid_placesinteger—32max(max_position) — the number of paying positions.
ticket_totalinteger—0Total ticket face value in cents.
tier_countinteger—18Number of tiers in the ladder.
top_prizeinteger—1000000First place prize in cents (e.g. 2000000 = $20,000.00).
top_prize_sharedecimal—0.3333top_prize / (cash_total + ticket_total).