Skip to content

Data

NHL expected goals: team xG, Corsi and goalie GSAX

NHL expected goals since 2010-11: team 5-on-5 xGF and xGA with Corsi and Fenwick, and goalie GSAX, updated daily. REST or MCP, 500 free credits.

PuckAPI serves NHL expected goals for every season since 2010-11: each team's 5-on-5 expected goals for and against alongside Corsi% and Fenwick%, and each goalie's expected goals against and goals saved above expected (GSAX) at every strength, recomputed every morning in season from the play-by-play.

The model is binned rather than a black box: every unblocked shot is scored by distance, angle, shot type, strength and whether it was a rebound, each bin carries its own observed goal rate, and the season is calibrated so league expected goals equal the goals actually scored. The shots underneath are one call away with their rink coordinates, so you can rebuild or replace the model. The table below is read from the database.

Coverage by season

Counted from the database on October 7, 2026.

SeasonTeamsGoalies with GSAX
2026-273255
2025-263291
2024-253293
2023-243294
2022-2332106
2021-2232119
2020-213198
2019-203187
2018-193193
2017-183195
2016-173094
2015-163092
2014-153092
2013-143096
2012-133082
2011-123088
2010-113086

How to get it

get_standings, 2 credits a call. A full 2026-27 season is 1 call and 2 credits, inside the 500 free credits every account starts with.

curl -X POST https://mcp.puckapi.com/v1/get_standings \
  -H "Content-Type: application/json" \
  -H "x-api-key: YOUR_API_KEY" \
  -d '{
  "season": "20252026"
}'

What comes back

standings[].rankLeague or division rank
standings[].teamAbbrevTeam abbreviation
standings[].teamNameFull team name
standings[].pointsTotal points
standings[].gamesPlayedGames played
standings[].winsWins
standings[].lossesLosses
standings[].otLossesOvertime losses
standings[].pointPctPoints percentage
standings[].goalDiffGoal differential
standings[].goalsForPerGameGoals for per game
standings[].goalsAgainstPerGameGoals against per game
standings[].corsiPctCorsi percentage, 5v5 shot attempts
standings[].fenwickPctFenwick percentage, 5v5 unblocked attempts

Every field and a real response: get_standings docs.

Questions

Where do I get NHL expected goals from the API?

get_standings and get_team_stats return each team's 5-on-5 expected goals for and against with Corsi% and Fenwick%. get_goalie_stats returns expected goals against and GSAX for every goalie and can sort by GSAX.

How is expected goals calculated?

Every unblocked shot is placed in a bin by distance, angle, shot type, strength and rebound, and takes that bin's observed goal rate, shrunk toward coarser bins where the sample is thin. A team's xG is the sum over its shots, calibrated each season so league xG matches actual goals.

Why does a team's xGA not match its goalies' xGA?

Team figures are 5-on-5 only, as possession numbers conventionally are; goalie figures cover every strength, so the goalie total runs roughly a quarter higher. Both are right and answer different questions.

Is there per-shot or per-skater expected goals?

Not as a field. get_shot_map returns every shot with its coordinates, type and strength, which is what an individual xG model needs.

How current is it?

Recomputed every morning in season after the night's play-by-play loads. Very early in a season the numbers rest on a handful of games and move a lot.

Can I use it from Claude or ChatGPT?

Yes. PuckAPI is an MCP server as well as a REST API: ask an assistant which goalies lead the league in GSAX or which teams out-chance their opponents at 5-on-5.

What it will not do

  • Team possession and xG are 5-on-5 and regular season only.
  • No per-shot or per-skater expected goals field; build those from get_shot_map.
  • Nothing before 2010-11, the first season with shot coordinates.

Works with

Start with 500 free credits

No card. REST or MCP.