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.
| Season | Teams | Goalies with GSAX |
|---|---|---|
| 2026-27 | 32 | 55 |
| 2025-26 | 32 | 91 |
| 2024-25 | 32 | 93 |
| 2023-24 | 32 | 94 |
| 2022-23 | 32 | 106 |
| 2021-22 | 32 | 119 |
| 2020-21 | 31 | 98 |
| 2019-20 | 31 | 87 |
| 2018-19 | 31 | 93 |
| 2017-18 | 31 | 95 |
| 2016-17 | 30 | 94 |
| 2015-16 | 30 | 92 |
| 2014-15 | 30 | 92 |
| 2013-14 | 30 | 96 |
| 2012-13 | 30 | 82 |
| 2011-12 | 30 | 88 |
| 2010-11 | 30 | 86 |
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[].rank | League or division rank |
| standings[].teamAbbrev | Team abbreviation |
| standings[].teamName | Full team name |
| standings[].points | Total points |
| standings[].gamesPlayed | Games played |
| standings[].wins | Wins |
| standings[].losses | Losses |
| standings[].otLosses | Overtime losses |
| standings[].pointPct | Points percentage |
| standings[].goalDiff | Goal differential |
| standings[].goalsForPerGame | Goals for per game |
| standings[].goalsAgainstPerGame | Goals against per game |
| standings[].corsiPct | Corsi percentage, 5v5 shot attempts |
| standings[].fenwickPct | Fenwick 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.