API key Sign in, or get an instant trial key below — no signup required.

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).

LayerEndpointNHL notes
Schedule / boardGET /v1/eventssport=nhl; status, date, include_odds / include_scores
TeamsGET /v1/teamsConference / division filters (e.g. conference=Eastern)
Live scoreGET /v1/events/{id}/score · SSEPeriods 13 / OT / SO; clock often null
OddsGET …/odds · …/odds/historyTwo-way h2h, spreads, totals · 9 books
Player propsGET …/player-propsSettleable goals / assists / SOG / points mains + live box progress
SplitsGET …/splitsPre-game ticket% vs handle% (in-season)
IntelligenceGET …/intelligenceNot yet — expect available: false
Raw statsGET …/statsStage-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
curl "https://lumify.ai/v1/events?sport=nhl&status=scheduled&include_odds=true&limit=5" \
  -H "Authorization: Bearer YOUR_API_KEY"
Python
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"))
TypeScript
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
curl "https://lumify.ai/v1/teams?sport=nhl&conference=Eastern" \
  -H "Authorization: Bearer YOUR_API_KEY"
Python
page = client.teams.list(sport="nhl", conference="Eastern")
for team in page.get("data") or []:
    print(team["id"], team.get("name"))
TypeScript
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):

json
{
  "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

FeedCadenceFit
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 propsLines ~10 min; live box ~1 min while in progressSettleable mains + this-event box progress
SplitsPre-game ingestStops updating once puck-drop is live
StatsScheduled box ingestPersist-then-read Stage-1 team context
IntelligenceNot available for NHL yet

Pricing

CallCredits
Most successful GETs (events, score, splits, teams, …)1
Multi-book odds (bookmaker=all or a list)1
available: false / errors0

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

What does the NHL API include?

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.

Is NHL bet intelligence available?

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.

Do you support NHL player props or player game logs?

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.

How do NHL betting splits work?

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.

How is NHL different from NBA in the API?

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.