get_shifts
Every player's shifts in one NHL game, to the second, with the official boxscore time on ice and plus/minus.
Use it when you need who was on the ice and when: line combinations, on-ice events for a player, your own time-on-ice splits, or the raw input to an exposure model. NHL games from 2010-11 on; a chart lands a day or so after the game.
Parameters
game_idstringrequired- NHL game ID, 10 digits (e.g. 2026020084)
teamstringoptional- Only this team's players, e.g. WSH
player_idnumberoptional- Only this player
Notes
- Over MCP, ask for it in plain English and the client calls
get_shiftsitself. Point any MCP client athttps://mcp.puckapi.com/mcp?key=YOUR_API_KEY. - Each call costs 10 credits, taken before it runs and refunded if the server errors.
- Not the call you need? Find the right call by what you are trying to answer.
Request
curl -X POST https://mcp.puckapi.com/v1/get_shifts \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"game_id": "2026020084",
"player_id": 8471214
}'Response
{
"game_id": "2026020084",
"game_date": "2026-10-11",
"home_team": "WSH",
"away_team": "SEA",
"players": [
{
"player_id": 8471214,
"name": "Alex Ovechkin",
"position": "LW",
"team": "WSH",
"home_away": "home",
"goalie": false,
"shift_count": 18,
"shift_seconds": 1016,
"official_toi_seconds": 1016,
"plus_minus": 0,
"shifts": [
{
"period": 1,
"start": "00:57",
"end": "02:39",
"start_seconds": 57,
"end_seconds": 159,
"duration_seconds": 102
},
{
"period": 1,
"start": "03:47",
"end": "04:40",
"start_seconds": 227,
"end_seconds": 280,
"duration_seconds": 53
}
]
}
],
"count": 1,
"dropped_shifts": 0
}Response fields
players[].player_idinteger- NHL player ID
players[].teamstring- Team abbreviation
players[].goalieboolean- True for a goalie (not counted as a skater in any strength)
players[].shift_countinteger- Shifts after merging overlaps
players[].shift_secondsinteger- Seconds on ice by these shifts
players[].official_toi_secondsinteger- The NHL boxscore's time on ice, seconds
players[].plus_minusinteger- The NHL boxscore's plus/minus; null for goalies
players[].shifts[].periodinteger- Period, 4 and up is overtime
players[].shifts[].startstring- Period clock when the shift began, mm:ss elapsed
players[].shifts[].endstring- Period clock when it ended
players[].shifts[].start_secondsinteger- Seconds from the opening faceoff, (period - 1) * 1200 + clock
players[].shifts[].end_secondsinteger- Seconds from the opening faceoff; the shift covers start up to, not including, end
players[].shifts[].duration_secondsinteger- end_seconds - start_seconds
dropped_shiftsinteger- Shifts the NHL listed with no usable start or end, left out
Related endpoints
Returns the game_id this one takes.
Upcoming games for the next N days. Defaults to 7 days.
Returns the game_id this one takes.
Query games by date range, team, season, game state, or type.
Takes the player_id this one returns.
Player bio and goalie stats (if goalie). For skaters, returns bio info and team context.
Takes the player_id this one returns.
A player's game-by-game stat lines for a season: date, opponent, home/away, and the box score for each game.
Try it
500 free credits every month: 50 calls to get_shifts, and no card.