Docs / Stats & data
NHL Stats API
Expected goals, not just goals. The NHL surface is built on shot-quality data: every skater leaderboard carries xG and goals-above-expected alongside the counting stats, across twelve seasons. One call, no scraping.
Coverage
Twelve seasons of skater data, 2014 through 2025: goals, assists, points, shots, expected goals (xG) and goals-above-expected, keyed by player id. Leaderboards default to 5-on-5 situations with a 10-game minimum. The 2025-26 season is complete — all 1,391 games from opening night through the Cup final on 15 June 2026 — and the 2026-27 season starts in October.
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": "5on5",
"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 talent from percentages, then regress it over twelve seasons.
xG leaderboard
Rank skaters by expected goals for any season back to 2014 with one call.
Playoff matchup preview
Pair a game matchup with each side’s xG leaders to build a preview card.
Need per-player NHL stat lines and goalie stats (GAA, save percentage)?
Today the NHL surface serves season leaderboards with xG, plus goalie workload inside a team’s depth chart. Per-player stat lookups and goalie lines like GAA and save percentage 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?
- Twelve: 2014 through 2025, where a season is labelled by its starting year (2025 is the 2025-26 season). Pass ?season= to scope a call; omit it for the most recent.
- 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.
- Why are leaderboards 5-on-5 by default?
- Even-strength play is the fairest basis for comparing skaters, so leaders default to situation 5on5 with a 10-game minimum. The response echoes both back in the envelope.
- Can I look up one player’s NHL stat line directly?
- Not on the NHL surface today — stats are served as season leaderboards keyed by player id, not as a per-player lookup, and goalie lines (GAA, save percentage) are not exposed yet. Goalie workload is visible in a team’s depth chart.
Start pulling NHL Stats
Free tier: 1,000 requests/day (2,000 with GitHub), no credit card.
Get an API key