Docs / Stats & data

NHL Stats API

Partial/nhl-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/leaders

Skater 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}/matchup

Head-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-chart

Team 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