NBA

29 tables

Every NBA game across the 82-game regular season, the In-Season Tournament, the play-in round, and the four-round playoffs through the Finals — with the players, coaching staffs, depth charts, injuries, betting markets, and possession-level play-by-play behind them.

Machine-readable spec: /api/openapi/public.json (OpenAPI 3.1)

Main· 4 tables

seasonsnba.seasons
Each NBA league year, running from October through June — the 82-game regular season, the play-in tournament, and the four-round playoffs that end with the NBA Finals.
Fields8
FieldTypeReferencesDescription
idkeybigintPrimary Key
short_idstring
Values:2020-212021-222022-232023-242024-252025-262027
descriptionstringnullable
Values:2020-21 NBA Season (72 …2021-22 NBA Season2022-23 NBA Season2023-24 NBA Season2024-25 NBA Season2025-26 NBA Season
end_datetimestamptznullable
e.g. 2021-07-20T00:00:00.000Z
post_season_start_datetimestamptznullable
e.g. 2021-05-22T00:00:00.000Z
regular_season_start_datetimestamptznullable
e.g. 2020-12-22T00:00:00.000Z
start_datetimestamptz
e.g. 2020-12-22T00:00:00.000Z
start_yearinteger
e.g. 2020
GET/api/v1/nba/seasons
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/seasons?limit=3'
Responses
200seasons rows matching the declared filter set, wrapped in { seasons, 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/nba/seasons/{id}
Parameters
idpathbigintrequired
Primary key (id) of the season row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/seasons/{pk_value}'
Responses
200Single season row.application/jsonshow example ▸
404Row not found.
teamsnba.teams
The 30 NBA franchises, organized into the Eastern and Western Conferences with three divisions in each.
Fields10
FieldTypeReferencesDescription
idkeybigintPrimary Key
league_team_idintegernullableOfficial NBA team ID from stats.nba.com
e.g. 1610612738
stadium_idbigintnullable
e.g. — (all-null in sample)
abbreviationstring
e.g. BOS
activeboolean
e.g. true
citystring
e.g. Los Angeles
conferencestring
Values:EasternWestern
divisionstring
Values:AtlanticCentralSoutheastNorthwestPacificSouthwest
full_namestring
e.g. Boston Celtics
namestring
e.g. Celtics
GET/api/v1/nba/teams
Parameters
activequerybooleanoptional
Filter by active status (defaults to true to show only currently-active rows; pass active=false to include inactive).
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/teams?limit=3'
Responses
200teams rows matching the declared filter set, wrapped in { teams, 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/nba/teams/{id}
Parameters
idpathbigintrequired
Primary key (id) of the team row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/teams/{pk_value}'
Responses
200Single team row.application/jsonshow example ▸
404Row not found.
gamesnba.games
Every scheduled and played NBA game from the 2020-21 season onward — preseason, the 82-game regular season, the In-Season Tournament, the play-in round, and the four-round playoffs through the NBA Finals. All-Star exhibitions are not included.
Fields28
FieldTypeReferencesDescription
idkeybigintPrimary Key
away_team_idbigint
e.g. 1
home_team_idbigint
e.g. 1
league_game_idstringnullableOfficial NBA game ID from stats.nba.com
e.g. 0022500650
season_idbigint
e.g. 2023
stadium_idintegernullable
e.g. 19
attendanceintegernullable
e.g. 19156
away_rotation_numberintegernullable
e.g. — (all-null in sample)
away_teamstring
e.g. BOS
away_team_scoreinteger
e.g. 113
channelstringnullable
e.g. NBA TV
dayinteger
e.g. 20250413
end_timetimestamptznullable
e.g. 2022-11-07T07:12:00.000Z
game_labelstringnullable
e.g. — (all-null in sample)
game_sub_labelstringnullable
e.g. — (all-null in sample)
game_timetimestamptz
e.g. 2025-04-13T19:30:00.000Z
home_rotation_numberintegernullable
e.g. — (all-null in sample)
home_teamstring
e.g. BOS
home_team_scoreinteger
e.g. 112
if_necessarybooleannullable
e.g. — (all-null in sample)
neutral_venueboolean
e.g. false
postponed_statusstringnullable
e.g. — (all-null in sample)
season_typestring
Values:Regular SeasonPlayoffsPreseasonPlay-InIn-Season Tournament
series_game_numberstringnullable
e.g. — (all-null in sample)
series_namestringnullable
e.g. — (all-null in sample)
series_textstringnullable
e.g. — (all-null in sample)
start_timetimestamptz
e.g. 2025-04-13T19:30:00.000Z
statusstring
e.g. Final
GET/api/v1/nba/games
Requires one of: season_id — requests satisfying none of these return 400.
Parameters
season_idquerybigintoptional
Filter to a season. Defaults to the current season.
home_team_idquerybigintoptional
Filter by home team.
away_team_idquerybigintoptional
Filter by away team.
statusquerystringoptional
Filter by game status. Values: Final, Scheduled.
dayqueryintegeroptional
Filter by calendar day (YYYYMMDD integer, US Eastern) — e.g. day=20260609 for tonight's slate. Note season_id defaults to the current season; pass season_id explicitly when querying a past season's day. Range syntax: day__gte=, day__lte=, day__between=.
season_typequerystringoptional
Filter by season type (Regular Season, Preseason, Playoffs, Play-In, In-Season Tournament). Values: In-Season Tournament, Play-In, Playoffs, Preseason, Regular Season.
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/games?season_id=2027'
Responses
200games rows matching the declared filter set, wrapped in { 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/nba/games/{id}
Parameters
idpathbigintrequired
Primary key (id) of the game row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/games/{pk_value}'
Responses
200Single game row.application/jsonshow example ▸
404Row not found.
playersnba.players
Every individual who has played in the NBA — current rosters, two-way and 10-day contracts, G-League call-ups, free agents, and retired veterans. NBA `players` has no boolean `active` column; the roster signal lives in `status` / `roster_status` (text) and `team_id` (null for free agents and retired players). Pass `?team_id=` to scope to one franchise's current roster, or omit it to scan the full historical roster pool.
Fields41
FieldTypeReferencesDescription
idkeybigintPrimary Key
league_player_idintegerOfficial NBA player ID from stats.nba.com. Stable across seasons; use for cross-API joins to nba_stats sources.
e.g. 203999
team_idbigintnullableFK to nba.teams. Null for free agents and retired players.
e.g. 12
birth_citystringnullableCity of birth.
e.g. Sombor
birth_countrystringnullableCountry of birth (ISO English name).
e.g. Serbia
birth_datedatenullableBirth date in YYYY-MM-DD form.
e.g. 1995-02-19
birth_statestringnullableState / province of birth (US/Canadian players).
e.g.
display_fi_laststringnullableDisplay name in "F. Last" form.
e.g. N. Jokić
display_last_comma_firststringnullableDisplay name in "Last, First" form. Useful for sorted lists.
e.g. Jokić, Nikola
dleague_flagstringnullableTwo-character bit-string from stats.nba.com: "00" no G-League history, "01" G-League experience, "11" currently G-League-affiliated (two-way / assignment).
e.g. 00
draft_numberstringnullableOverall pick number within the draft (string). Empty for undrafted.
e.g. 41
draft_roundstringnullableDraft round (string). Empty for undrafted players.
e.g. 2
draft_yearstringnullableYear the player was drafted (string form). Empty for undrafted players.
e.g. 2014
experienceintegernullableYears of NBA experience as of the most recent season. Rookies = 0.
e.g. 10
first_namestringPlayer's legal first name as registered with the league.
e.g. Nikola
from_yearstringnullablePlayer's NBA debut year as a string (per stats.nba.com).
e.g. 2015
full_namestringConvenience concatenation of first_name + last_name. Use this for display.
e.g. Nikola Jokić
full_position_liststringnullableHyphenated full-word position list (e.g., "Guard-Forward", "Center-Forward").
Values:GuardForwardCenterGuard-ForwardForward-CenterCenter-ForwardForward-Guard
games_played_flagstringnullableString "Y"/"N" indicating whether the player has played at least one regular-season game.
Values:YN
heightintegernullableHeight in inches.
e.g. 83
injury_body_partstringnullableAffected body part for the most recent injury (e.g., "Knee", "Ankle"). Null when injury_status is null.
Values:anklekneeillnesshiptoebackwristfootcalfhamstringpelvisabdomenheelrestachillesthumbhand
injury_detailstringnullableFree-text injury description from the source feed.
e.g.
injury_sincetimestamptznullableTimestamp of the injury status snapshot. Updated when player_news produces a new injury entry.
e.g. 2026-04-12T18:30:00Z
injury_statusstringnullableCurrent injury status snapshot derived from player_news. Values: "OUT", "QUESTIONABLE"; null = no active injury designation (healthy).
Values:OUTQUESTIONABLE
jerseystringnullableCurrent jersey number as a string (some leagues allow leading zeros, e.g., "00").
e.g. 15
last_affiliationstringnullableMost recent pre-NBA affiliation (school, league, or team).
e.g. Mega Basket / Serbia
last_namestringPlayer's legal last name.
e.g. Jokić
league_slugstringnullableNBA-issued URL slug (e.g., for stats.nba.com player page).
e.g. nikola-jokic
nba_flagstringnullableString "Y"/"N" indicating NBA experience. Almost always "Y" in this table.
e.g. Y
playercodestringnullableNBA-issued player code (lastname_firstname format).
e.g. jokic_nikola
position_categorystringnullableCoarse positional grouping. One of Guard, Forward, Center, Utility.
Values:GuardForwardCenterUtility
primary_positionstringPrimary position. One of G, F, C, G-F, F-C. (True PG/SG/SF/PF splits live in team_depth_charts.position.)
Values:GFCG-FF-CUnknown
roster_statusstringnullableRoster flag from stats.nba.com: "1" on an active NBA roster, "0" not. (Contract type — two-way / 10-day — is not exposed; dleague_flag is the closest signal.)
e.g. 1
schoolstringnullableLast school attended before the NBA (college, prep, or international club).
e.g. Mega Basket
statusstringnullableRoster status. One of "Active", "Inactive"; null for a few legacy rows.
Values:InactiveActive
team_abbreviationstringnullableCurrent team's tri-letter code.
e.g. DEN
team_citystringnullableCurrent team's city name.
e.g. Denver
team_codestringnullableCurrent team's lowercase URL slug.
e.g. nuggets
team_namestringnullableCurrent team's mascot name (denormalized from teams.name for read convenience).
e.g. Nuggets
to_yearstringnullablePlayer's most recent NBA season year. Equal to from_year for rookies.
e.g. 2025
weightintegernullableListed weight in pounds.
e.g. 284
GET/api/v1/nba/players
Requires one of: status — requests satisfying none of these return 400.
Parameters
team_idquerybigintoptional
Filter to players whose current team_id matches. Null team_id rows (free agents, retired) are excluded when this filter is applied.
statusquerystringoptional
Filter by roster status. Defaults to Active (current players); pass status=Inactive to include retired/inactive players, or any other status value. Values: Active, Inactive.
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/players?status=example'
Responses
200players rows matching the declared filter set, wrapped in { 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/nba/players/{id}
Parameters
idpathbigintrequired
Primary key (id) of the player row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/players/{pk_value}'
Responses
200Single player row.application/jsonshow example ▸
404Row not found.

Plays· 2 tables

game_possessionsnba.game_possessions
Each offensive possession in an NBA game (regular season, play-in, IST, and playoffs — no preseason) — which team had the ball, how the possession started, how it ended (made shot, missed shot, turnover, foul), and how long it lasted.
Fields29
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
e.g. 2357
team_idbigintnullable
e.g. 19
astinteger
e.g. 0
away_scoreinteger
e.g. 38
blkinteger
e.g. 0
cum_away_possinteger
e.g. 13
cum_home_possinteger
e.g. 75
drebinteger
e.g. 0
end_clockintegernullable
e.g. 0
end_nba_event_numinteger
e.g. 7
fg3ainteger
e.g. 0
fg3minteger
e.g. 0
fgainteger
e.g. 1
fgminteger
e.g. 0
ftainteger
e.g. 0
ftminteger
e.g. 0
game_seconds_elapsedinteger
e.g. 720
home_scoreinteger
e.g. 82
orebinteger
e.g. 0
periodinteger
e.g. 1
pfinteger
e.g. 0
ptsinteger
e.g. 0
start_clockinteger
e.g. 720
start_nba_event_numinteger
e.g. 4
stlinteger
e.g. 0
time_actual_endtimestamptznullable
e.g. 2024-10-30T02:08:06.000Z
time_actual_starttimestamptznullable
e.g. 2024-10-28T23:53:48.400Z
tovinteger
e.g. 0
GET/api/v1/nba/game_possessions
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
team_idquerybigintoptional
Filter by team in possession.
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_possessions?game_id=1'
Responses
200game_possessions rows matching the declared filter set, wrapped in { game_possessions, 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/nba/game_possessions/{id}
Parameters
idpathbigintrequired
Primary key (id) of the game_possession row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_possessions/{pk_value}'
Responses
200Single game_possession row.application/jsonshow example ▸
404Row not found.
play_by_playsnba.play_by_plays
Every individual event in every NBA game (regular season, play-in, IST, and playoffs — no preseason) — made and missed shots, rebounds, assists, fouls, turnovers, blocks, steals, substitutions, and timeouts, with the game clock at the moment. Period and score context live on game_possessions (FK game_possession_id).
Fields21
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
e.g. 2377
game_possession_idbigint
e.g. 16457458
play_idstring
e.g. 0052400111_2
player_idbigintnullable
e.g. 49
player2_idbigintnullable
e.g. 49
player2_team_idbigintnullable
e.g. 21
player3_idbigintnullable
e.g. 227
player3_team_idbigintnullable
e.g. 21
team_idbigintnullable
e.g. 21
end_clockintegernullable
e.g. — (all-null in sample)
event_seqinteger
e.g. 100
event_sub_typeinteger
e.g. 0
event_typeinteger
e.g. 8
home_descriptionstring
e.g.
nba_event_numinteger
e.g. 2
neutral_descriptionstring
e.g.
possession_seqinteger
e.g. 142
start_clockinteger
e.g. 720
time_actualtimestamptznullable
e.g. 2025-04-17T01:56:41.900Z
visitor_descriptionstring
e.g.
GET/api/v1/nba/play_by_plays
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
player_idquerybigintoptional
Filter to plays involving a specific player.
team_idquerybigintoptional
Filter to plays by a specific team.
event_typequeryintegeroptional
Filter by event type code: 1 made shot, 2 missed shot, 3 free throw, 4 rebound, 5 turnover, 6 foul, 7 violation, 8 substitution, 9 timeout, 10 jump ball, 11 ejection, 12 period start, 13 period end, 18 instant replay (stats.nba.com codes).
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/play_by_plays?game_id=1'
Responses
200play_by_plays rows matching the declared filter set, wrapped in { play_by_plays, 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/nba/play_by_plays/{id}
Parameters
idpathbigintrequired
Primary key (id) of the play_by_play row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/play_by_plays/{pk_value}'
Responses
200Single play_by_play row.application/jsonshow example ▸
404Row not found.

Stats· 7 tables

operator_team_lookupsnba.operator_team_lookups
How each sportsbook and fantasy operator names every NBA team — the mapping from each operator's team code to the unified franchise record.
Fields6
FieldTypeReferencesDescription
idkeybigintPrimary Key
operator_idbigintReference to main.operator entity
e.g. 1
operator_team_idstringExternal team ID from operator
e.g. 2003
team_idbigintInternal nba.teams.id reference
e.g. 11
abbreviationstringnullableTeam abbreviation for reconciliation
e.g. ATL
team_namestringnullableTeam name for reconciliation
e.g. Atlanta Hawks
GET/api/v1/nba/operator_team_lookups
Requires one of: operator_id — requests satisfying none of these return 400.
Parameters
operator_idquerybigintoptional
Filter by operator.
team_idquerybigintoptional
Filter by team.
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/operator_team_lookups?operator_id=1'
Responses
200operator_team_lookups rows matching the declared filter set, wrapped in { operator_team_lookups, 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/nba/operator_team_lookups/{id}
Parameters
idpathbigintrequired
Primary key (id) of the operator_team_lookup row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/operator_team_lookups/{pk_value}'
Responses
200Single operator_team_lookup row.application/jsonshow example ▸
404Row not found.
season_team_statsnba.season_team_stats
Season totals for each NBA team — wins and losses, points scored and allowed, pace, offensive and defensive ratings, rebounding margins, shooting splits, and turnover differentials. Regular-season games only; playoff, play-in, and preseason totals are not included.
Fields9
FieldTypeReferencesDescription
idkeybigintPrimary Key
season_idbigint
e.g. 2024
team_idbigint
e.g. 11
games_playedinteger
e.g. 82
lossesinteger
e.g. 32
pts_allowedinteger
e.g. 0
pts_scoredinteger
e.g. 9372
tiesinteger
e.g. 0
winsinteger
e.g. 48
GET/api/v1/nba/season_team_stats
Requires one of: season_id — requests satisfying none of these return 400.
Parameters
season_idquerybigintoptional
Filter to a single season. Defaults to the current season.
team_idquerybigintoptional
Filter by team.
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/season_team_stats?season_id=2027'
Responses
200season_team_stats rows matching the declared filter set, wrapped in { season_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
GET/api/v1/nba/season_team_stats/{id}
Parameters
idpathbigintrequired
Primary key (id) of the season_team_stat row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/season_team_stats/{pk_value}'
Responses
200Single season_team_stat row.application/jsonshow example ▸
404Row not found.
team_standingsnba.team_standings
Conference and division standings throughout the NBA season — wins, losses, win percentage, games behind, last-10 record, win/loss streak, and home/away splits as of each date.
Fields21
FieldTypeReferencesDescription
idkeybigintPrimary Key
season_idbigint
e.g. 2024
team_idbigint
e.g. 1
away_lossesinteger
e.g. 6
away_winsinteger
e.g. 1
conference_gbdecimalGames back from conference leader
e.g. 0.0000
conference_rankinteger1-15 within conference
e.g. 8
dayintegerYYYYMMDD — standings as of this date (before games on this day)
e.g. 20241103
division_rankinteger1-5 within division
e.g. 1
games_playedinteger
e.g. 1
games_remaininginteger
e.g. 81
home_lossesinteger
e.g. 4
home_winsinteger
e.g. 1
l10_lossesinteger
e.g. 4
l10_winsinteger
e.g. 6
lossesinteger
e.g. 1
playin_gbdecimalGames back from 10th seed (play-in cutoff)
e.g. 0.0000
playoff_gbdecimalGames back from 6th seed (auto-qualify cutoff)
e.g. 0.0000
streakintegerPositive = win streak, negative = loss streak
e.g. -1
win_pctdecimal
e.g. 0.5000
winsinteger
e.g. 2
GET/api/v1/nba/team_standings
Requires one of: season_id — requests satisfying none of these return 400.
Parameters
season_idquerybigintoptional
Filter to a single season. Defaults to the current season.
team_idquerybigintoptional
Filter by team.
dayqueryintegeroptional
Standings as of this day (YYYYMMDD integer). Omit for all daily snapshots, newest first; pass a day for a point-in-time table. Range syntax: day__gte=, day__lte=, day__between=.
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/team_standings?season_id=2027'
Responses
200team_standings rows matching the declared filter set, wrapped in { team_standings, 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/nba/team_standings/{id}
Parameters
idpathbigintrequired
Primary key (id) of the team_standing row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/team_standings/{pk_value}'
Responses
200Single team_standing row.application/jsonshow example ▸
404Row not found.
game_player_statsnba.game_player_stats
Each NBA player's stat line for each game — points, rebounds, assists, steals, blocks, shooting line, three-point line, free-throw line, plus-minus, and minutes played.
Fields116
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
e.g. 122
player_idbigint
e.g. 75
team_idbigint
e.g. 17
abnormal_exit_clockinteger
e.g. 0
abnormal_exit_periodinteger
e.g. 0
alley_oopsinteger
e.g. 0
and_onesinteger
e.g. 0
assist_percentagedecimalnullable
e.g. 0.0000
assist_ratiodecimalnullable
e.g. 0.0000
assist_to_turnoverdecimalnullable
e.g. 0.0000
assistsinteger
e.g. 0
avg_dribbles_per_touchdecimalnullable
e.g. 0.0000
avg_seconds_per_touchdecimalnullable
e.g. 0.0000
backcourt_violationsinteger
e.g. 0
balls_stolenintegernullable
e.g. 0
basket_interference_violationsinteger
e.g. 0
blocksinteger
e.g. 0
box_outsintegernullable
e.g. 0
carrying_palming_violationsinteger
e.g. 0
challenges_requestedinteger
e.g. 0
charges_takenintegernullable
e.g. 0
clear_path_foulsinteger
e.g. 0
commentstringnullable
e.g. — (all-null in sample)
competitive_minutesdecimal
e.g. 0.0
contestsintegernullable
e.g. 1
defensive_ratingdecimalnullable
e.g. 100.0000
defensive_rebound_percentagedecimalnullable
e.g. 0.0000
defensive_reboundsinteger
e.g. 1
deflectionsintegernullable
e.g. 1
double_doublesinteger
e.g. 0
double_dribble_violationsinteger
e.g. 0
drivesintegernullable
e.g. 0
dunksinteger
e.g. 0
effective_field_goal_percentagedecimalnullable
e.g. 0.0000
ejectionsinteger
e.g. 0
elbow_touchesintegernullable
e.g. 0
estimated_defensive_ratingdecimalnullable
e.g. 100.0000
estimated_net_ratingdecimalnullable
e.g. 0.0000
estimated_offensive_ratingdecimalnullable
e.g. 100.0000
estimated_pacedecimalnullable
e.g. 84.7100
estimated_usage_percentagedecimalnullable
e.g. 0.1670
fast_break_ptsinteger
e.g. 0
field_goal_percentagedecimalnullable
e.g. 0.0000
field_goals_attemptedinteger
e.g. 5
field_goals_madeinteger
e.g. 1
flagrant_fouls_type_1integer
e.g. 0
flagrant_fouls_type_2integer
e.g. 0
foul_trouble_severityinteger
e.g. 0
foulsinteger
e.g. 1
fouls_drawninteger
e.g. 0
free_throw_percentagedecimalnullable
e.g. 0.0000
free_throws_attemptedinteger
e.g. 0
free_throws_madeinteger
e.g. 0
front_court_touchesintegernullable
e.g. 14
game_dateinteger
e.g. 20251112
garbage_time_minutesdecimal
e.g. 0
goaltending_violationsinteger
e.g. 0
hockey_assistsintegernullable
e.g. 0
jump_balls_lostinteger
e.g. 0
jump_balls_woninteger
e.g. 0
lane_violationsinteger
e.g. 0
layupsinteger
e.g. 0
loose_balls_recoveredintegernullable
e.g. 0
minutesdecimal
e.g. 31.7000
minutes_deviation_pctdecimal
e.g. 0
net_ratingdecimalnullable
e.g. 0.0000
offensive_foulsinteger
e.g. 0
offensive_ratingdecimalnullable
e.g. 100.0000
offensive_rebound_percentagedecimalnullable
e.g. 0.0000
offensive_reboundsinteger
e.g. 0
paint_touchesintegernullable
e.g. 0
pass_percentagedecimalnullable
e.g. 0.0000
passesintegernullable
e.g. 18
passes_deflectedintegernullable
e.g. 0
personal_foulsinteger
e.g. 1
player_impact_estimatedecimal
e.g. 0.0000
plus_minusinteger
e.g. 0
possessionsinteger
e.g. 53
post_touchesintegernullable
e.g. 0
potential_assistsintegernullable
e.g. 0
ptsinteger
e.g. 0
pts_per_elbow_touchdecimalnullable
e.g. — (all-null in sample)
pts_per_paint_touchdecimalnullable
e.g. — (all-null in sample)
pts_per_post_touchdecimalnullable
e.g. — (all-null in sample)
pts_per_touchdecimalnullable
e.g. 0.0000
put_backsinteger
e.g. 0
rebound_percentagedecimalnullable
e.g. 0.0000
reboundsinteger
e.g. 2
role_anomalous_gameboolean
Values:falsetrue
role_archetypestringnullable
Values:deep_benchco_starcore_starterrotationend_of_benchalphasixth_mantwo_way
role_archetype_confidencedecimal
e.g. 0.6
rotation_contextstringnullable
Values:normalgarbage_time_boostambiguous_anomalyblowout_restfoul_troublefoul_outinjury_exitdnp_coach
rotation_context_confidencedecimal
e.g. 0.5
screen_assistsintegernullable
e.g. 0
second_chance_ptsinteger
e.g. 0
shot_clock_violationsinteger
e.g. 0
shot_contested_countintegernullable
e.g. 1
shots_blockedintegernullable
e.g. 0
start_positionstringnullable
Values:GFC
stealsinteger
e.g. 0
substitutions_ininteger
e.g. 0
substitutions_outinteger
e.g. 0
technical_foulsinteger
e.g. 0
three_point_percentagedecimalnullable
e.g. 0.0000
three_pointers_attemptedinteger
e.g. 0
three_pointers_madeinteger
e.g. 0
time_of_possessiondecimalnullable
e.g. 0.2000
timeouts_calledinteger
e.g. 0
touchesintegernullable
e.g. 28
traveling_violationsinteger
e.g. 0
triple_doublesinteger
e.g. 0
true_shooting_percentagedecimalnullable
e.g. 0.0000
turnover_ratiodecimalnullable
e.g. 0.0000
turnoversinteger
e.g. 0
usage_percentagedecimalnullable
e.g. 0.0000
GET/api/v1/nba/game_player_stats
Requires one of: game_id or player_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
player_idquerybigintoptional
Filter to a single player — their full game log, newest first. Combine with game_date ranges to window it.
team_idquerybigintoptional
Filter by team.
game_datequeryintegeroptional
Filter by game day (YYYYMMDD integer, US Eastern). Range syntax: game_date__gte=, game_date__lte=, game_date__between=.
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_player_stats?game_id=1'
Responses
200game_player_stats rows matching the declared filter set, wrapped in { game_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
GET/api/v1/nba/game_player_stats/{id}
Parameters
idpathbigintrequired
Primary key (id) of the game_player_stat row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_player_stats/{pk_value}'
Responses
200Single game_player_stat row.application/jsonshow example ▸
404Row not found.
game_team_statsnba.game_team_stats
Each NBA team's stat line for each game — the same offensive, defensive, rebounding, and shooting counters as the season aggregate, broken out per game with home/away context.
Fields70
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
e.g. 6
team_idbigint
e.g. 12
assist_percentagedecimal
e.g. 0.6670
assist_ratiodecimal
e.g. 0.0000
assistsinteger
e.g. 24
assists_to_turnoversdecimal
e.g. 2.0000
bench_ptsinteger
e.g. 34
blocksinteger
e.g. 4
conference_rankintegerConference rank entering game
e.g. 0
defensive_ratingdecimal
e.g. 100.0000
defensive_rebound_percentagedecimal
e.g. 0.6670
defensive_reboundsinteger
e.g. 32
effective_field_goal_percentagedecimal
e.g. 0.5000
estimated_defensive_ratingdecimal
e.g. 0.0000
estimated_net_ratingdecimal
e.g. 0.0000
estimated_offensive_ratingdecimal
e.g. 0.0000
estimated_pacedecimal
e.g. 0.0000
fast_break_ptsinteger
e.g. 11
field_goal_percentagedecimal
e.g. 0.5000
field_goals_attemptedinteger
e.g. 88
field_goals_madeinteger
e.g. 42
foulsinteger
e.g. 19
free_throw_attempt_ratedecimal
e.g. 0.2500
free_throw_percentagedecimal
e.g. 0.7500
free_throws_attemptedinteger
e.g. 21
free_throws_madeinteger
e.g. 17
lossinteger
e.g. 0
lossesintegerCumulative losses
e.g. 0
minutesinteger
e.g. 48
net_ratingdecimal
e.g. 2.0000
offensive_ratingdecimal
e.g. 100.0000
offensive_rebound_percentagedecimal
e.g. 0.3330
offensive_reboundsinteger
e.g. 10
pacedecimal
e.g. 101.0000
pace_per40decimal
e.g. 0.0000
pct_ast_2pmdecimal
e.g. 0.5000
pct_ast_3pmdecimal
e.g. 1.0000
pct_ast_fgmdecimal
e.g. 0.6670
pct_fga_2ptdecimal
e.g. 0.0000
pct_fga_3ptdecimal
e.g. 0.0000
pct_pts_2ptdecimal
e.g. 0.5000
pct_pts_2pt_mrdecimal
e.g. 0.0000
pct_pts_3ptdecimal
e.g. 0.0000
pct_pts_fbdecimal
e.g. 0.0000
pct_pts_ftdecimal
e.g. 0.0000
pct_pts_off_tovdecimal
e.g. 0.0000
pct_pts_paintdecimal
e.g. 0.0000
pct_uast_2pmdecimal
e.g. 0.5000
pct_uast_3pmdecimal
e.g. 0.0000
pct_uast_fgmdecimal
e.g. 0.3330
player_impact_estimatedecimal
e.g. 0.0000
possessionsinteger
e.g. 101
ptsinteger
e.g. 113
pts_in_paintinteger
e.g. 50
pts_off_turnoversinteger
e.g. 17
rebound_percentagedecimal
e.g. 0.5000
reboundsinteger
e.g. 42
second_chance_ptsinteger
e.g. 14
stealsinteger
e.g. 7
steals_to_turnoversdecimal
e.g. 0.5000
three_point_percentagedecimal
e.g. 0.3330
three_pointers_attemptedinteger
e.g. 34
three_pointers_madeinteger
e.g. 12
timeouts_remaininginteger
e.g. 0
true_shooting_percentagedecimal
e.g. 0.5760
turnover_percentagedecimal
e.g. 0.0000
turnoversinteger
e.g. 13
wininteger
e.g. 0
winsintegerCumulative wins
e.g. 0
GET/api/v1/nba/game_team_stats
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
team_idquerybigintoptional
Filter by team.
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_team_stats?game_id=1'
Responses
200game_team_stats rows matching the declared filter set, wrapped in { game_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
GET/api/v1/nba/game_team_stats/{id}
Parameters
idpathbigintrequired
Primary key (id) of the game_team_stat row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_team_stats/{pk_value}'
Responses
200Single game_team_stat row.application/jsonshow example ▸
404Row not found.
operator_player_lookupsnba.operator_player_lookups
How each sportsbook and fantasy operator names every NBA player — the mapping from each operator's player identifier to a unified player record.
Fields6
FieldTypeReferencesDescription
idkeybigintPrimary Key
operator_idbigintOperator id: 1 DraftKings, 2 FanDuel, 3 Yahoo, 13 sportsdata.io, 83 stats.nba.com.
e.g. 83
operator_player_idstringExternal player ID from operator
e.g. 76001
player_idbigintInternal nba.players.id reference
e.g. 521
player_namestringnullablePlayer name for reconciliation
e.g. George Johnson
positionstringnullablePosition for reconciliation
Values:GFCG-FF-CUnknown
GET/api/v1/nba/operator_player_lookups
Requires one of: operator_id — requests satisfying none of these return 400.
Parameters
operator_idquerybigintoptional
Filter by operator id: 1 DraftKings, 2 FanDuel, 3 Yahoo, 13 sportsdata.io, 83 stats.nba.com.
player_idquerybigintoptional
Filter to a single 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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/operator_player_lookups?operator_id=1'
Responses
200operator_player_lookups rows matching the declared filter set, wrapped in { operator_player_lookups, 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/nba/operator_player_lookups/{id}
Parameters
idpathbigintrequired
Primary key (id) of the operator_player_lookup row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/operator_player_lookups/{pk_value}'
Responses
200Single operator_player_lookup row.application/jsonshow example ▸
404Row not found.
season_player_statsnba.season_player_stats
Season totals for each NBA player — scoring, rebounding, assists, steals, blocks, shooting splits, advanced metrics, plus-minus, and minutes played. Regular-season games only; playoff, play-in, and preseason totals are not included. Players traded mid-season have one merged row (no per-team split).
Fields49
FieldTypeReferencesDescription
idkeybigintPrimary Key
player_idbigint
e.g. 1
season_idbigint
e.g. 2021
assist_percentagedecimal
e.g. 0.0000
assist_ratiodecimal
e.g. 0.0000
assist_to_turnoverdecimal
e.g. 0.0000
assistsinteger
e.g. 0
avg_dribbles_per_touchdecimal
e.g. 0.0000
avg_seconds_per_touchdecimal
e.g. 0.0000
blocksinteger
e.g. 0
defensive_ratingdecimal
e.g. 100.0000
defensive_rebound_percentagedecimal
e.g. 0.0000
defensive_reboundsinteger
e.g. 2
double_doublesinteger
e.g. 0
effective_field_goal_percentagedecimal
e.g. 0.5000
field_goal_percentagedecimal
e.g. 0.5000
field_goals_attemptedinteger
e.g. 6
field_goals_madeinteger
e.g. 1
foulsinteger
e.g. 0
free_throw_percentagedecimal
e.g. 0.0000
free_throws_attemptedinteger
e.g. 0
free_throws_madeinteger
e.g. 0
front_court_touchesinteger
e.g. 0
games_playedinteger
e.g. 1
lossesinteger
e.g. 0
minutesdecimal
e.g. 5.3000
net_ratingdecimal
e.g. 2.7000
offensive_ratingdecimal
e.g. 112.5000
offensive_rebound_percentagedecimal
e.g. 0.0000
offensive_reboundsinteger
e.g. 0
pacedecimal
e.g. 100.0000
player_impact_estimatedecimal
e.g. 0.0670
plus_minusinteger
e.g. 5
possessionsinteger
e.g. 43
ptsinteger
e.g. 0
rebound_percentagedecimal
e.g. 0.0000
reboundsinteger
e.g. 2
stealsinteger
e.g. 0
three_point_percentagedecimal
e.g. 0.0000
three_pointers_attemptedinteger
e.g. 0
three_pointers_madeinteger
e.g. 0
time_of_possessiondecimal
e.g. 0.0000
touchesinteger
e.g. 0
triple_doublesinteger
e.g. 0
true_shooting_percentagedecimal
e.g. 0.0000
turnover_percentagedecimal
e.g. 0.0000
turnoversinteger
e.g. 0
usage_percentagedecimal
e.g. 0.1670
winsinteger
e.g. 1
GET/api/v1/nba/season_player_stats
Requires one of: season_id or player_id — requests satisfying none of these return 400.
Parameters
season_idquerybigintoptional
Filter to a single season. Defaults to the current season.
player_idquerybigintoptional
Filter to a single 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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/season_player_stats?season_id=2027'
Responses
200season_player_stats rows matching the declared filter set, wrapped in { season_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
GET/api/v1/nba/season_player_stats/{id}
Parameters
idpathbigintrequired
Primary key (id) of the season_player_stat row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/season_player_stats/{pk_value}'
Responses
200Single season_player_stat row.application/jsonshow example ▸
404Row not found.

Odds· 3 tables

game_linesnba.game_lines
NBA game betting lines — point spreads, moneylines, and over/under totals from sportsbooks, captured over time as the lines move from opening to closing.
Fields30
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
e.g. 16082
operator_idbigintSportsbook id: 6 Consensus (full history); per-book ids (1 DraftKings, 2 FanDuel, 1683 Pinnacle, 1684 BetMGM, 1685 Caesars, 1686 BetRivers, 1687 ESPN BET) begin 2026-05.
e.g. 6
season_idbigintDenormalized for efficient season-level queries
e.g. 2021
captured_attimestamptzWhen this snapshot was captured
e.g. 2022-04-10T00:00:00.000Z
implied_away_scoredecimalnullable
e.g. 109.0000
implied_away_win_pctdecimalnullable
e.g. 0.4082
implied_home_scoredecimalnullableCalculated from spread + total
e.g. 109.7500
implied_home_win_pctdecimalnullableFrom moneyline, 0-1
e.g. 0.6296
is_openingbooleanTrue if this is the opening line
Values:falsetrue
moneyline_awayintegernullableAmerican odds for away team win
e.g. 145
moneyline_bet_pct_awayintegernullable
e.g. — (all-null in sample)
moneyline_bet_pct_homeintegernullable
e.g. — (all-null in sample)
moneyline_homeintegernullableAmerican odds for home team win
e.g. -170
moneyline_money_pct_awayintegernullable
e.g. — (all-null in sample)
moneyline_money_pct_homeintegernullable
e.g. — (all-null in sample)
over_oddsintegernullableAmerican odds for over
e.g. 0
spreaddecimalnullableHome team spread (e.g., -3.5 means home favored by 3.5)
e.g. -2.5000
spread_away_oddsintegernullableAmerican odds for away spread
e.g. -110
spread_bet_pct_awayintegernullable
e.g. — (all-null in sample)
spread_bet_pct_homeintegernullable
e.g. — (all-null in sample)
spread_home_oddsintegernullableAmerican odds for home spread (e.g., -110)
e.g. -110
spread_money_pct_awayintegernullable
e.g. — (all-null in sample)
spread_money_pct_homeintegernullable
e.g. — (all-null in sample)
totaldecimalnullableCombined score total line (e.g., 224.5)
e.g. 225.5000
total_bet_pct_overintegernullable
e.g. — (all-null in sample)
total_bet_pct_underintegernullable
e.g. — (all-null in sample)
total_money_pct_overintegernullable
e.g. — (all-null in sample)
total_money_pct_underintegernullable
e.g. — (all-null in sample)
under_oddsintegernullableAmerican odds for under
e.g. 0
GET/api/v1/nba/game_lines
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
season_idquerybigintoptional
Filter by season.
operator_idquerybigintoptional
Filter by sportsbook id: 6 Consensus (full history), 1 DraftKings, 2 FanDuel, 1683 Pinnacle, 1684 BetMGM, 1685 Caesars, 1686 BetRivers, 1687 ESPN BET (per-book rows begin 2026-05).
is_openingquerybooleanoptional
Filter to opening lines only. Reliable from the 2025-26 season; earlier seasons largely lack opener flags.
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_lines?game_id=1'
Responses
200game_lines rows matching the declared filter set, wrapped in { game_lines, 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/nba/game_lines/{id}
Parameters
idpathbigintrequired
Primary key (id) of the game_line row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_lines/{pk_value}'
Responses
200Single game_line row.application/jsonshow example ▸
404Row not found.
game_period_linesnba.game_period_lines
Period-specific NBA betting lines — first-half, second-half, and individual-quarter spreads, moneylines, and totals offered alongside the full-game markets.
Fields17
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
e.g. 769
operator_idbigintData source (consensus, DraftKings, FanDuel, etc.)
e.g. 6
season_idbigintDenormalized for efficient season-level queries
e.g. 2025
captured_attimestamptzWhen this snapshot was captured
e.g. 2024-01-05T05:00:00.000Z
implied_away_win_pctdecimalnullable
e.g. 0.5121951219512195
implied_home_win_pctdecimalnullableFrom moneyline, 0-1
e.g. 0.5121951219512195
is_openingbooleanTrue if this is the first captured line for this period
e.g. false
moneyline_awayintegernullableAmerican odds for away team win in this period
e.g. -105
moneyline_homeintegernullableAmerican odds for home team win in this period
e.g. -105
over_oddsintegernullableAmerican odds for over
e.g. -110
period_codestringMarket period code (1H, 2H, Q1, Q2, Q3, Q4)
Values:1HQ1Q3Q4Q22H
spreaddecimalnullableHome team spread for this period
e.g. -0.5
spread_away_oddsintegernullableAmerican odds for away spread
e.g. -110
spread_home_oddsintegernullableAmerican odds for home spread (e.g., -110)
e.g. -110
totaldecimalnullableCombined score total line for this period
e.g. 57.5
under_oddsintegernullableAmerican odds for under
e.g. -110
GET/api/v1/nba/game_period_lines
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
season_idquerybigintoptional
Filter by season.
operator_idquerybigintoptional
Filter by sportsbook.
period_codequerystringoptional
Filter by period (1H, 2H, Q1, Q2, Q3, Q4).
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_period_lines?game_id=1'
Responses
200game_period_lines rows matching the declared filter set, wrapped in { game_period_lines, 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/nba/game_period_lines/{id}
Parameters
idpathbigintrequired
Primary key (id) of the game_period_line row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_period_lines/{pk_value}'
Responses
200Single game_period_line row.application/jsonshow example ▸
404Row not found.
game_player_propsnba.game_player_props
NBA player prop bets for each game — points, rebounds, assists, threes made, steals, blocks, and other player-statistic markets offered by sportsbooks.
Fields18
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
e.g. 126
operator_idbigintUsually consensus
e.g. 6
player_idbigint
e.g. 157
season_idbigintDenormalized for efficient season-level queries
e.g. 2025
book_countintegerNumber of curated books contributing to this consensus value
e.g. 3
captured_attimestamptzWhen this snapshot was captured
e.g. 2025-10-22T04:00:00.000Z
categorystringCanonical category (points, rebounds, assists, pra, etc.)
Values:pointsreboundsthree_pointers_madepts_reboundsdouble_doubleassistspts_rebounds_assistsrebounds_assistspts_assiststriple_doubleblockssteals
is_openingbooleanTrue if this is the first captured line for this player/market
e.g. false
linedecimalnullableProp line for over/under markets (e.g., 24.5)
e.g. 1.5
market_keystringRaw market key from source API (e.g., player_points)
Values:player_pointsplayer_reboundsplayer_threesplayer_points_reboundsplayer_double_doubleplayer_assistsplayer_points_rebounds_…player_rebounds_assistsplayer_points_assistsplayer_triple_doubleplayer_blocksplayer_steals
no_oddsintegernullableAmerican odds for no
e.g. -10000
outcome_typestringou | yes_no
Values:ouyes_no
over_oddsintegernullableAmerican odds for over
e.g. -120
period_codestringnullableOptional period code (Q1, 1H)
e.g. — (all-null in sample)
subcategorystringnullableOptional subtype (alternate, boosted, etc.)
e.g. — (all-null in sample)
under_oddsintegernullableAmerican odds for under
e.g. -110
yes_oddsintegernullableAmerican odds for yes
e.g. 1100
GET/api/v1/nba/game_player_props
Requires one of: game_id or player_id + season_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
player_idquerybigintoptional
Filter to a single player. With season_id: the player's prop history across a season.
season_idquerybigintoptional
Filter by season.
operator_idquerybigintoptional
Filter by sportsbook. Historical rows are operator 6 (Consensus); per-book rows (1 DraftKings, 2 FanDuel, 1683 Pinnacle, 1684 BetMGM, 1685 Caesars, 1686 BetRivers, 1687 ESPN BET) begin 2026-05.
categoryquerystringoptional
Filter by prop category (points, rebounds, assists, pra, etc.). Values: assists, blocks, double_double, points, pts_assists, pts_rebounds, pts_rebounds_assists, rebounds, rebounds_assists, steals, steals_blocks, three_pointers_made, triple_double, turnovers.
market_keyquerystringoptional
Filter by raw market key (e.g., player_points). Values: player_assists, player_blocks, player_blocks_steals, player_double_double, player_points, player_points_assists, player_points_rebounds, player_points_rebounds_assists, player_rebounds, player_rebounds_assists, player_steals, player_threes, player_triple_double, player_turnovers.
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_player_props?game_id=1'
Responses
200game_player_props rows matching the declared filter set, wrapped in { game_player_props, 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/nba/game_player_props/{id}
Parameters
idpathbigintrequired
Primary key (id) of the game_player_prop row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_player_props/{pk_value}'
Responses
200Single game_player_prop row.application/jsonshow example ▸
404Row not found.

Lineups & Roster· 5 tables

coaching_staffsnba.coaching_staffs
NBA coaches and staff — head coaches, lead assistants, player-development coaches, and other basketball-operations staff who appear on team benches.
Fields5
FieldTypeReferencesDescription
idkeybigintPrimary Key
coach_idintegerOfficial NBA coach/staff ID from stats.nba.com
e.g. 57
first_namestring
e.g. Mike
last_namestring
e.g. Jones
namestring
e.g. Stacey Augmon
GET/api/v1/nba/coaching_staffs
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/coaching_staffs?limit=3'
Responses
200coaching_staffs rows matching the declared filter set, wrapped in { coaching_staffs, 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/nba/coaching_staffs/{id}
Parameters
idpathbigintrequired
Primary key (id) of the coaching_staff row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/coaching_staffs/{pk_value}'
Responses
200Single coaching_staff row.application/jsonshow example ▸
404Row not found.
team_coaching_staffsnba.team_coaching_staffs
The coaching staff each NBA team carries through the season — head coach, assistants, trainers — with the dates each staff member started and ended their tenure.
Fields9
FieldTypeReferencesDescription
idkeybigintPrimary Key
coaching_staff_idbigint
e.g. 346
season_idbigintFirst season of this tenure
e.g. 2025
team_idbigint
e.g. 8
coach_typestringHead Coach, Assistant Coach, Trainer
Values:Assistant CoachHead CoachTrainerAssistant Coach for Pla…Associate Head CoachAssistant TrainerStrength and Conditioni…Lead Assistant CoachDirector of Athletic De…Interim Head Coach
end_datedatenullableTenure end date. NULL = still active.
e.g. 2021-10-18T04:00:00.000Z
is_assistantboolean
Values:truefalse
sort_sequenceintegernullable
e.g. 4
start_datedateTenure start date (derived from season start)
e.g. 2025-10-21T04:00:00.000Z
GET/api/v1/nba/team_coaching_staffs
Requires one of: team_id — requests satisfying none of these return 400.
Parameters
team_idquerybigintoptional
Filter by team.
season_idquerybigintoptional
Filter to a season.
coach_typequerystringoptional
Filter by coach role (Head Coach, Assistant Coach, Trainer). Values: Assistant Coach, Assistant Coach for Player Development, Assistant Trainer, Associate Head Coach, Director of Athletic Development, Head Coach, Interim Head Coach, Lead Assistant Coach, Strength and Conditioning Coach, Trainer.
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/team_coaching_staffs?team_id=1'
Responses
200team_coaching_staffs rows matching the declared filter set, wrapped in { team_coaching_staffs, 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/nba/team_coaching_staffs/{id}
Parameters
idpathbigintrequired
Primary key (id) of the team_coaching_staff row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/team_coaching_staffs/{pk_value}'
Responses
200Single team_coaching_staff row.application/jsonshow example ▸
404Row not found.
game_team_lineup_stintsnba.game_team_lineup_stints
Each continuous stretch an NBA team had the same five players on the floor (regular season, play-in, IST, and playoffs — no preseason) — the five-man unit, when it started and ended, and the team's net production while it was in.
Fields25
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
e.g. 127
player1_idbigint
e.g. 53
player2_idbigint
e.g. 197
player3_idbigint
e.g. 187
player4_idbigint
e.g. 178
player5_idbigint
e.g. 258
team_idbigint
e.g. 12
assist_pctdecimal
e.g. 0.0000
defensive_ratingdecimal
e.g. 0.0000
defensive_rebound_pctdecimal
e.g. 1.0000
end_clockinteger
e.g. 0
end_event_seqinteger
e.g. 7200
net_ratingdecimal
e.g. 0.0000
offensive_ratingdecimal
e.g. 0.0000
offensive_rebound_pctdecimal
e.g. 0.0000
pacedecimal
e.g. 0.0000
periodinteger
e.g. 2
player_statsjsonb
e.g. [{"ast":0,"astShare":0,"blk":0,"corner3Rate":0,"dreb":0,"fg…
possessionsinteger
e.g. 2
pts_allowedinteger
e.g. 0
pts_scoredinteger
e.g. 0
start_clockinteger
e.g. 720
start_event_seqinteger
e.g. 100
turnover_pctdecimal
e.g. 0.0000
GET/api/v1/nba/game_team_lineup_stints
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
team_idquerybigintoptional
Filter by team.
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_team_lineup_stints?game_id=1'
Responses
200game_team_lineup_stints rows matching the declared filter set, wrapped in { game_team_lineup_stints, 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/nba/game_team_lineup_stints/{id}
Parameters
idpathbigintrequired
Primary key (id) of the game_team_lineup_stint row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_team_lineup_stints/{pk_value}'
Responses
200Single game_team_lineup_stint row.application/jsonshow example ▸
404Row not found.
game_team_rostersnba.game_team_rosters
The gameday roster for each NBA game — every player available that night, who started, who sat, and who was on a minutes restriction, with the pre-tip snapshot and the reconciled post-game truth side by side.
Fields15
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
e.g. 724
player_idbigint
e.g. 197
team_idbigint
e.g. 12
commentstringnullable
e.g. INACTIVE_GLEAGUE_TWOWAY
confirmedbooleannullableWhether the starter truth was established from post-game evidence
e.g. true
dayinteger
e.g. 20260207
injury_statusstringnullableReconciled final injury designation for the roster row
Values:OUTQUESTIONABLEPROBABLEDOUBTFUL
positionstringnullable
Values:GFCG-FF-C
pre_game_confirmedbooleannullablePre-tip lineup confidence from source (e.g. RotoWire confirmed vs expected)
e.g. true
pre_game_injury_statusstringnullablePre-tip injury designation: OUT, DOUBTFUL, QUESTIONABLE, PROBABLE
Values:OUTQUESTIONABLEPROBABLEDOUBTFUL
pre_game_starterbooleannullablePre-tip expected starter flag from lineup sources
Values:falsetrue
pre_game_statusintegernullablePre-tip roster availability: 1=Active, 2=Inactive, 3=Out
e.g. 1
starterbooleannullableWhether the player was in the starting five (reconciled post-game)
Values:falsetrue
statusintegernullableReconciled final roster availability: 1=Active, 2=Inactive, 3=Out
e.g. 1
GET/api/v1/nba/game_team_rosters
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
team_idquerybigintoptional
Filter by team.
player_idquerybigintoptional
Filter to a single 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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_team_rosters?game_id=1'
Responses
200game_team_rosters rows matching the declared filter set, wrapped in { game_team_rosters, 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/nba/game_team_rosters/{id}
Parameters
idpathbigintrequired
Primary key (id) of the game_team_roster row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_team_rosters/{pk_value}'
Responses
200Single game_team_roster row.application/jsonshow example ▸
404Row not found.
team_depth_chartsnba.team_depth_charts
Each NBA team's depth chart by position on each date — the starter, second-unit, and bench order at point guard, shooting guard, small forward, power forward, and center, with injury designations layered in.
Fields8
FieldTypeReferencesDescription
idkeybigintPrimary Key
player_idbigint
e.g. 337
season_idbigint
e.g. 2025
team_idbigint
e.g. 4
dayintegerYYYYMMDD snapshot day
e.g. 20260214
depth_rankinteger1-based rank within position (1 = starter)
e.g. 1
injury_statusstringnullableDay-To-Day, Out, etc. from ESPN
Values:OutDay-To-DaySuspension
positionstringPG, SG, SF, PF, C
Values:SFSGPFPGC
GET/api/v1/nba/team_depth_charts
Requires one of: team_id + season_id — requests satisfying none of these return 400.
Parameters
team_idquerybigintoptional
Filter by team.
season_idquerybigintoptional
Filter to a season. Defaults to the current season.
positionquerystringoptional
Filter by position (PG, SG, SF, PF, C). Values: C, PF, PG, SF, SG.
dayqueryintegeroptional
Snapshot day (YYYYMMDD integer). The table holds one snapshot per day; pass the latest day for the current depth chart. Range syntax: day__gte=, day__lte=, day__between=.
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/team_depth_charts?team_id=1&season_id=2027'
Responses
200team_depth_charts rows matching the declared filter set, wrapped in { team_depth_charts, 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/nba/team_depth_charts/{id}
Parameters
idpathbigintrequired
Primary key (id) of the team_depth_chart row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/team_depth_charts/{pk_value}'
Responses
200Single team_depth_chart row.application/jsonshow example ▸
404Row not found.

Misc· 8 tables

stadiumsnba.stadiums
NBA arenas — current home venues and historical buildings the league's teams have played in.
Fields19
FieldTypeReferencesDescription
idkeybigintPrimary Key
league_stadium_idintegernullableOfficial NBA arena ID from stats.nba.com
e.g. 643
addressstringnullable
e.g. — (all-null in sample)
capacityintegernullable
e.g. — (all-null in sample)
citystring
e.g. Miami
closed_datetimestamptznullable
e.g. — (all-null in sample)
countrystringnullable
Values:USCAGBFRMXDE
descriptionstringnullable
e.g. Home of the Toronto Raptors. Multi-purpose arena in downtow…
elevationfloatnullableElevation in feet above sea level
e.g. 198
image_urlstringnullableURL to aerial/overview image of arena
e.g. — (all-null in sample)
latitudefloatnullable
e.g. 25.7814
longitudefloatnullable
e.g. -80.187
namestring
e.g. Scotiabank Arena
opened_datetimestamptznullable
e.g. — (all-null in sample)
roof_typestringnullableArena roof type (all indoor)
e.g. — (all-null in sample)
statestringnullable
e.g. CA
surfacestringnullable
e.g. — (all-null in sample)
team_namestringnullable
e.g. — (all-null in sample)
timezonestringnullableIANA timezone (e.g., America/New_York)
Values:America/New_YorkAmerica/ChicagoAmerica/Los_AngelesAmerica/DenverAmerica/PhoenixAmerica/Mexico_CityAmerica/TorontoAmerica/Indiana/Indiana…Europe/LondonEurope/ParisEurope/Berlin
GET/api/v1/nba/stadiums
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/stadiums?limit=3'
Responses
200stadiums rows matching the declared filter set, wrapped in { stadiums, 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/nba/stadiums/{id}
Parameters
idpathbigintrequired
Primary key (id) of the stadium row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/stadiums/{pk_value}'
Responses
200Single stadium row.application/jsonshow example ▸
404Row not found.
refereesnba.referees
NBA officials — the three-person crew of referees who work each game.
Fields13
FieldTypeReferencesDescription
idkeybigintPrimary Key
nba_referee_idinteger
e.g. 202027
activeboolean
e.g. true
birth_citystringnullable
e.g. — (all-null in sample)
birth_countrystringnullable
e.g. — (all-null in sample)
birth_datedatenullable
e.g. — (all-null in sample)
birth_statestringnullable
e.g. — (all-null in sample)
collegestringnullable
e.g. — (all-null in sample)
experienceintegernullable
e.g. — (all-null in sample)
first_namestring
e.g. Biniam
full_namestring
e.g. Biniam Maru
jersey_numberstringnullable
e.g. 94
last_namestring
e.g. Maru
GET/api/v1/nba/referees
Parameters
activequerybooleanoptional
Filter by active status (defaults to true to show only currently-active rows; pass active=false to include inactive).
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/referees?limit=3'
Responses
200referees rows matching the declared filter set, wrapped in { referees, 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/nba/referees/{id}
Parameters
idpathbigintrequired
Primary key (id) of the referee row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/referees/{pk_value}'
Responses
200Single referee row.application/jsonshow example ▸
404Row not found.
broadcastersnba.broadcasters
Networks, regional sports networks, and streaming services that air NBA games — ESPN, TNT, ABC, NBA TV, plus team-local RSNs like YES, MSG, and Bally Sports.
Fields12
FieldTypeReferencesDescription
idkeybigintPrimary Key
broadcaster_idinteger
e.g. 0
broadcaster_team_idinteger
e.g. 0
region_idinteger
e.g. 0
broadcaster_abbreviationstring
e.g. BSIN
broadcaster_descriptionstringnullable
e.g. — (all-null in sample)
broadcaster_displaystring
e.g. BSIN
broadcaster_mediastring
e.g. tv
broadcaster_rankinginteger
e.g. 0
broadcaster_scopestring
Values:localnational
broadcaster_video_linkstringnullable
e.g. — (all-null in sample)
tape_delay_commentsstringnullable
e.g. — (all-null in sample)
GET/api/v1/nba/broadcasters
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/broadcasters?limit=3'
Responses
200broadcasters rows matching the declared filter set, wrapped in { broadcasters, 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/nba/broadcasters/{id}
Parameters
idpathbigintrequired
Primary key (id) of the broadcaster row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/broadcasters/{pk_value}'
Responses
200Single broadcaster row.application/jsonshow example ▸
404Row not found.
playoffsnba.playoffs
The NBA postseason bracket — the play-in tournament, the four conference series rounds, and the NBA Finals, tracked as best-of-seven matchups with seeds, wins, and outcomes.
Fields12
FieldTypeReferencesDescription
idkeybigintPrimary Key
away_team_idbigint
e.g. 13
home_team_idbigint
e.g. 1
season_idbigint
e.g. 2020
series_idbigint
e.g. 202001
away_team_winsinteger
e.g. 0
games_playedinteger
e.g. 1
home_team_winsinteger
e.g. 4
max_gamesinteger
e.g. 7
series_namestring
Values:East First RoundWest First RoundEast Play-InWest Play-InEast Conference Semifin…West Conference Semifin…West Conference FinalsEast Conference FinalsNBA Finals
series_textstring
e.g. MIA won 1-0
statusstring
Values:CompletedActive
GET/api/v1/nba/playoffs
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/playoffs?limit=3'
Responses
200playoffs rows matching the declared filter set, wrapped in { playoffs, 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/nba/playoffs/{id}
Parameters
idpathbigintrequired
Primary key (id) of the playoff row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/playoffs/{pk_value}'
Responses
200Single playoff row.application/jsonshow example ▸
404Row not found.
game_broadcastersnba.game_broadcasters
Which networks broadcast each NBA game — the national TV partner, home and away regional carriers, radio calls, and streaming providers.
Fields4
FieldTypeReferencesDescription
idkeybigintPrimary Key
broadcaster_idbigint
e.g. 10
game_idbigint
e.g. 15975
broadcaster_typestring
Values:awayTvhomeTvnationalTv
GET/api/v1/nba/game_broadcasters
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
broadcaster_idquerybigintoptional
Filter by broadcaster.
broadcaster_typequerystringoptional
Filter by broadcaster role. Values: awayTv, homeTv, nationalTv.
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_broadcasters?game_id=1'
Responses
200game_broadcasters rows matching the declared filter set, wrapped in { game_broadcasters, 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/nba/game_broadcasters/{id}
Parameters
idpathbigintrequired
Primary key (id) of the game_broadcaster row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_broadcasters/{pk_value}'
Responses
200Single game_broadcaster row.application/jsonshow example ▸
404Row not found.
game_refereesnba.game_referees
The officiating crew assigned to each NBA game — the three referees who worked the matchup.
Fields4
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
e.g. 4727
referee_idbigint
e.g. 58
positionstringnullable
Values:RefereeCrew ChiefUmpireALTERNATE
GET/api/v1/nba/game_referees
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
referee_idquerybigintoptional
Filter by referee.
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_referees?game_id=1'
Responses
200game_referees rows matching the declared filter set, wrapped in { game_referees, 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/nba/game_referees/{id}
Parameters
idpathbigintrequired
Primary key (id) of the game_referee row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/game_referees/{pk_value}'
Responses
200Single game_referee row.application/jsonshow example ▸
404Row not found.
player_newsnba.player_news
News about NBA players — trades, injuries, lineup decisions, suspensions, and general beat-reporter updates.
Fields16
FieldTypeReferencesDescription
idkeybigintPrimary Key
external_idstringnullable
e.g. rotoql-14973
player_idbigintnullable
e.g. 165
team_idbigintnullable
e.g. 16
ai_processedboolean
e.g. false
analysisstringnullable
e.g. Barton had to be helped back to the locker room during the …
authorstringnullable
e.g. — (all-null in sample)
categorystringnullableinjury, transaction, lineup, general
e.g. — (all-null in sample)
contentstringnullable
e.g. — (all-null in sample)
descriptionstringnullable
e.g. Murray was assigned Sunday to the D-League's Austin Spurs.
linkstringnullable
e.g. — (all-null in sample)
news_timetimestamptz
e.g. 2016-11-27T19:29:13.000Z
priorityinteger
e.g. 3
situational_impactjsonbnullable
e.g. — (all-null in sample)
sourcestringnullable
e.g. rotowire
titlestring
e.g. Assigned to D-League
GET/api/v1/nba/player_news
Requires one of: player_id or team_id — requests satisfying none of these return 400.
Parameters
player_idquerybigintoptional
Filter to news about a single player.
team_idquerybigintoptional
Filter by team — a team-level news feed, newest first.
categoryquerystringoptional
Filter by news category (injury, transaction, lineup, general). Values: general, injury, lineup, transaction.
news_timequerytimestamptzoptional
Filter by publication time (ISO 8601). Use news_time__gte to poll for items since your last check. Range syntax: news_time__gte=, news_time__lte=, news_time__between=.
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/player_news?player_id=1'
Responses
200player_news rows matching the declared filter set, wrapped in { player_news, 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/nba/player_news/{id}
Parameters
idpathbigintrequired
Primary key (id) of the player_new row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/player_news/{pk_value}'
Responses
200Single player_new row.application/jsonshow example ▸
404Row not found.
team_game_contextsnba.team_game_contexts
Situational context for each NBA team in each game — how much the game matters (playoff push, tanking, contender mode, In-Season Tournament stakes), what phase of the season it's in, and how far along the schedule the team is.
Fields20
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
e.g. 2374
opponent_team_idbigint
e.g. 9
season_idbigint
e.g. 2024
team_idbigint
e.g. 9
conference_rankinteger
e.g. 8
game_typestringregular, playoff, play_in, ist_group, ist_knockout, preseason, allstar
Values:regularplayoffist_group
games_remaininginteger
e.g. 0
intensityinteger1-10 motivation intensity scale
e.g. 5
is_back_to_backboolean
Values:falsetrue
is_clinchboolean
Values:falsetrue
is_eliminationboolean
Values:falsetrue
ist_group_rankintegernullable
e.g. — (all-null in sample)
ist_group_recordstringnullablee.g. 2-1
e.g. — (all-null in sample)
motivationstringcontender, playoff_lock, seeding_battle, playoff_push, play_in, fringe, tanking, eliminated, early_season, playoff_comfortable, playoff_competitive, playoff_desperate, playoff_elimination, playoff_clinch, ist_contending, ist_eliminated, ist_knockout
Values:play_infringeearly_seasonseeding_battlecontendertankingplayoff_lockplayoff_competitiveplayoff_comfortableplayoff_desperateplayoff_clinchplayoff_eliminationist_contending
rest_daysinteger
e.g. 1
season_pctdecimal0.0-1.0 how far through regular season
e.g. 1.0000
season_phasestringearly, mid, late, final_push, postseason
Values:midlateearlyfinal_pushpostseason
team_series_winsinteger
e.g. 0
win_pctdecimal
e.g. 0.5000
GET/api/v1/nba/team_game_contexts
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
team_idquerybigintoptional
Filter by team.
season_idquerybigintoptional
Filter by season.
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 \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/team_game_contexts?game_id=1'
Responses
200team_game_contexts rows matching the declared filter set, wrapped in { team_game_contexts, 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/nba/team_game_contexts/{id}
Parameters
idpathbigintrequired
Primary key (id) of the team_game_context row.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/nba/team_game_contexts/{pk_value}'
Responses
200Single team_game_context row.application/jsonshow example ▸
404Row not found.