NHL
NHL API for Scores, Schedules, Odds & AI Agents
One event graph for the NHL — puck-drop schedules, period-aware live scores, nine-book moneyline/spread/totals, settleable player props, public betting splits, and Stage-1 raw team stats agents can act on without scraping a board.
Available data
Everything below filters on the stable slug sport=nhl (league nhl). Discover seasons with GET /v1/seasons?sport=nhl and teams with GET /v1/teams?sport=nhl (optional conference=Eastern / Western).
| Layer | Endpoint | NHL notes |
|---|---|---|
| Schedule / board | GET /v1/events | sport=nhl; status, date, include_odds / include_scores |
| Teams | GET /v1/teams | Conference / division filters (e.g. conference=Eastern) |
| Live score | GET /v1/events/{id}/score · SSE | Periods 1–3 / OT / SO; clock often null |
| Odds | GET …/odds · …/odds/history | Two-way h2h, spreads, totals · 9 books |
| Player props | GET …/player-props | Settleable goals / assists / SOG / points mains + live box progress |
| Splits | GET …/splits | Pre-game ticket% vs handle% (in-season) |
| Intelligence | GET …/intelligence | Not yet — expect available: false |
| Raw stats | GET …/stats | Stage-1 team context (record, form, H2H, rest, SOG/hits/PIM rates) |
Schedules
List the slate with GET /v1/events?sport=nhl. Narrow by status (scheduled / inprogress / final), date or from/to (max 90 days per request), and paginate with after_id / limit.
NHL puck-drop volume is dense — use date windows and include_odds=true / include_scores=true to keep night-of boards to one round trip. Historical lookbacks work year-round (including summer league / playoffs when ingested).
Scores
NHL score payloads use hockey period labels — "1"–"3", "OT", and "SO". Game clock is often null on this feed (unlike NBA/NFL).
- GET /v1/events?sport=nhl&status=inprogress&include_scores=true — live board
- GET /v1/events/{id}/score — lightweight poll (~15s cache while live)
- GET /v1/events/{id}/stream — SSE event: score or signed webhooks
Cloneable pattern: live scoreboard use case (keep keys server-side).
Odds
NHL markets are two-way: moneyline (h2h), point spreads, and game totals (often around 6.0). American odds integers; point is null on moneyline sides. Default single-book call is Pinnacle; bookmaker=all is the same 1 credit.
GET /v1/events/{id}/odds/history returns recorded price/point moves between ingest cycles — useful for steam on NHL sides and totals. Game markets only — player props are a separate endpoint below.
Full bookmaker list and normalization notes: Sports Odds API.
Player props
GET /v1/events/{id}/player-props (1 credit when lines exist; available:false is free) joins persisted player-prop mains to this-event player box counts and grades over / under / push once the game is final. NHL markets: goals, assists (hockey_assists), shots on goal, and points (hockey_points = goals + assists).
Market keys and which ones grade: player props catalog. Endpoint fields: API reference.
Splits
NHL is one of the sports with public betting splits in-API — ticket% vs handle% on moneyline, spread, and total, with a cross-book consensus and per-book breakdown.
Call GET /v1/events/{id}/splits (1 credit when available). Data is pre-game only; once puck-drop starts, expect frozen or unavailable updates. Always check available before reading consensus / books.
Without NHL intelligence yet, splits are the main sharp-vs-public signal on the same event IDs as odds, scores, and stats — pair with /odds for line context.
Raw stats
GET /v1/events/{id}/stats returns Stage-1 NHL-native team context (record, form, H2H, rest, team box rates). Check available. Fields: API reference — stats.
Sportsbooks
Odds keys: pinnacle, fanduel, draftkings, betmgm, caesars, bet365, circa, hardrock, betonline. Availability varies by event — check each bookmaker entry.
Splits use the same bookmaker slugs as odds under bookmakers[].bookmaker (e.g. draftkings, fanduel).
Examples
Tonight’s NHL games with odds inlined:
curl "https://lumify.ai/v1/events?sport=nhl&status=scheduled&include_odds=true&limit=5" \
-H "Authorization: Bearer YOUR_API_KEY"
from lumify import Lumify client = Lumify(api_key="YOUR_API_KEY") page = client.events.list( sport="nhl", status="scheduled", include_odds=True, limit=5, ) for event in page["events"]: print(event["id"], event["name"], event.get("odds"))
import { Lumify } from "@lumifyai/sdk"; const client = new Lumify({ apiKey: "YOUR_API_KEY" }); const { events } = await client.events.list({ sport: "nhl", status: "scheduled", includeOdds: true, limit: 5, }); events.forEach(e => console.log(e.id, e.name, e.odds));
Eastern Conference teams:
curl "https://lumify.ai/v1/teams?sport=nhl&conference=Eastern" \
-H "Authorization: Bearer YOUR_API_KEY"
page = client.teams.list(sport="nhl", conference="Eastern") for team in page.get("data") or []: print(team["id"], team.get("name"))
const { data: east } = await client.teams.list({ sport: "nhl", conference: "Eastern", }); east.forEach(t => console.log(t.id, t.name));
Sample odds shape (abridged NHL event — totals market):
{
"event_id": 5091,
"available": true,
"bookmakers": [
{
"bookmaker": "pinnacle",
"markets": [
{
"key": "totals",
"label": "total",
"outcomes": [
{ "outcome": "Over", "price": -108, "point": 6.0 },
{ "outcome": "Under", "price": -112, "point": 6.0 }
]
}
],
"captured_at": "2026-05-13T23:05:00Z"
}
]
}
Freshness
| Feed | Cadence | Fit |
|---|---|---|
| Live scores | ~1 minute (+ SSE/webhooks) | Scoreboards, in-game agents |
| Odds ingest | ~10 minutes (2-min response cache) | Research, line shop, alerts — not HFT |
| Player props | Lines ~10 min; live box ~1 min while in progress | Settleable mains + this-event box progress |
| Splits | Pre-game ingest | Stops updating once puck-drop is live |
| Stats | Scheduled box ingest | Persist-then-read Stage-1 team context |
| Intelligence | — | Not available for NHL yet |
Pricing
| Call | Credits |
|---|---|
| Most successful GETs (events, score, splits, teams, …) | 1 |
| Multi-book odds (bookmaker=all or a list) | 1 |
| available: false / errors | 0 |
Free Tier: 1,000 credits that never expire. Instant trial: 100 credits / 14 days, no signup. Details: /pricing.
For agents: machine-readable twin at /sports/nhl-api.md. MCP tools: list_events, list_teams, get_odds, get_player_props, get_splits, get_stats — setup at /sports-mcp-server.
FAQ
Filter with sport=nhl (league slug nhl) for schedules, live scores (periods; clock often null), teams/players (including conference filters), multi-book moneyline/spread/totals, settleable player props, public betting splits, and Stage-1 raw /stats. Same event IDs across every layer.
Not yet. GET /v1/events/{id}/intelligence returns available: false for NHL today. Schedules, scores, odds, splits, and Stage-1 /stats are live. Intelligence is already shipping for MLB, NFL, NCAAF, tennis, and MLS — NHL is on the roadmap.
Yes — goals, assists, shots on goal, and points on GET /player-props. Market keys: goals, hockey_assists, shots_on_goal, hockey_points (goals + assists). GET /odds stays moneyline/spread/totals. Raw /stats is Stage-1 team context (record, form, H2H, rest, SOG/hits/PIM rates). Catalog: /docs/player-props.
GET /v1/events/{id}/splits returns public ticket% vs handle% for NHL pre-game — same coverage class as MLB/NBA/NFL. Splits stop updating once puck-drop goes live. Useful for sharp-vs-public divergence without waiting on an intelligence pipeline.
Use sport=nhl vs sport=nba. Both expose schedules, scores, odds, settleable player props, splits, and Stage-1 /stats. Stats payloads are sport-native (hockey SOG/hits/PIM vs basketball shooting/rebounds). Neither has Lumify intelligence yet. This page is the NHL landing only.
Start with the NHL API
Create a free key — or use an instant trial key with no signup — and list tonight’s NHL slate in under a minute.