Skip to content

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.

SeasonGamesCoveredPlays
2025-261,394100%443,569
2024-251,398100%451,857
2023-241,400100%445,452
2022-231,400100%440,786
2021-221,401100%436,795
2020-21952100%287,926
2019-201,212100%382,738
2018-191,358100%433,203
2017-181,355100%434,744
2016-171,317100%413,339
2015-161,321100%413,912
2014-151,319100%423,034
2013-141,323100%417,619
2012-13806100%253,224
2011-121,316100%404,502
2010-111,318100%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[].typeEvent type, the NHL's own key
plays[].teamAbbreviation of the team that owns the event
plays[].strengthSkater count from the owner's view, e.g. 5v4
plays[].x_coordRink x, -100..100 along the length
plays[].y_coordRink y, -42..42 across
plays[].zoneO, N or D
plays[].seconds_elapsedSeconds from the opening faceoff, continuous across periods
plays[].scoring_player_idScorer on a goal; see also shooting_player_id, winning_player_id, hitting_player_id
summary.by_typeCounts per event type, for this page of results only
next_offsetOffset 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.