The hockey data API.
Every NHL play since 2010.
More than 6.9 million plays; every shot, hit and faceoff carries the x and y it happened at and the strength state. Every season since 2010-11 of games, goalie and skater stats that refresh every morning, and line movement from the books we track. Call it over REST or point Claude at it over MCP.
500 free credits every month, no card. Works in Claude, ChatGPT and Cursor: connect over MCP
- plays
- 6.9M+
- games
- 23,000+
- players
- 4,900+
- seasons
- 17
Call it over REST or point Claude at it over MCP.
Try it
One request, JSON back.
Copy the call, put your key in, run it. get_standings costs 2 credits, and every account starts with 500 free credits every month, no card.
Request
curl -X POST https://mcp.puckapi.com/v1/get_standings \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_API_KEY"Response
{
"standings": [
{
"rank": 1,
"teamAbbrev": "COL",
"teamName": "Colorado Avalanche",
"points": 121,
"gamesPlayed": 82,
"wins": 55,
"losses": 16,
"otLosses": 11,
"pointPct": 0.738,
"goalDiff": 99,
"goalsForPerGame": 3.68,
"goalsAgainstPerGame": 2.48,
"corsiPct": 56.7,
"fenwickPct": 55.9,
"expectedGoalsFor": 201.2,
"expectedGoalsAgainst": 153.9
},
{
"rank": 2,
...First 22 lines. Full response and every field
Also in PuckAPI
Every PWHL game, as an API.
Professional Women's Hockey League, every season since 2024: play-by-play, shot locations, standings and season lines. Same key and credits as the NHL.
PWHL API: see the data- games
- 343
- plays
- 56,216
- seasons
- 3
Also in PuckAPI
OHL data, as an API.
Ontario Hockey League, every season since 2015: play-by-play, shot locations, standings and season lines. Same key and credits as the NHL.
OHL API: see the data- games
- 8,916
- plays
- 1,125,516
- seasons
- 12
Also in PuckAPI
WHL data, as an API.
Western Hockey League, every season since 2015: play-by-play, standings and season lines. Same key and credits as the NHL.
WHL API: see the data- games
- 10,304
- plays
- 641,857
- seasons
- 13
Also in PuckAPI
QMJHL data, as an API.
Quebec Maritimes Junior Hockey League, every season since 2015: play-by-play, shot locations, standings and season lines. Same key and credits as the NHL.
QMJHL API: see the data- games
- 8,746
- plays
- 1,475,417
- seasons
- 13
Also in PuckAPI
ECHL data, as an API.
ECHL, every season since 2015: play-by-play, shot locations, standings and season lines. Same key and credits as the NHL.
ECHL API: see the data- games
- 12,561
- plays
- 915,503
- seasons
- 13
Also in PuckAPI
AHL data, as an API.
American Hockey League, every season since 2005: play-by-play, shot locations, standings and season lines. Same key and credits as the NHL.
AHL API: see the data- games
- 25,951
- plays
- 1,002,776
- seasons
- 23
Also in PuckAPI
USHL data, as an API.
United States Hockey League, every season since 2003: play-by-play, standings and season lines. Same key and credits as the NHL.
USHL API: see the data- games
- 11,713
- plays
- 217,047
- seasons
- 25
This week
What get_schedule returns right now.
Rendered from the same rows get_schedule returns, refreshed every hour. Lines are the latest bookmaker snapshot.
| Kickoff | Away | Home | Line | Total | Game id |
|---|---|---|---|---|---|
| Tue 7:00 PM ET | COL | TOR | COL -1.5 | 6.5 | 2026020286 |
| Tue 7:00 PM ET | MIN | MTL | MIN -1.5 | 6 | 2026020287 |
| Tue 7:00 PM ET | WSH | OTT | OTT -1.5 | 6.5 | 2026020288 |
| Tue 7:30 PM ET | FLA | CBJ | FLA -1.5 | 6 | 2026020289 |
| Tue 8:00 PM ET | DET | STL | STL -1.5 | 6 | 2026020290 |
| Tue 8:00 PM ET | NJD | WPG | NJD -1.5 | 6 | 2026020291 |
get_schedule · 2 credits · then get_game_detail for the box score and odds
Prop history
Every line a player has had, and how they did against it.
- Gustav ForslingFLA
- Evan BouchardEDM
- Carter VerhaegheFLA
- Ivan BarbashevVGK
- Jordan MartinookCAR
- Wyatt JohnstonDAL
- Darnell NurseSJS
- Sebastian AhoCAR
- Brent BurnsCOL
- Eetu LuostarinenFLA
- Jason RobertsonDAL
- Anton LundellFLA
- Connor McDavidEDM
- Ryan Nugent-HopkinsEDM
- Sam BennettFLA
- Sam ReinhartFLA
- Esa LindellDAL
- Brayden McNabbVGK
- Sean WalkerCAR
- Oliver Ekman-LarssonTOR
- Leon DraisaitlEDM
- Jack EichelVGK
- Mitch MarnerVGK
- Evan RodriguesNJD
Coverage
Coverage you can inspect before you build.
Every event since 2010-11, with coordinates, strength state and the players involved where the event has them.
Regular season, playoffs, and preseason across supported seasons.
Moneyline, puck line and total by sportsbook for every game from 2019-20, about 16 to 18 books a game from 2020-21 to 2023-24 and 8 since.
| Dataset | Seasons | Volume | Status | Tools |
|---|---|---|---|---|
Play-by-play Every event, with rink coordinates, strength state, zone, shot type and the players involved where the event has them: goals, shots, misses, blocks, faceoffs, hits, giveaways, takeaways, penalties. | 2010-11 through current | 6,900,000+ events | Full 22,097 of 22,184 completed games. The 87 gaps are preseason games before 2018, for which the source publishes no play data. Coordinates are present on locatable events; stoppages and period markers carry none. | |
Shift charts and situation time Every player's shifts in every game, and from them the exact seconds each team spent at 5v5, on the power play, shorthanded or with the goalie pulled, plus each skater's time by strength. Game logs carry official time on ice and plus/minus. | 2010-11 through current | 16,000,000+ shifts | Full 22,009 of 22,237 completed games. The 228 gaps are preseason games for which the NHL publishes no shift chart or time-on-ice report. For 1,268 games the NHL's shift API has no chart, and the shifts come from its official HTML time-on-ice reports instead. | |
Games Game records and detail for supported regular season, playoff, and preseason matchups. | 2010-11 through current | 23,000+ | Full Historical coverage depends on supported seasons and source availability. | |
Players Player search and player stat lookup across supported datasets. | Bio, roster, position, supported stats | 4,900+ | Full | |
Skaters Skater season totals: goals, assists, points, plus/minus, power play and shorthanded production, shooting%, faceoff% and time on ice. | 2010-11 to current | 14,000+ | Full One line per player per regular season. A player traded mid-season is combined into one line; his faceoff% and time on ice are weighted by games played. | |
Goalies Goalie stat lookup including save percentage, GAA, goals saved above expected, high-danger save%, rolling form and rest days. | Supported goalie stat seasons | 1,509 | Full | |
Teams Team metadata, abbreviations, divisions, conferences, and arenas. | Active and historical franchises represented in PuckAPI | 34 | Full | |
Standings + rankings Standings and rankings with 5v5 possession: Corsi%, Fenwick% and expected goals for and against. | Supported seasons and current-season snapshots | 526 | Full Do not treat standings as real-time unless freshness is shown separately. | |
Odds Odds for supported games, books, and markets where available. | 2019 playoffs, then every game from 2019-20 through current | 191,000+ | Partial Coverage varies by sportsbook, game, market, and source availability. | |
Line movement Line movement data where multiple odds snapshots exist for a supported game and market. | Historical odds snapshots where available | Opening/current/closing snapshots | Partial Not every game, book, or market has line movement history. | |
Head-to-head Historical matchup context for supported teams and games. | Supported teams and games | Matchup history | Full |
Full detail in the data atlas. Sportsbooks: All eight books (including DraftKings, FanDuel, BetMGM, theScore Bet and Pinnacle) fetched every hour from October 7 2026 for games in the next 7 days, with five labelled snapshots a day kept (latenight, earlyam, midday, afternoon, night) plus opening and closing; opening and closing history from the sportsbook odds archive covers seven books, among them DraftKings, FanDuel, BetMGM and Pinnacle, from 2020-21 and ESPN BET from 2023-24; 2019-20 to 2023-24 also carries Bet365, Caesars, Betfair, Unibet, PointsBet and others (closing lines). Sportsbook availability varies by game, market, and source. Do not assume every book is available for every game.
Last written 2026-11-10 11:05 UTC. Every dataset's own refresh time is in the changelog.
Why trust it
Our model never sees a vote. Its top goalie won the Vezina in four of these six seasons.
Nobody told the model who won anything. It scores shots on distance, angle, type, strength and rebound, and the goalie who saved the most above expectation won the award in four of the six seasons below. In the other two he was the analytics pick or a finalist.
| Season | GSAX leader | GSAX | What happened |
|---|---|---|---|
| 2014-15 | Carey Price | +33.7 | Vezina, Hart, Ted Lindsay |
| 2017-18 | John Gibson | +35.3 | the analytics pick that year |
| 2019-20 | Connor Hellebuyck | +27.7 | Vezina |
| 2021-22 | Igor Shesterkin | +47.2 | Vezina, and the highest in the set |
| 2022-23 | Ilya Sorokin | +39.9 | Vezina finalist; Linus Ullmark won it at +37.1 |
| 2023-24 | Connor Hellebuyck | +26.2 | Vezina |
The model was trained on fifteen seasons and tested on the two most recent it had never seen: expected goals came within 0.15% of actual, and the top tenth of shots converted at 27x the bottom tenth. It over-rates the very best chances slightly, so a goalie facing an unusually high-danger workload is flattered; treat small gaps as noise.
See it in use: PuckCast, our NHL predictions site, runs on this data and shows how every prediction turned out in its public record.
Tools
Every tool, and what a call costs.
Every tool is one REST endpoint and one MCP tool with the same name, the same parameters, and a fixed credit cost. Empty results are not charged.
- get_gamesQuery games by date range, team, season, game state, or type.
- get_predictionsThe model's win probability and A/B/C grade for each NHL game on the current slate, with the model version and a backtest note.
- get_team_statsOne team's record, league rank, and 5v5 possession: Corsi%, Fenwick% and expected goals for and against.
- get_player_statsPlayer bio and goalie stats (if goalie). For skaters, returns bio info and team context.
- get_goalie_statsGoalie leaderboard sorted by save%, GAA, GSAX or wins, with high-danger save%, recent form and rest days.
- get_skater_season_statsSkater leaderboard sorted by points, goals, assists, plus/minus, or shots.
- get_player_game_logA player's game-by-game stat lines for a season: date, opponent, home/away, and the box score for each game.
- get_game_probabilitiesWhat the market thinks of a game: average implied and fair probability for the moneyline, puck lines and totals
- get_oddsOdds for one game, or a whole season of closing lines in one call, billed per game returned (estimate_only prices it first), with bookmaker and snapshot filters.
- get_game_detailFull game detail including odds snapshots and the goalies who started, with time on ice.
- get_head_to_headMatchup history between two teams with win/loss records.
- get_playsPlay-by-play events with rink coordinates, strength state, and the players involved.
- get_shot_mapEvery shot attempt with rink coordinates, shot type, shooter and goalie.
- get_shiftsEvery player's shifts in one NHL game, to the second, with the official boxscore time on ice and plus/minus.
- get_situation_timeExact seconds each team spent at 5v5, 5v4, 4v5, 6v5 and every other on-ice state in an NHL game, from the shift charts, with a completeness check.
- get_player_propsPlayer prop lines by sportsbook, the closing line and the opening line where held: points, goals, assists, shots on goal, blocked shots, goalie saves and anytime goal scorer.
- get_prop_movementHow one player's prop line moved before a game, every capture by sportsbook.
- get_prop_historyA player's prop lines against the result, game by game, with the over rate.
- get_market_oddsOpening and closing lines by sportsbook for the period and regulation-result markets (history from May 2023)
- get_prop_probabilitiesWhat the market thinks of a game's player props: average implied and fair probability for each player and line
Built for
Four jobs, and the endpoints that do them.
Run a hockey study without spending a month on ingestion
Play-by-play with coordinates for every NHL game since 2010-11, queryable without building a scraper first.
Read more →Closing lines and the play-by-play underneath them, in one place
Moneyline, puck line and totals for every game from 2019-20, about 16 to 18 books a game from 2020-21 to 2023-24, eight a game since (Pinnacle included), all eight fetched hourly from October 2026, alongside the shot data to model against them.
Read more →Hockey data your agent can actually call
REST for code, MCP for Claude and Cursor: the same tools, the same credits, no scraping and no schema archaeology.
Read more →Start-sit calls with the numbers behind them
Skater and goalie form, rest days, matchup history and who is actually starting in net.
Read more →Guides
Working code for the questions people ask.
- get_prop_movement
How do I see how an NHL player prop line moved before puck drop in Python?
Every capture of one player's prop line before puck drop, book by book, with the minutes to the start and both prices.
Python, JavaScript, cURL → - get_player_game_log
How do I get an NHL goalie's save percentage by game in Python?
A goalie's game log for a season with shots against, saves, goals against and the decision, ready for a rolling save percentage.
Python, JavaScript, cURL → - get_goalie_stats
How do I rank NHL goalies by goals saved above expected?
A goalie leaderboard for a season sorted by goals saved above expected, with save percentage, GAA, high-danger save percentage and a recent-form trend.
Python, JavaScript, cURL →
Access
REST or MCP. Same data either way.
Call it from any language over REST. Let Claude or Cursor query it in plain English over MCP.
- GET https://mcp.puckapi.com/v1/tools public catalogue with JSON Schema
- GET https://mcp.puckapi.com/openapi.json OpenAPI 3.1 spec
- POST https://mcp.puckapi.com/v1/{tool}
- MCP https://mcp.puckapi.com/mcp
curl -X POST https://mcp.puckapi.com/v1/list_teams \
-H "x-api-key: YOUR_API_KEY"
# every tool: POST /v1/{tool} with a JSON body
# responses carry X-Credits-Used and X-Credits-RemainingPricing
Free to start, then you pay per call.
500 credits every month, no card. Subscriptions add a monthly allowance; wallet top-ups do not expire while your account is open.
- +26 of 27 endpoints (the rest on paid plans)
- +REST API + MCP access
- +No credit card required
- +10,000 credits/month
- +All 27 endpoints
- +Email support
- +Overage at wallet rates
- +30,000 credits/month
- +All 27 endpoints
- +Priority support
- +Overage at wallet rates
- +125,000 credits/month
- +All 27 endpoints
- +Dedicated support
- +Volume rates available
Full breakdown, credit costs per tool, and FAQ on the pricing page.
Questions
The things people ask before signing up.
Is PuckAPI free?
Every account gets 500 credits every month and no card. Calls cost 1 to 25 credits depending on the endpoint, so 500 is a few hundred real requests. Paid plans start at $19/mo for 10,000 credits a month, and wallet top-ups do not expire while your account is open.
How far back does the data go?
Play-by-play runs from the 2010-11 season to the current one: more than 6.9 million events, with coordinates on every shot, hit and faceoff. There is nothing before 2010-11, and a query for an earlier season returns an empty result rather than an error.
What is MCP, and do I need it?
MCP is the protocol Claude, Cursor and similar assistants use to call tools. Point one at https://mcp.puckapi.com/mcp with your key and it picks the endpoint and reads the response itself, no client code. If you are writing an application instead, ignore MCP and use the REST endpoints; they are the same 27 tools.
Can I use this commercially?
Yes, within the terms. The one thing to know is that odds data comes from a commercial provider, so reselling the odds themselves as a feed is not permitted; using them inside a product or a model is.
How current is it?
Odds refresh every hour for games in the next week. Everything else updates once a day, early morning US Eastern (10:00 UTC): scores, standings, rosters, goalie and skater stats and the previous night's play-by-play. There is no live in-game feed, and a game in progress is not reflected until the next morning.
Are the advanced stats computed or sourced?
Computed here, from the play-by-play. Expected goals come from a shot-quality model trained on 1.8 million shots and calibrated within each season; Corsi and Fenwick are counted from shot attempts at 5v5. Nothing is licensed from another analytics provider.
What are the rate limits?
60 requests a minute, dropping to 10 if your credit balance falls below 100. The limit is the same on every plan: credits, not requests, are the spend boundary.
Before you write another scraper
Start with 500 free credits every month, no card.
PuckAPI · The hockey data API.