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_settings11 fields· 1 refsendpoints →

The scoring format and roster-construction ruleset a slate is built on — salary cap, position slots, seat multipliers, and the scoring rule (`scoring`) per operator / league / format version. A small reference table that many slates point at; a slate's scoring comes only from its setting.

FieldTypeReferencesExampleDescription
idkeybigint——Primary Key
league_idbigint—2—
operator_idbigint→ main.operators2—
operator_setting_idstringnullable—45The 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_EMFULL_ROSTERLATE_SWAPSHOW_DOWNSHOW_DOWN_CAPTAIN_MODESINGLE_GAME_BOOSTSINGLE_GAME_V3NON_LATE_SWAPSTARTING_5WEEKENDSHOW_DOWN_CAPTAIN_MODE_SUPERFLEXFINAL_ROUND_ONLYSINGLE_GAME_DEPRECATEDSINGLE_GAME_V2-DEPRECATEDSINGLE_GAME_V2
game_typeinteger—1Contest format code (0 = Classic full-slate, 1 = Showdown / Single Game, 2 = Tiers).
namestring—ShowdownRuleset name (e.g. "Classic", "Showdown Captain Mode", "Single Game").
scoringjsonbnullable—[object Object]The setting's scoring rule, the only source of its slates' points: `rule` (a name shared by settings that score alike, e.g. fanduel-nfl-2024), `part_of_game` (full, second_half, fourth_quarter), and for a full-game rule `stats`: points per stat, yardage bonuses (stat, at, points), field-goal tiers, and defense points (with the points-allowed figure the operator counts). An in-game rule holds no `stats`: its slates carry the operator's own points. NULL = no rule yet.
settingsjsonb—[object Object]The lineup ruleset as JSON, from the operator's own data: salary cap, roster slots, eligible positions, and the seat multipliers (syntheticPositions, e.g. CPT 1.5x). The points per stat are in `scoring`.
valid_fromdatenullable—2015-10-01First slate day (US Eastern) this version of the format applies to.
dfs.slates18 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—25The 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 some stored values are not numbers (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_settings23FK 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").
part_of_gamestringnullable——The part of each game that the slate scores, from the scoring rule of its slate setting (dfs.slate_settings.scoring): full, or second_half and fourth_quarter for an in-game slate. Null when the setting holds no scoring rule.
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_players17 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
eligible_positionsstringnullable—CEvery position the operator lets this listing fill, /-joined in the operator's order (e.g. OF/2B/3B, PG/SG). A lineup may seat the player in any slot that accepts one of them. A showdown listing (CPT, MVP, STAR, PRO) holds its own seat. Null when no operator answer we hold gives the list.
ValuesCPGCPTSGMVPPROSTARSFSG/SFPFSF/PFPG/SGPF/CPF/SFSF/SGSG/PGPG/SFC/PFPG/PF
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 scoring rule of the slate's setting with home/away point totals, per-category point columns, and headline raw stats per side. Per-side category detail lives on team_stats. NFL and NBA. The fields marked "NBA only" are null on NFL rows; every NFL-only field is null on NBA rows.

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—105.7600—
away_passing_ydsintegernullable—194—
away_ptsintegernullable—17—
away_rushing_ydsintegernullable—106—
away_total_ydsintegernullable—396—
away_turnoversintegernullable—1—
home_fptsdecimalnullable—76.9800—
home_passing_ydsintegernullable—275—
home_ptsintegernullable—17—
home_rushing_ydsintegernullable—96—
home_total_ydsintegernullable—367—
home_turnoversintegernullable—1—
player_countintegernullable—78—
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—4.0000—
total_field_goal_fptsdecimalnullable—6.0000—
total_field_goal_missed_fptsdecimalnullable—0.0000—
total_fptsdecimalnullable—180.5600—
total_fumble_lost_fptsdecimalnullable—-2.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 scoring rule of the slate's setting — total points, the per-category point columns, and the raw stats behind them. NFL and NBA. The fields marked "NBA only" are null on NFL rows; every NFL-only field is null on NBA rows.

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—0Numeric — 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 scoring rule of the slate's setting — total points, per-category point columns, player count, and the team's raw box-score line. NFL and NBA. An NFL team total includes its DST. The fields marked "NBA only" are null on NFL rows; every NFL-only field is null on NBA rows.

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—2.0000—
extra_pts_madeintegernullable—2—
fantasy_ptsdecimalnullable—89.3000—
field_goal_fptsdecimalnullable—3.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—39—
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.
ValuesCompletedCancelled
contest_typeinteger—0Contest structure code (0 = Tournament / GPP, 1 = Cash game / 50-50 / Double-up / head-to-head, 2 = League: a small public operator contest, e.g. a FanDuel 3-player league).
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—2026-10-02T03:09:20.810ZLast 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—1Number 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.contests14086FK to the contest. Also the row id.
cash_linedecimal—0.0085paid_places / max_entries.
cash_totalinteger—0Total 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—2.0000min_cash / entry_fee. 2.0 on a double-up.
paid_placesinteger—1max(max_position) — the number of paying positions.
ticket_totalinteger—0Total ticket face value in cents.
tier_countinteger—1Number of tiers in the ladder.
top_prizeinteger—2500First place prize in cents (e.g. 2000000 = $20,000.00).
top_prize_sharedecimal—1.0000top_prize / (cash_total + ticket_total).