Scores tell you how a finished game ended. The schedule tells you which games are on the board: clubs, venue, and start time. You pass a date, or you omit it and the call uses the current schedule. The list is grouped by day. Each day has its own games.
👉 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 are GET /v1/nhl/standings. Scores are GET /v1/nhl/scores. This schedule is GET /v1/nhl/schedule. All three can take a date, and they return different objects. A game id from this list is not a teamAbbrev. Roster, team games, and team stats want teamAbbrev from standings, such as PHI or DET.
Games on the schedule
Endpoint: GET /v1/nhl/schedule
Documentation:
https://docs.steadyapi.com/#hockey-nhl-GETapi-v1-nhl-schedule
Parameters
date— optional date,YYYY-MM-DD
The date selects the week that contains that day. You still get a list of days, not a single game. There is no team filter. meta.numberOfGames is the count for the window. meta.nextStartDate and meta.previousStartDate are the neighboring windows.
Python
import requests
url = "https://api.steadyapi.com/v1/nhl/schedule"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
response = requests.get(url, headers=headers, params={"date": "2024-01-25"})
response.raise_for_status()
payload = response.json()
print(payload.get("meta", {}).get("numberOfGames"))
for day in payload.get("body", [])[:3]:
for game in day.get("games", [])[:8]:
away = game.get("awayTeam", {})
home = game.get("homeTeam", {})
print(
day.get("date"),
away.get("abbrev"),
"at",
home.get("abbrev"),
game.get("startTimeUTC"),
game.get("gameState"),
)
Annotated sample
{
"date": "2024-01-25",
"dayAbbrev": "THU",
"numberOfGames": 9,
"games": [
{
"id": 2023020747,
"startTimeUTC": "2024-01-26T00:00:00Z",
"gameState": "FUT",
"venue": { "default": "Little Caesars Arena" },
"awayTeam": { "abbrev": "PHI", "placeName": { "default": "Philadelphia" } },
"homeTeam": { "abbrev": "DET", "placeName": { "default": "Detroit" } }
}
]
}
Store the game id, startTimeUTC, and gameState. venue.default is the building name. Club codes are awayTeam.abbrev and homeTeam.abbrev. City names are placeName.default on each club. The day wrapper has date, dayAbbrev, and numberOfGames. Odds and broadcast lists sit on the game too. Ignore them unless you are showing lines or TV. gameState of FUT means the game has not been played. Final games use a different state. Scores for a finished night are the scores endpoint, not this row.
Practical use
body is a list of days. Games are nested on games. A loop over body that expects each item to be a game will print dates instead of matchups.
startTimeUTC can fall on the next civil date. The sample game is on the Thursday slate and starts at 2024-01-26T00:00:00Z. Use the timestamp for tip-off and date for the slate day.
Passing 2024-01-25 still returns the week, including meta.numberOfGames for that window. It does not return only Thursday’s nine games at the top level. Count Thursday with day.numberOfGames.
👉 Get your API key and open the schedule: https://steadyapi.com/register