Data and API

Where every number comes from, how fresh it is, and how to fetch it yourself.

Everything is up to date

6:54:03 PM ET
Scoreboardevery 60 s on game nightsevery 60 s on game nights2026-11-14: 14 games, 0 live, 2 final · 6:53:55 PM
Play-by-playevery 10 s while liveevery 10 s while live1 live · 6:25:22 PM
Final gamesas games go finalas games go final0 of 0 final games settled · 5:01:14 AM
Shift chartsuntil they appearuntil they appear0 of 50 games without shifts have them now · 5:02:04 AM
Nightly importdaily 5:00 AMdaily 5:00 AMdone in 124 s · 5:02:04 AM
Trophy winnersnightly until a season’s are innightly until a season’s are in828 trophy winners · 1:41:37 PM

Sources

NHL Web API api-web.nhle.com/v1

Scores, schedules, games and play-by-play, standings on any date, rosters, playoff brackets

NHL Stats API api.nhle.com/stats/rest/en

Shift charts, player bios (nationality for flags), season summaries, franchises and seasons

NHL Records records.nhl.com/site/api

Trophy winners and franchise history, for the seasons archive

sportsdataverse fastRhockey, sportsdataverse-py

How to parse the NHL’s documents; a possible one-time history import

Use the API

read-only JSON, no key

Every page has a twin under /api/v1. Put it in front of the page’s path and you get the data behind the page.

$ curl https://hockeydata.io/api/v1/seasons/2024-25
{ "data": { "season": 20242025, "headline": "Florida wins the Stanley Cup again", … },
  "meta": { "canonical": "/seasons/2024-25", "final": true, "updatedAt": … } }
$ curl https://hockeydata.io\
/api/v1/seasons/2024-25
{ "data": {
    "season": 20242025,
    "headline": "Florida wins …", … },
  "meta": {
    "canonical": "/seasons/2024-25",
    "final": true,
    "updatedAt": … } }

Full API reference →

Credits and terms

Data © NHL. hockeydata.io is an independent fan project, not affiliated with or endorsed by the NHL or its teams. No team logos are used: the diagonal colour marks are our own, always shown with the team abbreviation. If you use our numbers, link the page you took them from.

The archive

every season since 1917–18, by what the NHL recorded then
EraSeasonsResultsBox scoresGoals and penaltiesFull play-by-playShot locationsShifts
2010–11 to now17every gameevery gameevery oneshots, hits, faceoffs, blockswhere each shot came fromevery shift
1997–98 to 2009–1012every gamewith ice time, hits, faceoffsevery onenot recordednot recordedcounts per player only
1917–18 to 1996–9780every gamegoals, assists, penalties; shots where keptevery onenot recordednot recordednot recorded

108 finished seasons · 70,309 games · 7,970 skaters and 904 goalies, each with a bio and season lines · 2004–05 was not played

recorded partly not recorded

API reference

the same paths as the pages, under /api/v1
Base/api/v1, the same paths as the pages
AccessRead-only JSON, no key, CORS open
Idsteam col · player 8477492 · game 2026-11-12/col-dal (an NHL game id redirects) · season 2026-27
TimeISO dates; UTC in data, Eastern on pages
Envelope{ data, meta }, where meta has canonical, updatedAt, final and sources
CachingETag and Cache-Control by freshness; final games are immutable
Errorsapplication/problem+json (RFC 9457): status, title, detail and suggested links in see
Versions/v1 grows only by addition; breaking changes go to /v2
GET /api/v1ReturnsFresh
/scores/{date}Games on a date: teams, score, state, clock, three stars, flow-strip series30 s · past 1 d
/schedule/{yyyy-mm}Days with game counts and matchups; ?team=1 d
/games/{date}/{away}-{home}Venue, periods, goals, penalties, stars, team stats, skaters, goalies10 s · final ∞
/games/{…}/flowEvery attempt, goals with the score after them, power plays, a box per period; ?strength=10 s · final ∞
/games/{…}/shotsAttempts with x, y, shooter and goalie, per team; ?team= &period= &strength= &type=10 s · final ∞
/games/{…}/shiftsA team’s units and ice time by strength, once the NHL’s shift charts are out; ?team=30 s · final ∞
/games/{…}/liveServer-sent events: shot, goal, penalty, period, finalstream
/standings/{season}The table; ?view= &date=5 min · past ∞
/standings/{season}/race/{group}Rank and points, week by week1 d
/leaders/{season}/{category}Ranked players; ?pos= &team= &country= &rookies= &min-gp=after finals
/teams32 teams, record, last ten, next game; ?view=5 min
/teams/{team}/{season}Record, ranks, special teams, season strip, leaders, division, last and next game5 min · past 1 d
/teams/{team}/{season}/scheduleEvery game with result, record and points after it; ?month=5 min · past 1 d
/teams/{team}/{season}/rosterSkaters and goalies with season stats; ?sort= &dir=5 min · past 1 d
/playersDirectory; ?q= &team= &pos= &letter= &country=, paged with ?limit= &cursor=1 h
/players/{id}Bio, this season with league ranks, last ten games, career, honours5 min · retired 1 d
/players/{id}/{season}Game log with totals; ?type=playoffs5 min · past 1 d
/playoffs/{season}Bracket, every series game by game, the Final; projected during the season1 h · past 1 d
/seasonsEvery season: champion, Final, Presidents’ Trophy, trophy winners; ?decade=1 h
/seasons/{season}Champion, trophies, scoring leaders, best record1 h · past 1 d
/search?q=Players, teams, seasons, games and trophy winners1 h
/search-indexThe whole search index in one file, versioned by a hash of its contents; ?v= is cached for a year1 h

A wrong address answers 404 in problem+json with links to what you probably meant, the same suggestions as the page. The full reference is docs/api.md.

When we fetch

One worker mirrors the NHL into Postgres through one polite fetcher, about one request a second with backoff. Pages read our copy; every NHL response is kept, so history can be rebuilt without asking again.

Daily, 5:00 AMSeasons, the schedule, teams, rosters and bios, yesterday’s and today’s standings, the bracket once the regular season ends, trophy winners while a season’s are missing
Game daysThe scoreboard every 60 s from 30 minutes before puck drop, otherwise every 10 minutes
While a game is livePlay-by-play every 10 s; each change goes to every open page of that game
When a game goes finalBox score, landing, play-by-play, shift charts (retried until they appear); the game becomes immutable
First runThe season so far, the final tables since 2015–16, the brackets since 2016 and the trophy winners since 2005–06

Freshness

Final gamesimmutable: cached for a year
Past dates and seasons1 day
Today’s scores30 seconds
Live gamesstreamed; 15 s polling as the fallback
Standings and leadersrebuilt after each final

House rules

  • The data belongs to the NHL: credited on every page, no logos, non-commercial.
  • One fetcher, about one request a second, never scraping nhl.com pages.
  • Unofficial endpoints change: every response is kept, and shapes are tested.
  • Some data arrives late: we say “data incomplete” rather than guess.

About

hockeydata.io is NHL scores, standings, leaders and history on plain, bookmarkable pages: every page is a URL, and every page has a JSON twin. It is an independent fan project by , built in the open under the MIT licence: github.com/asilachev/hockeydata-io.

  • Data © NHL, from its public endpoints; team names and colours belong to their teams.
  • Flags from flag-icons by Panayiotis Lipiridis, MIT licence.
  • Type: IBM Plex Sans and Plex Mono, SIL Open Font License, bundled from Fontsource.
  • Endpoints mapped by the NHL-API-Reference by Zmalski.
  • Parsing after sportsdataverse and fastRhockey.
  • Colours from the Nord Lane theme, after Nord.