Data
NHL play-by-play data
Every NHL play-by-play event since 2010-11 with rink coordinates, strength state and the players involved. REST or MCP, 500 free credits to start.
PuckAPI serves NHL play-by-play for every game since 2010-11: each shot, goal, hit, faceoff, penalty and stoppage, with rink coordinates normalised to one attacking end, the strength state, and the players involved.
The coordinates, the strength state and the player ids are the parts that usually take weeks to clean. They come back ready to query, by game, by season or by player. The table below is read from the database.
Coverage by season
Counted from the database when this page was built: finished regular-season and playoff games.
| Season | Games | Covered | Plays |
|---|---|---|---|
| 2025-26 | 1,394 | 100% | 443,569 |
| 2024-25 | 1,398 | 100% | 451,857 |
| 2023-24 | 1,400 | 100% | 445,452 |
| 2022-23 | 1,400 | 100% | 440,786 |
| 2021-22 | 1,401 | 100% | 436,795 |
| 2020-21 | 952 | 100% | 287,926 |
| 2019-20 | 1,212 | 100% | 382,738 |
| 2018-19 | 1,358 | 100% | 433,203 |
| 2017-18 | 1,355 | 100% | 434,744 |
| 2016-17 | 1,317 | 100% | 413,339 |
| 2015-16 | 1,321 | 100% | 413,912 |
| 2014-15 | 1,319 | 100% | 423,034 |
| 2013-14 | 1,323 | 100% | 417,619 |
| 2012-13 | 806 | 100% | 253,224 |
| 2011-12 | 1,316 | 100% | 404,502 |
| 2010-11 | 1,318 | 100% | 410,342 |
How to get it
get_plays, 10 credits a call. A full 2025-26 season is 1,394 calls and 13,940 credits, which fits in one month of Pro ($49/mo).
curl -X POST https://mcp.puckapi.com/v1/get_plays \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"game_id": "2024020500"
}'What comes back
| plays[].type | Event type, the NHL's own key |
| plays[].team | Abbreviation of the team that owns the event |
| plays[].strength | Skater count from the owner's view, e.g. 5v4 |
| plays[].x_coord | Rink x, -100..100 along the length |
| plays[].y_coord | Rink y, -42..42 across |
| plays[].zone | O, N or D |
| plays[].seconds_elapsed | Seconds from the opening faceoff, continuous across periods |
| plays[].scoring_player_id | Scorer on a goal; see also shooting_player_id, winning_player_id, hitting_player_id |
| summary.by_type | Counts per event type, for this page of results only |
| next_offset | Offset for the next page, or null when the page is the last |
Every field and a real response: get_plays docs.
Questions
How far back does NHL play-by-play go?
Every game from 2010-11 to today, regular season and playoffs, updated daily in season.
Are shot coordinates included?
Yes. Every event with a location has x and y rink coordinates, already flipped so the attacking team always shoots the same way. get_shot_map returns just the shot attempts.
Does it include expected goals?
Team and season expected goals come back from get_team_stats and get_standings. The shot-level model is described in the glossary.
Can I use it from Claude or ChatGPT?
Yes. PuckAPI is an MCP server as well as a REST API: add one URL to Claude, Cursor or any MCP client and ask in plain English.
Is it free?
Every account starts with 500 free credits and no card. Plans start at $19 a month for 10,000 credits.
What it will not do
- Nothing before 2010-11. A query for an earlier season returns empty rather than an error.
- One game per call for the full event list; a whole season is about 1,300 calls.
- Player tracking (skating speed, puck location between events) is not included.
Works with
Start with 500 free credits
No card. REST or MCP.