MLB

38 tables

Every MLB game from spring training through the World Series — the 162-game regular season, the postseason bracket, plus the players, ballparks, umpires, weather, Statcast metrics, and pitch-by-pitch detail.

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

Main· 4 tables

seasonsmlb.seasons
Each MLB season — spring training, the 162-game regular season, the Wild Card Series, the Division Series, the League Championship Series, and the World Series.
Fields9
FieldTypeReferencesDescription
idkeybigintPrimary Key
league_idstringnullableOfficial MLB season identifier
short_idstring
descriptionstringnullable
end_datetimestamptznullable
post_season_start_datetimestamptznullable
regular_season_start_datetimestamptznullable
start_datetimestamptz
start_yearinteger
GET/api/v1/mlb/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/mlb/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/mlb/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/mlb/seasons/{pk_value}'
Responses
200Single season row.application/jsonshow example ▸
404Row not found.
teamsmlb.teams
The 30 MLB franchises, organized into the American and National Leagues with three divisions in each.
Fields11
FieldTypeReferencesDescription
idkeybigintPrimary Key
league_team_idintegernullableOfficial MLB team ID from statsapi.mlb.com
venue_idbigintnullable
abbreviationstring
activeboolean
citystring
divisionstring
full_namestring
leaguestring
logo_urlstringnullableURL to team logo image
namestring
GET/api/v1/mlb/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/mlb/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/mlb/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/mlb/teams/{pk_value}'
Responses
200Single team row.application/jsonshow example ▸
404Row not found.
gamesmlb.games
Every scheduled and played MLB game — spring training exhibitions, the 162-game regular season, the Wild Card Series, the Division and Championship Series, and the World Series.
Fields31
FieldTypeReferencesDescription
idkeybigintPrimary Key
away_team_idbigint
home_team_idbigint
league_game_idintegernullableOfficial MLB gamePk from statsapi.mlb.com
league_idstringnullableOfficial MLB game identifier
losing_pitcher_idbigintnullableLosing pitcher of record
save_pitcher_idbigintnullableSave pitcher (if any)
season_idbigint
venue_idbigintnullable
winning_pitcher_idbigintnullableWinning pitcher of record
attendanceintegernullable
away_team_scoreinteger
channelstringnullable
dayinteger
day_nightstringnullableD=Day, N=Night
doubleheaderboolean
duration_minutesintegernullableTotal game duration in minutes
end_timetimestamptznullable
game_labelstringnullable
game_numberintegerFor doubleheaders: 1 or 2
game_timetimestamptzCanonical game start time (use this over start_time)
game_typestringR=Regular, S=Spring, F=Wild Card, D=Division, L=League, W=World Series, E=Exhibition, A=All-Star
home_team_scoreinteger
if_necessarybooleannullable
neutral_venueboolean
postponed_statusstringnullable
season_typestringRegular Season, Postseason, Spring Training, All-Star
series_game_numberstringnullable
series_namestringnullable
series_textstringnullable
statusstringFinal, Live, Scheduled, Postponed, Suspended, Cancelled
GET/api/v1/mlb/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.
dayqueryintegeroptional
Filter by calendar day (YYYYMMDD integer, US Eastern) — e.g. day=20260609 for today's slate. season_id defaults to the current season; pass it explicitly for past-season days. 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/mlb/games?season_id=2026'
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/mlb/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/mlb/games/{pk_value}'
Responses
200Single game row.application/jsonshow example ▸
404Row not found.
playersmlb.players
Every individual who has played in Major League Baseball — current 26-man and 40-man rosters, minor-league call-ups, players on the injured list, free agents, and retired players.
Fields30
FieldTypeReferencesDescription
idkeybigintPrimary Key
league_idstringnullableOfficial MLB player identifier
league_player_idintegerOfficial MLB player ID from statsapi.mlb.com
team_idbigintnullable
batsstringnullable
birth_citystringnullable
birth_countrystringnullable
birth_datedatenullable
birth_statestringnullable
debut_datetimestamptznullable
display_fi_laststringnullable
display_last_comma_firststringnullable
draft_numberstringnullable
draft_roundstringnullable
draft_yearstringnullable
first_namestring
full_namestring
full_position_liststringnullable
heightintegernullable
jerseystringnullable
last_namestring
league_slugstringnullable
position_categorystringnullable
primary_positionstring
profile_pic_urlstringnullableURL to player profile picture image
roster_statusstringnullable
schoolstringnullable
statusstringnullable
throwsstringnullable
weightintegernullable
GET/api/v1/mlb/players
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.
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/mlb/players?limit=3'
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/mlb/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/mlb/players/{pk_value}'
Responses
200Single player row.application/jsonshow example ▸
404Row not found.

Plays· 4 tables

inningsmlb.innings
Each half-inning of every MLB game — runs scored, hits, errors, base traffic, plate appearances, who pitched, and how the offense ended each frame.
Fields10
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
away_team_errorsinteger
away_team_hitsinteger
away_team_runsinteger
home_team_errorsinteger
home_team_hitsinteger
home_team_runsinteger
inning_halfstring
inning_numberinteger
GET/api/v1/mlb/innings
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
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/mlb/innings?game_id=1'
Responses
200innings rows matching the declared filter set, wrapped in { innings, 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/mlb/innings/{id}
Parameters
idpathbigintrequired
Primary key (id) of the inning 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/mlb/innings/{pk_value}'
Responses
200Single inning row.application/jsonshow example ▸
404Row not found.
pitchesmlb.pitches
Every individual pitch thrown in every MLB game — the pitch type, velocity, location, movement, spin, and the result (called strike, swinging strike, foul, ball, hit, walk).
Fields72
FieldTypeReferencesDescription
idkeybigintPrimary Key
at_bat_idbigint
batter_idbigint
game_idbigint
pitcher_idbigint
play_idbigint
air_outbooleanWhether this pitch resulted in an air out
ballboolean
barrelbooleannullableOptimal combination of exit velocity and launch angle
break_anglefloatnullable
break_lengthfloatnullable
break_yfloatnullable
breaking_ballbooleannullableBreaking ball (curveball, slider, knuckleball)
callstring
catchers_interferencebooleanWhether this pitch resulted in catchers interference
chasebooleannullableWhether batter swung at pitch outside zone
doublebooleanWhether this pitch resulted in a double
effective_speedfloatnullablePerceived speed to batter (mph)
expected_batting_avgdecimalnullablexBA based on exit velocity and launch angle
expected_wobadecimalnullablexwOBA based on exit velocity and launch angle
extensionfloatnullable
fastballbooleannullableFastball variant (4-seam, 2-seam, sinker, cutter)
flare_burnerbooleannullableLaunch angle 10-25 AND exit velocity < 95
fly_outbooleanWhether this pitch resulted in a fly out
ground_into_double_playbooleanWhether this pitch resulted in grounding into double play
ground_into_triple_playbooleanWhether this pitch resulted in grounding into triple play
ground_outbooleanWhether this pitch resulted in a ground out
hard_hitbooleannullableExit velocity >= 95 MPH
hit_by_pitchbooleanWhether this pitch resulted in hit by pitch
hit_coord_xfloatnullableHit coordinate X (feet from home plate)
hit_coord_yfloatnullableHit coordinate Y (feet from home plate)
hit_distanceintegernullableDistance of batted ball (feet)
hit_exit_velocityfloatnullableExit velocity of batted ball (mph)
hit_launch_anglefloatnullableLaunch angle of batted ball (degrees)
home_runbooleanWhether this pitch resulted in a home run
in_playboolean
in_strike_zonebooleannullableWhether pitch was in the strike zone
intentional_walkbooleanWhether this pitch resulted in an intentional walk
launch_speed_angle_zoneintegernullable1=Weak, 2=Topped, 3=Under, 4=Flare/Burner, 5=Solid, 6=Barrel
line_outbooleanWhether this pitch resulted in a line out
offspeedbooleannullableOffspeed pitch (changeup, splitter, forkball)
pitch_numberinteger
pitch_speedfloatnullable
pitch_typestringnullable
pitch_xfloatnullable
pitch_yfloatnullable
pitch_zfloatnullable
pitch_zoneintegernullable
plate_xfloatnullable
plate_zfloatnullable
pop_outbooleanWhether this pitch resulted in a pop out
release_speedfloatnullableSpeed at release point (mph)
resultstring
sacrifice_flybooleanWhether this pitch resulted in a sacrifice fly
sacrifice_hitbooleanWhether this pitch resulted in a sacrifice bunt
singlebooleanWhether this pitch resulted in a single
solid_contactbooleannullableLaunch angle 20-25 AND exit velocity 95-100
spin_axisfloatnullableSpin axis (degrees)
spin_directionfloatnullable
spin_ratefloatnullable
spray_anglefloatnullableHorizontal angle from center field (degrees)
statcast_quality_scoredecimalnullableStatcast data quality score (0.0-1.0)
strikeboolean
strike_zone_bottomfloatnullable
strike_zone_topfloatnullable
strikeoutbooleanWhether this pitch resulted in a strikeout
sweet_spotbooleannullableLaunch angle between 8-32 degrees
toppedbooleannullableLaunch angle < 10 AND exit velocity < 90
tracking_confidencedecimalnullableConfidence in tracking data accuracy
triplebooleanWhether this pitch resulted in a triple
underbooleannullableLaunch angle less than 10 degrees
walkbooleanWhether this pitch resulted in a walk
GET/api/v1/mlb/pitches
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
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/mlb/pitches?game_id=1'
Responses
200pitches rows matching the declared filter set, wrapped in { pitches, 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/mlb/pitches/{id}
Parameters
idpathbigintrequired
Primary key (id) of the pitche 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/mlb/pitches/{pk_value}'
Responses
200Single pitche row.application/jsonshow example ▸
404Row not found.
at_batsmlb.at_bats
Every plate appearance in every MLB game — the batter, the pitcher, the count, the pitch sequence, and the outcome (single, double, home run, strikeout, walk, hit-by-pitch, etc.).
Fields35
FieldTypeReferencesDescription
idkeybigintPrimary Key
batter_idbigint
game_idbigint
inning_idbigint
pitcher_idbigint
at_bat_numberinteger
ballsinteger
end_outsinteger
end_runnersinteger
expected_batting_avgdecimalnullable
expected_wobadecimalnullable
hit_coord_xfloatnullable
hit_coord_yfloatnullable
hit_distanceintegernullable
hit_exit_velocityfloatnullable
hit_launch_anglefloatnullable
hit_locationstringnullable
hit_typestringnullable
is_barrelbooleannullable
is_flare_burnerbooleannullableLaunch angle 10-25 AND exit velocity < 95
is_hard_hitbooleannullable
is_solid_contactbooleannullableLaunch angle 20-25 AND exit velocity 95-100
is_sweet_spotbooleannullableLaunch angle between 8-32 degrees
is_toppedbooleannullableLaunch angle < 10 AND exit velocity < 90
is_underbooleannullableLaunch angle less than 10 degrees
launch_speed_angle_zoneintegernullable
pitch_countinteger
resultstring
runs_scoredinteger
spray_anglefloatnullableHorizontal angle from center field (degrees)
start_outsinteger
start_runnersinteger
statcast_quality_scoredecimalnullableStatcast data quality score (0.0-1.0)
strikesinteger
tracking_confidencedecimalnullableConfidence in tracking data accuracy
GET/api/v1/mlb/at_bats
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
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/mlb/at_bats?game_id=1'
Responses
200at_bats rows matching the declared filter set, wrapped in { at_bats, 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/mlb/at_bats/{id}
Parameters
idpathbigintrequired
Primary key (id) of the at_bat 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/mlb/at_bats/{pk_value}'
Responses
200Single at_bat row.application/jsonshow example ▸
404Row not found.
play_by_playsmlb.play_by_plays
Every individual play of every MLB game — every plate appearance, baserunning event, defensive play, and substitution with the inning, outs, base state, and score at the moment.
Fields22
FieldTypeReferencesDescription
idkeybigintPrimary Key
at_bat_idbigintnullable
batter_idbigintnullable
catcher_idbigintnullable
first_base_runner_idbigintnullable
game_idbigint
inning_idbigint
pitcher_idbigintnullable
play_idbigint
player_idbigintnullable
second_base_runner_idbigintnullable
team_idbigint
third_base_runner_idbigintnullable
count_ballsinteger
count_strikesinteger
event_sub_typeinteger
event_typeinteger
hit_locationstringnullable
hit_typestringnullable
mlb_event_numinteger
outsinteger
runners_on_baseinteger
GET/api/v1/mlb/play_by_plays
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
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/mlb/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/mlb/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/mlb/play_by_plays/{pk_value}'
Responses
200Single play_by_play row.application/jsonshow example ▸
404Row not found.

Stats· 10 tables

park_factorsmlb.park_factors
How each MLB ballpark inflates or suppresses run-scoring categories — runs, home runs, doubles, triples, and batting average relative to a neutral park, computed per season.
Fields18
FieldTypeReferencesDescription
idkeybigintPrimary Key
season_idbigint
venue_idbigint
basic_park_factordecimalOverall park factor for runs (1.0 = neutral)
double_factordecimalPark factor for doubles
fly_ball_factordecimalnullablePark factor for fly balls
ground_ball_factordecimalnullablePark factor for ground balls
handedness_factordecimalPark effect on handedness advantage
home_run_factordecimalPark factor for home runs (1.0 = neutral)
left_handed_factordecimalPark factor for left-handed batters
right_handed_factordecimalPark factor for right-handed batters
run_factordecimalnullablePark factor for total runs
single_factordecimalPark factor for singles
strikeout_factordecimalPark factor for strikeouts
triple_factordecimalPark factor for triples
updated_datetimestamptz
walk_factordecimalPark factor for walks
years_of_dataintegerNumber of years used to calculate factors
GET/api/v1/mlb/park_factors
Requires one of: venue_id — requests satisfying none of these return 400.
Parameters
venue_idquerybigintoptional
Filter by venue.
season_idquerybigintoptional
Filter to a 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/mlb/park_factors?venue_id=1'
Responses
200park_factors rows matching the declared filter set, wrapped in { park_factors, 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/mlb/park_factors/{id}
Parameters
idpathbigintrequired
Primary key (id) of the park_factor 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/mlb/park_factors/{pk_value}'
Responses
200Single park_factor row.application/jsonshow example ▸
404Row not found.
season_run_environmentsmlb.season_run_environments
League-wide offensive context per MLB season — average runs per game, league batting line, ERA, and the offensive baseline used to normalize player and team stats across eras.
Fields10
FieldTypeReferencesDescription
idkeybigintPrimary Key
season_idbigint
batting_average_on_balls_in_playdecimalLeague average BABIP
fip_constantdecimalFIP constant to scale FIP to ERA
home_run_per_fly_balldecimalLeague average HR/FB rate
runs_per_outdecimalLeague average runs per out made
runs_per_plate_appearancedecimalLeague average runs per plate appearance
strikeout_ratedecimalLeague average strikeout rate
updated_datetimestamptz
walk_ratedecimalLeague average walk rate
GET/api/v1/mlb/season_run_environments
Requires one of: season_id — requests satisfying none of these return 400.
Parameters
season_idquerybigintoptional
Filter to a season. Defaults to the current 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/mlb/season_run_environments?season_id=2026'
Responses
200season_run_environments rows matching the declared filter set, wrapped in { season_run_environments, 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/mlb/season_run_environments/{id}
Parameters
idpathbigintrequired
Primary key (id) of the season_run_environment 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/mlb/season_run_environments/{pk_value}'
Responses
200Single season_run_environment row.application/jsonshow example ▸
404Row not found.
woba_weightsmlb.woba_weights
The weighted on-base average coefficients for each MLB season — the run values assigned to walks, singles, doubles, triples, and home runs, used to compute wOBA and wRC+.
Fields12
FieldTypeReferencesDescription
idkeybigintPrimary Key
season_idbigint
double_weightdecimalWeight for doubles (w2B)
hit_by_pitch_weightdecimalWeight for hit by pitch (wHBP)
home_run_weightdecimalWeight for home runs (wHR)
league_obpdecimalLeague average OBP for calibration
league_wobadecimalLeague average wOBA for the season
single_weightdecimalWeight for singles (w1B)
triple_weightdecimalWeight for triples (w3B)
updated_datetimestamptzWhen these weights were last updated
walk_weightdecimalWeight for unintentional walks (wBB)
woba_scaledecimalScale factor to convert wOBA to runs
GET/api/v1/mlb/woba_weights
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/mlb/woba_weights?limit=3'
Responses
200woba_weights rows matching the declared filter set, wrapped in { woba_weights, 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/mlb/woba_weights/{id}
Parameters
idpathbigintrequired
Primary key (id) of the woba_weight 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/mlb/woba_weights/{pk_value}'
Responses
200Single woba_weight row.application/jsonshow example ▸
404Row not found.
operator_team_lookupsmlb.operator_team_lookups
How each sportsbook and fantasy operator names every MLB team — the mapping from each operator's team code to the unified franchise record.
Fields6
FieldTypeReferencesDescription
idkeybigintPrimary Key
operator_idbigintOperator id: 1 DraftKings, 2 FanDuel, 3 Yahoo, 13 sportsdata.io.
operator_team_idstringExternal team ID from operator
team_idbigintInternal mlb.teams.id reference
abbreviationstringnullableTeam abbreviation for reconciliation
team_namestringnullableTeam name for reconciliation
⚠️ This endpoint is documented but not yet live. Calls return 503 until data is wired in.
GET/api/v1/mlb/operator_team_lookups
Requires one of: operator_id — requests satisfying none of these return 400.
Parameters
operator_idquerybigintoptional
Filter by operator.
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/mlb/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
503Coming soon — handler returns 503 until data is wired in.
GET/api/v1/mlb/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/mlb/operator_team_lookups/{pk_value}'
Responses
200Single operator_team_lookup row.application/jsonshow example ▸
404Row not found.
503Coming soon — handler returns 503 until data is wired in.
season_team_statsmlb.season_team_stats
Season totals for each MLB team — wins and losses, runs scored and allowed, batting and pitching aggregates, fielding stats, and advanced team metrics (BaseRuns, pythagorean expectation, run differential).
Fields36
FieldTypeReferencesDescription
idkeybigintPrimary Key
season_idbigint
team_idbigint
at_batsinteger
batting_averagedecimal
blown_savesinteger
caught_stealinginteger
complete_gamesinteger
double_playsinteger
doublesinteger
earned_run_averagedecimal
earned_runsinteger
errorsinteger
fielding_percentagedecimal
games_playedinteger
hitsinteger
holdsinteger
home_runsinteger
innings_pitcheddecimalInnings pitched in MLB notation (6.2 = 6 and 2/3 innings)
lossesinteger
on_base_percentagedecimal
on_base_plus_sluggingdecimal
runs_allowedinteger
runs_batted_ininteger
runs_scoredinteger
save_opportunitiesinteger
savesinteger
shutoutsinteger
slugging_percentagedecimal
stolen_basesinteger
strikeoutsinteger
tiesinteger
triplesinteger
walksinteger
whipdecimal
winsinteger
GET/api/v1/mlb/season_team_stats
Requires one of: season_id — requests satisfying none of these return 400.
Parameters
season_idquerybigintoptional
Filter to a 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/mlb/season_team_stats?season_id=2026'
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/mlb/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/mlb/season_team_stats/{pk_value}'
Responses
200Single season_team_stat row.application/jsonshow example ▸
404Row not found.
game_player_batter_statsmlb.game_player_batter_stats
Each batter's box-score stat line for each MLB game — at-bats, hits, doubles, triples, home runs, RBIs, walks, strikeouts, stolen bases, and runs scored.
Fields42
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
player_idbigint
team_idbigint
air_outsinteger
at_batsinteger
at_bats_per_home_rundecimal
babipdecimal
balls_in_playinteger
batting_averagedecimal
catchers_interferenceinteger
caught_stealinginteger
double_playsinteger
doublesinteger
fly_outsinteger
ground_into_double_playinteger
ground_into_triple_playinteger
ground_outsinteger
hit_by_pitchinteger
hitsinteger
home_runsinteger
intentional_walksinteger
isolated_powerdecimal
left_on_baseinteger
line_outsinteger
on_base_percentagedecimal
on_base_plus_sluggingdecimal
pickoffsinteger
plate_appearancesinteger
pop_outsinteger
runsinteger
runs_batted_ininteger
sacrifice_fliesinteger
sacrificesinteger
singlesinteger
slugging_percentagedecimal
stolen_basesinteger
strikeoutsinteger
total_basesinteger
triplesinteger
walksinteger
wobadecimal
GET/api/v1/mlb/game_player_batter_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.
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/mlb/game_player_batter_stats?game_id=1'
Responses
200game_player_batter_stats rows matching the declared filter set, wrapped in { game_player_batter_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/mlb/game_player_batter_stats/{id}
Parameters
idpathbigintrequired
Primary key (id) of the game_player_batter_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/mlb/game_player_batter_stats/{pk_value}'
Responses
200Single game_player_batter_stat row.application/jsonshow example ▸
404Row not found.
game_player_pitching_statsmlb.game_player_pitching_stats
Each pitcher's box-score stat line for each MLB game — innings pitched, hits and runs allowed, earned runs, walks, strikeouts, home runs allowed, and pitches thrown.
Fields68
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
player_idbigint
team_idbigint
air_outsinteger
babipdecimal
balksinteger
ballsinteger
balls_in_playinteger
batters_facedinteger
blown_saveinteger
catchers_interferenceinteger
complete_gamesinteger
double_playsinteger
doubles_allowedinteger
earned_run_averagedecimal
earned_runsinteger
fipdecimal
fly_outsinteger
games_finishedinteger
games_pitchedinteger
games_startedinteger
grand_slams_allowedinteger
ground_into_double_playinteger
ground_outsinteger
hit_by_pitchinteger
hits_allowedinteger
holdinteger
home_runs_allowedinteger
home_runs_per_ninedecimal
inherited_runnersinteger
inherited_runners_scoredinteger
inning_startedinteger
innings_pitcheddecimalInnings pitched in MLB notation (6.2 = 6 and 2/3 innings)
intentional_walksinteger
left_on_basedecimal
line_outsinteger
lossinteger
no_hittersinteger
on_base_percentagedecimal
on_base_plus_sluggingdecimal
outsinteger
perfect_gamesinteger
pickoffsinteger
pitches_throwninteger
plate_appearancesinteger
pop_outsinteger
quality_startsinteger
runs_allowedinteger
runs_scored_per_ninedecimal
sacrifice_flies_allowedinteger
sacrifices_allowedinteger
saveinteger
shutoutsinteger
singles_allowedinteger
slugging_percentagedecimal
strike_percentagedecimal
strikeouts_per_ninedecimal
strikeouts_pitchedinteger
strikesinteger
total_bases_allowedinteger
triples_allowedinteger
walks_allowedinteger
walks_per_ninedecimal
whipdecimal
wild_pitchesinteger
wininteger
wobadecimal
GET/api/v1/mlb/game_player_pitching_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.
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/mlb/game_player_pitching_stats?game_id=1'
Responses
200game_player_pitching_stats rows matching the declared filter set, wrapped in { game_player_pitching_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/mlb/game_player_pitching_stats/{id}
Parameters
idpathbigintrequired
Primary key (id) of the game_player_pitching_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/mlb/game_player_pitching_stats/{pk_value}'
Responses
200Single game_player_pitching_stat row.application/jsonshow example ▸
404Row not found.
game_team_statsmlb.game_team_stats
Each MLB team's stat line for each game — runs, hits, errors, batting averages, pitching lines, broken out per game with home/away context.
Fields37
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
team_idbigint
assistsinteger
balksinteger
batters_facedinteger
batting_averagedecimal
caught_stealinginteger
double_plays_turnedinteger
doublesinteger
earned_run_averagedecimal
earned_runsinteger
errorsinteger
grounded_into_double_playinteger
hit_by_pitchinteger
hitsinteger
home_runsinteger
innings_pitcheddecimalInnings pitched in MLB notation (6.2 = 6 and 2/3 innings)
left_on_baseinteger
lossinteger
on_base_percentagedecimal
on_base_plus_sluggingdecimal
passed_ballsinteger
pitches_throwninteger
putoutsinteger
runsinteger
runs_batted_ininteger
sacrifice_fliesinteger
sacrifice_hitsinteger
slugging_percentagedecimal
stolen_basesinteger
strikeoutsinteger
strikesinteger
triplesinteger
walksinteger
wild_pitchesinteger
wininteger
GET/api/v1/mlb/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/mlb/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/mlb/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/mlb/game_team_stats/{pk_value}'
Responses
200Single game_team_stat row.application/jsonshow example ▸
404Row not found.
operator_player_lookupsmlb.operator_player_lookups
How each sportsbook and fantasy operator names every MLB 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.
operator_player_idstringExternal player ID from operator
player_idbigintInternal mlb.players.id reference
player_namestringnullablePlayer name for reconciliation
positionstringnullablePosition for reconciliation
GET/api/v1/mlb/operator_player_lookups
Requires one of: operator_id — requests satisfying none of these return 400.
Parameters
operator_idquerybigintoptional
Filter by operator.
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/mlb/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/mlb/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/mlb/operator_player_lookups/{pk_value}'
Responses
200Single operator_player_lookup row.application/jsonshow example ▸
404Row not found.
season_player_statsmlb.season_player_stats
Season totals for each MLB player — the full batting line (AVG, OBP, SLG, OPS), counting stats (HR, RBI, SB, R), and pitching line (W, L, ERA, WHIP, K, BB). Advanced run-value metrics (wRC+, FIP, WAR) are not carried here. Scope is not split by season type.
Fields69
FieldTypeReferencesDescription
idkeybigintPrimary Key
player_idbigint
season_idbigint
assistsinteger
at_batsinteger
ballsintegernullable
batters_facedinteger
batting_averagedecimal
blown_savesinteger
caught_stealinginteger
caught_stealing_byinteger
complete_gamesinteger
double_playsinteger
doublesinteger
earned_run_averagedecimal
earned_runsinteger
errorsinteger
fielding_gamesinteger
fielding_games_startedinteger
fielding_percentagedecimal
fielding_positionstring
games_pitchedinteger
games_playedinteger
games_startedinteger
games_started_pitchinginteger
grounded_into_double_playinteger
hit_by_pitchinteger
hitsinteger
hits_allowedinteger
hits_per_ninedecimal
holdsinteger
home_runsinteger
home_runs_allowedinteger
home_runs_per_ninedecimal
innings_pitcheddecimalInnings pitched in MLB notation (6.2 = 6 and 2/3 innings)
intentional_walksintegernullable
left_on_baseintegernullable
lossesinteger
on_base_percentagedecimal
on_base_plus_sluggingdecimal
passed_ballsinteger
pitches_thrownintegernullable
plate_appearancesinteger
putoutsinteger
quality_startsintegernullable
runsinteger
runs_allowedinteger
runs_batted_ininteger
sacrifice_fliesinteger
sacrifice_hitsinteger
save_opportunitiesinteger
savesinteger
shutoutsinteger
singlesintegernullableDerivable from hits - doubles - triples - home_runs
slugging_percentagedecimal
stolen_basesinteger
stolen_bases_allowedinteger
strikeoutsinteger
strikeouts_per_ninedecimal
strikeouts_pitchedinteger
strikesintegernullable
total_basesintegernullableDerivable: 1B + 2*2B + 3*3B + 4*HR
total_chancesinteger
triplesinteger
walksinteger
walks_allowedinteger
walks_per_ninedecimal
whipdecimal
winsinteger
GET/api/v1/mlb/season_player_stats
Requires one of: season_id or player_id — requests satisfying none of these return 400.
Parameters
season_idquerybigintoptional
Filter to a 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/mlb/season_player_stats?season_id=2026'
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/mlb/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/mlb/season_player_stats/{pk_value}'
Responses
200Single season_player_stat row.application/jsonshow example ▸
404Row not found.

Odds· 5 tables

series_oddsmlb.series_odds
Series-level odds for postseason MLB matchups — who wins each series and how many games it goes, with the price updating game by game as the series unfolds. MLB playoff series are best-of-5 (LDS/WC) or best-of-7 (LCS/WS).
Fields11
FieldTypeReferencesDescription
idkeybigintPrimary Key
away_team_idbigint
home_team_idbigint
operator_idbigint
season_idbigint
away_oddsintegerAmerican odds for away team to win series
captured_attimestamptz
games_playedintegernullable
home_oddsintegerAmerican odds for home team to win series
series_namestringALDS, NLDS, ALCS, NLCS, World Series, Wild Card
series_scorestringnullableCurrent series score (e.g., "3-2" home-away)
⚠️ This endpoint is documented but not yet live. Calls return 503 until data is wired in.
GET/api/v1/mlb/series_odds
Requires one of: season_id — requests satisfying none of these return 400.
Parameters
season_idquerybigintoptional
Filter to a season. Defaults to the current 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/mlb/series_odds?season_id=2026'
Responses
200series_odds rows matching the declared filter set, wrapped in { series_odds, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.application/json
503Coming soon — handler returns 503 until data is wired in.
GET/api/v1/mlb/series_odds/{id}
Parameters
idpathbigintrequired
Primary key (id) of the series_odd 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/mlb/series_odds/{pk_value}'
Responses
200Single series_odd row.application/jsonshow example ▸
404Row not found.
503Coming soon — handler returns 503 until data is wired in.
game_alt_linesmlb.game_alt_lines
Alternate MLB game lines — the full ladder of run-line and total offerings at non-standard prices that sportsbooks publish alongside the headline line.
Fields6
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
operator_idbigint
alt_spreadsjsonbnullableArray of {line, home_odds, away_odds}
alt_totalsjsonbnullableArray of {line, over_odds, under_odds}
captured_attimestamptz
⚠️ This endpoint is documented but not yet live. Calls return 503 until data is wired in.
GET/api/v1/mlb/game_alt_lines
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
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/mlb/game_alt_lines?game_id=1'
Responses
200game_alt_lines rows matching the declared filter set, wrapped in { game_alt_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
503Coming soon — handler returns 503 until data is wired in.
GET/api/v1/mlb/game_alt_lines/{id}
Parameters
idpathbigintrequired
Primary key (id) of the game_alt_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/mlb/game_alt_lines/{pk_value}'
Responses
200Single game_alt_line row.application/jsonshow example ▸
404Row not found.
503Coming soon — handler returns 503 until data is wired in.
game_linesmlb.game_lines
MLB game betting lines — moneylines, run lines (the baseball point-spread equivalent), and over/under totals from sportsbooks, captured over time as the lines move from opening to closing. In MLB, spread = run line (typically +/- 1.5).
Fields18
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
operator_idbigintData source (consensus, DraftKings, FanDuel, etc.)
season_idbigintDenormalized for efficient season-level queries
captured_attimestamptzWhen this snapshot was captured
implied_away_scoredecimalnullable
implied_away_win_pctdecimalnullable
implied_home_scoredecimalnullableCalculated from spread + total
implied_home_win_pctdecimalnullableFrom moneyline, 0-1
is_openingbooleanTrue if this is the opening line
moneyline_awayintegernullableAmerican odds for away team win
moneyline_homeintegernullableAmerican odds for home team win
over_oddsintegernullableAmerican odds for over
spreaddecimalnullableHome team run line (e.g., -1.5 means home favored by 1.5 runs)
spread_away_oddsintegernullableAmerican odds for away run line
spread_home_oddsintegernullableAmerican odds for home run line (e.g., -130)
totaldecimalnullableCombined run total line (e.g., 8.5)
under_oddsintegernullableAmerican odds for under
GET/api/v1/mlb/game_lines
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
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/mlb/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/mlb/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/mlb/game_lines/{pk_value}'
Responses
200Single game_line row.application/jsonshow example ▸
404Row not found.
game_period_linesmlb.game_period_lines
Period-specific MLB betting lines — first-five-innings markets (F5), individual-inning bets, and other partial-game spreads, moneylines, and totals. Each row is a time-series snapshot - only captured when values change.
Fields17
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
operator_idbigintData source (consensus, DraftKings, FanDuel, etc.)
season_idbigintDenormalized for efficient season-level queries
captured_attimestamptz
implied_away_win_pctdecimalnullable
implied_home_win_pctdecimalnullable
is_openingboolean
moneyline_awayintegernullable
moneyline_homeintegernullable
over_oddsintegernullable
period_codestringMarket period code (F5 = first 5 innings, F3, F7)
spreaddecimalnullableHome team run line for this period
spread_away_oddsintegernullable
spread_home_oddsintegernullable
totaldecimalnullableCombined run total line for this period
under_oddsintegernullable
⚠️ This endpoint is documented but not yet live. Calls return 503 until data is wired in.
GET/api/v1/mlb/game_period_lines
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
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/mlb/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
503Coming soon — handler returns 503 until data is wired in.
GET/api/v1/mlb/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/mlb/game_period_lines/{pk_value}'
Responses
200Single game_period_line row.application/jsonshow example ▸
404Row not found.
503Coming soon — handler returns 503 until data is wired in.
game_player_propsmlb.game_player_props
MLB player prop bets for each game — hits, runs, RBIs, total bases, home runs, strikeouts (for pitchers), and other player-statistic markets offered by sportsbooks.
Fields18
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
operator_idbigint
player_idbigint
season_idbigintDenormalized for efficient season-level queries
book_countintegerNumber of curated books contributing to this consensus value
captured_attimestamptz
categorystringCanonical category. Pitcher props: - strikeouts_pitcher, hits_allowed, walks_allowed, - earned_runs, outs_recorded, pitching_outs, win, quality_start Batter props: - hits, home_runs, rbis, total_bases, runs, walks, - stolen_bases, strikeouts_batter, hits_runs_rbis
is_openingboolean
linedecimalnullableProp line for over/under markets (e.g., 5.5 strikeouts)
market_keystringRaw market key from source API (e.g., pitcher_strikeouts)
no_oddsintegernullable
outcome_typestringou | yes_no
over_oddsintegernullable
period_codestringnullableOptional period code (F5)
subcategorystringnullableOptional subtype (alternate, boosted, etc.)
under_oddsintegernullable
yes_oddsintegernullable
⚠️ This endpoint is documented but not yet live. Calls return 503 until data is wired in.
GET/api/v1/mlb/game_player_props
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.
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/mlb/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
503Coming soon — handler returns 503 until data is wired in.
GET/api/v1/mlb/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/mlb/game_player_props/{pk_value}'
Responses
200Single game_player_prop row.application/jsonshow example ▸
404Row not found.
503Coming soon — handler returns 503 until data is wired in.

Lineups & Roster· 4 tables

game_team_rostersmlb.game_team_rosters
The active gameday roster for each MLB team in each game — the 26 players in uniform that day, with positions and any pre-game lineup designations.
Fields10
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
player_idbigint
team_idbigint
batting_orderintegernullable
commentstringnullable
dayinteger
positionstringnullable
starterboolean
statusstringnullable
GET/api/v1/mlb/game_team_rosters
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
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/mlb/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/mlb/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/mlb/game_team_rosters/{pk_value}'
Responses
200Single game_team_roster row.application/jsonshow example ▸
404Row not found.
team_player_rostersmlb.team_player_rosters
Day-by-day player-to-team affiliations across the MLB season — who was on each 40-man roster, who was on the IL, who was optioned to the minors, and who was designated for assignment.
Fields9
FieldTypeReferencesDescription
idkeybigintPrimary Key
player_idbigint
season_idbigint
team_idbigint
dayinteger
positionstringnullable
position_depthintegernullable
position_groupstringnullable
roster_typestring
GET/api/v1/mlb/team_player_rosters
Requires one of: team_id — requests satisfying none of these return 400.
Parameters
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/mlb/team_player_rosters?team_id=1'
Responses
200team_player_rosters rows matching the declared filter set, wrapped in { team_player_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/mlb/team_player_rosters/{id}
Parameters
idpathbigintrequired
Primary key (id) of the team_player_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/mlb/team_player_rosters/{pk_value}'
Responses
200Single team_player_roster row.application/jsonshow example ▸
404Row not found.
team_starting_lineup_battersmlb.team_starting_lineup_batters
Each batter in each MLB starting lineup — position in the order (1 through 9), defensive position, and batting handedness for the day.
Fields5
FieldTypeReferencesDescription
idkeybigintPrimary Key
player_idbigint
team_starting_lineup_idbigint
batting_orderstring
positionstring
GET/api/v1/mlb/team_starting_lineup_batters
Requires one of: team_starting_lineup_id — requests satisfying none of these return 400.
Parameters
team_starting_lineup_idquerybigintoptional
Filter to a single starting lineup.
limitqueryintegeroptionaldefault 50
Page size. Defaults to 50; max 200.
from_idquerybigintoptional
Return rows with id strictly greater than this value; page using the previous response's `next_from_id`. Omit on the first page.
Restores the documented defaults (trial keys only accept the unchanged defaults).
Request
curl -sS \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  'https://api.stat-api.com/api/v1/mlb/team_starting_lineup_batters?team_starting_lineup_id=1'
Responses
200team_starting_lineup_batters rows matching the declared filter set, wrapped in { team_starting_lineup_batters, 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/mlb/team_starting_lineup_batters/{id}
Parameters
idpathbigintrequired
Primary key (id) of the team_starting_lineup_batter 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/mlb/team_starting_lineup_batters/{pk_value}'
Responses
200Single team_starting_lineup_batter row.application/jsonshow example ▸
404Row not found.
team_starting_lineupsmlb.team_starting_lineups
Each MLB team's starting lineup for each game — the nine batters in batting order plus the starting pitcher (and DH where applicable).
Fields6
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
pitcher_idbigintnullable
team_idbigint
batter_statusinteger
pitcher_statusinteger
GET/api/v1/mlb/team_starting_lineups
Requires one of: team_id or game_id — requests satisfying none of these return 400.
Parameters
team_idquerybigintoptional
Filter by team.
game_idquerybigintoptional
Filter to a single game.
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/mlb/team_starting_lineups?team_id=1'
Responses
200team_starting_lineups rows matching the declared filter set, wrapped in { team_starting_lineups, limit, next_from_id }. next_from_id is the last row's id on a full page — pass it back via ?from_id= to walk the full result; null marks the terminal page.application/jsonshow example ▸
400No declared filter set was satisfied — response body matches MissingRequiredFiltersError; pick one combo from the accepted-sets hint and resend.application/json
GET/api/v1/mlb/team_starting_lineups/{id}
Parameters
idpathbigintrequired
Primary key (id) of the team_starting_lineup 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/mlb/team_starting_lineups/{pk_value}'
Responses
200Single team_starting_lineup row.application/jsonshow example ▸
404Row not found.

Misc· 11 tables

venuesmlb.venues
MLB ballparks — current home stadiums and historical venues, with dimensions, surface, capacity, and roof type.
Fields21
FieldTypeReferencesDescription
idkeybigintPrimary Key
league_venue_idintegernullableOfficial MLB venue ID from statsapi.mlb.com
addressstringnullable
capacityintegernullable
citystring
closed_datetimestamptznullable
countrystringnullable
descriptionstringnullable
elevationfloatnullableElevation in feet above sea level
hr_factordecimalnullableHistorical home run park factor (1.0 = neutral)
image_urlstringnullableURL to aerial/overview image of ballpark
latitudefloatnullable
longitudefloatnullable
namestring
opened_datetimestamptznullable
orientationfloatnullableField orientation in degrees (0-360). Direction home plate faces. 0/360=North, 90=East, 180=South, 270=West
roof_typestringnullableOpen, Dome, Retractable
statestringnullable
surfacestringnullable
team_namestringnullable
timezonestringnullableIANA timezone (e.g., America/New_York)
GET/api/v1/mlb/venues
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/mlb/venues?limit=3'
Responses
200venues rows matching the declared filter set, wrapped in { venues, 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/mlb/venues/{id}
Parameters
idpathbigintrequired
Primary key (id) of the venue 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/mlb/venues/{pk_value}'
Responses
200Single venue row.application/jsonshow example ▸
404Row not found.
umpiresmlb.umpires
MLB umpires — the four-person crew of home-plate, first-base, second-base, and third-base umpires who work each game (six in the postseason with outfield umpires added).
Fields11
FieldTypeReferencesDescription
idkeybigintPrimary Key
mlb_umpire_idinteger
activeboolean
birth_citystringnullable
birth_countrystringnullable
birth_datedatenullable
birth_statestringnullable
experienceintegernullable
first_namestring
full_namestring
last_namestring
GET/api/v1/mlb/umpires
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/mlb/umpires?limit=3'
Responses
200umpires rows matching the declared filter set, wrapped in { umpires, 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/mlb/umpires/{id}
Parameters
idpathbigintrequired
Primary key (id) of the umpire 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/mlb/umpires/{pk_value}'
Responses
200Single umpire row.application/jsonshow example ▸
404Row not found.
venue_dimensionsmlb.venue_dimensions
Outfield dimensions and wall heights for each MLB ballpark — distances to left field, center field, right field, and the power alleys, plus the height of the outfield walls.
Fields21
FieldTypeReferencesDescription
idkeybigintPrimary Key
mlb_venue_idinteger
venue_idbigint
altitude_ftfloatnullableVenue altitude in feet (denormalized from venue for query convenience)
backstop_distancefloatnullableDistance from home plate to backstop (feet)
center_fieldfloat
center_field_fence_heightfloat
descriptionstringnullable
fair_territory_sq_ftfloatnullable
foul_territory_ratingdecimalnullableRelative foul territory size (1.0 = average, >1 = large)
foul_territory_sq_ftfloatnullable
left_center_fieldfloatnullable
left_fieldfloat
left_field_fence_heightfloat
orientationfloat
right_center_fieldfloatnullable
right_fieldfloat
right_field_fence_heightfloat
total_territory_sq_ftfloatnullable
venue_namestringnullable
yearinteger
GET/api/v1/mlb/venue_dimensions
Requires one of: venue_id — requests satisfying none of these return 400.
Parameters
venue_idquerybigintoptional
Filter by venue.
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/mlb/venue_dimensions?venue_id=1'
Responses
200venue_dimensions rows matching the declared filter set, wrapped in { venue_dimensions, 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/mlb/venue_dimensions/{id}
Parameters
idpathbigintrequired
Primary key (id) of the venue_dimension 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/mlb/venue_dimensions/{pk_value}'
Responses
200Single venue_dimension row.application/jsonshow example ▸
404Row not found.
broadcastersmlb.broadcasters
Networks, regional sports networks, and streaming services that air MLB games — Apple TV+, ESPN, FOX, TBS, MLB Network, MLB.TV, plus team-local RSNs.
Fields12
FieldTypeReferencesDescription
idkeybigintPrimary Key
broadcaster_idinteger
broadcaster_team_idinteger
region_idinteger
broadcaster_abbreviationstring
broadcaster_descriptionstringnullable
broadcaster_displaystring
broadcaster_mediastring
broadcaster_rankinginteger
broadcaster_scopestring
broadcaster_video_linkstringnullable
tape_delay_commentsstringnullable
⚠️ This endpoint is documented but not yet live. Calls return 503 until data is wired in.
GET/api/v1/mlb/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/mlb/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
503Coming soon — handler returns 503 until data is wired in.
GET/api/v1/mlb/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/mlb/broadcasters/{pk_value}'
Responses
200Single broadcaster row.application/jsonshow example ▸
404Row not found.
503Coming soon — handler returns 503 until data is wired in.
playoffsmlb.playoffs
The MLB postseason bracket — Wild Card Series, Division Series, League Championship Series, and the World Series, tracked as the seeded matchups and outcomes.
Fields12
FieldTypeReferencesDescription
idkeybigintPrimary Key
away_team_idbigint
home_team_idbigint
season_idbigint
series_idbigint
away_team_winsinteger
games_playedinteger
home_team_winsinteger
max_gamesinteger
series_namestring
series_textstring
statusstring
GET/api/v1/mlb/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/mlb/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/mlb/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/mlb/playoffs/{pk_value}'
Responses
200Single playoff row.application/jsonshow example ▸
404Row not found.
game_broadcastersmlb.game_broadcasters
Which networks broadcast each MLB game — the national TV partner, regional carriers, radio calls, and streaming providers.
Fields4
FieldTypeReferencesDescription
idkeybigintPrimary Key
broadcaster_idbigint
game_idbigint
broadcaster_typestring
⚠️ This endpoint is documented but not yet live. Calls return 503 until data is wired in.
GET/api/v1/mlb/game_broadcasters
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
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/mlb/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
503Coming soon — handler returns 503 until data is wired in.
GET/api/v1/mlb/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/mlb/game_broadcasters/{pk_value}'
Responses
200Single game_broadcaster row.application/jsonshow example ▸
404Row not found.
503Coming soon — handler returns 503 until data is wired in.
game_umpiresmlb.game_umpires
The umpiring crew assigned to each MLB game — who worked home plate, who worked each base.
Fields4
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
umpire_idbigint
positionstringnullable
GET/api/v1/mlb/game_umpires
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
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/mlb/game_umpires?game_id=1'
Responses
200game_umpires rows matching the declared filter set, wrapped in { game_umpires, 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/mlb/game_umpires/{id}
Parameters
idpathbigintrequired
Primary key (id) of the game_umpire 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/mlb/game_umpires/{pk_value}'
Responses
200Single game_umpire row.application/jsonshow example ▸
404Row not found.
player_awardsmlb.player_awards
MLB player awards — MVP, Cy Young, Rookie of the Year, Gold Gloves, Silver Sluggers, All-Star selections, and other end-of-season honors.
Fields8
FieldTypeReferencesDescription
idkeybigintPrimary Key
player_idbigint
season_idbigint
team_idbigintnullable
award_datedatenullableDate the award was announced
award_namestring
award_typestring
is_winnerbooleanstatsapi publishes recipients (winners) only — always true
GET/api/v1/mlb/player_awards
Requires one of: player_id — requests satisfying none of these return 400.
Parameters
player_idquerybigintoptional
Filter to a single player.
season_idquerybigintoptional
Filter to a 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/mlb/player_awards?player_id=1'
Responses
200player_awards rows matching the declared filter set, wrapped in { player_awards, 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/mlb/player_awards/{id}
Parameters
idpathbigintrequired
Primary key (id) of the player_award 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/mlb/player_awards/{pk_value}'
Responses
200Single player_award row.application/jsonshow example ▸
404Row not found.
player_injuriesmlb.player_injuries
The ongoing injury record for each MLB player — body part, severity, IL designation (10-day, 15-day, 60-day), and expected return timeline.
Fields16
FieldTypeReferencesDescription
idkeybigintPrimary Key
player_idbigint
season_idbigint
team_idbigint
body_partstring
descriptionstringnullable
end_datetimestamptznullable
expected_return_datetimestamptznullable
games_missedintegernullable
injury_typestring
is_surgery_requiredbooleannullable
sidestringnullable
sourcestringnullable
start_datetimestamptz
statusstring
updated_datetimestamptz
GET/api/v1/mlb/player_injuries
Requires one of: player_id — requests satisfying none of these return 400.
Parameters
player_idquerybigintoptional
Filter to a single player.
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/mlb/player_injuries?player_id=1'
Responses
200player_injuries rows matching the declared filter set, wrapped in { player_injuries, 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/mlb/player_injuries/{id}
Parameters
idpathbigintrequired
Primary key (id) of the player_injury 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/mlb/player_injuries/{pk_value}'
Responses
200Single player_injury row.application/jsonshow example ▸
404Row not found.
player_newsmlb.player_news
News about MLB players — trades, IL placements, lineup decisions, suspensions, and general beat-reporter updates, unified from beat-writer scrapers, operator feeds, and AI summarization.
Fields17
FieldTypeReferencesDescription
idkeybigintPrimary Key
external_idstringSource-specific unique identifier
player_idbigintnullable
team_idbigintnullable
ai_processedboolean
analysisstringnullable
authorstringnullable
categorystringnullableinjury, transaction, lineup, general
contentstringnullable
descriptionstringnullable
linkstringnullable
news_timetimestamptz
priorityinteger
processed_attimestamptznullable
situational_impactjsonbnullable
sourcestringNews source identifier (cbs, espn, rotoworld, sportsdata, etc.)
titlestring
GET/api/v1/mlb/player_news
Requires one of: player_id or team_id — requests satisfying none of these return 400.
Parameters
player_idquerybigintoptional
Filter to a single player.
team_idquerybigintoptional
Filter by team.
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/mlb/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/mlb/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/mlb/player_news/{pk_value}'
Responses
200Single player_new row.application/jsonshow example ▸
404Row not found.
venue_weathersmlb.venue_weathers
On-field weather throughout each MLB game — temperature, wind direction and speed, humidity, and precipitation captured at fixed intervals from first pitch.
Fields27
FieldTypeReferencesDescription
idkeybigintPrimary Key
game_idbigint
venue_idbigint
air_densityfloatnullableCalculated air density (lb/ft³)
ball_carry_factordecimalnullableEstimated ball carry factor (1.0 = neutral, >1 = carries more)
cloud_coverfloatnullable
dew_pointfloatnullable
feels_like_temperaturefloatnullable
humidityfloatnullable
is_domebooleannullable
precipitationfloatnullable
precipitation_probabilityfloatnullable
pressurefloatnullable
recorded_attimestamptznullable
roof_statusstringnullableopen, closed, retractable_open, retractable_closed
temperaturefloatnullable
time_minutesintegerMinutes from game start (0, 30, 60, 90, 120, 150, 180 for 3-hour game)
uv_indexfloatnullable
visibilityfloatnullable
weather_conditionstringnullable
weather_descriptionstringnullable
wind_blowing_outbooleannullableTrue if wind is blowing from home plate toward outfield
wind_component_outfloatnullableWind speed component blowing out to CF (mph, negative = blowing in)
wind_directionfloatnullable
wind_direction_relativefloatnullableWind direction relative to batter's box (degrees)
wind_gustfloatnullable
wind_speedfloatnullable
GET/api/v1/mlb/venue_weathers
Requires one of: game_id — requests satisfying none of these return 400.
Parameters
game_idquerybigintoptional
Filter to a single game.
venue_idquerybigintoptional
Filter by venue.
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/mlb/venue_weathers?game_id=1'
Responses
200venue_weathers rows matching the declared filter set, wrapped in { venue_weathers, 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/mlb/venue_weathers/{id}
Parameters
idpathbigintrequired
Primary key (id) of the venue_weather 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/mlb/venue_weathers/{pk_value}'
Responses
200Single venue_weather row.application/jsonshow example ▸
404Row not found.