Docs / Stats & data
NHL Stats API
Expected goals, not just goals. The NHL surface combines licensed all-situations counting stats with our shot-quality model, so skater leaderboards can carry xG and goals-above-expected without relying on a non-redistributable archive. One call, no scraping.
Coverage
Leaderboards report all-situations totals with a 10-game minimum, and each response names the seasons it serves. Game coverage is a separate, much deeper surface: GET /v1/coverage?sport=ice_hockey lists every NHL season we hold under seasons.list and reports the newest result and the next scheduled game under freshness, which is the figure to quote rather than one frozen into this page.
Endpoints
/v1/nhl/leadersSkater leaders for a season — goals, assists, points, shots or xG. Start here; each entry carries the player id every other call is keyed on.
curl "https://api.bigballsdata.com/v1/nhl/leaders?stat=xg&season=2025" \
-H "Authorization: Bearer $BBS_API_KEY"/v1/nhl/games/{game_id}/matchupHead-to-head matchup detail for one game, including the linescore by period.
curl "https://api.bigballsdata.com/v1/nhl/games/{game_id}/matchup" \
-H "Authorization: Bearer $BBS_API_KEY"/v1/teams/{id}/depth-chartTeam depth chart, including the goalie rotation ranked by workload.
curl "https://api.bigballsdata.com/v1/teams/{team_id}/depth-chart" \
-H "Authorization: Bearer $BBS_API_KEY"Example response
Illustrative shape of the unified envelope. Values are examples; live fields come from the call above.
{
"data": {
"stat": "xg",
"season": 2025,
"situation": "all",
"min_games": 10,
"leaders": [
{
"rank": 1,
"player": { "id": "…", "name": "Example Skater", "position": "C" },
"team": { "id": "…", "abbr": "EDM" },
"games_played": 82,
"icetime_minutes": 1419,
"goals": 25, "assists": 33, "points": 58, "shots": 183,
"xg": 21.4, "goals_above_xg": 3.6
}
]
},
"meta": { "cached": true, "cache_age_ms": 0 }
}What you can build
Shooting-luck model
Diff goals against xG to separate finishing results from the quality of chances generated.
xG leaderboard
Rank skaters by expected goals from the current computed season with one call.
Playoff matchup preview
Pair a game matchup with each side’s xG leaders to build a preview card.
Need historical team depth charts and live in-game skater stat lines?
Today the NHL surface serves season leaderboards with xG, per-player stats, current goalie workload inside team depth charts, and a dedicated GSAx leaderboard. Historical team depth attribution and live in-game stat lines are not on the surface yet. If you need it, tell us — the number of people asking is how we decide what to build next.
FAQ
- Which seasons are available?
- Counting-stat leaderboards currently cover 2023 through 2025, where a season is labelled by its starting year. Computed xG currently covers 2025. Pass ?season= to scope a call; an unavailable xG season returns 404 rather than substituting unrelated data.
- What does the xG number mean?
- Expected goals — the goals an average shooter would score from the same shots. Compare it to actual goals via goals_above_xg to see who is outperforming their shot quality.
- Which strength states are included?
- Leaderboards use all-situations season totals and return situation=all. The computed xG model does not infer strength state, so it does not claim a 5-on-5 split.
- Can I look up one player’s NHL stat line directly?
- Season leaderboards are keyed by player id, and /v1/players/:id/stats provides the per-player view. Goalie workload is visible in team depth charts, while /v1/nhl/goalies/gsax provides goals-saved-above-expected.
Start pulling NHL Stats
Free tier: 250 requests/day (500 with GitHub), no credit card.
Get an API key