NHL scores are one night of games. Standings are the table: points, wins, losses, overtime losses, and the conference and division for each club. You call it when you want the current order, or a snapshot on a date. The abbreviation on each row is the code the roster, team-games, and team-stats routes ask for.
Omit date to use the current day. Pass YYYY-MM-DD for another snapshot.
👉 To access this endpoint, you must obtain an API key: https://steadyapi.com/register
Authentication
Every call uses a Bearer token from your SteadyAPI dashboard.
Documentation:
https://docs.steadyapi.com/#authenticating-requests
headers = {
'Authorization': 'Bearer YOUR_API_KEY'
}
Where this fits
Standings do not need a previous call. Scores are GET /v1/nhl/scores. The schedule is GET /v1/nhl/schedule. Both take an optional date and return games, not the table. After standings, GET /v1/nhl/teams-roster, GET /v1/nhl/teams-games, and GET /v1/nhl/teams-stats each require teamAbbrev. Use teamAbbrev.default from this list, for example VAN.
Standings for a date
Endpoint: GET /v1/nhl/standings
Documentation:
https://docs.steadyapi.com/#hockey-nhl-GETapi-v1-nhl-standings
Parameters
date— optional date,YYYY-MM-DD
The date chooses the snapshot. It does not filter to one conference. You still receive the full list, and you group it with conferenceName and divisionName. There is no team parameter on this route.
Python
import requests
url = "https://api.steadyapi.com/v1/nhl/standings"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
response = requests.get(url, headers=headers, params={"date": "2024-01-25"})
response.raise_for_status()
rows = response.json().get("body", [])
for row in rows[:8]:
print(
row.get("teamAbbrev", {}).get("default"),
row.get("teamName", {}).get("default"),
row.get("points"),
row.get("wins"),
row.get("losses"),
row.get("conferenceName"),
row.get("divisionName"),
)
Annotated sample
{
"teamName": { "default": "Vancouver Canucks" },
"teamCommonName": { "default": "Canucks" },
"teamAbbrev": { "default": "VAN" },
"placeName": { "default": "Vancouver" },
"conferenceName": "Western",
"divisionName": "Pacific",
"points": 69,
"wins": 32,
"losses": 11,
"otLosses": 5,
"gamesPlayed": 48,
"goalFor": 181,
"goalAgainst": 123,
"goalDifferential": 58
}
Store teamAbbrev.default with points, wins, losses, and otLosses. teamName.default is the full club name. teamCommonName.default is the short name. placeName.default is the city. conferenceName and divisionName are plain strings, not objects. The row also carries home, road, and last-10 splits (homeWins, roadPoints, l10Points, and similar keys). Ignore those splits until you need them. teamLogo is a logo URL.
Practical use
The list is not pre-sorted into a division table. Group by divisionName, then sort by points. divisionSequence is already on the row if you would rather use the league’s order than sort yourself.
Names are objects with a default key. row["teamAbbrev"] is not the string VAN. The string is row["teamAbbrev"]["default"]. Roster and team-stats expect that string as teamAbbrev.
A date on standings is a table snapshot. The same date on GET /v1/nhl/scores or GET /v1/nhl/schedule is a set of games. Do not read points from a scores response, and do not read a final score from this table.
👉 Get your API key and pull the table: https://steadyapi.com/register