---
title: "NHL skater expected-goals leaderboard (our own model)"
method: GET
path: "/v1/nhl/xg-leaders"
tags: ["nhl"]
---

# NHL skater expected-goals leaderboard (our own model)

`GET /v1/nhl/xg-leaders`

## Request

- Base URL: `https://api.bigballsdata.com`
- URL: `https://api.bigballsdata.com/v1/nhl/xg-leaders`
- Auth: one of:
  - API key in header `x-api-key`
  - HTTP bearer

Expected goals (xG) computed entirely by us from a paid aggregator's
NHL play-by-play (nhl_play_by_play), which we hold clear commercial
redistribution rights to. GET /v1/nhl/leaders?stat=xg uses this same
model as a compatibility view with the legacy response envelope. The
model is a
hierarchical shot-distance/angle/type/rebound/rush lookup table with
empty-net shots modeled separately; it deliberately does not model
strength state (power play vs even strength); see
packages/orchestrator/scripts/compute-nhl-xg.ts for why. `source` in
the response is an opaque tier label (`aggregator-paid`), same as
every other paid-aggregator-derived surface.

## Query parameters

- `season` integer
- `season_type` 'regular' | 'playoffs'
- `min_shots` integer
- `limit` integer

## Response `200`

ok. `{ data, meta }` with a route-local cache stamp.

- object
  - `data` object, required
  - `meta` object
    - `cached` boolean
    - `cache_age_ms` integer

## Other responses

- `400`: Invalid query parameters.
- `404`: No computed NHL xG data available.

---

[API](https://skmtc.dev/bigballsdata/apis/big-ball-sports-api.md) · [All operations](https://skmtc.dev/bigballsdata/apis/big-ball-sports-api/llms.txt) · [OpenAPI document](https://skmtc.dev/bigballsdata/apis/big-ball-sports-api/revisions/31fb54ac414e?raw)
