# Ice Hockey API complete reference

The whole Ice Hockey API API in one file: every endpoint, parameter, sample answer and guide.

- Base URL: `https://api.icehockeyapi.com/v1`
- Authentication: `X-API-Key: <key>` or `Authorization: Bearer <key>`, never in the address
- Site: https://icehockeyapi.com
- Endpoints: 48
- Generated: 2026-10-12 21:49 UTC
- This file: https://icehockeyapi.com/documentation/manual.md

## Before anything else

- Factual data only: results, box scores, standings, players and the odds that were offered. No predictions, ratings, tips or betting advice on any endpoint.
- Not in the data, on any plan: live in-play odds, injuries, transactions and contracts, video, and anything outside ice hockey.
- Every answer is JSON: `data` (the records) and `meta` (count, paging, your plan; `meta.live` on play by play while a game is on). Errors are `{"error": {"code", "message", "docs"}}`.
- Every time is UTC.

## Plans

| Plan | Price | Reads | Calls | A minute |
| --- | --- | --- | --- | --- |
| Free key | Free | yesterday, today and ahead | 50 a day | 10 |
| Live | $29 a month, $290 a year | yesterday, today and ahead, current seasons, odds | 100,000 a month | 60 |
| Archive | $49 a month, $490 a year | yesterday, today and ahead, every past season, odds | 200,000 a month | 60 |
| Complete | $79 a month, $790 a year | yesterday, today and ahead, current seasons, every past season, odds | 500,000 a month | 120 |

Prices and checkout: https://icehockeyapi.com/pricing

## Coverage

- Finished games: 898,345
- Leagues and competitions: 1,275
- Teams: 27,951
- Games with odds: 285,504
- First results: 

Counted from the data; `GET /v1/coverage` gives the same figures, never counted as a call.

## Endpoints

### Account and coverage

Your plan and calls, and what the data holds

#### `GET /v1/usage`

Your plan, calls used today and this period, limits, reset times and the data your plan covers.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/usage

Errors: unauthorized, rate_limited, quota_exceeded

Sample: `GET /v1/usage`

```json
{
    "data": {
        "plan": "Complete",
        "key_prefix": "docs",
        "calls_today": 0,
        "calls_this_period": 0,
        "allowance": 500000,
        "allowance_period": "month",
        "allowance_remaining": 500000,
        "allowance_resets_at": null,
        "requests_per_minute": 120,
        "covers": {
            "yesterday_today_and_ahead": true,
            "current_seasons": true,
            "past_seasons": true,
            "odds": true,
            "all_endpoints": true
        }
    },
    "meta": {
        "plan": "Complete"
    }
}
```

#### `GET /v1/coverage`

What the data holds: leagues, seasons, teams, finished games, games with detail and with odds, players and venues, and the first and last game dates.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/coverage

Errors: unauthorized, rate_limited, quota_exceeded

Sample: `GET /v1/coverage`

```json
{
    "data": {
        "leagues": 1275,
        "seasons": 11822,
        "teams": 27939,
        "games": 892519,
        "games_with_detail": 301119,
        "games_with_odds": 285508,
        "players": 112970,
        "venues": 1122,
        "first_game_date": "0000-00-00",
        "last_game_date": "2026-10-12"
    },
    "meta": {
        "counted_at": "2026-10-12T11:56:57Z",
        "plan": "Complete"
    }
}
```

#### `GET /v1/countries`

Every country with the number of leagues and teams it has.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/countries

Errors: unauthorized, rate_limited, quota_exceeded

Sample: `GET /v1/countries`

```json
{
    "data": [
        {
            "country": "Afriquesud",
            "leagues": 1,
            "teams": 2
        },
        {
            "country": "AlpeAdria",
            "leagues": 1,
            "teams": 5
        },
        {
            "country": "Armenia",
            "leagues": 2,
            "teams": 6
        }
    ],
    "meta": {
        "count": 100,
        "plan": "Complete"
    }
}
```

### Leagues

Every league and competition, its seasons and teams

#### `GET /v1/leagues`

Every league and competition, with country, level, age group and gender.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/leagues

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `country` | query | string | no | Country name, as the leagues list shows it |  |
| `kind` | query | enum: league, cup, friendly, international | no | The kind of competition. |  |
| `gender` | query | enum: men, women | no | Men's or women's. |  |
| `age` | query | enum: senior, junior | no | The age group. |  |
| `q` | query | string | no | Part of the league name |  |
| `page` | query | int | no | The page, from 1. |  |
| `per_page` | query | int | no | Records a page, default 50, at most 200. | `3` |
| `cursor` | query | string | no | meta.next_cursor from the previous answer. |  |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded

Sample: `GET /v1/leagues?per_page=3`

```json
{
    "data": [
        {
            "id": "lg_j19r6ymm",
            "name": "2. Liga",
            "country": "Czech Republic",
            "level": null,
            "age_group": "senior",
            "gender": "men",
            "kind": "league"
        },
        {
            "id": "lg_hqme005w",
            "name": "2. Liga",
            "country": "Slovakia",
            "level": null,
            "age_group": "senior",
            "gender": "men",
            "kind": "league"
        },
        {
            "id": "lg_kqera1j9",
            "name": "2. Liga - East",
            "country": "Czech Republic",
            "level": null,
            "age_group": "senior",
            "gender": "men",
            "kind": "league"
        }
    ],
    "meta": {
        "count": 3,
        "next_cursor": "eyJvIjozLCJuIjozfQ",
        "page": 1,
        "per_page": 3,
        "total": 1275,
        "total_pages": 425,
        "next_page": 2,
        "prev_page": null,
        "plan": "Complete"
    }
}
```

#### `GET /v1/leagues/{league_id}`

One league, with its number of seasons and its latest season.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/league

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `league_id` | path | id | yes | A league, from /v1/leagues. | `lg_6t11wec7` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found

Sample: `GET /v1/leagues/lg_6t11wec7`

```json
{
    "data": {
        "id": "lg_6t11wec7",
        "name": "NHL",
        "country": "North America",
        "level": 1,
        "age_group": "senior",
        "gender": "men",
        "kind": "league",
        "seasons": 109,
        "games": 73156,
        "latest_season": {
            "id": "ss_0n4zhhna",
            "league_id": "lg_6t11wec7",
            "label": "2026-27",
            "start_year": 2026,
            "first_game_date": "2026-09-19",
            "last_game_date": "2026-10-20",
            "games": 216
        }
    },
    "meta": {
        "plan": "Complete"
    }
}
```

#### `GET /v1/leagues/{league_id}/seasons`

Every season of a league, newest first, with first and last game dates and the number of games.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/league-seasons

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `league_id` | path | id | yes | A league, from /v1/leagues. | `lg_6t11wec7` |
| `page` | query | int | no | The page, from 1. |  |
| `per_page` | query | int | no | Records a page, default 50, at most 200. | `3` |
| `cursor` | query | string | no | meta.next_cursor from the previous answer. |  |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/leagues/lg_6t11wec7/seasons?per_page=3`

```json
{
    "data": [
        {
            "id": "ss_0n4zhhna",
            "league_id": "lg_6t11wec7",
            "label": "2026-27",
            "start_year": 2026,
            "first_game_date": "2026-09-19",
            "last_game_date": "2026-10-20",
            "games": 216
        },
        {
            "id": "ss_22q138a1",
            "league_id": "lg_6t11wec7",
            "label": "2025-26",
            "start_year": 2025,
            "first_game_date": "2025-09-20",
            "last_game_date": "2026-06-14",
            "games": 1528
        },
        {
            "id": "ss_8rfxbg9h",
            "league_id": "lg_6t11wec7",
            "label": "2024-25",
            "start_year": 2024,
            "first_game_date": "2024-09-21",
            "last_game_date": "2025-06-17",
            "games": 1511
        }
    ],
    "meta": {
        "count": 3,
        "next_cursor": "eyJvIjozLCJuIjozfQ",
        "page": 1,
        "per_page": 3,
        "total": 109,
        "total_pages": 37,
        "next_page": 2,
        "prev_page": null,
        "plan": "Complete"
    }
}
```

#### `GET /v1/leagues/{league_id}/teams`

Every team that has played in a league, most recent first, with its first and last season and games played.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/league-teams

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `league_id` | path | id | yes | A league, from /v1/leagues. | `lg_6t11wec7` |
| `page` | query | int | no | The page, from 1. |  |
| `per_page` | query | int | no | Records a page, default 50, at most 200. | `3` |
| `cursor` | query | string | no | meta.next_cursor from the previous answer. |  |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found

Sample: `GET /v1/leagues/lg_6t11wec7/teams?per_page=3`

```json
{
    "data": [
        {
            "id": "tm_n4551jwr",
            "name": "Anaheim Ducks",
            "short_name": "ANA",
            "country": "North America",
            "first_season_start": 1993,
            "last_season_start": 2026,
            "games": 2843
        },
        {
            "id": "tm_7vyb6jrq",
            "name": "Boston Bruins",
            "short_name": "BOS",
            "country": "North America",
            "first_season_start": 1924,
            "last_season_start": 2026,
            "games": 7912
        },
        {
            "id": "tm_fyjh4knt",
            "name": "Buffalo Sabres",
            "short_name": "BUF",
            "country": "North America",
            "first_season_start": 1970,
            "last_season_start": 2026,
            "games": 4763
        }
    ],
    "meta": {
        "count": 3,
        "next_cursor": "eyJvIjozLCJuIjozfQ",
        "page": 1,
        "per_page": 3,
        "total": 165,
        "total_pages": 55,
        "next_page": 2,
        "prev_page": null,
        "plan": "Complete"
    }
}
```

### Seasons

A season's games, table, playoffs, leaders and numbers

#### `GET /v1/seasons/{season_id}`

One season: its league, label, dates and number of games.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/season

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `season_id` | path | id | yes | A season, from /v1/leagues/{league_id}/seasons. | `ss_0n4zhhna` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/seasons/ss_0n4zhhna`

```json
{
    "data": {
        "id": "ss_0n4zhhna",
        "league_id": "lg_6t11wec7",
        "label": "2026-27",
        "start_year": 2026,
        "first_game_date": "2026-09-19",
        "last_game_date": "2026-10-20",
        "games": 216,
        "league_name": "NHL"
    },
    "meta": {
        "plan": "Complete"
    }
}
```

#### `GET /v1/seasons/{season_id}/games`

Every game of a season, by date, with the same fields as the games list.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/season-games

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `season_id` | path | id | yes | A season, from /v1/leagues/{league_id}/seasons. | `ss_0n4zhhna` |
| `stage` | query | enum: regular, playoffs, qualification, preseason, friendly, cup, other | no | Only this part of the season. |  |
| `status` | query | enum: scheduled, live, final, postponed, cancelled, awarded | no | Only games in this state. |  |
| `order` | query | enum: asc, desc | no | By date: asc (default) or desc |  |
| `page` | query | int | no | The page, from 1. |  |
| `per_page` | query | int | no | Records a page, default 50, at most 200. | `3` |
| `cursor` | query | string | no | meta.next_cursor from the previous answer. |  |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/seasons/ss_0n4zhhna/games?per_page=3`

```json
{
    "data": [
        {
            "id": "gm_pn5tzfde",
            "date": "2026-09-19",
            "start_time": "2026-09-19T23:00:00Z",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "season": {
                "id": "ss_0n4zhhna",
                "label": "2026-27"
            },
            "stage": "preseason",
            "status": "final",
            "home_team": {
                "id": "tm_ebpcz2zh",
                "name": "St. Louis Blues",
                "short_name": "STL",
                "country": "North America"
            },
            "away_team": {
                "id": "tm_r9h9wspe",
                "name": "Dallas Stars",
                "short_name": "DAL",
                "country": "North America"
            },
            "home_goals": 1,
            "away_goals": 2,
            "ended_in": "regulation",
            "venue": {
                "id": "vn_7sfywt5d",
                "name": "Enterprise Center",
                "city": null,
                "country": null
            },
            "attendance": 16314,
            "odds": []
        },
        {
            "id": "gm_zfp1g7ce",
            "date": "2026-09-19",
            "start_time": "2026-09-19T23:00:00Z",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "season": {
                "id": "ss_0n4zhhna",
                "label": "2026-27"
            },
            "stage": "preseason",
            "status": "final",
            "home_team": {
                "id": "tm_ep68nr7a",
                "name": "Toronto Maple Leafs",
                "short_name": "TOR",
                "country": "North America"
            },
            "away_team": {
                "id": "tm_nayf5h8v",
                "name": "Montréal Canadiens",
                "short_name": "MTL",
                "country": "North America"
            },
            "home_goals": 1,
            "away_goals": 4,
            "ended_in": "regulation",
            "venue": {
                "id": "vn_bvx51s77",
                "name": "Scotiabank Arena",
                "city": null,
                "country": null
            },
            "attendance": 16267,
            "odds": []
        },
        {
            "id": "gm_dbew995n",
            "date": "2026-09-19",
            "start_time": "2026-09-19T23:00:00Z",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "season": {
                "id": "ss_0n4zhhna",
                "label": "2026-27"
            },
            "stage": "preseason",
            "status": "final",
            "home_team": {
                "id": "tm_nayf5h8v",
                "name": "Montréal Canadiens",
                "short_name": "MTL",
                "country": "North America"
            },
            "away_team": {
                "id": "tm_ep68nr7a",
                "name": "Toronto Maple Leafs",
                "short_name": "TOR",
                "country": "North America"
            },
            "home_goals": 4,
            "away_goals": 3,
            "ended_in": "overtime",
            "venue": {
                "id": "vn_9dbmpecn",
                "name": "Centre Bell",
                "city": null,
                "country": null
            },
            "attendance": 20962,
            "odds": []
        }
    ],
    "meta": {
        "count": 3,
        "next_cursor": "eyJvIjozLCJuIjozfQ",
        "page": 1,
        "per_page": 3,
        "total": 172,
        "total_pages": 58,
        "next_page": 2,
        "prev_page": null,
        "plan": "Complete"
    }
}
```

#### `GET /v1/seasons/{season_id}/standings`

The regular season table built from the results: games, wins, losses, overtime and shootout results, goals and points. The free key reads current seasons.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/season-standings

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `season_id` | path | id | yes | A season, from /v1/leagues/{league_id}/seasons. | `ss_0n4zhhna` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/seasons/ss_0n4zhhna/standings`

```json
{
    "data": [
        {
            "position": 1,
            "team": {
                "id": "tm_24hh7x72",
                "name": "Carolina Hurricanes",
                "short_name": "CAR",
                "country": "North America"
            },
            "games": 7,
            "wins": 5,
            "losses": 2,
            "ties": 0,
            "overtime_wins": 1,
            "overtime_losses": 1,
            "shootout_wins": 0,
            "shootout_losses": 0,
            "goals_for": 27,
            "goals_against": 17,
            "points": 11,
            "goal_difference": 10
        },
        {
            "position": 2,
            "team": {
                "id": "tm_kpzj338v",
                "name": "New York Rangers",
                "short_name": "NYR",
                "country": "North America"
            },
            "games": 7,
            "wins": 5,
            "losses": 2,
            "ties": 0,
            "overtime_wins": 0,
            "overtime_losses": 0,
            "shootout_wins": 0,
            "shootout_losses": 0,
            "goals_for": 23,
            "goals_against": 13,
            "points": 10,
            "goal_difference": 10
        },
        {
            "position": 3,
            "team": {
                "id": "tm_7m42g3ej",
                "name": "Vegas Golden Knights",
                "short_name": "VGK",
                "country": "North America"
            },
            "games": 6,
            "wins": 5,
            "losses": 1,
            "ties": 0,
            "overtime_wins": 1,
            "overtime_losses": 0,
            "shootout_wins": 1,
            "shootout_losses": 0,
            "goals_for": 23,
            "goals_against": 14,
            "points": 10,
            "goal_difference": 9
        }
    ],
    "meta": {
        "count": 32,
        "season_id": "ss_0n4zhhna",
        "points_rule": "2-1-0",
        "note": "Built from the results; a league that used its own rules for a season may differ from its official table.",
        "plan": "Complete"
    }
}
```

#### `GET /v1/seasons/{season_id}/teams`

The teams that took part in a season, with their number of games. The free key reads current seasons.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/season-teams

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `season_id` | path | id | yes | A season, from /v1/leagues/{league_id}/seasons. | `ss_0n4zhhna` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/seasons/ss_0n4zhhna/teams`

```json
{
    "data": [
        {
            "id": "tm_n4551jwr",
            "name": "Anaheim Ducks",
            "short_name": "ANA",
            "country": "North America",
            "games": 13
        },
        {
            "id": "tm_7vyb6jrq",
            "name": "Boston Bruins",
            "short_name": "BOS",
            "country": "North America",
            "games": 14
        },
        {
            "id": "tm_fyjh4knt",
            "name": "Buffalo Sabres",
            "short_name": "BUF",
            "country": "North America",
            "games": 13
        }
    ],
    "meta": {
        "count": 32,
        "plan": "Complete"
    }
}
```

#### `GET /v1/seasons/{season_id}/playoffs`

Playoff series in the order they started: the two teams, wins each, the winner and every game. The free key reads current seasons.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/season-playoffs

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `season_id` | path | id | yes | A season, from /v1/leagues/{league_id}/seasons. | `ss_0n4zhhna` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/seasons/ss_0n4zhhna/playoffs`

```json
{
    "data": [],
    "meta": {
        "count": 0,
        "season_id": "ss_0n4zhhna",
        "plan": "Complete"
    }
}
```

#### `GET /v1/seasons/{season_id}/leaders` (paid plans)

The regular season leaders in points, goals, assists, plus-minus, penalty minutes or shots, for leagues with game detail.

Plans: Live and up. Page: https://icehockeyapi.com/documentation/season-leaders

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `season_id` | path | id | yes | A season, from /v1/leagues/{league_id}/seasons. | `ss_0n4zhhna` |
| `category` | query | enum: points, goals, assists, plus_minus, penalty_minutes, shots | no | What to rank by: points (default) |  |
| `limit` | query | int | no | How many players: 20 (default) up to 100 |  |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/seasons/ss_0n4zhhna/leaders`

```json
{
    "data": [
        {
            "rank": 1,
            "player": {
                "id": "pl_ass089c0",
                "name": "Connor McDavid"
            },
            "games": 5,
            "goals": 3,
            "assists": 10,
            "points": 13,
            "plus_minus": 12,
            "penalty_minutes": 0,
            "shots": 12
        },
        {
            "rank": 2,
            "player": {
                "id": "pl_dmfjbx5w",
                "name": "Evan Bouchard"
            },
            "games": 5,
            "goals": 6,
            "assists": 6,
            "points": 12,
            "plus_minus": 12,
            "penalty_minutes": 0,
            "shots": 17
        },
        {
            "rank": 3,
            "player": {
                "id": "pl_gxtgwh9s",
                "name": "Jack Eichel"
            },
            "games": 6,
            "goals": 3,
            "assists": 9,
            "points": 12,
            "plus_minus": 5,
            "penalty_minutes": 2,
            "shots": 18
        }
    ],
    "meta": {
        "count": 20,
        "category": "points",
        "season_id": "ss_0n4zhhna",
        "plan": "Complete"
    }
}
```

#### `GET /v1/seasons/{season_id}/summary` (paid plans)

A season in numbers: goals a game, home and away wins, overtime and shootout share, average attendance and the biggest win.

Plans: Live and up. Page: https://icehockeyapi.com/documentation/season-summary

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `season_id` | path | id | yes | A season, from /v1/leagues/{league_id}/seasons. | `ss_0n4zhhna` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/seasons/ss_0n4zhhna/summary`

```json
{
    "data": {
        "season_id": "ss_0n4zhhna",
        "league_name": "NHL",
        "label": "2026-27",
        "games": 151,
        "first_game_date": "2026-09-19",
        "last_game_date": "2026-10-11",
        "goals": 885,
        "goals_per_game": 5.86,
        "home_win_pct": 59.6,
        "away_win_pct": 40.4,
        "tie_pct": 0.0,
        "overtime_pct": 14.6,
        "shootout_pct": 7.9,
        "average_attendance": 16571,
        "most_goals_in_a_game": 16,
        "biggest_win": {
            "game_id": "gm_j3cndrnw",
            "home_goals": 10,
            "away_goals": 0
        }
    },
    "meta": {
        "plan": "Complete"
    }
}
```

### Teams

Teams, their games, seasons, rosters and meetings

#### `GET /v1/teams`

Teams, by name, country, or the league or season they played in.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/teams

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `league_id` | query | id | no | A league, from /v1/leagues. | `lg_6t11wec7` |
| `season_id` | query | id | no | A season, from /v1/leagues/{league_id}/seasons. |  |
| `country` | query | string | no | A country. |  |
| `q` | query | string | no | Part of the team name | `New` |
| `page` | query | int | no | The page, from 1. |  |
| `per_page` | query | int | no | Records a page, default 50, at most 200. | `3` |
| `cursor` | query | string | no | meta.next_cursor from the previous answer. |  |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded

Sample: `GET /v1/teams?league_id=lg_6t11wec7&q=New&per_page=3`

```json
{
    "data": [
        {
            "id": "tm_vxt1q0ha",
            "name": "New Jersey Devils",
            "short_name": "NJD",
            "country": "North America"
        },
        {
            "id": "tm_k715zbf3",
            "name": "New York Americans",
            "short_name": "NYA",
            "country": "North America"
        },
        {
            "id": "tm_zy5w8596",
            "name": "New York Islanders",
            "short_name": "NYI",
            "country": "North America"
        }
    ],
    "meta": {
        "count": 3,
        "next_cursor": "eyJvIjozLCJuIjozfQ",
        "page": 1,
        "per_page": 3,
        "total": 4,
        "total_pages": 2,
        "next_page": 2,
        "prev_page": null,
        "plan": "Complete"
    }
}
```

#### `GET /v1/teams/{team_id}`

One team: its name, short name, country and the leagues it has played in.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/team

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `team_id` | path | id | yes | A team, from /v1/teams. | `tm_kpzj338v` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found

Sample: `GET /v1/teams/tm_kpzj338v`

```json
{
    "data": {
        "id": "tm_kpzj338v",
        "name": "New York Rangers",
        "short_name": "NYR",
        "country": "North America",
        "leagues": [
            {
                "id": "lg_6t11wec7",
                "name": "NHL",
                "first_season_start": 1926,
                "last_season_start": 2026,
                "games": 7697
            }
        ]
    },
    "meta": {
        "plan": "Complete"
    }
}
```

#### `GET /v1/teams/{team_id}/games`

A team's results and fixtures by date, optionally for one season or a date range.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/team-games

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `team_id` | path | id | yes | A team, from /v1/teams. | `tm_kpzj338v` |
| `season_id` | query | id | no | A season, from /v1/leagues/{league_id}/seasons. | `ss_0n4zhhna` |
| `from` | query | date | no | First day of a range |  |
| `to` | query | date | no | Last day of a range |  |
| `stage` | query | enum: regular, playoffs, qualification, preseason, friendly, cup, other | no | Only this part of the season. |  |
| `status` | query | enum: scheduled, live, final, postponed, cancelled, awarded | no | Only games in this state. |  |
| `order` | query | enum: asc, desc | no | By date: asc (default) or desc |  |
| `page` | query | int | no | The page, from 1. |  |
| `per_page` | query | int | no | Records a page, default 50, at most 200. | `3` |
| `cursor` | query | string | no | meta.next_cursor from the previous answer. |  |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/teams/tm_kpzj338v/games?season_id=ss_0n4zhhna&per_page=3`

```json
{
    "data": [
        {
            "id": "gm_kx9rchmc",
            "date": "2026-09-21",
            "start_time": "2026-09-21T23:00:00Z",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "season": {
                "id": "ss_0n4zhhna",
                "label": "2026-27"
            },
            "stage": "preseason",
            "status": "final",
            "home_team": {
                "id": "tm_vxt1q0ha",
                "name": "New Jersey Devils",
                "short_name": "NJD",
                "country": "North America"
            },
            "away_team": {
                "id": "tm_kpzj338v",
                "name": "New York Rangers",
                "short_name": "NYR",
                "country": "North America"
            },
            "home_goals": 3,
            "away_goals": 2,
            "ended_in": "regulation",
            "venue": {
                "id": "vn_98eh74ka",
                "name": "Prudential Center",
                "city": null,
                "country": null
            },
            "attendance": 11156,
            "odds": []
        },
        {
            "id": "gm_vcs066ba",
            "date": "2026-09-22",
            "start_time": "2026-09-22T23:00:00Z",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "season": {
                "id": "ss_0n4zhhna",
                "label": "2026-27"
            },
            "stage": "preseason",
            "status": "final",
            "home_team": {
                "id": "tm_kpzj338v",
                "name": "New York Rangers",
                "short_name": "NYR",
                "country": "North America"
            },
            "away_team": {
                "id": "tm_zy5w8596",
                "name": "New York Islanders",
                "short_name": "NYI",
                "country": "North America"
            },
            "home_goals": 3,
            "away_goals": 4,
            "ended_in": "regulation",
            "venue": {
                "id": "vn_aymp6wpr",
                "name": "Madison Square Garden",
                "city": null,
                "country": null
            },
            "attendance": 16603,
            "odds": []
        },
        {
            "id": "gm_v7m24nbp",
            "date": "2026-09-24",
            "start_time": "2026-09-24T23:00:00Z",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "season": {
                "id": "ss_0n4zhhna",
                "label": "2026-27"
            },
            "stage": "preseason",
            "status": "final",
            "home_team": {
                "id": "tm_kpzj338v",
                "name": "New York Rangers",
                "short_name": "NYR",
                "country": "North America"
            },
            "away_team": {
                "id": "tm_vxt1q0ha",
                "name": "New Jersey Devils",
                "short_name": "NJD",
                "country": "North America"
            },
            "home_goals": 4,
            "away_goals": 3,
            "ended_in": "shootout",
            "venue": {
                "id": "vn_aymp6wpr",
                "name": "Madison Square Garden",
                "city": null,
                "country": null
            },
            "attendance": 16078,
            "odds": []
        }
    ],
    "meta": {
        "count": 3,
        "next_cursor": "eyJvIjozLCJuIjozfQ",
        "page": 1,
        "per_page": 3,
        "total": 12,
        "total_pages": 4,
        "next_page": 2,
        "prev_page": null,
        "plan": "Complete"
    }
}
```

#### `GET /v1/teams/{team_id}/seasons` (paid plans)

A team's regular season record, season by season, newest first, with points under each league's rule.

Plans: Live and up. Page: https://icehockeyapi.com/documentation/team-seasons

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `team_id` | path | id | yes | A team, from /v1/teams. | `tm_kpzj338v` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/teams/tm_kpzj338v/seasons`

```json
{
    "data": [
        {
            "season_id": "ss_0n4zhhna",
            "label": "2026-27",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "games": 7,
            "wins": 5,
            "losses": 2,
            "ties": 0,
            "overtime_wins": 0,
            "overtime_losses": 0,
            "shootout_wins": 0,
            "shootout_losses": 0,
            "goals_for": 23,
            "goals_against": 13,
            "points": 10,
            "goal_difference": 10,
            "points_rule": "2-1-0"
        },
        {
            "season_id": "ss_22q138a1",
            "label": "2025-26",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "games": 82,
            "wins": 34,
            "losses": 48,
            "ties": 0,
            "overtime_wins": 6,
            "overtime_losses": 8,
            "shootout_wins": 3,
            "shootout_losses": 1,
            "goals_for": 238,
            "goals_against": 250,
            "points": 77,
            "goal_difference": -12,
            "points_rule": "2-1-0"
        },
        {
            "season_id": "ss_8rfxbg9h",
            "label": "2024-25",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "games": 82,
            "wins": 39,
            "losses": 43,
            "ties": 0,
            "overtime_wins": 3,
            "overtime_losses": 7,
            "shootout_wins": 1,
            "shootout_losses": 0,
            "goals_for": 256,
            "goals_against": 255,
            "points": 85,
            "goal_difference": 1,
            "points_rule": "2-1-0"
        }
    ],
    "meta": {
        "count": 100,
        "team_id": "tm_kpzj338v",
        "stage": "regular season",
        "plan": "Complete"
    }
}
```

#### `GET /v1/teams/{team_id}/roster` (paid plans)

The players who dressed for a team in a season, with number, position and games, for leagues with game detail.

Plans: Live and up. Page: https://icehockeyapi.com/documentation/team-roster

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `team_id` | path | id | yes | A team, from /v1/teams. | `tm_kpzj338v` |
| `season_id` | query | id | yes | A season, from /v1/leagues/{league_id}/seasons. | `ss_0n4zhhna` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/teams/tm_kpzj338v/roster?season_id=ss_0n4zhhna`

```json
{
    "data": [
        {
            "player": {
                "id": "pl_5t0tyjwh",
                "name": "Gabe Perreault"
            },
            "number": "94",
            "position": "right_wing",
            "games": 10
        },
        {
            "player": {
                "id": "pl_90ce8vqz",
                "name": "Alberts Smits"
            },
            "number": "63",
            "position": "defense",
            "games": 10
        },
        {
            "player": {
                "id": "pl_9phqbmpc",
                "name": "Mika Zibanejad"
            },
            "number": "93",
            "position": "center",
            "games": 9
        }
    ],
    "meta": {
        "count": 45,
        "team_id": "tm_kpzj338v",
        "season_id": "ss_0n4zhhna",
        "plan": "Complete"
    }
}
```

#### `GET /v1/teams/{team_id}/stats` (paid plans)

A team's regular season in one season: overall, home and away records, shots a game and average home attendance.

Plans: Live and up. Page: https://icehockeyapi.com/documentation/team-stats

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `team_id` | path | id | yes | A team, from /v1/teams. | `tm_kpzj338v` |
| `season_id` | query | id | yes | A season, from /v1/leagues/{league_id}/seasons. | `ss_0n4zhhna` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/teams/tm_kpzj338v/stats?season_id=ss_0n4zhhna`

```json
{
    "data": {
        "team": {
            "id": "tm_kpzj338v",
            "name": "New York Rangers",
            "short_name": "NYR",
            "country": "North America"
        },
        "season_id": "ss_0n4zhhna",
        "label": "2026-27",
        "overall": {
            "games": 7,
            "wins": 5,
            "losses": 2,
            "ties": 0,
            "overtime_wins": 0,
            "overtime_losses": 0,
            "shootout_wins": 0,
            "shootout_losses": 0,
            "goals_for": 23,
            "goals_against": 13,
            "points": 10,
            "goal_difference": 10
        },
        "home": {
            "games": 4,
            "wins": 4,
            "losses": 0,
            "ties": 0,
            "overtime_wins": 0,
            "overtime_losses": 0,
            "shootout_wins": 0,
            "shootout_losses": 0,
            "goals_for": 20,
            "goals_against": 7,
            "points": 8,
            "goal_difference": 13
        },
        "away": {
            "games": 3,
            "wins": 1,
            "losses": 2,
            "ties": 0,
            "overtime_wins": 0,
            "overtime_losses": 0,
            "shootout_wins": 0,
            "shootout_losses": 0,
            "goals_for": 3,
            "goals_against": 6,
            "points": 2,
            "goal_difference": -3
        },
        "shots_for_per_game": 23.3,
        "shots_against_per_game": 23.7,
        "average_home_attendance": 17796
    },
    "meta": {
        "points_rule": "2-1-0",
        "stage": "regular season",
        "plan": "Complete"
    }
}
```

#### `GET /v1/teams/{team_id}/head-to-head/{other_id}` (paid plans)

Every meeting of two teams your plan covers, newest first, with the first team's record against the second.

Plans: Live and up. Page: https://icehockeyapi.com/documentation/head-to-head

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `team_id` | path | id | yes | A team, from /v1/teams. | `tm_kpzj338v` |
| `other_id` | path | id | yes | The other team's | `tm_ampzcavy` |
| `page` | query | int | no | The page, from 1. |  |
| `per_page` | query | int | no | Records a page, default 50, at most 200. | `3` |
| `cursor` | query | string | no | meta.next_cursor from the previous answer. |  |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/teams/tm_kpzj338v/head-to-head/tm_ampzcavy?per_page=3`

```json
{
    "data": [
        {
            "id": "gm_seyr9d88",
            "date": "2026-10-11",
            "start_time": "2026-10-11T22:00:00Z",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "season": {
                "id": "ss_0n4zhhna",
                "label": "2026-27"
            },
            "stage": "regular",
            "status": "final",
            "home_team": {
                "id": "tm_kpzj338v",
                "name": "New York Rangers",
                "short_name": "NYR",
                "country": "North America"
            },
            "away_team": {
                "id": "tm_ampzcavy",
                "name": "Vancouver Canucks",
                "short_name": "VAN",
                "country": "North America"
            },
            "home_goals": 6,
            "away_goals": 2,
            "ended_in": "regulation",
            "venue": {
                "id": "vn_aymp6wpr",
                "name": "Madison Square Garden",
                "city": null,
                "country": null
            },
            "attendance": null
        },
        {
            "id": "gm_t1petegv",
            "date": "2025-12-16",
            "start_time": "2025-12-17T00:00:00Z",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "season": {
                "id": "ss_22q138a1",
                "label": "2025-26"
            },
            "stage": "regular",
            "status": "final",
            "home_team": {
                "id": "tm_kpzj338v",
                "name": "New York Rangers",
                "short_name": "NYR",
                "country": "North America"
            },
            "away_team": {
                "id": "tm_ampzcavy",
                "name": "Vancouver Canucks",
                "short_name": "VAN",
                "country": "North America"
            },
            "home_goals": 0,
            "away_goals": 3,
            "ended_in": "regulation",
            "venue": {
                "id": "vn_aymp6wpr",
                "name": "Madison Square Garden",
                "city": null,
                "country": null
            },
            "attendance": 17452
        },
        {
            "id": "gm_r1hzkhjf",
            "date": "2025-10-28",
            "start_time": "2025-10-29T02:00:00Z",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "season": {
                "id": "ss_22q138a1",
                "label": "2025-26"
            },
            "stage": "regular",
            "status": "final",
            "home_team": {
                "id": "tm_ampzcavy",
                "name": "Vancouver Canucks",
                "short_name": "VAN",
                "country": "North America"
            },
            "away_team": {
                "id": "tm_kpzj338v",
                "name": "New York Rangers",
                "short_name": "NYR",
                "country": "North America"
            },
            "home_goals": 0,
            "away_goals": 2,
            "ended_in": "regulation",
            "venue": {
                "id": "vn_egvm20q6",
                "name": "Rogers Arena",
                "city": null,
                "country": null
            },
            "attendance": 18919
        }
    ],
    "meta": {
        "count": 3,
        "next_cursor": "eyJvIjozLCJuIjozfQ",
        "page": 1,
        "per_page": 3,
        "total": 144,
        "total_pages": 48,
        "next_page": 2,
        "prev_page": null,
        "record": {
            "team": {
                "id": "tm_kpzj338v",
                "name": "New York Rangers",
                "short_name": "NYR",
                "country": "North America"
            },
            "against": {
                "id": "tm_ampzcavy",
                "name": "Vancouver Canucks",
                "short_name": "VAN",
                "country": "North America"
            },
            "games": 144,
            "wins": 92,
            "losses": 44,
            "ties": 8,
            "overtime_wins": 4,
            "overtime_losses": 2,
            "shootout_wins": 1,
            "shootout_losses": 1,
            "goals_for": 558,
            "goals_against": 415,
            "goal_difference": 143
        },
        "plan": "Complete"
    }
}
```

### Games

Find games and read results

#### `GET /v1/games`

Games by date, date range, league, season or team: teams, score, how it ended, venue and attendance.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/games

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `date` | query | date | no | One day, YYYY-MM-DD | `2026-10-11` |
| `from` | query | date | no | First day of a range |  |
| `to` | query | date | no | Last day of a range |  |
| `league_id` | query | id | no | A league, from /v1/leagues. | `lg_6t11wec7` |
| `season_id` | query | id | no | A season, from /v1/leagues/{league_id}/seasons. |  |
| `team_id` | query | id | no | A team, from /v1/teams. | `tm_kpzj338v` |
| `status` | query | enum: scheduled, live, final, postponed, cancelled, awarded | no | Only games in this state. |  |
| `stage` | query | enum: regular, playoffs, qualification, preseason, friendly, cup, other | no | Only this part of the season. |  |
| `order` | query | enum: asc, desc | no | By date: asc (default) or desc |  |
| `page` | query | int | no | The page, from 1. |  |
| `per_page` | query | int | no | Records a page, default 50, at most 200. | `3` |
| `cursor` | query | string | no | meta.next_cursor from the previous answer. |  |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, upgrade_required

Sample: `GET /v1/games?date=2026-10-11&league_id=lg_6t11wec7&team_id=tm_kpzj338v&per_page=3`

```json
{
    "data": [
        {
            "id": "gm_seyr9d88",
            "date": "2026-10-11",
            "start_time": "2026-10-11T22:00:00Z",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "season": {
                "id": "ss_0n4zhhna",
                "label": "2026-27"
            },
            "stage": "regular",
            "status": "final",
            "home_team": {
                "id": "tm_kpzj338v",
                "name": "New York Rangers",
                "short_name": "NYR",
                "country": "North America"
            },
            "away_team": {
                "id": "tm_ampzcavy",
                "name": "Vancouver Canucks",
                "short_name": "VAN",
                "country": "North America"
            },
            "home_goals": 6,
            "away_goals": 2,
            "ended_in": "regulation",
            "venue": {
                "id": "vn_aymp6wpr",
                "name": "Madison Square Garden",
                "city": null,
                "country": null
            },
            "attendance": null,
            "odds": [
                {
                    "market": "three_way",
                    "price": "average",
                    "format": "decimal",
                    "home": 1.6,
                    "draw": 4.68,
                    "away": 4.47
                }
            ]
        }
    ],
    "meta": {
        "count": 1,
        "next_cursor": null,
        "page": 1,
        "per_page": 3,
        "total": 1,
        "total_pages": 1,
        "next_page": null,
        "prev_page": null,
        "plan": "Complete"
    }
}
```

#### `GET /v1/games/upcoming`

Scheduled games from today over the next two days, optionally for one league.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/games-upcoming

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `league_id` | query | id | no | A league, from /v1/leagues. |  |
| `page` | query | int | no | The page, from 1. |  |
| `per_page` | query | int | no | Records a page, default 50, at most 200. | `3` |
| `cursor` | query | string | no | meta.next_cursor from the previous answer. |  |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, upgrade_required

Sample: `GET /v1/games/upcoming?per_page=3`

```json
{
    "data": [
        {
            "id": "gm_a39695k0",
            "date": "2026-10-12",
            "start_time": "2026-10-12T10:00:00Z",
            "league": {
                "id": "lg_g8ks82ha",
                "name": "MHL"
            },
            "season": {
                "id": "ss_k6m0n6es",
                "label": "2026-27"
            },
            "stage": "regular",
            "status": "scheduled",
            "home_team": {
                "id": "tm_n337tjyv",
                "name": "AKM-Junior",
                "short_name": null,
                "country": "Russia"
            },
            "away_team": {
                "id": "tm_vmftvh5y",
                "name": "Tolpar",
                "short_name": null,
                "country": "Russia"
            },
            "home_goals": null,
            "away_goals": null,
            "ended_in": null,
            "venue": {
                "id": "vn_qhadn3j5",
                "name": "Tula",
                "city": null,
                "country": "Russia"
            },
            "attendance": null
        },
        {
            "id": "gm_n1vcars0",
            "date": "2026-10-12",
            "start_time": "2026-10-12T11:30:00Z",
            "league": {
                "id": "lg_r92era2x",
                "name": "KHL"
            },
            "season": {
                "id": "ss_ppv6ze7r",
                "label": "2026-27"
            },
            "stage": "regular",
            "status": "scheduled",
            "home_team": {
                "id": "tm_5kz2bqyf",
                "name": "Salavat Ufa",
                "short_name": null,
                "country": "Russia"
            },
            "away_team": {
                "id": "tm_gkykh37t",
                "name": "Niznekamsk",
                "short_name": null,
                "country": "Russia"
            },
            "home_goals": null,
            "away_goals": null,
            "ended_in": null,
            "venue": {
                "id": "vn_xpphqp3f",
                "name": "Ufa",
                "city": null,
                "country": "Russia"
            },
            "attendance": null
        },
        {
            "id": "gm_csme34nr",
            "date": "2026-10-12",
            "start_time": "2026-10-12T12:15:00Z",
            "league": {
                "id": "lg_pmd5f6q0",
                "name": "VHL"
            },
            "season": {
                "id": "ss_vtz2s7ve",
                "label": "2026-27"
            },
            "stage": "regular",
            "status": "scheduled",
            "home_team": {
                "id": "tm_sqxbhx18",
                "name": "HC Norilsk",
                "short_name": null,
                "country": "Russia"
            },
            "away_team": {
                "id": "tm_78phpemv",
                "name": "Perm",
                "short_name": null,
                "country": "Russia"
            },
            "home_goals": null,
            "away_goals": null,
            "ended_in": null,
            "venue": null,
            "attendance": null
        }
    ],
    "meta": {
        "count": 3,
        "next_cursor": "eyJvIjozLCJuIjozfQ",
        "page": 1,
        "per_page": 3,
        "total": 93,
        "total_pages": 31,
        "next_page": 2,
        "prev_page": null,
        "plan": "Complete"
    }
}
```

#### `GET /v1/games/{game_id}`

One game, with its odds on paid plans.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/game

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `game_id` | path | id | yes | A game, from /v1/games. | `gm_seyr9d88` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/games/gm_seyr9d88`

```json
{
    "data": {
        "id": "gm_seyr9d88",
        "date": "2026-10-11",
        "start_time": "2026-10-11T22:00:00Z",
        "league": {
            "id": "lg_6t11wec7",
            "name": "NHL"
        },
        "season": {
            "id": "ss_0n4zhhna",
            "label": "2026-27"
        },
        "stage": "regular",
        "status": "final",
        "home_team": {
            "id": "tm_kpzj338v",
            "name": "New York Rangers",
            "short_name": "NYR",
            "country": "North America"
        },
        "away_team": {
            "id": "tm_ampzcavy",
            "name": "Vancouver Canucks",
            "short_name": "VAN",
            "country": "North America"
        },
        "home_goals": 6,
        "away_goals": 2,
        "ended_in": "regulation",
        "venue": {
            "id": "vn_aymp6wpr",
            "name": "Madison Square Garden",
            "city": null,
            "country": null
        },
        "attendance": null,
        "odds": [
            {
                "market": "three_way",
                "price": "average",
                "format": "decimal",
                "home": 1.6,
                "draw": 4.68,
                "away": 4.47
            }
        ]
    },
    "meta": {
        "plan": "Complete"
    }
}
```

#### `GET /v1/results/yesterday`

Every finished game from yesterday (UTC), on every plan.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/results-yesterday

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `league_id` | query | id | no | A league, from /v1/leagues. |  |
| `page` | query | int | no | The page, from 1. |  |
| `per_page` | query | int | no | Records a page, default 50, at most 200. | `3` |
| `cursor` | query | string | no | meta.next_cursor from the previous answer. |  |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded

Sample: `GET /v1/results/yesterday?per_page=3`

```json
{
    "data": [
        {
            "id": "gm_00hypvw3",
            "date": "2026-10-11",
            "start_time": "2026-10-10T23:15:00Z",
            "league": {
                "id": "lg_t4ne8mae",
                "name": "AHL"
            },
            "season": {
                "id": "ss_w9df0xyz",
                "label": "2026-27"
            },
            "stage": "regular",
            "status": "final",
            "home_team": {
                "id": "tm_mzy6exdh",
                "name": "Iowa Wild",
                "short_name": null,
                "country": "North America"
            },
            "away_team": {
                "id": "tm_3zmda0ak",
                "name": "Rockford IceHogs",
                "short_name": null,
                "country": "North America"
            },
            "home_goals": 4,
            "away_goals": 3,
            "ended_in": "regulation",
            "venue": {
                "id": "vn_3qweppdy",
                "name": "Casey’s Center",
                "city": null,
                "country": "North America"
            },
            "attendance": null,
            "odds": [
                {
                    "market": "three_way",
                    "price": "average",
                    "format": "decimal",
                    "home": 2.63,
                    "draw": 4.13,
                    "away": 2.15
                }
            ]
        },
        {
            "id": "gm_n8y430cm",
            "date": "2026-10-11",
            "start_time": "2026-10-10T23:15:00Z",
            "league": {
                "id": "lg_t4ne8mae",
                "name": "AHL"
            },
            "season": {
                "id": "ss_w9df0xyz",
                "label": "2026-27"
            },
            "stage": "regular",
            "status": "final",
            "home_team": {
                "id": "tm_7cgrd9sf",
                "name": "Milwaukee Admirals",
                "short_name": null,
                "country": "North America"
            },
            "away_team": {
                "id": "tm_grvww2ay",
                "name": "Grand Rapids Griffins",
                "short_name": null,
                "country": "North America"
            },
            "home_goals": 4,
            "away_goals": 1,
            "ended_in": "regulation",
            "venue": {
                "id": "vn_rzjaw5xh",
                "name": "UW-Milwaukee Panther Arena",
                "city": null,
                "country": "North America"
            },
            "attendance": null,
            "odds": [
                {
                    "market": "three_way",
                    "price": "average",
                    "format": "decimal",
                    "home": 1.92,
                    "draw": 4.18,
                    "away": 3.06
                }
            ]
        },
        {
            "id": "gm_9ekvtgj0",
            "date": "2026-10-11",
            "start_time": "2026-10-10T23:15:00Z",
            "league": {
                "id": "lg_t4ne8mae",
                "name": "AHL"
            },
            "season": {
                "id": "ss_w9df0xyz",
                "label": "2026-27"
            },
            "stage": "regular",
            "status": "final",
            "home_team": {
                "id": "tm_b2aky134",
                "name": "Syracuse Crunch",
                "short_name": null,
                "country": "North America"
            },
            "away_team": {
                "id": "tm_knn655fh",
                "name": "Belleville Senators",
                "short_name": null,
                "country": "North America"
            },
            "home_goals": 2,
            "away_goals": 3,
            "ended_in": "regulation",
            "venue": {
                "id": "vn_kya61xk6",
                "name": "Upstate Medical University Arena",
                "city": null,
                "country": "North America"
            },
            "attendance": null,
            "odds": [
                {
                    "market": "three_way",
                    "price": "average",
                    "format": "decimal",
                    "home": 3.4,
                    "draw": 4.39,
                    "away": 1.77
                }
            ]
        }
    ],
    "meta": {
        "count": 3,
        "next_cursor": "eyJvIjozLCJuIjozfQ",
        "page": 1,
        "per_page": 3,
        "total": 207,
        "total_pages": 69,
        "next_page": 2,
        "prev_page": null,
        "date": "2026-10-11",
        "plan": "Complete"
    }
}
```

#### `GET /v1/results`

Finished games for one day or a date range, optionally for one league. Give date, or from (and to).

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/results

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `date` | query | date | no | One day, YYYY-MM-DD | `2026-10-11` |
| `from` | query | date | no | First day of a range |  |
| `to` | query | date | no | Last day of a range |  |
| `league_id` | query | id | no | A league, from /v1/leagues. | `lg_6t11wec7` |
| `stage` | query | enum: regular, playoffs, qualification, preseason, friendly, cup, other | no | Only this part of the season. |  |
| `order` | query | enum: asc, desc | no | By date: asc (default) or desc |  |
| `page` | query | int | no | The page, from 1. |  |
| `per_page` | query | int | no | Records a page, default 50, at most 200. | `3` |
| `cursor` | query | string | no | meta.next_cursor from the previous answer. |  |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded

Sample: `GET /v1/results?date=2026-10-11&league_id=lg_6t11wec7&per_page=3`

```json
{
    "data": [
        {
            "id": "gm_sxe029v9",
            "date": "2026-10-11",
            "start_time": "2026-10-11T21:00:00Z",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "season": {
                "id": "ss_0n4zhhna",
                "label": "2026-27"
            },
            "stage": "regular",
            "status": "final",
            "home_team": {
                "id": "tm_rt3xcyx4",
                "name": "Washington Capitals",
                "short_name": "WSH",
                "country": "North America"
            },
            "away_team": {
                "id": "tm_dphk633j",
                "name": "Seattle Kraken",
                "short_name": "SEA",
                "country": "North America"
            },
            "home_goals": 3,
            "away_goals": 5,
            "ended_in": "regulation",
            "venue": {
                "id": "vn_kwrwver8",
                "name": "Capital One Arena",
                "city": null,
                "country": null
            },
            "attendance": null,
            "odds": [
                {
                    "market": "three_way",
                    "price": "average",
                    "format": "decimal",
                    "home": 1.79,
                    "draw": 4.45,
                    "away": 3.58
                }
            ]
        },
        {
            "id": "gm_seyr9d88",
            "date": "2026-10-11",
            "start_time": "2026-10-11T22:00:00Z",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "season": {
                "id": "ss_0n4zhhna",
                "label": "2026-27"
            },
            "stage": "regular",
            "status": "final",
            "home_team": {
                "id": "tm_kpzj338v",
                "name": "New York Rangers",
                "short_name": "NYR",
                "country": "North America"
            },
            "away_team": {
                "id": "tm_ampzcavy",
                "name": "Vancouver Canucks",
                "short_name": "VAN",
                "country": "North America"
            },
            "home_goals": 6,
            "away_goals": 2,
            "ended_in": "regulation",
            "venue": {
                "id": "vn_aymp6wpr",
                "name": "Madison Square Garden",
                "city": null,
                "country": null
            },
            "attendance": null,
            "odds": [
                {
                    "market": "three_way",
                    "price": "average",
                    "format": "decimal",
                    "home": 1.6,
                    "draw": 4.68,
                    "away": 4.47
                }
            ]
        },
        {
            "id": "gm_8b73gzzc",
            "date": "2026-10-11",
            "start_time": "2026-10-11T23:00:00Z",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "season": {
                "id": "ss_0n4zhhna",
                "label": "2026-27"
            },
            "stage": "regular",
            "status": "final",
            "home_team": {
                "id": "tm_qfd8n54x",
                "name": "Philadelphia Flyers",
                "short_name": "PHI",
                "country": "North America"
            },
            "away_team": {
                "id": "tm_24hh7x72",
                "name": "Carolina Hurricanes",
                "short_name": "CAR",
                "country": "North America"
            },
            "home_goals": 1,
            "away_goals": 4,
            "ended_in": "regulation",
            "venue": {
                "id": "vn_rv68rp77",
                "name": "Xfinity Mobile Arena",
                "city": null,
                "country": null
            },
            "attendance": null,
            "odds": []
        }
    ],
    "meta": {
        "count": 3,
        "next_cursor": null,
        "page": 1,
        "per_page": 3,
        "total": 3,
        "total_pages": 1,
        "next_page": null,
        "prev_page": null,
        "plan": "Complete"
    }
}
```

### Inside a game

Everything that happened on the ice

#### `GET /v1/games/{game_id}/periods`

Goals and shots for each side, period by period, overtime and shootout included.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/game-periods

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `game_id` | path | id | yes | A game, from /v1/games. | `gm_seyr9d88` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/games/gm_seyr9d88/periods`

```json
{
    "data": [
        {
            "period": 1,
            "kind": "regulation",
            "home_goals": 1,
            "away_goals": 1,
            "home_shots": 5,
            "away_shots": 7
        },
        {
            "period": 2,
            "kind": "regulation",
            "home_goals": 2,
            "away_goals": 1,
            "home_shots": 10,
            "away_shots": 10
        },
        {
            "period": 3,
            "kind": "regulation",
            "home_goals": 3,
            "away_goals": 0,
            "home_shots": 10,
            "away_shots": 4
        }
    ],
    "meta": {
        "game_id": "gm_seyr9d88",
        "count": 3,
        "detail": true,
        "plan": "Complete"
    }
}
```

#### `GET /v1/games/{game_id}/goals`

Every goal in order: period, time, side, scorer, assists, strength, empty net and the score after it.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/game-goals

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `game_id` | path | id | yes | A game, from /v1/games. | `gm_seyr9d88` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/games/gm_seyr9d88/goals`

```json
{
    "data": [
        {
            "number": 1,
            "period": 1,
            "time_seconds": 27,
            "side": "home",
            "scorer": {
                "id": "pl_eb1y2yzq",
                "name": "Tye Kartye"
            },
            "assists": [
                {
                    "id": "pl_1rp3dfd1",
                    "name": "J.T. Miller"
                },
                {
                    "id": "pl_k5173zwm",
                    "name": "Alexis Lafrenière"
                }
            ],
            "strength": "even",
            "empty_net": false,
            "game_winner": false,
            "score_after": {
                "home": 1,
                "away": 0
            }
        },
        {
            "number": 2,
            "period": 1,
            "time_seconds": 1024,
            "side": "away",
            "scorer": {
                "id": "pl_7ztvs1q7",
                "name": "Jake DeBrusk"
            },
            "assists": [
                {
                    "id": "pl_gcq1jn9f",
                    "name": "Jonathan Lekkerimäki"
                }
            ],
            "strength": "even",
            "empty_net": false,
            "game_winner": false,
            "score_after": {
                "home": 1,
                "away": 1
            }
        },
        {
            "number": 3,
            "period": 2,
            "time_seconds": 129,
            "side": "home",
            "scorer": {
                "id": "pl_tt2g1enk",
                "name": "Will Cuylle"
            },
            "assists": [
                {
                    "id": "pl_hrj96gn4",
                    "name": "Noah Laba"
                }
            ],
            "strength": "even",
            "empty_net": false,
            "game_winner": false,
            "score_after": {
                "home": 2,
                "away": 1
            }
        }
    ],
    "meta": {
        "game_id": "gm_seyr9d88",
        "count": 8,
        "detail": true,
        "plan": "Complete"
    }
}
```

#### `GET /v1/games/{game_id}/penalties` (paid plans)

Every penalty in order: period, time, side, player, who drew it, minutes, kind and offence.

Plans: Live and up. Page: https://icehockeyapi.com/documentation/game-penalties

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `game_id` | path | id | yes | A game, from /v1/games. | `gm_seyr9d88` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/games/gm_seyr9d88/penalties`

```json
{
    "data": [
        {
            "number": 1,
            "period": 1,
            "time_seconds": 885,
            "side": "home",
            "player": {
                "id": "pl_9phqbmpc",
                "name": "Mika Zibanejad"
            },
            "drawn_by": {
                "id": "pl_fpkynced",
                "name": "Elias Pettersson"
            },
            "minutes": 2,
            "kind": "minor",
            "offence": "interference"
        },
        {
            "number": 2,
            "period": 2,
            "time_seconds": 923,
            "side": "away",
            "player": {
                "id": "pl_wr9e9aq0",
                "name": "Guillaume Brisebois"
            },
            "drawn_by": {
                "id": "pl_hrj96gn4",
                "name": "Noah Laba"
            },
            "minutes": 2,
            "kind": "minor",
            "offence": "holding"
        },
        {
            "number": 3,
            "period": 2,
            "time_seconds": 1157,
            "side": "away",
            "player": {
                "id": "pl_v38bhy6z",
                "name": "Brock Boeser"
            },
            "drawn_by": {
                "id": "pl_ayhqj0q8",
                "name": "Marcus Pettersson"
            },
            "minutes": 2,
            "kind": "minor",
            "offence": "tripping"
        }
    ],
    "meta": {
        "game_id": "gm_seyr9d88",
        "count": 3,
        "detail": true,
        "plan": "Complete"
    }
}
```

#### `GET /v1/games/{game_id}/lineups` (paid plans)

Who dressed for each side, with number, position, line, captaincy and the starting goalie.

Plans: Live and up. Page: https://icehockeyapi.com/documentation/game-lineups

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `game_id` | path | id | yes | A game, from /v1/games. | `gm_seyr9d88` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/games/gm_seyr9d88/lineups`

```json
{
    "data": [
        {
            "player": {
                "id": "pl_zgna58ee",
                "name": "Matt Rempe"
            },
            "side": "home",
            "number": null,
            "position": null,
            "line": null,
            "captain": null,
            "status": "scratched",
            "started": null
        },
        {
            "player": {
                "id": "pl_3twte27m",
                "name": "Scott Morrow"
            },
            "side": "home",
            "number": null,
            "position": null,
            "line": null,
            "captain": null,
            "status": "scratched",
            "started": null
        },
        {
            "player": {
                "id": "pl_1rp3dfd1",
                "name": "J.T. Miller"
            },
            "side": "home",
            "number": "10",
            "position": "center",
            "line": null,
            "captain": null,
            "status": "dressed",
            "started": null
        }
    ],
    "meta": {
        "game_id": "gm_seyr9d88",
        "count": 45,
        "detail": true,
        "plan": "Complete"
    }
}
```

#### `GET /v1/games/{game_id}/skaters` (paid plans)

Each skater's line: goals, assists, points, plus-minus, penalty minutes, shots, hits, blocks, faceoffs and ice time; in North American top league games from 2009-10, his expected goals too.

Plans: Live and up. Page: https://icehockeyapi.com/documentation/game-skaters

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `game_id` | path | id | yes | A game, from /v1/games. | `gm_seyr9d88` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/games/gm_seyr9d88/skaters`

```json
{
    "data": [
        {
            "player": {
                "id": "pl_eb1y2yzq",
                "name": "Tye Kartye"
            },
            "side": "home",
            "goals": 2,
            "assists": 0,
            "points": 2,
            "plus_minus": 2,
            "penalty_minutes": 0,
            "shots": 3,
            "hits": 1,
            "blocked_shots": 0,
            "giveaways": 0,
            "takeaways": 0,
            "faceoff_pct": 0.0,
            "power_play_goals": 0,
            "time_on_ice_seconds": 939,
            "shifts": 21
        },
        {
            "player": {
                "id": "pl_tt2g1enk",
                "name": "Will Cuylle"
            },
            "side": "home",
            "goals": 2,
            "assists": 0,
            "points": 2,
            "plus_minus": 1,
            "penalty_minutes": 0,
            "shots": 3,
            "hits": 4,
            "blocked_shots": 0,
            "giveaways": 0,
            "takeaways": 0,
            "faceoff_pct": 0.0,
            "power_play_goals": 0,
            "time_on_ice_seconds": 939,
            "shifts": 19
        },
        {
            "player": {
                "id": "pl_k5173zwm",
                "name": "Alexis Lafrenière"
            },
            "side": "home",
            "goals": 1,
            "assists": 1,
            "points": 2,
            "plus_minus": 0,
            "penalty_minutes": 0,
            "shots": 2,
            "hits": 1,
            "blocked_shots": 0,
            "giveaways": 2,
            "takeaways": 0,
            "faceoff_pct": 1.0,
            "power_play_goals": 1,
            "time_on_ice_seconds": 1159,
            "shifts": 22
        }
    ],
    "meta": {
        "game_id": "gm_seyr9d88",
        "count": 36,
        "detail": true,
        "plan": "Complete"
    }
}
```

#### `GET /v1/games/{game_id}/goalies` (paid plans)

Each goalie's line: ice time, shots against, saves, goals against, save percentage and decision.

Plans: Live and up. Page: https://icehockeyapi.com/documentation/game-goalies

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `game_id` | path | id | yes | A game, from /v1/games. | `gm_seyr9d88` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/games/gm_seyr9d88/goalies`

```json
{
    "data": [
        {
            "player": {
                "id": "pl_6fqc4gsd",
                "name": "Dylan Garand"
            },
            "side": "home",
            "started": true,
            "time_on_ice_seconds": 3600,
            "shots_against": 21,
            "saves": 19,
            "goals_against": 2,
            "save_pct": 0.905,
            "decision": "win"
        },
        {
            "player": {
                "id": "pl_e470xqsk",
                "name": "Spencer Martin"
            },
            "side": "home",
            "started": false,
            "time_on_ice_seconds": 0,
            "shots_against": 0,
            "saves": 0,
            "goals_against": 0,
            "save_pct": null,
            "decision": null
        },
        {
            "player": {
                "id": "pl_pfn285n6",
                "name": "Kevin Lankinen"
            },
            "side": "away",
            "started": true,
            "time_on_ice_seconds": 3600,
            "shots_against": 25,
            "saves": 19,
            "goals_against": 6,
            "save_pct": 0.76,
            "decision": "loss"
        }
    ],
    "meta": {
        "game_id": "gm_seyr9d88",
        "count": 4,
        "detail": true,
        "plan": "Complete"
    }
}
```

#### `GET /v1/games/{game_id}/team-stats` (paid plans)

Team totals for the game side by side: shots, faceoffs, power play, penalty minutes, hits, blocks, giveaways and takeaways; in North American top league games from 2009-10, expected goals too.

Plans: Live and up. Page: https://icehockeyapi.com/documentation/game-team-stats

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `game_id` | path | id | yes | A game, from /v1/games. | `gm_seyr9d88` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/games/gm_seyr9d88/team-stats`

```json
{
    "data": [
        {
            "stat": "blocked_shots",
            "home": "14",
            "away": "14"
        },
        {
            "stat": "faceoff_pct",
            "home": "0.62",
            "away": "0.38"
        },
        {
            "stat": "faceoff_wins",
            "home": "31/50",
            "away": "19/50"
        }
    ],
    "meta": {
        "game_id": "gm_seyr9d88",
        "count": 10,
        "detail": true,
        "plan": "Complete"
    }
}
```

#### `GET /v1/games/{game_id}/events` (paid plans)

Every event in order: type, period, time, side, players, goalie, zone, rink position and shot type, with the expected goals of each unblocked shot (our own model, North American top league from 2009-10). While a North American top league game is being played it is read again every minute, and meta.live gives the period, clock and score as they stand.

Plans: Live and up. Page: https://icehockeyapi.com/documentation/game-events

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `game_id` | path | id | yes | A game, from /v1/games. | `gm_seyr9d88` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/games/gm_seyr9d88/events`

```json
{
    "data": [
        {
            "number": 1,
            "period": 1,
            "time_seconds": 0,
            "type": "period_start",
            "side": null,
            "players": [],
            "goalie": null,
            "zone": null,
            "x": null,
            "y": null,
            "shot_type": null
        },
        {
            "number": 2,
            "period": 1,
            "time_seconds": 0,
            "type": "faceoff",
            "side": "away",
            "players": [
                {
                    "id": "pl_fpkynced",
                    "name": "Elias Pettersson"
                },
                {
                    "id": "pl_1rp3dfd1",
                    "name": "J.T. Miller"
                }
            ],
            "goalie": null,
            "zone": "neutral",
            "x": 0,
            "y": 0,
            "shot_type": null
        },
        {
            "number": 3,
            "period": 1,
            "time_seconds": 11,
            "type": "hit",
            "side": "away",
            "players": [
                {
                    "id": "pl_fpkynced",
                    "name": "Elias Pettersson"
                },
                {
                    "id": "pl_qf6kqgj1",
                    "name": "Vladislav Gavrikov"
                }
            ],
            "goalie": null,
            "zone": "offensive",
            "x": 71,
            "y": -39,
            "shot_type": null
        }
    ],
    "meta": {
        "game_id": "gm_seyr9d88",
        "count": 307,
        "detail": true,
        "plan": "Complete"
    }
}
```

#### `GET /v1/games/{game_id}/officials` (paid plans)

The referees and linesmen of the game.

Plans: Live and up. Page: https://icehockeyapi.com/documentation/game-officials

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `game_id` | path | id | yes | A game, from /v1/games. | `gm_seyr9d88` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/games/gm_seyr9d88/officials`

```json
{
    "data": [
        {
            "name": "Justin Kea",
            "role": "referee"
        },
        {
            "name": "Thomas John Luxmore",
            "role": "referee"
        },
        {
            "name": "Dylan Blujus",
            "role": "linesman"
        }
    ],
    "meta": {
        "game_id": "gm_seyr9d88",
        "count": 4,
        "detail": true,
        "plan": "Complete"
    }
}
```

#### `GET /v1/games/{game_id}/coaches` (paid plans)

The head coach behind each bench, with side.

Plans: Live and up. Page: https://icehockeyapi.com/documentation/game-coaches

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `game_id` | path | id | yes | A game, from /v1/games. | `gm_seyr9d88` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/games/gm_seyr9d88/coaches`

```json
{
    "data": [
        {
            "name": "Mike Sullivan",
            "role": "head_coach",
            "side": "home"
        },
        {
            "name": "Manny Malhotra",
            "role": "head_coach",
            "side": "away"
        }
    ],
    "meta": {
        "game_id": "gm_seyr9d88",
        "count": 2,
        "detail": true,
        "plan": "Complete"
    }
}
```

#### `GET /v1/games/{game_id}/stars`

The three stars of the game, with side.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/game-stars

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `game_id` | path | id | yes | A game, from /v1/games. | `gm_seyr9d88` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/games/gm_seyr9d88/stars`

```json
{
    "data": [
        {
            "star": 1,
            "player": {
                "id": "pl_eb1y2yzq",
                "name": "Tye Kartye"
            },
            "side": "home"
        },
        {
            "star": 2,
            "player": {
                "id": "pl_k5173zwm",
                "name": "Alexis Lafrenière"
            },
            "side": "home"
        },
        {
            "star": 3,
            "player": {
                "id": "pl_5t0tyjwh",
                "name": "Gabe Perreault"
            },
            "side": "home"
        }
    ],
    "meta": {
        "game_id": "gm_seyr9d88",
        "count": 3,
        "detail": true,
        "plan": "Complete"
    }
}
```

### Odds

Prices for games, by game or by day

#### `GET /v1/games/{game_id}/odds` (paid plans)

Odds for one game: three-way, moneyline, puck line and totals, opening, closing or average prices.

Plans: Live and up. Page: https://icehockeyapi.com/documentation/game-odds

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `game_id` | path | id | yes | A game, from /v1/games. | `gm_seyr9d88` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/games/gm_seyr9d88/odds`

```json
{
    "data": {
        "game_id": "gm_seyr9d88",
        "odds": [
            {
                "market": "three_way",
                "price": "average",
                "format": "decimal",
                "home": 1.6,
                "draw": 4.68,
                "away": 4.47
            }
        ]
    },
    "meta": {
        "count": 1,
        "plan": "Complete"
    }
}
```

#### `GET /v1/odds` (paid plans)

Games with odds for one day or a date range, each with its prices. Give date, or from (and to).

Plans: Live and up. Page: https://icehockeyapi.com/documentation/odds

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `date` | query | date | no | One day, YYYY-MM-DD | `2026-10-11` |
| `from` | query | date | no | First day of a range |  |
| `to` | query | date | no | Last day of a range |  |
| `league_id` | query | id | no | A league, from /v1/leagues. | `lg_6t11wec7` |
| `page` | query | int | no | The page, from 1. |  |
| `per_page` | query | int | no | Records a page, default 50, at most 200. | `3` |
| `cursor` | query | string | no | meta.next_cursor from the previous answer. |  |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, upgrade_required

Sample: `GET /v1/odds?date=2026-10-11&league_id=lg_6t11wec7&per_page=3`

```json
{
    "data": [
        {
            "id": "gm_sxe029v9",
            "date": "2026-10-11",
            "start_time": "2026-10-11T21:00:00Z",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "season": {
                "id": "ss_0n4zhhna",
                "label": "2026-27"
            },
            "stage": "regular",
            "status": "final",
            "home_team": {
                "id": "tm_rt3xcyx4",
                "name": "Washington Capitals",
                "short_name": "WSH",
                "country": "North America"
            },
            "away_team": {
                "id": "tm_dphk633j",
                "name": "Seattle Kraken",
                "short_name": "SEA",
                "country": "North America"
            },
            "home_goals": 3,
            "away_goals": 5,
            "ended_in": "regulation",
            "venue": {
                "id": "vn_kwrwver8",
                "name": "Capital One Arena",
                "city": null,
                "country": null
            },
            "attendance": null,
            "odds": [
                {
                    "market": "three_way",
                    "price": "average",
                    "format": "decimal",
                    "home": 1.79,
                    "draw": 4.45,
                    "away": 3.58
                }
            ]
        },
        {
            "id": "gm_seyr9d88",
            "date": "2026-10-11",
            "start_time": "2026-10-11T22:00:00Z",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "season": {
                "id": "ss_0n4zhhna",
                "label": "2026-27"
            },
            "stage": "regular",
            "status": "final",
            "home_team": {
                "id": "tm_kpzj338v",
                "name": "New York Rangers",
                "short_name": "NYR",
                "country": "North America"
            },
            "away_team": {
                "id": "tm_ampzcavy",
                "name": "Vancouver Canucks",
                "short_name": "VAN",
                "country": "North America"
            },
            "home_goals": 6,
            "away_goals": 2,
            "ended_in": "regulation",
            "venue": {
                "id": "vn_aymp6wpr",
                "name": "Madison Square Garden",
                "city": null,
                "country": null
            },
            "attendance": null,
            "odds": [
                {
                    "market": "three_way",
                    "price": "average",
                    "format": "decimal",
                    "home": 1.6,
                    "draw": 4.68,
                    "away": 4.47
                }
            ]
        }
    ],
    "meta": {
        "count": 2,
        "next_cursor": null,
        "page": 1,
        "per_page": 3,
        "total": 2,
        "total_pages": 1,
        "next_page": null,
        "prev_page": null,
        "plan": "Complete"
    }
}
```

### Players

Players, careers, game logs, awards and drafts

#### `GET /v1/players`

Players by part of the name, position, nationality or birth year.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/players

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `q` | query | string | no | Part of the name | `Rempe` |
| `position` | query | enum: center, left_wing, right_wing, defense, goalie, forward | no | A position. |  |
| `nationality` | query | string | no | Nationality as players show it, like FIN or CAN |  |
| `born` | query | int | no | Birth year |  |
| `page` | query | int | no | The page, from 1. |  |
| `per_page` | query | int | no | Records a page, default 50, at most 200. | `3` |
| `cursor` | query | string | no | meta.next_cursor from the previous answer. |  |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded

Sample: `GET /v1/players?q=Rempe&per_page=3`

```json
{
    "data": [
        {
            "id": "pl_zgna58ee",
            "name": "Matt Rempe",
            "first_name": "Matt",
            "last_name": "Rempe",
            "position": "center",
            "shoots": "right",
            "birth_date": "2002-06-29",
            "birth_place": "Calgary, Alberta",
            "birth_country": "CAN",
            "nationality": null,
            "height_cm": 206,
            "weight_kg": 122
        },
        {
            "id": "pl_qgrny56g",
            "name": "Matt Rempe",
            "first_name": "Matt",
            "last_name": "Rempe",
            "position": "right_wing",
            "shoots": null,
            "birth_date": null,
            "birth_place": null,
            "birth_country": null,
            "nationality": null,
            "height_cm": null,
            "weight_kg": null
        },
        {
            "id": "pl_fyfwe6my",
            "name": "Matthew Rempe",
            "first_name": "Matthew",
            "last_name": "Rempe",
            "position": "center",
            "shoots": null,
            "birth_date": null,
            "birth_place": null,
            "birth_country": null,
            "nationality": null,
            "height_cm": null,
            "weight_kg": null
        }
    ],
    "meta": {
        "count": 3,
        "next_cursor": "eyJvIjozLCJuIjozfQ",
        "page": 1,
        "per_page": 3,
        "total": 8,
        "total_pages": 3,
        "next_page": 2,
        "prev_page": null,
        "plan": "Complete"
    }
}
```

#### `GET /v1/players/{player_id}`

One player: name, position, shoots, birth date and place, nationality, height, weight, draft and number of awards.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/player

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `player_id` | path | id | yes | A player, from /v1/players. | `pl_zgna58ee` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found

Sample: `GET /v1/players/pl_zgna58ee`

```json
{
    "data": {
        "id": "pl_zgna58ee",
        "name": "Matt Rempe",
        "first_name": "Matt",
        "last_name": "Rempe",
        "position": "center",
        "shoots": "right",
        "birth_date": "2002-06-29",
        "birth_place": "Calgary, Alberta",
        "birth_country": "CAN",
        "nationality": null,
        "height_cm": 206,
        "weight_kg": 122,
        "draft": {
            "year": 2020,
            "team_code": "NYR",
            "round": 6,
            "pick": 10,
            "overall": 165
        },
        "awards": 0
    },
    "meta": {
        "plan": "Complete"
    }
}
```

#### `GET /v1/players/{player_id}/seasons` (paid plans)

A player's career season by season, every league and team, regular season and playoffs, with skater or goalie numbers.

Plans: Live and up. Page: https://icehockeyapi.com/documentation/player-seasons

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `player_id` | path | id | yes | A player, from /v1/players. | `pl_zgna58ee` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/players/pl_zgna58ee/seasons`

```json
{
    "data": [
        {
            "season": "2015-16",
            "stage": "regular",
            "league_name": "HCBAA",
            "team_name": "CNHA Blazers U15 AA",
            "games": 29,
            "goals": 10,
            "assists": 9,
            "points": 19,
            "penalty_minutes": 14,
            "plus_minus": null,
            "power_play_goals": null,
            "short_handed_goals": null,
            "game_winning_goals": null,
            "shots": null
        },
        {
            "season": "2016-17",
            "stage": "playoffs",
            "league_name": "CSSHL U15",
            "team_name": "Okanagan HA U15 Prep",
            "games": 3,
            "goals": 1,
            "assists": 1,
            "points": 2,
            "penalty_minutes": 2,
            "plus_minus": null,
            "power_play_goals": null,
            "short_handed_goals": null,
            "game_winning_goals": null,
            "shots": null
        },
        {
            "season": "2016-17",
            "stage": "regular",
            "league_name": "CSSHL U15",
            "team_name": "Okanagan HA U15 Prep",
            "games": 30,
            "goals": 1,
            "assists": 6,
            "points": 7,
            "penalty_minutes": 8,
            "plus_minus": null,
            "power_play_goals": null,
            "short_handed_goals": null,
            "game_winning_goals": null,
            "shots": null
        }
    ],
    "meta": {
        "count": 21,
        "player_id": "pl_zgna58ee",
        "plan": "Complete"
    }
}
```

#### `GET /v1/players/{player_id}/games` (paid plans)

Every game your plan covers in which the player has a line, newest first, with his goals, assists, shots and ice time.

Plans: Live and up. Page: https://icehockeyapi.com/documentation/player-games

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `player_id` | path | id | yes | A player, from /v1/players. | `pl_zgna58ee` |
| `page` | query | int | no | The page, from 1. |  |
| `per_page` | query | int | no | Records a page, default 50, at most 200. | `3` |
| `cursor` | query | string | no | meta.next_cursor from the previous answer. |  |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/players/pl_zgna58ee/games?per_page=3`

```json
{
    "data": [
        {
            "game": {
                "id": "gm_0tvcfpmt",
                "date": "2026-09-29",
                "start_time": "2026-09-30T00:00:00Z",
                "league": {
                    "id": "lg_6t11wec7",
                    "name": "NHL"
                },
                "season": {
                    "id": "ss_0n4zhhna",
                    "label": "2026-27"
                },
                "stage": "regular",
                "status": "final",
                "home_team": {
                    "id": "tm_7vyb6jrq",
                    "name": "Boston Bruins",
                    "short_name": "BOS",
                    "country": "North America"
                },
                "away_team": {
                    "id": "tm_kpzj338v",
                    "name": "New York Rangers",
                    "short_name": "NYR",
                    "country": "North America"
                },
                "home_goals": 3,
                "away_goals": 0,
                "ended_in": "regulation",
                "venue": {
                    "id": "vn_2qcvdrkt",
                    "name": "TD Garden",
                    "city": null,
                    "country": null
                },
                "attendance": 17850
            },
            "side": "away",
            "goals": 0,
            "assists": 0,
            "points": 0,
            "plus_minus": 0,
            "penalty_minutes": 0,
            "shots": 1,
            "time_on_ice_seconds": 589
        },
        {
            "game": {
                "id": "gm_8ysp0nqc",
                "date": "2026-09-25",
                "start_time": "2026-09-25T23:30:00Z",
                "league": {
                    "id": "lg_6t11wec7",
                    "name": "NHL"
                },
                "season": {
                    "id": "ss_0n4zhhna",
                    "label": "2026-27"
                },
                "stage": "preseason",
                "status": "final",
                "home_team": {
                    "id": "tm_zy5w8596",
                    "name": "New York Islanders",
                    "short_name": "NYI",
                    "country": "North America"
                },
                "away_team": {
                    "id": "tm_kpzj338v",
                    "name": "New York Rangers",
                    "short_name": "NYR",
                    "country": "North America"
                },
                "home_goals": 1,
                "away_goals": 6,
                "ended_in": "regulation",
                "venue": {
                    "id": "vn_2qwm96dt",
                    "name": "UBS Arena",
                    "city": null,
                    "country": null
                },
                "attendance": 14034
            },
            "side": "away",
            "goals": 0,
            "assists": 1,
            "points": 1,
            "plus_minus": 1,
            "penalty_minutes": 0,
            "shots": 0,
            "time_on_ice_seconds": 823
        },
        {
            "game": {
                "id": "gm_v7m24nbp",
                "date": "2026-09-24",
                "start_time": "2026-09-24T23:00:00Z",
                "league": {
                    "id": "lg_6t11wec7",
                    "name": "NHL"
                },
                "season": {
                    "id": "ss_0n4zhhna",
                    "label": "2026-27"
                },
                "stage": "preseason",
                "status": "final",
                "home_team": {
                    "id": "tm_kpzj338v",
                    "name": "New York Rangers",
                    "short_name": "NYR",
                    "country": "North America"
                },
                "away_team": {
                    "id": "tm_vxt1q0ha",
                    "name": "New Jersey Devils",
                    "short_name": "NJD",
                    "country": "North America"
                },
                "home_goals": 4,
                "away_goals": 3,
                "ended_in": "shootout",
                "venue": {
                    "id": "vn_aymp6wpr",
                    "name": "Madison Square Garden",
                    "city": null,
                    "country": null
                },
                "attendance": 16078
            },
            "side": "home",
            "goals": 0,
            "assists": 1,
            "points": 1,
            "plus_minus": 0,
            "penalty_minutes": 0,
            "shots": 1,
            "time_on_ice_seconds": 854
        }
    ],
    "meta": {
        "count": 3,
        "next_cursor": "eyJvIjozLCJuIjozfQ",
        "page": 1,
        "per_page": 3,
        "total": 111,
        "total_pages": 37,
        "next_page": 2,
        "prev_page": null,
        "plan": "Complete"
    }
}
```

#### `GET /v1/players/{player_id}/awards`

The trophies and awards a player has won, by season.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/player-awards

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `player_id` | path | id | yes | A player, from /v1/players. | `pl_zgna58ee` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found

Sample: `GET /v1/players/pl_zgna58ee/awards`

```json
{
    "data": [],
    "meta": {
        "count": 0,
        "player_id": "pl_zgna58ee",
        "plan": "Complete"
    }
}
```

#### `GET /v1/draft/{year}`

Every pick of one draft year in order: round, pick, overall, the drafting team's code and the player.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/draft

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `year` | path | int | yes | Draft year | `2024` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found

Sample: `GET /v1/draft/2024`

```json
{
    "data": [
        {
            "overall": 1,
            "round": 1,
            "pick": 1,
            "team_code": "SJS",
            "player": {
                "id": "pl_r76c3ha1",
                "name": "Macklin Celebrini",
                "position": "center",
                "nationality": null
            }
        },
        {
            "overall": 2,
            "round": 1,
            "pick": 2,
            "team_code": "CHI",
            "player": {
                "id": "pl_h5823bee",
                "name": "Artyom Levshunov",
                "position": "defense",
                "nationality": null
            }
        },
        {
            "overall": 3,
            "round": 1,
            "pick": 3,
            "team_code": "ANA",
            "player": {
                "id": "pl_1facdf42",
                "name": "Beckett Sennecke",
                "position": "right_wing",
                "nationality": null
            }
        }
    ],
    "meta": {
        "count": 224,
        "year": 2024,
        "plan": "Complete"
    }
}
```

### Venues

Arenas and the games played there

#### `GET /v1/venues`

Arenas by part of the name or city, or by country.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/venues

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `q` | query | string | no | Part of the name or city |  |
| `country` | query | string | no | A country. |  |
| `page` | query | int | no | The page, from 1. |  |
| `per_page` | query | int | no | Records a page, default 50, at most 200. | `3` |
| `cursor` | query | string | no | meta.next_cursor from the previous answer. |  |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded

Sample: `GET /v1/venues?per_page=3`

```json
{
    "data": [
        {
            "id": "vn_z3aeycdq",
            "name": "1st Mariner Arena",
            "city": null,
            "country": null
        },
        {
            "id": "vn_sw570grp",
            "name": "1st Summit Arena",
            "city": null,
            "country": "North America"
        },
        {
            "id": "vn_teghn2q1",
            "name": "A3 Arena",
            "city": null,
            "country": "Sweden"
        }
    ],
    "meta": {
        "count": 3,
        "next_cursor": "eyJvIjozLCJuIjozfQ",
        "page": 1,
        "per_page": 3,
        "total": 1122,
        "total_pages": 374,
        "next_page": 2,
        "prev_page": null,
        "plan": "Complete"
    }
}
```

#### `GET /v1/venues/{venue_id}`

One arena: name, city, country and the teams that have played home games there.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/venue

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `venue_id` | path | id | yes | An arena, from /v1/venues. | `vn_aymp6wpr` |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found

Sample: `GET /v1/venues/vn_aymp6wpr`

```json
{
    "data": {
        "id": "vn_aymp6wpr",
        "name": "Madison Square Garden",
        "city": null,
        "country": null,
        "home_teams": [
            {
                "id": "tm_kpzj338v",
                "name": "New York Rangers",
                "short_name": "NYR",
                "country": "North America",
                "games": 2530,
                "first_game_date": "1968-02-18",
                "last_game_date": "2026-10-19"
            },
            {
                "id": "tm_12dj2ymx",
                "name": "Slovakia Slovakia",
                "short_name": "SVK",
                "country": "North America",
                "games": 1,
                "first_game_date": "1996-09-03",
                "last_game_date": "1996-09-03"
            },
            {
                "id": "tm_9xqzt5f1",
                "name": "USA",
                "short_name": "USA",
                "country": "North America",
                "games": 1,
                "first_game_date": "1996-09-02",
                "last_game_date": "1996-09-02"
            },
            {
                "id": "tm_gchc0agc",
                "name": "All-Stars West All-Stars West",
                "short_name": "ASW",
                "country": "North America",
                "games": 2,
                "first_game_date": "1973-01-30",
                "last_game_date": "1994-01-22"
            }
        ]
    },
    "meta": {
        "plan": "Complete"
    }
}
```

#### `GET /v1/venues/{venue_id}/games`

Games played at an arena that your plan covers, newest first.

Plans: Free key and up. Page: https://icehockeyapi.com/documentation/venue-games

| Parameter | In | Type | Required | Description | Example |
| --- | --- | --- | --- | --- | --- |
| `venue_id` | path | id | yes | An arena, from /v1/venues. | `vn_aymp6wpr` |
| `page` | query | int | no | The page, from 1. |  |
| `per_page` | query | int | no | Records a page, default 50, at most 200. | `3` |
| `cursor` | query | string | no | meta.next_cursor from the previous answer. |  |

Errors: bad_request, unknown_parameter, unauthorized, rate_limited, quota_exceeded, not_found, upgrade_required

Sample: `GET /v1/venues/vn_aymp6wpr/games?per_page=3`

```json
{
    "data": [
        {
            "id": "gm_kk0z6gqs",
            "date": "2026-10-13",
            "start_time": "2026-10-13T23:15:00Z",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "season": {
                "id": "ss_0n4zhhna",
                "label": "2026-27"
            },
            "stage": "regular",
            "status": "scheduled",
            "home_team": {
                "id": "tm_kpzj338v",
                "name": "New York Rangers",
                "short_name": "NYR",
                "country": "North America"
            },
            "away_team": {
                "id": "tm_76hme1dz",
                "name": "Tampa Bay Lightning",
                "short_name": "TBL",
                "country": "North America"
            },
            "home_goals": null,
            "away_goals": null,
            "ended_in": null,
            "venue": {
                "id": "vn_aymp6wpr",
                "name": "Madison Square Garden",
                "city": null,
                "country": null
            },
            "attendance": null
        },
        {
            "id": "gm_seyr9d88",
            "date": "2026-10-11",
            "start_time": "2026-10-11T22:00:00Z",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "season": {
                "id": "ss_0n4zhhna",
                "label": "2026-27"
            },
            "stage": "regular",
            "status": "final",
            "home_team": {
                "id": "tm_kpzj338v",
                "name": "New York Rangers",
                "short_name": "NYR",
                "country": "North America"
            },
            "away_team": {
                "id": "tm_ampzcavy",
                "name": "Vancouver Canucks",
                "short_name": "VAN",
                "country": "North America"
            },
            "home_goals": 6,
            "away_goals": 2,
            "ended_in": "regulation",
            "venue": {
                "id": "vn_aymp6wpr",
                "name": "Madison Square Garden",
                "city": null,
                "country": null
            },
            "attendance": null
        },
        {
            "id": "gm_3t7er8gh",
            "date": "2026-10-06",
            "start_time": "2026-10-06T23:30:00Z",
            "league": {
                "id": "lg_6t11wec7",
                "name": "NHL"
            },
            "season": {
                "id": "ss_0n4zhhna",
                "label": "2026-27"
            },
            "stage": "regular",
            "status": "final",
            "home_team": {
                "id": "tm_kpzj338v",
                "name": "New York Rangers",
                "short_name": "NYR",
                "country": "North America"
            },
            "away_team": {
                "id": "tm_zy5w8596",
                "name": "New York Islanders",
                "short_name": "NYI",
                "country": "North America"
            },
            "home_goals": 5,
            "away_goals": 2,
            "ended_in": "regulation",
            "venue": {
                "id": "vn_aymp6wpr",
                "name": "Madison Square Garden",
                "city": null,
                "country": null
            },
            "attendance": 18006
        }
    ],
    "meta": {
        "count": 3,
        "next_cursor": "eyJvIjozLCJuIjozfQ",
        "page": 1,
        "per_page": 3,
        "total": 2534,
        "total_pages": 845,
        "next_page": 2,
        "prev_page": null,
        "plan": "Complete"
    }
}
```

## Guides

### Quick start

A key, the first call and the answer, in a minute. Page: https://icehockeyapi.com/documentation/quick-start

Three steps take you from nothing to real data.

#### 1. Get a key

Make an account at [https://icehockeyapi.com/login](https://icehockeyapi.com/login?tab=new) with your Google account. The free key appears on the next page: 50 calls a day, no card. It is shown once, so copy it. It is also filled in on every page of these docs in that browser.

#### 2. Make the first call

Yesterday's results in every league, with no parameters:

```
curl -H "X-API-Key: YOUR_KEY" "https://api.icehockeyapi.com/v1/results/yesterday"
```

#### 3. Read the answer

Every answer is JSON with two parts: `data`, the records, and `meta`, about the answer: how many came back, the page you are on, the next cursor, and your plan.

```
{"data": [{"id": "gm_...", "date": "...", "home_team": {...}, "away_team": {...}, "home_goals": 4, "away_goals": 3, "ended_in": "overtime"}],
 "meta": {"count": 1, "next_cursor": null, "plan": "Free key"}}
```

#### Where to go next

- [Games and results](https://icehockeyapi.com/documentation/games-and-results): find games by day, league or team.
- [Ids and names](https://icehockeyapi.com/documentation/ids-and-names): how records link.
- [MCP](https://icehockeyapi.com/documentation/mcp): give the whole API to your assistant.

### Authentication

Your key, the two ways to send it, and making a new one. Page: https://icehockeyapi.com/documentation/authentication

Every call needs a key. Keys start `iha_live_` and belong to your account; every key on the account shares its plan and its limits.

#### Sending the key

Send it in a header, either of these:

```
X-API-Key: iha_live_...
Authorization: Bearer iha_live_...
```

A key in the address (`?key=`) is refused with `bad_request`, because addresses end up in logs and browser history.

#### Making and revoking keys

In your account, under [API keys](https://icehockeyapi.com/account/keys), you can make up to five, give each a label, and revoke one at once. A key is shown once, when it is made; we keep only a fingerprint of it, so it cannot be shown again. Lost a key? Make a new one and revoke the old.

#### In the browser

The API answers browsers from any site (CORS is open), so a key used in a web page can be read by anyone who opens it. Keep keys on a server where you can.

### Plans and limits

What each plan reads, its calls and its rate. Page: https://icehockeyapi.com/documentation/plans-and-limits

Every plan reads every league. Plans differ in which seasons they read, whether odds and the full detail of a game are included, and how many calls they allow.

| Plan | Price | Reads | Calls | A minute |
| --- | --- | --- | --- | --- |
| Free key | Free | yesterday, today and the next two days | 50 a day | 10 |
| Live | $29 a month, $290 a year | yesterday, today and the next two days, the seasons being played, odds, every endpoint | 100,000 a month | 60 |
| Archive | $49 a month, $490 a year | yesterday, today and the next two days, every past season, odds, every endpoint | 200,000 a month | 60 |
| Complete | $79 a month, $790 a year | yesterday, today and the next two days, the seasons being played, every past season, odds, every endpoint | 500,000 a month | 120 |

#### Calls

The free key counts calls a day, reset at 00:00 UTC. Paid plans count calls a calendar month (UTC). Calls are counted for the whole account, across its keys. [`/v1/usage`](https://icehockeyapi.com/documentation/usage) and `/v1/coverage` are never counted.

#### Headers on every answer

- `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset`: this minute.
- `X-Quota-Remaining`: calls left this day or month.
- `Retry-After` on a 429: seconds to wait.

#### When a plan does not read something

The answer is 403 `upgrade_required` with the plan that does, in `plan`. A list your plan only partly covers gives the rows it covers.

Prices and checkout are on [the pricing page](https://icehockeyapi.com/pricing).

### How fresh the data is

When results, detail and odds arrive, the same on every plan. Page: https://icehockeyapi.com/documentation/how-fresh

| What | How often | Where |
| --- | --- | --- |
| Play by play during the game | Every minute while a North American top league game is on | `/v1/games/{game_id}/events`, with `meta.live` |
| Start times, scores, how games ended, postponements | Every 10 minutes, in more than a thousand leagues | `/v1/games`, `/v1/results` |
| Box scores: lineups, skater and goalie lines, penalties, officials, coaches, attendance | Hourly, after the final horn | The endpoints inside a game |
| A full sweep of every result, and closing odds | Twice a day, 07:10 and 19:10 UTC | `/v1/odds`, `/v1/games/{game_id}/odds` |
| Players and careers | Daily | `/v1/players` |

#### A game while it is played

A game being played has `status` `live`. For North American top league games, `meta.live` on the events endpoint gives the period, the clock, the score and the shots as they stand, read again every minute. Other leagues show the result within about ten minutes of the end.

#### Times

Every time is UTC. A game's `date` is the day it was played where it was played; `start_time` is the face-off in UTC.

### Pagination

Pages and cursors for every list. Page: https://icehockeyapi.com/documentation/pagination

Every list answers 50 records a page by default, up to 200 with `per_page`. There are two ways through a long list.

#### Pages

Give `page` (from 1). `meta` then carries `total`, `total_pages`, `next_page` and `prev_page`.

```
GET /v1/games?date=2026-10-08&page=2&per_page=100
```

#### Cursors

Every list also gives `meta.next_cursor`. Send it back as `cursor`, with the same `per_page`, to get the next part; it is `null` on the last. Cursors skip counting the total, so they are the faster way through a big list.

```
GET /v1/players?q=smith&cursor=eyJvIjo1MCwibiI6NTB9
```

### Errors

Every error code, what it means and what to do. Page: https://icehockeyapi.com/documentation/errors

An error answers with its HTTP status and one shape:

```
{"error": {"code": "upgrade_required", "message": "...", "plan": "archive", "docs": "https://icehockeyapi.com/documentation/errors#upgrade_required"}}
```

| Code | HTTP | What it means | What to do |
| --- | --- | --- | --- |
| `bad_request` | 400 | A parameter is missing or has the wrong form. The message names it. | Fix the value and send it again. |
| `unauthorized` | 401 | No key was sent, or it is not one we know (or it was revoked). | Send an active key from your account in X-API-Key or Authorization: Bearer. |
| `upgrade_required` | 403 | Your plan does not read this endpoint or these seasons. The answer names the plan that does in `plan`. | Move up from Billing in your account, or ask for what your plan covers. |
| `not_found` | 404 | No such endpoint, or no record with that id. | Check the path, and take ids from a list call. |
| `unknown_parameter` | 422 | A parameter this endpoint does not take. The message lists the ones it does. | Take the parameter out, or use one from the list. |
| `rate_limited` | 429 | More calls this minute than your plan allows. | Wait for the seconds in `Retry-After`, then go on, a little slower. |
| `quota_exceeded` | 429 | Your calls for the day (free key) or month (paid plans) are used up. `resets_at` says when they come back. | Wait for the reset, or move up a plan. |
| `server_error` | 500 | Something went wrong on our side. It is logged and we look at every one. | Try again in a minute. If it keeps happening, open a ticket with the time and path. |

A 4xx comes back the same way however often it is sent, so fix the request before trying again.

### Ids and names

How ids work, how records link, and dates. Page: https://icehockeyapi.com/documentation/ids-and-names

Every id carries its type: `lg_` league, `ss_` season, `tm_` team, `gm_` game, `pl_` player, `vn_` venue. They never change once given out.

#### Finding an id

Find the thing with a list call first, then use its id. A league from `/v1/leagues?q=`, its seasons from `/v1/leagues/{league_id}/seasons`, a team from `/v1/teams?q=`, a player from `/v1/players?q=`.

#### How records link

A game has its league, season, both teams and its venue, each with its id and name. Inside a game, every player is given with his id and name, so a goal, a penalty or a line leads straight to `/v1/players/{player_id}`.

#### Dates

A game's `date` is its local day. A few very old games are recorded with their season but not their day: their `date` is `null`. Seasons are labelled the way the league labels them, `2026-27` or `2026`.

#### Names

Teams and leagues carry the names they had at the time, so a team that moved or renamed shows its old name in old seasons.

### Games and results

Finding games, following a night, reading results. Page: https://icehockeyapi.com/documentation/games-and-results

A game has its date and start time, league, season, stage (regular, playoffs and others), status, both teams, the score, how it ended (`regulation`, `overtime` or `shootout`), the venue and the attendance.

#### Common jobs

- One day: `GET /v1/games?date=2026-10-08`. No parameters gives today (UTC).
- Yesterday's finished games: `GET /v1/results/yesterday`.
- A league's night: add `league_id`.
- A team's season: `GET /v1/teams/{team_id}/games?season_id=`.
- What is coming: `GET /v1/games/upcoming`, the next two days.
- A range: `from` and `to`.

#### Statuses

`scheduled`, `live`, `final`, `postponed`, `cancelled` and `awarded`. A postponed game keeps its id when it is played later.

#### Seasons, tables and playoffs

`/v1/seasons/{season_id}/standings` builds the regular season table from the results, with each league's own points. `/playoffs` gives every series, and `/v1/teams/{team_id}/head-to-head/{other_id}` every meeting of two teams.

### Inside a game

Periods, goals, penalties, lineups, lines, events, officials and coaches. Page: https://icehockeyapi.com/documentation/inside-a-game

For the leagues that publish full box scores, every game has its detail. `/v1/coverage` counts the games with detail, and any game without it answers with `meta.detail` `false` and an empty list.

#### What there is

- Periods: goals and shots each period, overtime and the shootout.
- Goals: scorer, assists, strength, empty net and the score after each.
- Penalties: who, who drew it, minutes and offence.
- Lineups: number, position, line, captains and the starting goalie.
- Skater and goalie lines, and team totals.
- Play by play: every event with its place on the rink and shot type.
- Officials and the head coach of each bench.
- Three stars.

#### Leagues with detail

The North American top league has every game since its first season in 1917, with play by play and rink positions from about 2010. The Finnish top league and the Swedish top two tiers have lineups, goals and penalties for their modern seasons. The AHL, ECHL, OHL, WHL, QMJHL and USHL have box scores (lineups, goals, penalties, skater and goalie lines, officials, coaches and three stars), filled season by season from the newest. The KHL and MHL have box scores too (lineups with the starting fives, goals, penalties, skater and goalie lines, team shots, power plays and faceoffs, officials), with time on ice, shifts, hits and blocks in the recent seasons, also filled from the newest. The Swiss National League and Swiss League have box scores with line-ups by line, captains and coaches, goals with strength and the winning goal, penalties, skater lines (plus/minus, shots, blocks, faceoffs, time on ice), goalie lines, shots by period, attendance and officials. The VHL has box scores with goals and the players on ice, penalties, skater lines (plus/minus, shots, faceoffs, time on ice, shifts, hits, blocks), goalie lines, power plays, shots by period, coaches, attendance and officials. The Czech Extraliga has box scores from its own game records: goals with strength and the players on ice, penalties, skater lines (time on ice, also on the power play and short-handed, plus/minus, hits, shots, blocks, faceoffs), goalie lines, shots by period, attendance, the rink and officials. The DEL has lighter box scores from 2022-23: periods, goals with scorer, assists and empty-net goals, penalties, and the goalies who played with their time. The DEL2 has box scores from 2008-09: periods, goals with scorer, assists and strength, penalties, attendance, the rink and officials, with skater lines (plus/minus, faceoffs, shots, blocks, time on ice, shifts) and goalie lines (minutes, shots, saves) from the seasons its box scores begin. The ICE Hockey League has scores by period from 2000-01, and box scores from its modern seasons: goals with scorer, assists, strength and empty-net goals, penalties, line-ups by line, skater points, plus/minus and penalty minutes, goalie minutes, goals against and decisions, attendance, officials and coaches. The Kazakhstan championship has box scores from 2021-22: goals with scorer and assists, penalties, skater lines (goals, assists, points, penalty minutes, shots, blocks, plus/minus), goalie lines (shots, saves, time), line-ups by line, team shots, blocks, faceoffs and power-play goals by period, the rink and officials. Mestis has box scores from 2014-15: goals with scorer, assists, strength, empty-net and winning goals and the players on ice, penalties with the player who drew them, skater lines (goals, assists, points, penalty minutes, plus/minus, power-play goals, shots, faceoffs, time on ice), goalie lines (saves, goals against, time) and attendance. Other leagues have scores, periods where kept, and odds.

#### Plans

Periods, goals and three stars are on every plan. The rest is on the paid plans, for the seasons each plan reads.

### Odds

Markets, prices and formats. Page: https://icehockeyapi.com/documentation/odds

Odds come with the games on the paid plans: on `/v1/games/{game_id}`, on `/v1/games/{game_id}/odds`, and for a day or range on `/v1/odds`.

#### Markets

- `three_way`: home, draw and away at the end of regulation.
- `moneyline`: home and away, overtime and shootout included.
- `puck_line`: with the `line`.
- `total`: over and under the `line`.

#### Prices

Each market has `opening`, `closing` or `average` prices, in `decimal` or `american` format, as kept. Odds are for finished games: they are added with the result, at the twice-daily sweep.

### Players and careers

Finding players, careers, game logs, awards and drafts. Page: https://icehockeyapi.com/documentation/players-and-careers

- Find: `/v1/players?q=` by part of the name, with `position`, `nationality` or `born`.
- One player: `/v1/players/{player_id}`, with birth, size, shooting side and draft.
- Career: `/v1/players/{player_id}/seasons`, every league and team, regular season and playoffs.
- Game log: `/v1/players/{player_id}/games`.
- Awards: `/v1/players/{player_id}/awards`.
- A draft: `/v1/draft/{year}`, every pick in order.
- A season's leaders: `/v1/seasons/{season_id}/leaders`.

### MCP

The API as tools for Claude, ChatGPT, Cursor and other assistants. Page: https://icehockeyapi.com/documentation/mcp

The MCP server gives an assistant 15 tools over this API, so you can ask in plain words and it calls the API for you, with your own key, plan and limits.

#### The server

```
https://icehockeyapi.com/mcp
```

Streamable HTTP, JSON-RPC 2.0. Send your key as `Authorization: Bearer iha_live_...` (or `X-API-Key`).

#### Adding it

- Claude Code: `claude mcp add --transport http icehockeyapi https://icehockeyapi.com/mcp --header "Authorization: Bearer YOUR_KEY"`
- Cursor and other clients that take a JSON config: a server with `"url": "https://icehockeyapi.com/mcp"` and `"headers": {"Authorization": "Bearer YOUR_KEY"}`.
- Clients that only take an address: give `https://icehockeyapi.com/mcp` and add the header where the client allows it.

#### An example

Asked "who won the North American top league games last night, and who scored?", an assistant calls `yesterdays_results`, then `game_scoring` for each game, and answers from what comes back. Every call counts against your plan like any other.

Every tool, its parameters and its plan: [MCP tools](https://icehockeyapi.com/documentation/mcp-tools).

### MCP tools

Every tool the MCP server offers, from the same registry as the API. Page: https://icehockeyapi.com/documentation/mcp-tools

Each tool calls one endpoint with your key. Ids carry their type, as in the API.

##### find_games

Find ice hockey games by date, date range, league, season or team, with scores, how each game ended, venue and attendance. With no filters it gives today's games.

- Calls [`GET /v1/games`](https://icehockeyapi.com/documentation/games)
- Takes `date`, `from`, `to`, `league_id`, `season_id`, `team_id`, `status`, `stage`, `order`, and `per_page`
- Plan: every plan, the free key included

##### get_game

One game in full by its game id (gm_...), with its odds on paid plans.

- Calls [`GET /v1/games/{game_id}`](https://icehockeyapi.com/documentation/game)
- Takes `game_id` (required)
- Plan: every plan, the free key included

##### game_odds

Odds for one game by its game id (gm_...): three-way, moneyline, puck line and totals, with opening, closing and average prices.

- Calls [`GET /v1/games/{game_id}/odds`](https://icehockeyapi.com/documentation/game-odds)
- Takes `game_id` (required)
- Plan: Live and up

##### yesterdays_results

Every finished game from yesterday (UTC), optionally for one league.

- Calls [`GET /v1/results/yesterday`](https://icehockeyapi.com/documentation/results-yesterday)
- Takes `league_id`, and `per_page`
- Plan: every plan, the free key included

##### find_leagues

Find leagues and competitions by country, kind, gender, age group or part of the name. Gives each league's id (lg_...).

- Calls [`GET /v1/leagues`](https://icehockeyapi.com/documentation/leagues)
- Takes `country`, `kind`, `gender`, `age`, `q`, and `per_page`
- Plan: every plan, the free key included

##### league_seasons

Every season of one league, newest first, with first and last game dates and the number of games. Gives each season's id (ss_...).

- Calls [`GET /v1/leagues/{league_id}/seasons`](https://icehockeyapi.com/documentation/league-seasons)
- Takes `league_id` (required), and `per_page`
- Plan: every plan, the free key included

##### find_teams

Find teams by part of the name, country, or the league or season they played in. Gives each team's id (tm_...).

- Calls [`GET /v1/teams`](https://icehockeyapi.com/documentation/teams)
- Takes `league_id`, `season_id`, `country`, `q`, and `per_page`
- Plan: every plan, the free key included

##### get_standings

The regular season table of one season by its season id (ss_...): games, wins, losses, overtime and shootout results, goals and points, built from the results. The free key reads current seasons.

- Calls [`GET /v1/seasons/{season_id}/standings`](https://icehockeyapi.com/documentation/season-standings)
- Takes `season_id` (required)
- Plan: every plan, the free key included

##### get_playoffs

The playoff series of one season by its season id (ss_...): the two teams, wins each, the winner and every game. The free key reads current seasons.

- Calls [`GET /v1/seasons/{season_id}/playoffs`](https://icehockeyapi.com/documentation/season-playoffs)
- Takes `season_id` (required)
- Plan: every plan, the free key included

##### season_leaders

The leading players of one season by its season id (ss_...), ranked by points, goals, assists, plus-minus, penalty minutes or shots. Gives each player's id (pl_...).

- Calls [`GET /v1/seasons/{season_id}/leaders`](https://icehockeyapi.com/documentation/season-leaders)
- Takes `season_id` (required), `category`, `limit`
- Plan: Live and up

##### head_to_head

Every meeting of two teams by their team ids (tm_...), newest first, with the first team's record against the second.

- Calls [`GET /v1/teams/{team_id}/head-to-head/{other_id}`](https://icehockeyapi.com/documentation/head-to-head)
- Takes `team_id` (required), `other_id` (required), and `per_page`
- Plan: Live and up

##### game_scoring

Every goal of one game by its game id (gm_...): period, time, side, scorer, assists, strength and the score after it.

- Calls [`GET /v1/games/{game_id}/goals`](https://icehockeyapi.com/documentation/game-goals)
- Takes `game_id` (required)
- Plan: every plan, the free key included

##### find_players

Find players by part of the name, position, nationality or birth year. Gives each player's id (pl_...).

- Calls [`GET /v1/players`](https://icehockeyapi.com/documentation/players)
- Takes `q`, `position`, `nationality`, `born`, and `per_page`
- Plan: every plan, the free key included

##### player_career

One player's career season by season by the player id (pl_...): every league and team, regular season and playoffs.

- Calls [`GET /v1/players/{player_id}/seasons`](https://icehockeyapi.com/documentation/player-seasons)
- Takes `player_id` (required)
- Plan: Live and up

##### my_usage

The plan this key is on, calls used today and this period, limits, reset times and which seasons the plan covers.

- Calls [`GET /v1/usage`](https://icehockeyapi.com/documentation/usage)
- Takes nothing
- Plan: every plan, the free key included

### Agent skill

One file that teaches an agent to use the API. Page: https://icehockeyapi.com/documentation/agent-skill

The skill is a single markdown file an agent reads before it starts: when to use the API, how to authenticate, the calls that answer the common questions, and the rules.

- [https://icehockeyapi.com/skill.md](https://icehockeyapi.com/skill.md)
- [https://icehockeyapi.com/.well-known/agent-skills/icehockeyapi/SKILL.md](https://icehockeyapi.com/.well-known/agent-skills/icehockeyapi/SKILL.md), with its index at `/.well-known/agent-skills/index.json`

Add it to an agent's skills folder, or give the address to an agent that reads skills from the web. For the whole API in one file, use the [manual](https://icehockeyapi.com/documentation/manual.md).

### Changelog

What changed, newest first. Page: https://icehockeyapi.com/documentation/changelog

- 9 October 2026: Head coaches for every North American top league game since 1917: `/v1/games/{game_id}/coaches`.
- 9 October 2026: Play by play is read every minute while North American top league games are on, with `meta.live` on `/v1/games/{game_id}/events`.
- 8 October 2026: Games carry the status `live`, and results arrive within about ten minutes in more than a thousand leagues.
- 7 October 2026: International competitions named in full: Olympic Games, World Championship, World Junior Championship U20, World Championship U18 and Women.
- 5 October 2026: Swedish top two tiers: lineups, goals and penalties for past seasons.
- 1 October 2026: The MCP server, with 15 tools, at `https://icehockeyapi.com/mcp`.

## Errors

Every error is `{"error": {"code", "message", "docs"}}`, with `plan` on `upgrade_required` and `resets_at` on `quota_exceeded`. The full list: https://icehockeyapi.com/documentation/errors

## About this document

Generated from the endpoint registry, the guides and the plans, never written by hand. The date at the top is the newest of its sources, so two copies with the same date are the same. Machine-readable: https://icehockeyapi.com/openapi.json and the MCP server at https://icehockeyapi.com/mcp. The agent skill: https://icehockeyapi.com/skill.md
