BYTETOOLS

NHL Records API

Free NHL Records API with no key: every franchise since 1917 including defunct teams, plus records, milestones and historical statistics. Tested example included.

No API key requiredHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the NHL Records API?

The NHL Records API is a free, key-free API serving the league's historical database. It covers every franchise since the NHL's founding in 1917 — including long-defunct teams — with season ranges, team identifiers, relocations, records and milestone statistics.

This is the historical companion to the NHL's live stats API, and it answers a different class of question: not what happened last night, but what has happened since 1917. Every franchise the league has ever had is here, including the Montreal Wanderers, who played a single season before their arena burned down — the sort of record that only a properly maintained historical database preserves.

The franchise model repays a moment's attention because hockey teams relocate and rename often. Each record carries `firstSeasonId` and `lastSeasonId` in a distinctive `YYYYYYYY` integer format (19171918 for the 1917-18 season), with `lastSeasonId` null for active franchises. `mostRecentTeamId` links the franchise to its current team identity, which is how you connect a modern club to the history it inherited under a different name in a different city.

Quick facts

Base URL
https://records.nhl.com/site/api
Authentication
No API key or account. This is an undocumented public endpoint the NHL's own site uses; there is community documentation but no official contract.
Rate limit
No published limit. Historical data is effectively static, so cache it.
Pricing
Free.
CORS
Not enabled — call it from your server
Official docs
Read the docs

How to use the NHL Records API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. List every NHL franchise in league history

GET https://records.nhl.com/site/api/franchise

curl
curl 'https://records.nhl.com/site/api/franchise'
JavaScript (fetch)
const res = await fetch("https://records.nhl.com/site/api/franchise");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://records.nhl.com/site/api/franchise", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "data": [
    {
      "id": 1,
      "firstSeasonId": 19171918,
      "fullName": "Montréal Canadiens",
      "lastSeasonId": null,
      "mostRecentTeamId": 8,
      "teamAbbrev": "MTL",
      "teamCommonName": "Canadiens",
      "teamPlaceName": "Montréal"
    },
    {
      "id": 2,
      "firstSeasonId": 19171918,
      "fullName": "Montreal Wanderers",
      "lastSeasonId": 19171918,
      "mostRecentTeamId": 41,
      "teamAbbrev": "MWN",
      "teamCommonName": "Wanderers",
      "teamPlaceName": "Montreal"
    },
    {
      "id": 3,
      "firstSeasonId": 19171918,
      "fullName": "St. Louis Eagles",
      "lastSeasonId": 19341935,
      "mostRecentTeamId": 45,
      "teamAbbrev": "SLE",
      "teamCommonName": "Eagles",
      "teamPlaceName": "St. Louis"
    },
    {
      "id": 4,
      "firstSeasonId": 19191920,
      "fullName": "Hamilton Tigers",
      "lastSeasonId": 19241925,
      "mostRecentTeamId": 37,
      "teamAbbrev": "HAM",
      "teamCommonName": "Tigers",
      "teamPlaceName": "Hamilton"
    },
    {
      "id": 5,
      "firstSeasonId": 19171918,
      "fullName": "Toronto Maple Leafs",
      "lastSeasonId": null,
      "mostRecentTeamId": 10,
      "teamAbbrev": "TOR",
      "teamCommonName": "Maple Leafs",
      "teamPlaceName": "Toronto"
    },
    {
      "id": 6,
      "firstSeasonId": 19241925,
      "fullName": "Boston Bruins",
      "lastSeasonId": null,
      "mostRecentTeamId": 6,
      "teamAbbrev": "BOS",
      "teamCommonName": "Bruins",
      "teamPlaceName": "Boston"
    },
    {
      "id": 7,
      "firstSeasonId": 19241925

Parameters

ParameterTypeRequiredDescription
resourcepath segmentRequiredThe record set: `franchise`, `franchise-season-results`, `franchise-team-totals`, `record-detail` and others. franchise
cayenneExpqueryOptionalServer-side filter expression, for example `franchiseId=1`. The syntax comes from the NHL's own query layer. franchiseId=1
includequeryOptionalPull in related fields on some record sets.
sortqueryOptionalSort specification, given as a JSON array of field and direction objects.

Response fields

dataarray
The records. Everything is wrapped in a `data` envelope, usually alongside a `total` count.
idinteger
Franchise identifier, distinct from the team id — a franchise persists across relocations and renames.
fullNamestring
Franchise name, with proper diacritics (Montréal Canadiens), so make sure your pipeline is UTF-8 clean.
firstSeasonId / lastSeasonIdinteger
Season range in `YYYYYYYY` form — 19171918 is the 1917-18 season. `lastSeasonId` is null for franchises still active.
mostRecentTeamIdinteger
Links the franchise to its current team identity, which is how you connect a modern club to its earlier incarnations.
teamAbbrevstring
Three-letter code such as MTL.
teamPlaceName / teamCommonNamestring
City and nickname split into separate fields, which makes rendering flexible.

What you can build with the NHL Records API

  • Build an NHL franchise history browser covering relocations and renames
  • Look up all-time records and milestone statistics
  • Join historical franchise data to modern team stats
  • Research defunct teams and early league history

Common errors and how to fix them

404

Unknown record set in the path.

Fix: Resource names are hyphenated and specific, such as `franchise-team-totals`. There is no index endpoint — consult the community documentation.

400

Malformed `cayenneExp` filter.

Fix: The expression syntax is the NHL's own and is picky about quoting. Test simple equality filters before building compound ones.

Unexpected schema change

This is an undocumented endpoint with no stability guarantee.

Fix: The NHL has changed its API surface before without notice. Do not build critical infrastructure on it without monitoring.

NHL Records API — frequently asked questions

Is the NHL Records API free?

Yes, free with no API key or account. It is an undocumented public endpoint that the NHL's own site uses, documented by the community rather than officially, so it carries no stability guarantee.

What is the difference between a franchise and a team?

A franchise persists through relocations and renames; a team is one identity within it. The `mostRecentTeamId` field links a franchise to its current team, which is how you trace a modern club back through its earlier cities and names.

What does the season ID format mean?

It concatenates the two calendar years a season spans, so 19171918 is the 1917-18 season and 20232024 is 2023-24. A null `lastSeasonId` means the franchise is still active.

Does it include current season statistics?

No. This is the historical records database. Live scores, standings and current-season statistics come from the NHL's separate stats API, which is also documented in this directory.

Tools that pair with this API

NHL Records is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.