get_plays
Play-by-play events with rink coordinates, strength state, and the players involved.
When to use it
You are working at the event level: shot locations, what happened on a power play, every faceoff a centre took, or the sequence leading to a goal. Requires at least game_id, season, or player_id -- an unfiltered scan of 7 million events is not offered.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| game_id | string | no | NHL game ID (e.g. 2025020887) |
| season | string | no | Season ID, 8-digit (e.g. 20242025) |
| team | string | no | Team abbreviation that owns the event |
| player_id | number | no | NHL player ID; matches any role on the event |
| type | string | no | goal, shot-on-goal, missed-shot, blocked-shot, faceoff, hit, giveaway, takeaway, penalty, stoppage, ... |
| strength | string | no | Skater strength from the event owner's view: 5v5, 5v4, 4v5, ... |
| zone | string | no | O offensive, N neutral, D defensive |
| period | number | no | Period number (4+ is overtime) |
| shot_attempts_only | boolean | no | Only goals, shots, misses and blocks (Corsi events) |
| limit | number | no | Max events (default 200, max 1000) |
| offset | number | no | Pagination offset |
Request
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": "2024020601",
"type": "goal"
}'Over MCP, ask for it in plain English and the client calls get_plays itself. Point any MCP client at https://mcp.puckapi.com/mcp?key=YOUR_API_KEY.
Response
{
"plays": [
{
"game_id": "2024020601",
"event_id": 111,
"season": "20242025",
"period": 1,
"time_in_period": "01:08",
"seconds_elapsed": 68,
"type": "goal",
"team": "PIT",
"strength": "5v4",
"x_coord": -80,
"y_coord": -10,
"zone": "O",
"shot_type": "tip-in",
"scoring_player_id": 8479344,
"assist1_player_id": 8482758,
"assist2_player_id": 8482698,
"goalie_in_net_id": 8480045,
"away_score": 1,
"home_score": 0
}
],
"summary": {
"returned": 1,
"scope": "this page of results, not the full filter",
"by_type": {
"goal": 1
},
"shot_attempts": 1,
"goals": 1
},
"count": 1,
"next_offset": null
}Response fields
| Field | Type | Description |
|---|---|---|
| plays[].type | string | Event type, the NHL's own key |
| plays[].team | string | Abbreviation of the team that owns the event |
| plays[].strength | string | Skater count from the owner's view, e.g. 5v4 |
| plays[].x_coord | number | Rink x, -100..100 along the length |
| plays[].y_coord | number | Rink y, -42..42 across |
| plays[].zone | string | O, N or D |
| plays[].seconds_elapsed | number | Seconds from the opening faceoff, continuous across periods |
| plays[].scoring_player_id | number | Scorer on a goal; see also shooting_player_id, winning_player_id, hitting_player_id |
| summary.by_type | object | Counts per event type, for this page of results only |
| next_offset | number | Offset for the next page, or null when the page is the last |
Related endpoints
Takes the player_id this one returns.
Player bio and goalie stats (if goalie). For skaters, returns bio info and team context.
Returns the team this one takes.
All 32 active NHL teams with divisions, conferences, and arenas.
Returns the game_id this one takes.
Upcoming games for the next N days. Defaults to 7 days.
Returns the player_id this one takes.
Find players by name, team, or position.
Try it
500 credits free on signup — 50 calls to get_plays — and no card.