---
title: "NHL skater expected goals by on-ice strength, 2014-2025 (Edge)"
method: GET
path: "/v1/nhl/skaters/xg-splits"
tags: ["nhl"]
---

# NHL skater expected goals by on-ice strength, 2014-2025 (Edge)

`GET /v1/nhl/skaters/xg-splits`

## Request

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

Season-aggregate skater expected goals broken out by ON-ICE STRENGTH
STATE - even strength, power play, short-handed and everything else -
for twelve complete seasons, 2014 through 2025.

NOT a second answer to GET /v1/nhl/xg-leaders, which stays free and
unchanged. That route is OUR OWN shot-level model: current, updating
daily, and deliberately strength-state agnostic. This one adds the two
things that model does not have - ten further seasons of history, and
the strength-state split itself.

A FROZEN ARCHIVE, AND THE RESPONSE SAYS SO. These rows have no writer.
`data.as_of` carries the real data date for the exact slice served,
scoped to the same season and game_type, so staleness is readable from
the response rather than from a changelog. The 2026-27 season is not
present and will not be added. If you want the current season, use
GET /v1/nhl/xg-leaders.

`player.id` is a Big Balls player UUID where we have bridged the
athlete and `null` where we have not; `player.name` is always present.
Unbridged rows are returned rather than dropped, so filter on
`player.id` yourself if you need only bridged athletes.

Requires the Edge plan or higher.

## Query parameters

- `season` integer
- `game_type` 'regular' | 'playoffs'
- `situation` 'all' | '5on5' | '5on4' | '4on5' | 'other'
- `team` string
- `min_games` integer
- `limit` integer

## Response `200`

ok. `{ data, meta }` with a route-local cache stamp. `data.as_of` is the real data date for the slice served, taken from the rows themselves.

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

## Other responses

- `400`: Invalid query parameters.
- `403`: Plan does not include this capability. Requires Edge or higher; the floor is enforced before validation, so a 403 is returned even for an invalid query.
- `404`: No NHL xG season splits available for the requested game_type.

---

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