Skip to content
Multi-table10 credits

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

NameTypeRequiredDescription
game_idstringnoNHL game ID (e.g. 2025020887)
seasonstringnoSeason ID, 8-digit (e.g. 20242025)
teamstringnoTeam abbreviation that owns the event
player_idnumbernoNHL player ID; matches any role on the event
typestringnogoal, shot-on-goal, missed-shot, blocked-shot, faceoff, hit, giveaway, takeaway, penalty, stoppage, ...
strengthstringnoSkater strength from the event owner's view: 5v5, 5v4, 4v5, ...
zonestringnoO offensive, N neutral, D defensive
periodnumbernoPeriod number (4+ is overtime)
shot_attempts_onlybooleannoOnly goals, shots, misses and blocks (Corsi events)
limitnumbernoMax events (default 200, max 1000)
offsetnumbernoPagination offset

Request

bash
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

json
{
  "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

FieldTypeDescription
plays[].typestringEvent type, the NHL's own key
plays[].teamstringAbbreviation of the team that owns the event
plays[].strengthstringSkater count from the owner's view, e.g. 5v4
plays[].x_coordnumberRink x, -100..100 along the length
plays[].y_coordnumberRink y, -42..42 across
plays[].zonestringO, N or D
plays[].seconds_elapsednumberSeconds from the opening faceoff, continuous across periods
plays[].scoring_player_idnumberScorer on a goal; see also shooting_player_id, winning_player_id, hitting_player_id
summary.by_typeobjectCounts per event type, for this page of results only
next_offsetnumberOffset for the next page, or null when the page is the last

Related endpoints

Try it

500 credits free on signup — 50 calls to get_plays — and no card.