Skip to navigation

Coverage by league

What each league has today, field by field, and how far back it goes.

Every league uses the same endpoints and the same JSON. Change nfl to epl in the path and your parser keeps working. What differs is which fields a sport fills and which endpoints have data yet, and that’s what this page lists.

Anything listed under Not filled yet already has its endpoint or field: it answers with an empty list, null or 404, as noted. Code written against it today keeps working when the data arrives.

Leagues

LeagueAliasSportStatus
National Football LeaguenflFootballLive
NCAA Division I FBS FootballncaafFootballLive
English Premier LeagueeplSoccerLive

Every plan includes all three. GET /v1/leagues lists the leagues your key can read.

The data model already covers basketball, baseball and hockey, but no league in those sports is served yet. A request for a league your key can’t read answers 403 with code forbidden.

What every game has

Everything in this table but injuries comes from the live game feed, so it’s there for every game in a live league and updates during the game. Game data arrives on the game’s stream as it changes; teams, players and injuries, which many games share, arrive on league:<alias>.

DataWhereNFL and NCAAFPremier League
ScheduleGET /v1/{league}/gamesEvery game from about 10 minutes before kickoff, with status, start time and scoreEvery match from about 10 minutes before kickoff, with status, start time and score
Live statelive_state on GET /games/{id}Period, clock, score, possession, down, distance, yard line and timeouts. After the final, the last down, distance and yard line stay, and timeouts are null because the feed stops reporting them.Half, match minute, whether the clock is running, stoppage time (shown and announced), formations, red cards and shoot-out score
Game timingstarted_at, ended_at on the game; last_play_id on the live stateWhen the first play happened and, once the game is over, the last one, from the play-by-play’s own clock; the newest play of any type, timeouts and period ends includedKickoff and the final whistle, from the match events’ own clock; the newest event
Play-by-playGET /games/{id}/playsEvery play: type, description, down and distance, start and end yard line, yards gained, penalty yards, first down, touchdown, turnover, score after the playKey events: goals, shots (on target, off target, blocked, woodwork), penalties, cards, substitutions, corners, fouls, offsides and VAR decisions, with the match minute, body part, pitch position and the players involved with their roles
DrivesGET /games/{id}/play-groupsEvery drive: plays, yards, first downs, start and end yard line, time of possession, result and pointsNot applicable. Soccer events belong to no group.
Player box scoreplayers in GET /games/{id}/boxscorePassing, rushing, receiving, defense, interceptions, fumbles, kicking, punting, kick returns and punt returnsOne soccer line per player: goals, assists, shots, shots on target, saves, goals conceded, fouls, offsides and cards
Game rosterGET /games/{id}/rosterThe players with a box-score line, with team and jerseyThe match squads, with starters, positions and jerseys
InjuriesGET /v1/{league}/injuries and league:<alias>NFL: every player on a team’s injury report, refreshed every 30 minutes, with status (questionable, doubtful, out or injured_reserve), when it was reported, started_on (the US Eastern day of the first report Statpad recorded, not when the player was hurt), plus body part, side and estimated return when they’re known. An injury that ends arrives on the stream as a delete. NCAAF: not filled yet.Not filled yet
Teams, players and venues/teams, /players/{id}Every team and player that has appeared in a gameEvery team and player that has appeared in a match
Change journalGET /games/{id}/changes and the streamYesYes

The Sample responses page has every one of these as a real, untrimmed response.

Stat keys

Box score lines are objects keyed by stat code inside a category. These are the codes you’ll see today:

CategoryStat codes
passingatt, completions, yards, yards_per_attempt, touchdowns, interceptions, qbr; NFL also rating, sacks, sack_yards_lost
rushingatt, yards, yards_per_attempt, touchdowns, longest
receivingreceptions, yards, yards_per_reception, touchdowns, longest; NFL also targets
defensivetackles, solo_tackles, sacks, tackles_for_loss, passes_defended, touchdowns; NFL qb_hits, NCAAF qb_hurries
interceptionsinterceptions, yards, touchdowns
fumblesfumbles, lost, recovered
kickingfield_goals_made, field_goal_attempts, field_goal_pct, longest_field_goal, extra_points_made, extra_point_attempts, points
puntingpunts, yards, gross_average, inside_20, touchbacks, longest
kick_returns, punt_returnsreturns, yards, yards_per_return, longest, touchdowns
CategoryStat codes
soccerappearances, sub_ins, total_goals, goal_assists, own_goals, total_shots, shots_on_target, offsides, fouls_committed, fouls_suffered, yellow_cards, red_cards, saves, shots_faced, goals_conceded

A player only has the categories and codes that apply to them, so treat every code as optional. New codes can appear; ignore the ones you don’t use.

Not filled yet

These endpoints and fields are part of the API, but nothing fills them today. Each applies to every league unless the row names one.

DataWhereWhat you get today
Upcoming scheduleGET /v1/{league}/games for a future dateGames appear about 10 minutes before kickoff, so a later day’s list is empty until then.
Team totalsteams in the box scoreAn empty list. Add up the player lines for team totals.
Score by periodperiod_scores on the game and the box scoreAn empty list. Plays carry the score after each play.
Team rostersGET /teams/{id}/rosterAn empty list. A game’s roster lists the players in that game.
Depth chartsGET /teams/{id}/depth-chart404
NCAAF and Premier League injuriesGET /{league}/injuriesAn empty list
Injury practice status and notespractice_status and comment on an injurynull
TransactionsGET /{league}/transactions?since=An empty list
Season stats and leadersGET /players/{id}/stats, GET /seasons/{year}/{type}/leaders?category=&stat=Empty lists
Players on an NFL or NCAAF playparticipants on a playAn empty list. The play’s description names them. Premier League events have them.
Football play tagsair_yards, play_action, screen_pass, run_pass_optionnull
Running clock in NFL and NCAAFclock_running on the live statenull: the football feed has no running flag, and its clock moves only when a play posts. Use status and clock_seconds.
Player detailsbirth_date, height_in, weight_lb, college and draft on players; in NFL and NCAAF also primary_position (NFL players who have been on the injury report have it) and a game roster entry’s position and starternull, and starter is always false

When any of these starts filling, it arrives the same way as everything else: over REST, and as changes on the stream.

How far back it goes

Statpad started collecting each league in November 2026. Earlier games and seasons aren’t backfilled, so the history you can read starts there, and there are no season-to-date totals from before it.

Once collected, a game stays readable:

  • Over REST, for good. The game, its plays, drives, box score and roster stay available after it ends.
  • As a change journal, for at least 7 days after it ends. That covers GET /games/{id}/changes and resuming game:<id> on the stream. A position older than what’s retained gets resync_required (a 410 over REST): read the game over REST instead. A league stream such as league:nfl can be resumed for at least 30 days.

Corrections

A play or a stat line can change after it first appears, during the game and shortly after it, as the official record catches up. A correction arrives as an upsert with a higher version, and a play removed from the record arrives as a delete, on the same stream and in the same seq order as everything else. A game’s status moves to complete at the final whistle, but its stats can still be corrected after that.

If you store data, key it by id and keep the highest version you’ve seen. Then corrections need no special handling.