API documentation
The onice API returns the same statistics as the website as JSON: team, skater and goalie tables in every situation, lines, pairs, with-or-without combinations, game reports and more. Everything is calculated by onice from the NHL's play-by-play and shift data.
Base URL: /api/v1/. All endpoints are read-only GET requests. The list of endpoints is also available as JSON at /api/v1/.
Quick start
Ask for the five skaters with the best expected-goals share at 5-on-5 in 2025-26 (at least 100 minutes):
curl "/api/v1/tables/skaters?seasons=20252026&sit=5v5&toi=100&sort=xgf_pct&limit=5"
Use the console under any endpoint below to try it: choose Sample data to see a fixed example response without touching the real data, or Real data to query the real numbers.
Responses
Every response is JSON with two parts:
{
"meta": {
"api": "v1",
"metrics_version": "1", // changes when the meaning of a metric changes
"filters": { ... }, // the filters that were applied
"count": 3, "total": 120, "offset": 0 // for lists
},
"data": [ ... ] // rows (list) or an object, see each endpoint
}
Percentages are 0 to 100. Times on ice are minutes. Numbers are rounded to four decimals. A value that cannot be calculated (for example SV% with no shots against) is null. In the sample data responses meta.sandbox is true.
List endpoints take limit, offset, sort, order and columns. The value meta.total is the number of rows before paging.
Errors
| Status | Meaning |
400 | A parameter is wrong, {"error": "..."} says which. Also returned when the sva situation is asked before its coefficients exist. |
404 | The team, player or game does not exist. |
405 | Only GET is supported. |
Common parameters
Most table endpoints accept these filters. Each endpoint below lists the ones it uses.
| Name | Type | Default | Description |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
sit | situation | all | Game situation: all strengths, even strength, 5v5, 5v5 adjusted for score and venue (sva), power play, penalty kill, exact strengths, empty net (enf: own net empty, ena: against an empty net). Values: 3v3, 4v5, 5v4, 5v5, all, ena, enf, ev, pk, pp, sva |
score | score state | all | Score state from the team's point of view: tied, leading (u), trailing (d), within 1, up 1 (u1), down 1 (d1). Values: all, d, d1, tied, u, u1, w1 |
rate | n | y | r | n | n counts, y rates per 60 minutes, r relative (on ice minus off ice, per 60). Values: n, y, r |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
pos | position | | Skaters only: S all skaters, F forwards, C, L, R, D. The position of the player in each game is used. Values: S, F, C, L, R, D, G |
toi | minutes | 0 | Minimum time on ice, in minutes, in the selected situation. The API applies no default minimum (0). The website uses 100 for skaters. |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
last | number | | Only the last N games of each team (1 to 200). |
team | ids or abbreviations | | Team ids or current abbreviations, separated by commas: COL or 21,22. Abbreviations that are not unique are refused: use the id. |
split | true | false | true | true: a player who played for several teams is one row per team, false: one combined row. Values: true, false |
game | game id | | Restrict the tables to one game (then seasons is not needed). |
limit | number | 100 | Rows to return (1 to 1000). |
offset | number | 0 | Rows to skip. |
sort | column | | Column to sort by. It must be a column of the table. |
order | asc | desc | desc | Sort order. Rows without a value for the column come last. Values: asc, desc |
columns | list of columns | | Return only these columns (identity columns are always returned). |
Situations and metrics
Situations (sit):
all every strength
ev even strength
5v5 five skaters a side with both goalies in
sva 5v5 adjusted for score and venue (the events of the side that gains from the score or home ice are scaled down, method of Micah Blake McCurdy)
pp/pk skater advantage/disadvantage
5v4, 4v5, 3v3 exact strengths
enf/ena own/opponent goalie pulled
Views (rate):
n counts
y every count per 60 minutes (time on ice becomes per game)
r relative, the player's or combination's per-60 numbers minus the team's numbers when he or they are off the ice
Naming. cf/ca shot attempts for/against (Corsi), ff/fa unblocked attempts (Fenwick), sf/sa shots on goal, gf/ga goals, xgf/xga expected goals, scf scoring chances, hdcf/mdcf/ldcf high/medium/low danger chances. A _pct suffix is the share for / (for + against). Every column is described with its formula in the glossary and at /api/v1/glossary.
Expected goals and chances are onice's own models and rules (a logistic regression on shot location, type, rebound and rush context, with danger points by shot place). They are not the numbers of any other site.
Endpoints
Glossary of metrics
GET/api/v1/glossary
Every column the tables can return: key, label, description, unit, formula, and the tables that contain it.
| Parameter | Type | Default | Description |
table | table name | | Only metrics of one table. Values: team, skater_oi, skater_std, goalie, pair, line, wowy, shift, bio |
Returns: A list of metrics.
Example request: /api/v1/glossary
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"count": 54
},
"data": [
{
"key": "gp",
"label": "GP",
"description": "Games played: games with time on ice in any situation.",
"unit": "count",
"tables": [
"team",
"skater_oi",
"skater_std",
"goalie",
"pair",
"line"
],
"formula": "",
"rate_scaled": false,
"version": "1"
},
{
"key": "toi",
"label": "TOI",
"description": "Time on ice in the selected situation, minutes (per game in rate mode).",
"unit": "minutes",
"tables": [
"team",
"skater_oi",
"skater_std",
"goalie",
"pair",
"line"
],
"formula": "",
"rate_scaled": false,
"version": "1"
},
{
"key": "toi_per_gp",
"label": "TOI/GP",
"description": "Time on ice per game played, minutes (rate and relative modes).",
"unit": "minutes",
"tables": [
"team",
"skater_oi",
"skater_std",
"goalie",
"pair",
"line"
],
"formula": "",
"rate_scaled": false,
"version": "1"
},
{
"key": "xga",
"label": "xGA",
"description": "Expected goals against: sum of the xG of the shots faced.",
"unit": "ratio",
"tables": [
"team",
"skater_oi",
"pair",
"line",
"wowy",
"goalie"
... (cut for display)
Default minimum time on ice
GET/api/v1/defaults
The minimums the website applies by default per table and situation. The API itself applies none unless you pass toi.
No parameters.
Returns: An object table -> situation -> minutes.
Example request: /api/v1/defaults
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"unit": "minutes"
},
"data": {
"skater": {
"all": 100,
"ev": 100,
"5v5": 100,
"sva": 100,
"pp": 20,
"pk": 20,
"5v4": 20,
"4v5": 20,
"3v3": 20,
"enf": 20,
"ena": 20
},
"goalie": {
"all": 600,
"ev": 600,
"5v5": 600,
"sva": 600,
"pp": 20,
"pk": 20,
"5v4": 20,
"4v5": 20,
"3v3": 20,
"enf": 20,
"ena": 20
},
"pair": {
"all": 100,
"ev": 100,
"5v5": 100,
"sva": 100,
"pp": 20,
"pk": 20,
"5v4": 20,
"4v5": 20,
"3v3": 20,
"enf": 20,
"ena": 20
},
"line": {
"all": 50,
"ev": 50,
"5v5": 50,
"sva": 50,
"pp": 20,
"pk": 20,
"5v4": 20,
"4v5": 20,
"3v3": 20,
"enf": 20,
"ena": 20
}
}
}
Teams (search by attributes)
GET/api/v1/teams
Teams with their id, current abbreviation and name, franchise and active seasons. Search by any attribute. Abbreviations and names also match the team's historical names (the NHL gives a team a new id when it is renamed or moves). Use the id wherever a team id is needed.
| Parameter | Type | Default | Description |
abbrev | text | | Abbreviation, current or historical (case-insensitive). |
name | text | | Part of the current or a historical name or of the team name. |
city | text | | Part of the city or region of the team in any season. |
franchise | franchise id | | Teams of one franchise (all its ids, past and present). |
season | season id | | Teams that played in that season. |
active | true | false | | Only active (true) or defunct/renamed ids (false). Values: true, false |
limit | number | 100 | Rows to return (1 to 1000). |
offset | number | 0 | Rows to skip. |
sort | column | | Column to sort by. It must be a column of the table. |
order | asc | desc | desc | Sort order. Rows without a value for the column come last. Values: asc, desc |
columns | list of columns | | Return only these columns (identity columns are always returned). |
Returns: One row per team. Supports limit, offset, sort, order, columns.
Example request: /api/v1/teams?limit=3
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"count": 1,
"total": 1,
"offset": 0,
"filters": {
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": [
{
"team_id": 21,
"abbrev": "COL",
"name": "Colorado Avalanche",
"franchise_id": 27,
"franchise": "Colorado Avalanche",
"is_active": true,
"first_season": 20102011,
"last_season": 20262027
}
]
}
Standings
GET/api/v1/standings
One row per team: games played (gp), wins (w), losses in regulation (l), overtime and shootout losses (otl), points, point % (0-100), regulation wins (rw), regulation and overtime wins (row), goals for (gf), goals against (ga) and goal differential (gd), ranked by points. Any set of games can be summed (dates, venue). The site charts of this page (where the points come from, goals against chances) are drawn from these columns and from gf_pct and xgf_pct of tables/teams.
| Parameter | Type | Default | Description |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
team | ids or abbreviations | | Team ids or current abbreviations, separated by commas: COL or 21,22. Abbreviations that are not unique are refused: use the id. |
limit | number | 100 | Rows to return (1 to 1000). |
offset | number | 0 | Rows to skip. |
sort | column | | Column to sort by. It must be a column of the table. |
order | asc | desc | desc | Sort order. Rows without a value for the column come last. Values: asc, desc |
columns | list of columns | | Return only these columns (identity columns are always returned). |
Returns: One row per team. Supports limit, offset, sort, order, columns.
Example request: /api/v1/standings?seasons=20252026&limit=3
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"count": 3,
"total": 32,
"offset": 0,
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": [
{
"team_id": 21,
"gp": 82,
"w": 55,
"l": 16,
"otl": 11,
"points": 121,
"rw": 48,
"row": 51,
"gf": 298,
"ga": 197,
"gd": 101,
"point_pct": 73.78,
"team": "COL"
},
{
"team_id": 12,
"gp": 82,
"w": 53,
"l": 22,
"otl": 7,
"points": 113,
"rw": 39,
"row": 48,
"gf": 291,
"ga": 236,
"gd": 55,
"point_pct": 68.9,
"team": "CAR"
},
{
"team_id": 25,
"gp": 82,
"w": 50,
"l": 20,
"otl": 12,
"points": 112,
"rw": 38,
"row": 44,
"gf": 273,
"ga": 222,
"gd": 51,
"point_pct": 68.29,
"team": "DAL"
}
]
}
Team table
GET/api/v1/tables/teams
One row per team: results and every on-ice column in the selected situation (Corsi, Fenwick, shots, goals, expected goals, scoring chances, high/medium/low danger, PDO, zone faceoffs).
| Parameter | Type | Default | Description |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
sit | situation | all | Game situation: all strengths, even strength, 5v5, 5v5 adjusted for score and venue (sva), power play, penalty kill, exact strengths, empty net (enf: own net empty, ena: against an empty net). Values: 3v3, 4v5, 5v4, 5v5, all, ena, enf, ev, pk, pp, sva |
score | score state | all | Score state from the team's point of view: tied, leading (u), trailing (d), within 1, up 1 (u1), down 1 (d1). Values: all, d, d1, tied, u, u1, w1 |
rate | n | y | r | n | n counts, y rates per 60 minutes, r relative (on ice minus off ice, per 60). Values: n, y, r |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
pos | position | | Skaters only: S all skaters, F forwards, C, L, R, D. The position of the player in each game is used. Values: S, F, C, L, R, D, G |
toi | minutes | 0 | Minimum time on ice, in minutes, in the selected situation. The API applies no default minimum (0). The website uses 100 for skaters. |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
last | number | | Only the last N games of each team (1 to 200). |
team | ids or abbreviations | | Team ids or current abbreviations, separated by commas: COL or 21,22. Abbreviations that are not unique are refused: use the id. |
split | true | false | true | true: a player who played for several teams is one row per team, false: one combined row. Values: true, false |
game | game id | | Restrict the tables to one game (then seasons is not needed). |
vs | true | false | false | true: the VS view, what all opponents together did against each team. Values: true, false |
limit | number | 100 | Rows to return (1 to 1000). |
offset | number | 0 | Rows to skip. |
sort | column | | Column to sort by. It must be a column of the table. |
order | asc | desc | desc | Sort order. Rows without a value for the column come last. Values: asc, desc |
columns | list of columns | | Return only these columns (identity columns are always returned). |
Returns: One row per team. Supports limit, offset, sort, order, columns.
Example request: /api/v1/tables/teams?seasons=20252026&limit=3
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"count": 3,
"total": 32,
"offset": 0,
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "5v5",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": [
{
"team_id": 21,
"team": "COL",
"cf": 4610,
"ca": 3518,
"cf_pct": 56.7175,
"ff": 3278,
"fa": 2582,
"ff_pct": 55.9386,
"sf": 2196,
"sa": 1645,
"sf_pct": 57.1726,
"gf": 216,
"ga": 128,
"gf_pct": 62.7907,
"xgf": 202.8755,
"xga": 153.816,
"xgf_pct": 56.877,
"scf": 2201,
"sca": 1616,
"scf_pct": 57.6631,
"scsf": 1161,
"scsa": 807,
"scsf_pct": 58.9939,
"scgf": 169,
"scga": 101,
"scgf_pct": 62.5926,
"hdcf": 877,
"hdca": 704,
"hdcf_pct": 55.4712,
"hdsf": 554,
"hdsa": 428,
"hdsf_pct": 56.4155,
"hdgf": 100,
"hdga": 70,
"hdgf_pct": 58.8235,
"mdcf": 1324,
"mdca": 912,
"mdcf_pct": 59.2129,
"mdsf": 607,
"mdsa": 379,
"mdsf_pct": 61.5619,
"mdgf": 69,
"mdga": 31,
"mdgf_pct": 69.0,
"ldcf": 2317,
"ldca": 1805,
"ldcf_pct": 56.2106,
"ldsf": 949,
... (cut for display)
Skaters
GET/api/v1/tables/skaters
kind=oi: what the team did while the skater was on the ice, with zone starts and faceoffs. kind=std: the skater's own numbers (goals, assists, shots, expected goals, penalties, hits, faceoffs).
| Parameter | Type | Default | Description |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
sit | situation | all | Game situation: all strengths, even strength, 5v5, 5v5 adjusted for score and venue (sva), power play, penalty kill, exact strengths, empty net (enf: own net empty, ena: against an empty net). Values: 3v3, 4v5, 5v4, 5v5, all, ena, enf, ev, pk, pp, sva |
score | score state | all | Score state from the team's point of view: tied, leading (u), trailing (d), within 1, up 1 (u1), down 1 (d1). Values: all, d, d1, tied, u, u1, w1 |
rate | n | y | r | n | n counts, y rates per 60 minutes, r relative (on ice minus off ice, per 60). Values: n, y, r |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
pos | position | | Skaters only: S all skaters, F forwards, C, L, R, D. The position of the player in each game is used. Values: S, F, C, L, R, D, G |
toi | minutes | 0 | Minimum time on ice, in minutes, in the selected situation. The API applies no default minimum (0). The website uses 100 for skaters. |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
last | number | | Only the last N games of each team (1 to 200). |
team | ids or abbreviations | | Team ids or current abbreviations, separated by commas: COL or 21,22. Abbreviations that are not unique are refused: use the id. |
split | true | false | true | true: a player who played for several teams is one row per team, false: one combined row. Values: true, false |
game | game id | | Restrict the tables to one game (then seasons is not needed). |
kind | oi | std | oi | oi on-ice numbers, std individual numbers. Values: oi, std |
player | list of player ids | | Only these players (NHL player ids, separated by commas). |
limit | number | 100 | Rows to return (1 to 1000). |
offset | number | 0 | Rows to skip. |
sort | column | | Column to sort by. It must be a column of the table. |
order | asc | desc | desc | Sort order. Rows without a value for the column come last. Values: asc, desc |
columns | list of columns | | Return only these columns (identity columns are always returned). |
Returns: One row per player (and team). Supports limit, offset, sort, order, columns.
Example request: /api/v1/tables/skaters?seasons=20252026&limit=3
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"count": 3,
"total": 844,
"offset": 0,
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "5v5",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 100.0,
"split": true
}
},
"data": [
{
"player_id": 8481606,
"player": "Jordan Spence",
"position": "D",
"team_id": 9,
"team": "OTT",
"cf": 1371,
"ca": 906,
"cf_pct": 60.2108,
"ff": 1005,
"fa": 653,
"ff_pct": 60.6152,
"sf": 625,
"sa": 432,
"sf_pct": 59.1296,
"gf": 58,
"ga": 43,
"gf_pct": 57.4257,
"xgf": 64.0123,
"xga": 38.8411,
"xgf_pct": 62.2364,
"scf": 667,
"sca": 404,
"scf_pct": 62.2782,
"scsf": 341,
"scsa": 217,
"scsf_pct": 61.1111,
"scgf": 52,
"scga": 35,
"scgf_pct": 59.7701,
"hdcf": 298,
"hdca": 184,
"hdcf_pct": 61.8257,
"hdsf": 183,
"hdsa": 120,
"hdsf_pct": 60.396,
"hdgf": 34,
"hdga": 27,
"hdgf_pct": 55.7377,
"mdcf": 369,
"mdca": 220,
"mdcf_pct": 62.6486,
"mdsf": 158,
"mdsa": 97,
"mdsf_pct": 61.9608,
"mdgf": 18,
"mdga": 8,
"mdgf_pct": 69.2308,
"ldcf": 680,
... (cut for display)
Goalies
GET/api/v1/tables/goalies
Shots against, saves, goals against, SV%, GAA, goals saved above average (GSAA) and above expected (GSAx), by shot danger, with shot distances.
| Parameter | Type | Default | Description |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
sit | situation | all | Game situation: all strengths, even strength, 5v5, 5v5 adjusted for score and venue (sva), power play, penalty kill, exact strengths, empty net (enf: own net empty, ena: against an empty net). Values: 3v3, 4v5, 5v4, 5v5, all, ena, enf, ev, pk, pp, sva |
score | score state | all | Score state from the team's point of view: tied, leading (u), trailing (d), within 1, up 1 (u1), down 1 (d1). Values: all, d, d1, tied, u, u1, w1 |
rate | n | y | r | n | n counts, y rates per 60 minutes, r relative (on ice minus off ice, per 60). Values: n, y, r |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
pos | position | | Skaters only: S all skaters, F forwards, C, L, R, D. The position of the player in each game is used. Values: S, F, C, L, R, D, G |
toi | minutes | 0 | Minimum time on ice, in minutes, in the selected situation. The API applies no default minimum (0). The website uses 100 for skaters. |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
last | number | | Only the last N games of each team (1 to 200). |
team | ids or abbreviations | | Team ids or current abbreviations, separated by commas: COL or 21,22. Abbreviations that are not unique are refused: use the id. |
split | true | false | true | true: a player who played for several teams is one row per team, false: one combined row. Values: true, false |
game | game id | | Restrict the tables to one game (then seasons is not needed). |
player | list of player ids | | Only these players (NHL player ids, separated by commas). |
limit | number | 100 | Rows to return (1 to 1000). |
offset | number | 0 | Rows to skip. |
sort | column | | Column to sort by. It must be a column of the table. |
order | asc | desc | desc | Sort order. Rows without a value for the column come last. Values: asc, desc |
columns | list of columns | | Return only these columns (identity columns are always returned). |
Returns: One row per goalie (and team). Supports limit, offset, sort, order, columns.
Example request: /api/v1/tables/goalies?seasons=20252026&limit=3
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"count": 3,
"total": 73,
"offset": 0,
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 600.0,
"split": true
}
},
"data": [
{
"player_id": 8478872,
"player": "Karel Vejmelka",
"position": "G",
"team_id": 68,
"team": "UTA",
"shots_against": 1627,
"goals_against": 169,
"saves": 1458,
"sv_pct": 89.6128,
"gaa": 2.7459,
"xga": 180.8115,
"gsaa": 0.9459,
"gsax": 11.8115,
"xsv_pct": 88.8868,
"sv_above_expected": 0.726,
"xgsaa_pct": 6.5325,
"hd_shots_against": 443,
"hd_saves": 353,
"hd_goals_against": 90,
"hdsv_pct": 79.684,
"hdgaa": 1.4623,
"hdgsaa": -6.9416,
"md_shots_against": 424,
"md_saves": 371,
"md_goals_against": 53,
"mdsv_pct": 87.5,
"mdgaa": 0.8611,
"mdgsaa": 1.7557,
"ld_shots_against": 660,
"ld_saves": 634,
"ld_goals_against": 26,
"ldsv_pct": 96.0606,
"ldgaa": 0.4224,
"ldgsaa": 2.9217,
"rebounds_allowed": 165,
"xrebounds_allowed": 157.7745,
"rebounds_saved_above_expected": -7.2255,
"rebound_pct": 11.3169,
"xrebound_pct": 10.8213,
"freezes": 331,
"xfreezes": 306.3533,
"freezes_above_expected": 24.6467,
"freeze_pct": 22.7023,
"rush_attempts_against": 54,
"rebound_attempts_against": 349,
"avg_shot_distance": 36.4745,
"avg_goal_distance": 19.4689,
"rapm_xgf60": null,
... (cut for display)
Team games
GET/api/v1/tables/games
One row per team and game (two rows per game): the date, who played whom and where, the result, and the on-ice columns of the whole game in the selected situation and score state (Corsi, Fenwick, shots, goals, expected goals, scoring chances, high, medium and low danger, PDO, plus-minus). The same rows as the Games page. Attendance is not in the data we collect.
| Parameter | Type | Default | Description |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
sit | situation | all | Game situation: all strengths, even strength, 5v5, 5v5 adjusted for score and venue (sva), power play, penalty kill, exact strengths, empty net (enf: own net empty, ena: against an empty net). Values: 3v3, 4v5, 5v4, 5v5, all, ena, enf, ev, pk, pp, sva |
score | score state | all | Score state from the team's point of view: tied, leading (u), trailing (d), within 1, up 1 (u1), down 1 (d1). Values: all, d, d1, tied, u, u1, w1 |
rate | n | y | r | n | n counts, y rates per 60 minutes, r relative (on ice minus off ice, per 60). Values: n, y, r |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
team | ids or abbreviations | | Team ids or current abbreviations, separated by commas: COL or 21,22. Abbreviations that are not unique are refused: use the id. |
limit | number | 100 | Rows to return (1 to 1000). |
offset | number | 0 | Rows to skip. |
sort | column | | Column to sort by. It must be a column of the table. |
order | asc | desc | desc | Sort order. Rows without a value for the column come last. Values: asc, desc |
columns | list of columns | | Return only these columns (identity columns are always returned). |
Returns: One row per team and game. Supports limit, offset, sort, order, columns.
Example request: /api/v1/tables/games?seasons=20252026&limit=3
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"count": 4,
"total": 82,
"offset": 0,
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "5v5",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"team": [
21
],
"split": true
}
},
"data": [
{
"game_id": 2025021312,
"game_date": "2026-04-16",
"team_id": 21,
"team": "COL",
"opponent": "SEA",
"game": "2026-04-16 COL vs SEA",
"result": "W 2\u20130",
"cf": 58,
"ca": 27,
"cf_pct": 68.2353,
"ff": 44,
"fa": 20,
"ff_pct": 68.75,
"sf": 29,
"sa": 14,
"sf_pct": 67.4419,
"gf": 2,
"ga": 0,
"gf_pct": 100.0,
"xgf": 2.1596,
"xga": 0.4649,
"xgf_pct": 82.2879,
"scf": 24,
"sca": 4,
"scf_pct": 85.7143,
"scsf": 12,
"scsa": 1,
"scsf_pct": 92.3077,
"scgf": 1,
"scga": 0,
"scgf_pct": 100.0,
"hdcf": 9,
"hdca": 3,
"hdcf_pct": 75.0,
"hdsf": 3,
"hdsa": 0,
"hdsf_pct": 100.0,
"hdgf": 0,
"hdga": 0,
"hdgf_pct": null,
"mdcf": 15,
"mdca": 1,
"mdcf_pct": 93.75,
"mdsf": 9,
"mdsa": 1,
... (cut for display)
Player bios
GET/api/v1/tables/bios
The players who played in the selected games (season, game type, team, position, dates) with games played and time on ice, age, date of birth, birth city, state or province and country, height in inches, weight in pounds, shooting or catching hand and the draft (year, team, round, pick in round, overall pick). The same rows as the Bios view of the Player season totals page.
| Parameter | Type | Default | Description |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
team | ids or abbreviations | | Team ids or current abbreviations, separated by commas: COL or 21,22. Abbreviations that are not unique are refused: use the id. |
pos | position | | Skaters only: S all skaters, F forwards, C, L, R, D. The position of the player in each game is used. Values: S, F, C, L, R, D, G |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
limit | number | 100 | Rows to return (1 to 1000). |
offset | number | 0 | Rows to skip. |
sort | column | | Column to sort by. It must be a column of the table. |
order | asc | desc | desc | Sort order. Rows without a value for the column come last. Values: asc, desc |
columns | list of columns | | Return only these columns (identity columns are always returned). |
Returns: One row per player (and team). Supports limit, offset, sort, order, columns.
Example request: /api/v1/tables/bios?seasons=20252026&limit=3
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"count": 3,
"total": 36,
"offset": 0,
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"team": [
21
],
"split": true
}
},
"data": [
{
"player_id": 8475809,
"player": "Scott Wedgewood",
"position": "G",
"birth_date": "1992-08-14",
"gp": 45,
"toi": 2549.0667,
"team_id": 21,
"team": "COL",
"age": 34,
"birth_city": "Brampton",
"birth_state_province": "Ontario",
"birth_country": "CAN",
"height_in": 74,
"weight_lbs": 201,
"shoots_catches": "L",
"draft_year": 2010,
"draft_team": "NJD",
"draft_round": 3,
"draft_pick": 24,
"draft_overall": 84
},
{
"player_id": 8478406,
"player": "Mackenzie Blackwood",
"position": "G",
"birth_date": "1996-12-09",
"gp": 38,
"toi": 2155.6667,
"team_id": 21,
"team": "COL",
"age": 29,
"birth_city": "Thunder Bay",
"birth_state_province": "Ontario",
"birth_country": "CAN",
"height_in": 76,
"weight_lbs": 225,
"shoots_catches": "L",
"draft_year": 2015,
"draft_team": "NJD",
"draft_round": 2,
"draft_pick": 12,
"draft_overall": 42
},
{
"player_id": 8480069,
... (cut for display)
Defensive pairs
GET/api/v1/tables/pairs
Two defensemen who were the only two defensemen on the ice, in any situation, with the full set of on-ice columns.
| Parameter | Type | Default | Description |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
sit | situation | all | Game situation: all strengths, even strength, 5v5, 5v5 adjusted for score and venue (sva), power play, penalty kill, exact strengths, empty net (enf: own net empty, ena: against an empty net). Values: 3v3, 4v5, 5v4, 5v5, all, ena, enf, ev, pk, pp, sva |
score | score state | all | Score state from the team's point of view: tied, leading (u), trailing (d), within 1, up 1 (u1), down 1 (d1). Values: all, d, d1, tied, u, u1, w1 |
rate | n | y | r | n | n counts, y rates per 60 minutes, r relative (on ice minus off ice, per 60). Values: n, y, r |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
pos | position | | Skaters only: S all skaters, F forwards, C, L, R, D. The position of the player in each game is used. Values: S, F, C, L, R, D, G |
toi | minutes | 0 | Minimum time on ice, in minutes, in the selected situation. The API applies no default minimum (0). The website uses 100 for skaters. |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
last | number | | Only the last N games of each team (1 to 200). |
team | ids or abbreviations | | Team ids or current abbreviations, separated by commas: COL or 21,22. Abbreviations that are not unique are refused: use the id. |
split | true | false | true | true: a player who played for several teams is one row per team, false: one combined row. Values: true, false |
game | game id | | Restrict the tables to one game (then seasons is not needed). |
limit | number | 100 | Rows to return (1 to 1000). |
offset | number | 0 | Rows to skip. |
sort | column | | Column to sort by. It must be a column of the table. |
order | asc | desc | desc | Sort order. Rows without a value for the column come last. Values: asc, desc |
columns | list of columns | | Return only these columns (identity columns are always returned). |
Returns: One row per pair. Supports limit, offset, sort, order, columns.
Example request: /api/v1/tables/pairs?seasons=20252026&limit=3
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"count": 3,
"total": 322,
"offset": 0,
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "5v5",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 100.0,
"split": true
}
},
"data": [
{
"team_id": 55,
"team": "SEA",
"player_1_id": 8476457,
"player_1": "Adam Larsson",
"player_2_id": 8478407,
"player_2": "Vince Dunn",
"cf": 1063,
"ca": 1304,
"cf_pct": 44.9092,
"ff": 761,
"fa": 932,
"ff_pct": 44.9498,
"sf": 494,
"sa": 576,
"sf_pct": 46.1682,
"gf": 48,
"ga": 53,
"gf_pct": 47.5248,
"xgf": 44.8532,
"xga": 55.7229,
"xgf_pct": 44.5963,
"scf": 484,
"sca": 585,
"scf_pct": 45.276,
"scsf": 237,
"scsa": 284,
"scsf_pct": 45.4894,
"scgf": 40,
"scga": 39,
"scgf_pct": 50.6329,
"hdcf": 187,
"hdca": 269,
"hdcf_pct": 41.0088,
"hdsf": 105,
"hdsa": 153,
"hdsf_pct": 40.6977,
"hdgf": 25,
"hdga": 22,
"hdgf_pct": 53.1915,
"mdcf": 297,
"mdca": 316,
"mdcf_pct": 48.4502,
"mdsf": 132,
"mdsa": 131,
"mdsf_pct": 50.1901,
"mdgf": 15,
"mdga": 17,
"mdgf_pct": 46.875,
... (cut for display)
Forward lines
GET/api/v1/tables/lines
Three forwards who were the only three forwards on the ice at 5v5 and took at least two faceoffs together in a game, with on-ice columns and rush/rebound attempts.
| Parameter | Type | Default | Description |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
sit | situation | all | Game situation: all strengths, even strength, 5v5, 5v5 adjusted for score and venue (sva), power play, penalty kill, exact strengths, empty net (enf: own net empty, ena: against an empty net). Values: 3v3, 4v5, 5v4, 5v5, all, ena, enf, ev, pk, pp, sva |
score | score state | all | Score state from the team's point of view: tied, leading (u), trailing (d), within 1, up 1 (u1), down 1 (d1). Values: all, d, d1, tied, u, u1, w1 |
rate | n | y | r | n | n counts, y rates per 60 minutes, r relative (on ice minus off ice, per 60). Values: n, y, r |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
pos | position | | Skaters only: S all skaters, F forwards, C, L, R, D. The position of the player in each game is used. Values: S, F, C, L, R, D, G |
toi | minutes | 0 | Minimum time on ice, in minutes, in the selected situation. The API applies no default minimum (0). The website uses 100 for skaters. |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
last | number | | Only the last N games of each team (1 to 200). |
team | ids or abbreviations | | Team ids or current abbreviations, separated by commas: COL or 21,22. Abbreviations that are not unique are refused: use the id. |
split | true | false | true | true: a player who played for several teams is one row per team, false: one combined row. Values: true, false |
game | game id | | Restrict the tables to one game (then seasons is not needed). |
limit | number | 100 | Rows to return (1 to 1000). |
offset | number | 0 | Rows to skip. |
sort | column | | Column to sort by. It must be a column of the table. |
order | asc | desc | desc | Sort order. Rows without a value for the column come last. Values: asc, desc |
columns | list of columns | | Return only these columns (identity columns are always returned). |
Returns: One row per line. Supports limit, offset, sort, order, columns.
Example request: /api/v1/tables/lines?seasons=20252026&limit=3
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"count": 3,
"total": 467,
"offset": 0,
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "5v5",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 50.0,
"split": true
}
},
"data": [
{
"team_id": 52,
"team": "WPG",
"player_1_id": 8480014,
"player_1": "Gabriel Vilardi",
"player_1_pos": "C",
"player_2_id": 8476460,
"player_2": "Mark Scheifele",
"player_2_pos": "C",
"player_3_id": 8478398,
"player_3": "Kyle Connor",
"player_3_pos": "L",
"cf": 579,
"ca": 611,
"cf_pct": 48.6555,
"ff": 439,
"fa": 474,
"ff_pct": 48.0832,
"sf": 285,
"sa": 334,
"sf_pct": 46.042,
"gf": 40,
"ga": 38,
"gf_pct": 51.2821,
"xgf": 30.2237,
"xga": 33.2209,
"xgf_pct": 47.6379,
"scf": 326,
"sca": 307,
"scf_pct": 51.5008,
"scsf": 163,
"scsa": 176,
"scsf_pct": 48.0826,
"scgf": 35,
"scga": 36,
"scgf_pct": 49.2958,
"hdcf": 121,
"hdca": 138,
"hdcf_pct": 46.7181,
"hdsf": 67,
"hdsa": 94,
"hdsf_pct": 41.6149,
"hdgf": 16,
"hdga": 25,
"hdgf_pct": 39.0244,
"mdcf": 205,
"mdca": 169,
"mdcf_pct": 54.8128,
"mdsf": 96,
... (cut for display)
Shift report
GET/api/v1/tables/shifts
Number of shifts, average length, standard deviation, and shifts that are short or long for the player (more than one or two standard deviations from his own average). A shift counts in the situation it began in.
| Parameter | Type | Default | Description |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
sit | situation | all | Game situation: all strengths, even strength, 5v5, 5v5 adjusted for score and venue (sva), power play, penalty kill, exact strengths, empty net (enf: own net empty, ena: against an empty net). Values: 3v3, 4v5, 5v4, 5v5, all, ena, enf, ev, pk, pp, sva |
score | score state | all | Score state from the team's point of view: tied, leading (u), trailing (d), within 1, up 1 (u1), down 1 (d1). Values: all, d, d1, tied, u, u1, w1 |
rate | n | y | r | n | n counts, y rates per 60 minutes, r relative (on ice minus off ice, per 60). Values: n, y, r |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
pos | position | | Skaters only: S all skaters, F forwards, C, L, R, D. The position of the player in each game is used. Values: S, F, C, L, R, D, G |
toi | minutes | 0 | Minimum time on ice, in minutes, in the selected situation. The API applies no default minimum (0). The website uses 100 for skaters. |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
last | number | | Only the last N games of each team (1 to 200). |
team | ids or abbreviations | | Team ids or current abbreviations, separated by commas: COL or 21,22. Abbreviations that are not unique are refused: use the id. |
split | true | false | true | true: a player who played for several teams is one row per team, false: one combined row. Values: true, false |
game | game id | | Restrict the tables to one game (then seasons is not needed). |
player | list of player ids | | Only these players (NHL player ids, separated by commas). |
limit | number | 100 | Rows to return (1 to 1000). |
offset | number | 0 | Rows to skip. |
sort | column | | Column to sort by. It must be a column of the table. |
order | asc | desc | desc | Sort order. Rows without a value for the column come last. Values: asc, desc |
columns | list of columns | | Return only these columns (identity columns are always returned). |
Returns: One row per skater. Supports limit, offset, sort, order, columns.
Example request: /api/v1/tables/shifts?seasons=20252026&limit=3
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"count": 3,
"total": 33,
"offset": 0,
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"team": [
21
],
"split": true
}
},
"data": [
{
"player_id": 8480069,
"player": "Cale Makar",
"position": "D",
"team_id": 21,
"team": "COL",
"shifts": 1938,
"avg_shift": 57.6956,
"std_dev": 27.7873,
"short_shifts": 207,
"long_shifts": 252,
"extra_short": 2,
"extra_long": 77,
"toi": 1863.5667
},
{
"player_id": 8477492,
"player": "Nathan MacKinnon",
"position": "C",
"team_id": 21,
"team": "COL",
"shifts": 1866,
"avg_shift": 57.2653,
"std_dev": 28.3363,
"short_shifts": 175,
"long_shifts": 232,
"extra_short": 0,
"extra_long": 103,
"toi": 1780.95
},
{
"player_id": 8480039,
"player": "Martin Necas",
"position": "C",
"team_id": 21,
"team": "COL",
"shifts": 1746,
"avg_shift": 57.6237,
"std_dev": 27.4371,
"short_shifts": 207,
"long_shifts": 216,
"extra_short": 1,
"extra_long": 80,
"toi": 1676.85
}
]
... (cut for display)
Team overview by situation
GET/api/v1/teams/{team_id}/overview
One row per situation (all, ev, 5v5, sva when available, 5v4, 4v5) with games, time and the on-ice columns.
| Parameter | Type | Default | Description |
team_id required, in the path | id | | For the sample: 21. |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
score | score state | all | Score state from the team's point of view: tied, leading (u), trailing (d), within 1, up 1 (u1), down 1 (d1). Values: all, d, d1, tied, u, u1, w1 |
rate | n | y | r | n | n counts, y rates per 60 minutes, r relative (on ice minus off ice, per 60). Values: n, y, r |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
last | number | | Only the last N games of each team (1 to 200). |
Returns: A list of situation rows.
Example request: /api/v1/teams/21/overview?seasons=20252026
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": [
{
"situation": "all",
"cf": 5709,
"ca": 4480,
"cf_pct": 56.031,
"ff": 4141,
"fa": 3320,
"ff_pct": 55.5019,
"sf": 2768,
"sa": 2144,
"sf_pct": 56.3518,
"gf": 298,
"ga": 197,
"gf_pct": 60.202,
"xgf": 299.9141,
"xga": 231.3871,
"xgf_pct": 56.449,
"scf": 2767,
"sca": 2134,
"scf_pct": 56.4579,
"scsf": 1479,
"scsa": 1112,
"scsf_pct": 57.0822,
"scgf": 220,
"scga": 152,
"scgf_pct": 59.1398,
"hdcf": 1104,
"hdca": 931,
"hdcf_pct": 54.2506,
"hdsf": 701,
"hdsa": 573,
"hdsf_pct": 55.0235,
"hdgf": 131,
"hdga": 96,
"hdgf_pct": 57.7093,
"mdcf": 1663,
"mdca": 1203,
"mdcf_pct": 58.0251,
"mdsf": 778,
"mdsa": 539,
"mdsf_pct": 59.0737,
"mdgf": 89,
"mdga": 56,
"mdgf_pct": 61.3793,
"ldcf": 2790,
"ldca": 2205,
"ldcf_pct": 55.8559,
"ldsf": 1171,
"ldsa": 908,
"ldsf_pct": 56.3252,
"ldgf": 70,
"ldga": 39,
... (cut for display)
Head to head
GET/api/v1/teams/{team_id}/head-to-head
Results against each opponent (wins, losses, overtime losses, points) and the on-ice columns of the selected situation in those games. By default the rows come in the order of the Natural Stat Trick report: the opponents of the division, then the rest of the conference, then the other conference, each group followed by a subtotal row (subtotal true: vs Division, vs Rest of Conference, vs Out of Conference). Every row has its group. Pass groups=0 for a plain list of opponents.
| Parameter | Type | Default | Description |
team_id required, in the path | id | | For the sample: 21. |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
sit | situation | all | Game situation: all strengths, even strength, 5v5, 5v5 adjusted for score and venue (sva), power play, penalty kill, exact strengths, empty net (enf: own net empty, ena: against an empty net). Values: 3v3, 4v5, 5v4, 5v5, all, ena, enf, ev, pk, pp, sva |
score | score state | all | Score state from the team's point of view: tied, leading (u), trailing (d), within 1, up 1 (u1), down 1 (d1). Values: all, d, d1, tied, u, u1, w1 |
rate | n | y | r | n | n counts, y rates per 60 minutes, r relative (on ice minus off ice, per 60). Values: n, y, r |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
last | number | | Only the last N games of each team (1 to 200). |
groups | number | 1 | 1 (default): group the opponents with subtotals, 0: a plain list. Values: 0, 1 |
limit | number | 100 | Rows to return (1 to 1000). |
offset | number | 0 | Rows to skip. |
sort | column | | Column to sort by. It must be a column of the table. |
order | asc | desc | desc | Sort order. Rows without a value for the column come last. Values: asc, desc |
columns | list of columns | | Return only these columns (identity columns are always returned). |
Returns: One row per opponent. Supports limit, offset, sort, order, columns.
Example request: /api/v1/teams/21/head-to-head?seasons=20252026&limit=3
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"count": 3,
"total": 34,
"offset": 0,
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "5v5",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": [
{
"opponent_id": 16,
"opponent": "CHI",
"group": "Division",
"w": 3,
"l": 0,
"otl": 0,
"row": 3,
"points": 6,
"point_pct": 100.0,
"cf": 181,
"ca": 107,
"cf_pct": 62.8472,
"ff": 136,
"fa": 80,
"ff_pct": 62.963,
"sf": 91,
"sa": 48,
"sf_pct": 65.4676,
"gf": 5,
"ga": 1,
"gf_pct": 83.3333,
"xgf": 7.5273,
"xga": 5.0745,
"xgf_pct": 59.7316,
"scf": 86,
"sca": 50,
"scf_pct": 63.2353,
"scsf": 48,
"scsa": 27,
"scsf_pct": 64.0,
"scgf": 5,
"scga": 1,
"scgf_pct": 83.3333,
"hdcf": 34,
"hdca": 25,
"hdcf_pct": 57.6271,
"hdsf": 23,
"hdsa": 14,
"hdsf_pct": 62.1622,
"hdgf": 2,
"hdga": 1,
"hdgf_pct": 66.6667,
"mdcf": 52,
"mdca": 25,
"mdcf_pct": 67.5325,
"mdsf": 25,
"mdsa": 13,
"mdsf_pct": 65.7895,
... (cut for display)
Rolling averages
GET/api/v1/teams/{team_id}/rolling
Sums over the last 10 or 25 games after every game: shot attempts and expected goals for and against, goals for above expected, goals saved above expected, save percentage.
| Parameter | Type | Default | Description |
team_id required, in the path | id | | For the sample: 21. |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
sit | situation | all | Game situation: all strengths, even strength, 5v5, 5v5 adjusted for score and venue (sva), power play, penalty kill, exact strengths, empty net (enf: own net empty, ena: against an empty net). Values: 3v3, 4v5, 5v4, 5v5, all, ena, enf, ev, pk, pp, sva |
score | score state | all | Score state from the team's point of view: tied, leading (u), trailing (d), within 1, up 1 (u1), down 1 (d1). Values: all, d, d1, tied, u, u1, w1 |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
window | 10 | 25 | 10 | Number of games in the window. Values: 10, 25 |
Returns: One row per game once the window is full.
Example request: /api/v1/teams/21/rolling?seasons=20252026
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"window": 10,
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "5v5",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": [
{
"game_id": 2025020140,
"game_date": "2025-10-26",
"opponent": "NJD",
"cf": 590,
"ca": 418,
"cf_pct": 58.5317,
"xgf": 24.4674,
"xga": 16.6235,
"xgf_pct": 59.5445,
"gf_above_expected": 0.5326,
"ga_saved_above_expected": -1.3765,
"sv_pct": 90.4762
},
{
"game_id": 2025020161,
"game_date": "2025-10-28",
"opponent": "NJD",
"cf": 600,
"ca": 422,
"cf_pct": 58.7084,
"xgf": 25.3244,
"xga": 17.516,
"xgf_pct": 59.1134,
"gf_above_expected": 0.6756,
"ga_saved_above_expected": -4.484,
"sv_pct": 88.8325
},
{
"game_id": 2025020178,
"game_date": "2025-10-31",
"opponent": "VGK",
"cf": 593,
"ca": 419,
"cf_pct": 58.5968,
"xgf": 26.7134,
"xga": 16.9418,
"xgf_pct": 61.1918,
"gf_above_expected": 1.2866,
"ga_saved_above_expected": -6.0582,
"sv_pct": 87.8307
},
{
"game_id": 2025020184,
"game_date": "2025-11-01",
"opponent": "SJS",
"cf": 594,
"ca": 423,
"cf_pct": 58.4071,
"xgf": 26.7691,
"xga": 16.2808,
... (cut for display)
Team NHL EDGE tracking
GET/api/v1/teams/{team_id}/edge
NHL EDGE tracking numbers of a team, one row per season and game type (from 2021-22): shot speed and speed bands, top skating speed and bursts, distance skated, share of time by zone (all situations and by strength), shot attempt and shots-on-goal differential per game, and shots and goals by 17 ice areas.
| Parameter | Type | Default | Description |
team_id required, in the path | id | | For the sample: 21. |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
Returns: A list of rows, one per season.
Example request: /api/v1/teams/21/edge?seasons=20252026
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": [
{
"game_type": 2,
"gp": 82,
"top_shot_speed": 99.2,
"avg_shot_speed": 56.9464,
"shots_100_plus": 0,
"shots_90_100": 33,
"shots_80_90": 339,
"shots_70_80": 942,
"top_skating_speed": 23.3719,
"bursts_22_plus": 61,
"bursts_20_22": 1520,
"bursts_18_20": 7731,
"distance_total": 3772.3996,
"distance_per_60": 9.2637,
"distance_max_game": 49.4242,
"oz_time_pct": 0.4089,
"nz_time_pct": 0.1812,
"dz_time_pct": 0.4098,
"shot_attempt_differential": 2.1951,
"sog_differential": 0.0403,
"shot_locations": [
{
"sog": 20,
"area": "Behind the Net",
"goals": 0
},
{
"sog": 63,
"area": "Beyond Red Line",
"goals": 6
},
{
"sog": 216,
"area": "Center Point",
"goals": 6
},
{
"sog": 75,
"area": "Crease",
"goals": 22
},
{
"sog": 231,
"area": "High Slot",
"goals": 28
},
{
"sog": 224,
"area": "L Circle",
"goals": 26
}
... (cut for display)
Team profile
GET/api/v1/teams/{team_id}
Attributes of a team, the other ids of its franchise, its name, city and abbreviation season by season and its regular-season record (games, wins, losses, overtime losses, points) for every season.
| Parameter | Type | Default | Description |
team_id required, in the path | id | | For the sample: 21. |
Returns: An object.
Example request: /api/v1/teams/21
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1"
},
"data": {
"team_id": 21,
"abbrev": "COL",
"name": "Colorado Avalanche",
"is_active": true,
"franchise_id": 27,
"franchise": "Colorado Avalanche",
"franchise_team_ids": [
21
],
"seasons": [
{
"season": 20262027,
"name": "Colorado Avalanche",
"city": "Colorado",
"team_name": "Avalanche",
"abbrev": "COL",
"record": {
"gp": 7,
"w": 4,
"l": 2,
"otl": 1,
"points": 9,
"row": 4
}
},
{
"season": 20252026,
"name": "Colorado Avalanche",
"city": "Colorado",
"team_name": "Avalanche",
"abbrev": "COL",
"record": {
"gp": 82,
"w": 55,
"l": 16,
"otl": 11,
"points": 121,
"row": 51
}
},
{
"season": 20242025,
"name": "Colorado Avalanche",
"city": "Colorado",
"team_name": "Avalanche",
"abbrev": "COL",
"record": {
"gp": 82,
"w": 49,
"l": 29,
"otl": 4,
"points": 102,
"row": 45
}
},
{
"season": 20232024,
"name": "Colorado Avalanche",
"city": "Colorado",
"team_name": "Avalanche",
"abbrev": "COL",
"record": {
"gp": 82,
"w": 50,
... (cut for display)
Team game log
GET/api/v1/teams/{team_id}/games
One row per game of the team in date order: opponent, venue, score, result, points and every on-ice column of the selected situation and score state in that game.
| Parameter | Type | Default | Description |
team_id required, in the path | id | | For the sample: 21. |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
sit | situation | all | Game situation: all strengths, even strength, 5v5, 5v5 adjusted for score and venue (sva), power play, penalty kill, exact strengths, empty net (enf: own net empty, ena: against an empty net). Values: 3v3, 4v5, 5v4, 5v5, all, ena, enf, ev, pk, pp, sva |
score | score state | all | Score state from the team's point of view: tied, leading (u), trailing (d), within 1, up 1 (u1), down 1 (d1). Values: all, d, d1, tied, u, u1, w1 |
rate | n | y | r | n | n counts, y rates per 60 minutes, r relative (on ice minus off ice, per 60). Values: n, y, r |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
last | number | | Only the last N games of each team (1 to 200). |
limit | number | 100 | Rows to return (1 to 1000). |
offset | number | 0 | Rows to skip. |
sort | column | | Column to sort by. It must be a column of the table. |
order | asc | desc | desc | Sort order. Rows without a value for the column come last. Values: asc, desc |
columns | list of columns | | Return only these columns (identity columns are always returned). |
Returns: One row per game. Supports limit, offset, sort, order, columns.
Example request: /api/v1/teams/21/games?seasons=20252026&limit=3
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"count": 3,
"total": 82,
"offset": 0,
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "5v5",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": [
{
"game_id": 2025020003,
"game_date": "2025-10-07",
"season": 20252026,
"game_type": 2,
"decided_in": "REG",
"team_id": 21,
"is_home": false,
"opponent_id": 26,
"opponent": "LAK",
"goals_for": 4,
"goals_against": 1,
"result": "W",
"points": 2,
"cf": 38,
"ca": 48,
"cf_pct": 44.186,
"ff": 25,
"fa": 29,
"ff_pct": 46.2963,
"sf": 17,
"sa": 15,
"sf_pct": 53.125,
"gf": 3,
"ga": 0,
"gf_pct": 100.0,
"xgf": 1.4262,
"xga": 1.4239,
"xgf_pct": 50.0404,
"scf": 17,
"sca": 18,
"scf_pct": 48.5714,
"scsf": 10,
"scsa": 7,
"scsf_pct": 58.8235,
"scgf": 2,
"scga": 0,
"scgf_pct": 100.0,
"hdcf": 8,
"hdca": 7,
"hdcf_pct": 53.3333,
"hdsf": 4,
"hdsa": 5,
"hdsf_pct": 44.4444,
"hdgf": 1,
"hdga": 0,
"hdgf_pct": 100.0,
"mdcf": 9,
"mdca": 11,
... (cut for display)
Team roster
GET/api/v1/teams/{team_id}/roster
Everyone who played for the team in the seasons: skaters with their individual numbers (goals, assists, points, shots, expected goals, penalties, hits ...) and goalies with theirs (SV%, GAA, GSAA, GSAx ...).
| Parameter | Type | Default | Description |
team_id required, in the path | id | | For the sample: 21. |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
sit | situation | all | Game situation: all strengths, even strength, 5v5, 5v5 adjusted for score and venue (sva), power play, penalty kill, exact strengths, empty net (enf: own net empty, ena: against an empty net). Values: 3v3, 4v5, 5v4, 5v5, all, ena, enf, ev, pk, pp, sva |
score | score state | all | Score state from the team's point of view: tied, leading (u), trailing (d), within 1, up 1 (u1), down 1 (d1). Values: all, d, d1, tied, u, u1, w1 |
rate | n | y | r | n | n counts, y rates per 60 minutes, r relative (on ice minus off ice, per 60). Values: n, y, r |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
toi | minutes | 0 | Minimum time on ice, in minutes, in the selected situation. The API applies no default minimum (0). The website uses 100 for skaters. |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
last | number | | Only the last N games of each team (1 to 200). |
Returns: An object: skaters, goalies.
Example request: /api/v1/teams/21/roster?seasons=20252026
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": {
"skaters": [
{
"player_id": 8480069,
"player": "Cale Makar",
"position": "D",
"team_id": 21,
"team": "COL",
"goals": 20,
"assists1": 33,
"assists2": 26,
"shots": 199,
"icf": 546,
"iff": 326,
"ixg": 15.8444,
"isc": 195,
"ihdcf": 21,
"rush_attempts": 2,
"rebounds_created": 33,
"created_xg": 4.3378,
"penalties": 12,
"minor": 12,
"major": 0,
"misconduct": 0,
"pim": 24,
"penalties_drawn": 23,
"giveaways": 86,
"dz_giveaways": 52,
"takeaways": 40,
"hits": 35,
"hits_taken": 42,
"shots_blocked": 118,
"faceoffs_won": 0,
"faceoffs_lost": 0,
"assists": 59,
"points": 79,
"ipp": 57.2464,
"sh_pct": 10.0503,
"faceoff_pct": null,
"ithru_pct": 59.707,
"shooting_talent_pct": null,
"talent_ixg": null,
"gar": 10.876,
"war": 1.8127,
"spar": 3.6253,
"gar_evo": -1.7142,
"gar_evd": 0.7443,
"gar_finishing": 4.1556,
"gar_take": 2.1838,
"gar_draw": 0.4899,
"edge_top_shot_speed": null,
"edge_avg_shot_speed": null,
"edge_top_skating_speed": null,
... (cut for display)
Teammates (with or without)
GET/api/v1/players/{player_id}/teammates
For each teammate: ice time together and the numbers with him, the player's numbers without him, and the teammate's numbers without the player.
| Parameter | Type | Default | Description |
player_id required, in the path | id | | For the sample: 8477492. |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
sit | situation | all | Game situation: all strengths, even strength, 5v5, 5v5 adjusted for score and venue (sva), power play, penalty kill, exact strengths, empty net (enf: own net empty, ena: against an empty net). Values: 3v3, 4v5, 5v4, 5v5, all, ena, enf, ev, pk, pp, sva |
score | score state | all | Score state from the team's point of view: tied, leading (u), trailing (d), within 1, up 1 (u1), down 1 (d1). Values: all, d, d1, tied, u, u1, w1 |
rate | n | y | r | n | n counts, y rates per 60 minutes, r relative (on ice minus off ice, per 60). Values: n, y, r |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
team required | id or abbreviation | | The player's team in those seasons (one id or abbreviation). |
Returns: One row per teammate.
Example request: /api/v1/players/8477492/teammates?seasons=20252026&team=COL
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "5v5",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": [
{
"player_id": 8480039,
"player": "Martin Necas",
"position": "C",
"team": "COL",
"team_id": 21,
"toi_with": 1052.7833,
"toi_without": 201.6333,
"with": {
"cf": 1331,
"ca": 995,
"cf_pct": 57.2227,
"ff": 938,
"fa": 756,
"ff_pct": 55.3719,
"sf": 640,
"sa": 481,
"sf_pct": 57.0919,
"gf": 84,
"ga": 36,
"gf_pct": 70.0,
"xgf": 63.1011,
"xga": 47.9138,
"xgf_pct": 56.8402,
"scf": 689,
"sca": 489,
"scf_pct": 58.489,
"scsf": 371,
"scsa": 249,
"scsf_pct": 59.8387,
"scgf": 66,
"scga": 32,
"scgf_pct": 67.3469,
"hdcf": 254,
"hdca": 222,
"hdcf_pct": 53.3613,
"hdsf": 163,
"hdsa": 134,
"hdsf_pct": 54.8822,
"hdgf": 38,
"hdga": 22,
"hdgf_pct": 63.3333,
"mdcf": 435,
"mdca": 267,
"mdcf_pct": 61.9658,
"mdsf": 208,
"mdsa": 115,
"mdsf_pct": 64.3963,
"mdgf": 28,
"mdga": 10,
"mdgf_pct": 73.6842,
"ldcf": 623,
... (cut for display)
Opposition
GET/api/v1/players/{player_id}/opposition
For each opponent: the player's numbers while that opponent was on the ice.
| Parameter | Type | Default | Description |
player_id required, in the path | id | | For the sample: 8477492. |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
sit | situation | all | Game situation: all strengths, even strength, 5v5, 5v5 adjusted for score and venue (sva), power play, penalty kill, exact strengths, empty net (enf: own net empty, ena: against an empty net). Values: 3v3, 4v5, 5v4, 5v5, all, ena, enf, ev, pk, pp, sva |
score | score state | all | Score state from the team's point of view: tied, leading (u), trailing (d), within 1, up 1 (u1), down 1 (d1). Values: all, d, d1, tied, u, u1, w1 |
rate | n | y | r | n | n counts, y rates per 60 minutes, r relative (on ice minus off ice, per 60). Values: n, y, r |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
team required | id or abbreviation | | The player's team in those seasons (one id or abbreviation). |
Returns: One row per opponent.
Example request: /api/v1/players/8477492/opposition?seasons=20252026&team=COL
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "5v5",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": [
{
"player_id": 8476945,
"player": "Connor Hellebuyck",
"position": "G",
"team": "COL",
"team_id": 21,
"toi_with": 73.25,
"toi_without": null,
"with": {
"cf": 81,
"ca": 58,
"cf_pct": 58.2734,
"ff": 56,
"fa": 45,
"ff_pct": 55.4455,
"sf": 36,
"sa": 32,
"sf_pct": 52.9412,
"gf": 2,
"ga": 4,
"gf_pct": 33.3333,
"xgf": 3.7086,
"xga": 1.9607,
"xgf_pct": 65.4157,
"scf": 42,
"sca": 28,
"scf_pct": 60.0,
"scsf": 22,
"scsa": 15,
"scsf_pct": 59.4595,
"scgf": 2,
"scga": 4,
"scgf_pct": 33.3333,
"hdcf": 17,
"hdca": 7,
"hdcf_pct": 70.8333,
"hdsf": 11,
"hdsa": 4,
"hdsf_pct": 73.3333,
"hdgf": 2,
"hdga": 2,
"hdgf_pct": 50.0,
"mdcf": 25,
"mdca": 21,
"mdcf_pct": 54.3478,
"mdsf": 11,
"mdsa": 11,
"mdsf_pct": 50.0,
"mdgf": 0,
"mdga": 2,
"mdgf_pct": 0.0,
"ldcf": 39,
... (cut for display)
Scoring links
GET/api/v1/players/{player_id}/scoring
Who assisted on his goals, whom he assisted, with whom he assisted together, and who else was on the ice for his points.
| Parameter | Type | Default | Description |
player_id required, in the path | id | | For the sample: 8477492. |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
sit | situation | all | Game situation: all strengths, even strength, 5v5, 5v5 adjusted for score and venue (sva), power play, penalty kill, exact strengths, empty net (enf: own net empty, ena: against an empty net). Values: 3v3, 4v5, 5v4, 5v5, all, ena, enf, ev, pk, pp, sva |
score | score state | all | Score state from the team's point of view: tied, leading (u), trailing (d), within 1, up 1 (u1), down 1 (d1). Values: all, d, d1, tied, u, u1, w1 |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
team | id or abbreviation | | Restrict to games for this team. |
Returns: An object with four lists.
Example request: /api/v1/players/8477492/scoring?seasons=20252026
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"team": [
21
],
"split": true
}
},
"data": {
"goals": 53,
"assists": 74,
"assisted_by": [
{
"player_id": 8480039,
"player": "Martin Necas",
"total": 22,
"first": 16,
"second": 6
},
{
"player_id": 8480069,
"player": "Cale Makar",
"total": 15,
"first": 9,
"second": 6
},
{
"player_id": 8477476,
"player": "Artturi Lehkonen",
"total": 11,
"first": 10,
"second": 1
},
{
"player_id": 8476455,
"player": "Gabriel Landeskog",
"total": 9,
"first": 2,
"second": 7
},
{
"player_id": 8478038,
"player": "Devon Toews",
"total": 7,
"first": 3,
"second": 4
},
{
"player_id": 8484258,
"player": "Sam Malinski",
"total": 5,
"first": 1,
"second": 4
}
],
"assisted_for": [
{
"player_id": 8480039,
... (cut for display)
Shift performance
GET/api/v1/players/{player_id}/shift-performance
Shot attempts (or expected goals) for and against per 60 minutes by the second of the shift, for the player, his team's other players at the same position and the league at that position.
| Parameter | Type | Default | Description |
player_id required, in the path | id | | For the sample: 8477492. |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
start | OZ | NZ | DZ | OTF | | Only shifts that began this way: faceoff in the offensive, neutral or defensive zone, or on the fly. Values: OZ, NZ, DZ, OTF |
metric | c | xg | c | c shot attempts, xg expected goals. Values: c, xg |
five_on_five | true | false | all | true | Count only seconds played at 5v5 (true), the others, or all. Values: true, false, all |
Returns: Three curves of 61 points (seconds 0 to 60).
Example request: /api/v1/players/8477492/shift-performance?seasons=20252026
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": {
"player_id": 8477492,
"position": "C",
"metric": "c",
"player": [
{
"second": 0,
"toi": 4676,
"for_per60": 66.9803,
"against_per60": 35.4149
},
{
"second": 1,
"toi": 6244,
"for_per60": 73.7988,
"against_per60": 33.4401
},
{
"second": 2,
"toi": 7812,
"for_per60": 71.8894,
"against_per60": 35.9447
},
{
"second": 3,
"toi": 7825,
"for_per60": 78.2109,
"against_per60": 35.885
},
{
"second": 4,
"toi": 7835,
"for_per60": 74.4352,
"against_per60": 38.1366
},
{
"second": 5,
"toi": 7844,
"for_per60": 70.2193,
"against_per60": 44.0592
}
],
"team": [
{
"second": 0,
"toi": 41417,
"for_per60": 46.068,
"against_per60": 36.7675
},
{
"second": 1,
"toi": 55205,
"for_per60": 47.6696,
... (cut for display)
Line tool (with or without)
GET/api/v1/wowy
Every with/without combination of up to five teammates: for two players four rows (both, only the first, only the second, neither). view=log gives the combination game by game.
| Parameter | Type | Default | Description |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
sit | situation | all | Game situation: all strengths, even strength, 5v5, 5v5 adjusted for score and venue (sva), power play, penalty kill, exact strengths, empty net (enf: own net empty, ena: against an empty net). Values: 3v3, 4v5, 5v4, 5v5, all, ena, enf, ev, pk, pp, sva |
score | score state | all | Score state from the team's point of view: tied, leading (u), trailing (d), within 1, up 1 (u1), down 1 (d1). Values: all, d, d1, tied, u, u1, w1 |
rate | n | y | r | n | n counts, y rates per 60 minutes, r relative (on ice minus off ice, per 60). Values: n, y, r |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
last | number | | Only the last N games of each team (1 to 200). |
team required | id or abbreviation | | The player's team in those seasons (one id or abbreviation). |
p required | list of player ids | | One to five player ids of the team, separated by commas. |
strict | incl | excl | incl | incl: rows without a player also cover games he missed, excl: only games in which all selected players played. Values: incl, excl |
view | wowy | log | wowy | wowy all combinations, log the all-with combination by game. Values: wowy, log |
vteam | id or abbreviation | | Only games against this team. |
Returns: One row per combination (or per game).
Example request: /api/v1/wowy?seasons=20252026&team=COL&p=8477492,8480069
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"players": [
8477492,
8480069
],
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "5v5",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"team": [
21
],
"split": true
}
},
"data": [
{
"with": [
8477492,
8480069
],
"without": [],
"members": [
{
"player_id": 8477492,
"player": "MacKinnon",
"on": true
},
{
"player_id": 8480069,
"player": "Makar",
"on": true
}
],
"label": "MacKinnon + Makar",
"cf": 958,
"ca": 720,
"cf_pct": 57.0918,
"ff": 671,
"fa": 548,
"ff_pct": 55.0451,
"sf": 451,
"sa": 354,
"sf_pct": 56.0248,
"gf": 53,
"ga": 25,
"gf_pct": 67.9487,
"xgf": 44.0296,
"xga": 33.1596,
"xgf_pct": 57.0411,
"scf": 518,
"sca": 353,
"scf_pct": 59.4719,
"scsf": 276,
"scsa": 189,
"scsf_pct": 59.3548,
"scgf": 39,
"scga": 22,
"scgf_pct": 63.9344,
"hdcf": 187,
"hdca": 163,
... (cut for display)
Player NHL EDGE tracking
GET/api/v1/players/{player_id}/edge
NHL EDGE puck and player tracking numbers of a skater or goalie, one row per season and game type (seasons from 2021-22 on, imperial units: miles and miles per hour). Skaters: top and average shot speed and the number of shots by speed band, top skating speed and bursts by speed band, distance skated (total, per 60 minutes, best game), share of time in the offensive, neutral and defensive zone and of zone starts, shots and goals by 17 ice areas, time by zone and distance by strength (all, es, pp, pk). Goalies: save percentage, GAA, 5v5 save percentage (all and in close games), shots against per 60 at 5v5, games above .900 and shots, goals and saves by area and by danger. Only players whose EDGE documents have been collected have rows.
| Parameter | Type | Default | Description |
player_id required, in the path | id | | For the sample: 8477492. |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
Returns: A list of rows, one per season.
Example request: /api/v1/players/8477492/edge?seasons=20252026
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": [
{
"game_type": 2,
"team_abbrev": "COL",
"gp": 80,
"top_shot_speed": 90.99,
"avg_shot_speed": 58.5965,
"shots_100_plus": 0,
"shots_90_100": 1,
"shots_80_90": 62,
"shots_70_80": 121,
"top_skating_speed": 24.7795,
"bursts_22_plus": 45,
"bursts_20_22": 410,
"bursts_18_20": 819,
"distance_total": 283.3627,
"distance_per_60": 9.5465,
"distance_max_game": 4.8913,
"oz_time_pct": 0.4661,
"nz_time_pct": 0.181,
"dz_time_pct": 0.3529,
"oz_start_pct": 0.4581,
"nz_start_pct": 0.3024,
"dz_start_pct": 0.2395,
"shot_locations": [
{
"sog": 3,
"area": "Behind the Net",
"goals": 0
},
{
"sog": 3,
"area": "Beyond Red Line",
"goals": 1
},
{
"sog": 16,
"area": "Center Point",
"goals": 4
},
{
"sog": 11,
"area": "Crease",
"goals": 3
},
{
"sog": 42,
"area": "High Slot",
"goals": 8
},
{
"sog": 77,
"area": "L Circle",
... (cut for display)
Compare two players
GET/api/v1/compare
Two skaters side by side in one season, as on the Compare page: individual numbers in all situations (scoring, shooting, expected goals, GAR and WAR with components, hits, takeaways, giveaways, penalties, faceoffs), on-ice numbers at 5v5 (Corsi, expected goals, scoring chances, PDO, plus-minus, RAPM, quality of teammates and competition, zone starts) and NHL EDGE. Every row has both raw values and which side is better (for giveaways, penalties and RAPM xGA the smaller value is better). Goalies are not compared.
| Parameter | Type | Default | Description |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
players | string | 8477492,8478402 | Two NHL player ids, comma separated. |
Returns: An object with the two players and the comparison blocks.
Example request: /api/v1/compare?seasons=20252026
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": {
"players": [
{
"player_id": 8477492,
"player": "Nathan MacKinnon",
"team_id": 21,
"goalie": false
},
{
"player_id": 8478402,
"player": "Connor McDavid",
"team_id": 22,
"goalie": false
}
],
"blocks": [
{
"title": "Player",
"rows": [
{
"key": "team",
"label": "Team",
"a": "COL",
"b": "EDM",
"better": null
},
{
"key": "position",
"label": "Position",
"a": "C",
"b": "C",
"better": null
},
{
"key": "gp",
"label": "GP",
"a": 80,
"b": 82,
"better": null
}
]
},
{
"title": "Individual, all situations",
"rows": [
{
"key": "toi",
"label": "TOI",
"a": 1780.95,
"b": 1884.8,
"better": null
},
{
... (cut for display)
Similar players
GET/api/v1/players/{player_id}/similar
The skaters of one season whose numbers are closest to the player's, within his position group (forwards or defensemen): per-60 shots, attempts, expected goals, goals, assists, hits, blocks, giveaways, takeaways, penalties, plus 5v5 CF%, xGF%, zone-start share and ice time. Similarity is 100 for identical numbers. It describes how alike the numbers are, not how the players play.
| Parameter | Type | Default | Description |
player_id required, in the path | id | | For the sample: 8477492. |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
limit | number | 10 | How many players (1 to 50). |
Returns: A list of players with a similarity score.
Example request: /api/v1/players/8477492/similar?seasons=20252026
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": [
{
"player_id": 8478403,
"player": "Jack Eichel",
"similarity": 62.3,
"distance": 2.646
},
{
"player_id": 8476453,
"player": "Nikita Kucherov",
"similarity": 60.2,
"distance": 2.789
},
{
"player_id": 8478402,
"player": "Connor McDavid",
"similarity": 52.0,
"distance": 3.366
},
{
"player_id": 8481559,
"player": "Jack Hughes",
"similarity": 49.2,
"distance": 3.565
},
{
"player_id": 8480027,
"player": "Jason Robertson",
"similarity": 46.2,
"distance": 3.772
}
]
}
Players (list)
GET/api/v1/players
Players who played in the seasons, with games played and time on ice. Filter by team, position and dates. This is how to find player ids (there is no search by name: players are identified by their NHL id).
| Parameter | Type | Default | Description |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
pos | position | | Skaters only: S all skaters, F forwards, C, L, R, D. The position of the player in each game is used. Values: S, F, C, L, R, D, G |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
team | ids or abbreviations | | Team ids or current abbreviations, separated by commas: COL or 21,22. Abbreviations that are not unique are refused: use the id. |
split | true | false | true | true: a player who played for several teams is one row per team, false: one combined row. Values: true, false |
limit | number | 100 | Rows to return (1 to 1000). |
offset | number | 0 | Rows to skip. |
sort | column | | Column to sort by. It must be a column of the table. |
order | asc | desc | desc | Sort order. Rows without a value for the column come last. Values: asc, desc |
columns | list of columns | | Return only these columns (identity columns are always returned). |
Returns: One row per player (and team). Supports limit, offset, sort, order, columns.
Example request: /api/v1/players?seasons=20252026&limit=3
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"count": 3,
"total": 36,
"offset": 0,
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"team": [
21
],
"split": true
}
},
"data": [
{
"player_id": 8475809,
"player": "Scott Wedgewood",
"position": "G",
"birth_date": "1992-08-14",
"gp": 45,
"toi": 2549.0667,
"team_id": 21,
"team": "COL"
},
{
"player_id": 8478406,
"player": "Mackenzie Blackwood",
"position": "G",
"birth_date": "1996-12-09",
"gp": 38,
"toi": 2155.6667,
"team_id": 21,
"team": "COL"
},
{
"player_id": 8480069,
"player": "Cale Makar",
"position": "D",
"birth_date": "1998-10-30",
"gp": 75,
"toi": 1863.5667,
"team_id": 21,
"team": "COL"
}
]
}
Player profile
GET/api/v1/players/{player_id}
Biography (name, position, handedness, birth date, height, weight, current team) and, season by season (team by team for a traded player), the individual numbers and the 5v5 on-ice numbers. For a goalie, the goalie columns.
| Parameter | Type | Default | Description |
player_id required, in the path | id | | For the sample: 8477492. |
seasons | list of season ids | | Seasons to include, e.g. 20252026 or 20242025,20252026. Without it, every season the player played. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
Returns: An object with the biography and a list of seasons.
Example request: /api/v1/players/8477492
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": {
"player_id": 8477492,
"first_name": "Nathan",
"last_name": "MacKinnon",
"position": "C",
"shoots_catches": "R",
"birth_date": "1995-09-01",
"height_cm": 183,
"weight_kg": 91,
"current_team_id": null,
"current_team": null,
"seasons": [
{
"season": 20252026,
"team_id": 21,
"team": "COL",
"individual": {
"player_id": 8477492,
"player": "Nathan MacKinnon",
"position": "C",
"team_id": 21,
"team": "COL",
"goals": 53,
"assists1": 50,
"assists2": 24,
"shots": 352,
"icf": 600,
"iff": 471,
"ixg": 42.7172,
"isc": 323,
"ihdcf": 116,
"rush_attempts": 9,
"rebounds_created": 45,
"created_xg": 5.4234,
"penalties": 15,
"minor": 12,
"major": 1,
"misconduct": 0,
"pim": 39,
"penalties_drawn": 21,
"giveaways": 165,
"dz_giveaways": 36,
"takeaways": 25,
"hits": 64,
"hits_taken": 75,
"shots_blocked": 35,
"faceoffs_won": 681,
"faceoffs_lost": 653,
"assists": 74,
"points": 127,
"ipp": 75.1479,
"sh_pct": 15.0568,
"faceoff_pct": 51.0495,
... (cut for display)
Player game log
GET/api/v1/players/{player_id}/games
One row per game of the player in date order: opponent, venue, score, result, and all his numbers in that game: on-ice columns with zone starts, and individual columns (a goalie: goalie columns), in the selected situation and score state.
| Parameter | Type | Default | Description |
player_id required, in the path | id | | For the sample: 8477492. |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
sit | situation | all | Game situation: all strengths, even strength, 5v5, 5v5 adjusted for score and venue (sva), power play, penalty kill, exact strengths, empty net (enf: own net empty, ena: against an empty net). Values: 3v3, 4v5, 5v4, 5v5, all, ena, enf, ev, pk, pp, sva |
score | score state | all | Score state from the team's point of view: tied, leading (u), trailing (d), within 1, up 1 (u1), down 1 (d1). Values: all, d, d1, tied, u, u1, w1 |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
last | number | | Only the last N games of each team (1 to 200). |
team | ids or abbreviations | | Team ids or current abbreviations, separated by commas: COL or 21,22. Abbreviations that are not unique are refused: use the id. |
rate | n | y | n | n counts, y per 60 minutes. Values: n, y |
limit | number | 100 | Rows to return (1 to 1000). |
offset | number | 0 | Rows to skip. |
sort | column | | Column to sort by. It must be a column of the table. |
order | asc | desc | desc | Sort order. Rows without a value for the column come last. Values: asc, desc |
columns | list of columns | | Return only these columns (identity columns are always returned). |
Returns: One row per game. Supports limit, offset, sort, order, columns.
Example request: /api/v1/players/8477492/games?seasons=20252026&limit=3
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"count": 3,
"total": 80,
"offset": 0,
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "5v5",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": [
{
"game_id": 2025020003,
"game_date": "2025-10-07",
"season": 20252026,
"game_type": 2,
"decided_in": "REG",
"team_id": 21,
"is_home": false,
"opponent_id": 26,
"opponent": "LAK",
"goals_for": 4,
"goals_against": 1,
"result": "W",
"points": 2,
"team": "COL",
"on_ice": {
"cf": 10,
"ca": 18,
"cf_pct": 35.7143,
"ff": 9,
"fa": 13,
"ff_pct": 40.9091,
"sf": 6,
"sa": 7,
"sf_pct": 46.1538,
"gf": 2,
"ga": 0,
"gf_pct": 100.0,
"xgf": 0.8431,
"xga": 0.8442,
"xgf_pct": 49.9663,
"scf": 7,
"sca": 7,
"scf_pct": 50.0,
"scsf": 5,
"scsa": 2,
"scsf_pct": 71.4286,
"scgf": 2,
"scga": 0,
"scgf_pct": 100.0,
"hdcf": 4,
"hdca": 4,
"hdcf_pct": 50.0,
"hdsf": 2,
"hdsa": 2,
"hdsf_pct": 50.0,
"hdgf": 1,
"hdga": 0,
"hdgf_pct": 100.0,
... (cut for display)
Player by situation
GET/api/v1/players/{player_id}/situations
One row per situation (all strengths, even strength, 5v5, sva when available, power play, penalty kill, 5v4, 4v5, 3v3, empty net): the on-ice and individual numbers, or the goalie columns.
| Parameter | Type | Default | Description |
player_id required, in the path | id | | For the sample: 8477492. |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
score | score state | all | Score state from the team's point of view: tied, leading (u), trailing (d), within 1, up 1 (u1), down 1 (d1). Values: all, d, d1, tied, u, u1, w1 |
rate | n | y | r | n | n counts, y rates per 60 minutes, r relative (on ice minus off ice, per 60). Values: n, y, r |
loc | B | H | A | B | Venue: B home and away, H home games only, A away games only. Values: B, H, A |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
last | number | | Only the last N games of each team (1 to 200). |
team | ids or abbreviations | | Team ids or current abbreviations, separated by commas: COL or 21,22. Abbreviations that are not unique are refused: use the id. |
Returns: One row per situation.
Example request: /api/v1/players/8477492/situations?seasons=20252026
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": [
{
"situation": "all",
"on_ice": {
"player_id": 8477492,
"player": "Nathan MacKinnon",
"position": "C",
"team_id": 21,
"team": "COL",
"cf": 2473,
"ca": 1431,
"cf_pct": 63.3453,
"ff": 1820,
"fa": 1094,
"ff_pct": 62.4571,
"sf": 1227,
"sa": 721,
"sf_pct": 62.9877,
"gf": 169,
"ga": 69,
"gf_pct": 71.0084,
"xgf": 153.9418,
"xga": 81.7982,
"xgf_pct": 65.3015,
"scf": 1306,
"sca": 697,
"scf_pct": 65.2022,
"scsf": 726,
"scsa": 375,
"scsf_pct": 65.9401,
"scgf": 122,
"scga": 54,
"scgf_pct": 69.3182,
"hdcf": 503,
"hdca": 310,
"hdcf_pct": 61.8696,
"hdsf": 326,
"hdsa": 192,
"hdsf_pct": 62.9344,
"hdgf": 69,
"hdga": 35,
"hdgf_pct": 66.3462,
"mdcf": 803,
"mdca": 387,
"mdcf_pct": 67.479,
"mdsf": 400,
"mdsa": 183,
"mdsf_pct": 68.6106,
"mdgf": 53,
"mdga": 19,
"mdgf_pct": 73.6111,
"ldcf": 1125,
"ldca": 671,
... (cut for display)
Game report
GET/api/v1/games/{game_id}
Header, numbers by team, situation (all, ev, 5v5, 5v4, 4v5) and period (1, 2, 3, OT and Final), and every power play of the game with its events (goals, shots, misses, blocks, faceoffs, giveaways, takeaways, hits, each by the power-play team or its opponent). The player tables of the game page are the ordinary tables with the game parameter: tables/skaters (kind=std for individual numbers, kind=oi with rate=r for on ice with the relative columns), tables/goalies, tables/shifts, tables/lines, and players/{id}/teammates and players/{id}/opposition for the linemates and the opposition.
| Parameter | Type | Default | Description |
game_id required, in the path | id | | For the sample: 2025020001. |
Returns: An object: header, overview, power_plays.
Example request: /api/v1/games/2025020001
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1"
},
"data": {
"header": {
"game_id": 2025020001,
"date": "2025-10-07",
"type": 2,
"venue": "Amerant Bank Arena",
"home": {
"team_id": 13,
"team": "FLA",
"score": 3
},
"away": {
"team_id": 16,
"team": "CHI",
"score": 2
},
"decided_in": "REG"
},
"overview": [
{
"team_id": 16,
"situation": "4v5",
"period": "1",
"cf": 0,
"ca": 8,
"cf_pct": 0.0,
"ff": 0,
"fa": 6,
"ff_pct": 0.0,
"sf": 0,
"sa": 5,
"sf_pct": 0.0,
"gf": 0,
"ga": 1,
"gf_pct": 0.0,
"xgf": 0,
"xga": 0.6607,
"xgf_pct": 0.0,
"scf": 0,
"sca": 5,
"scf_pct": 0.0,
"scsf": 0,
"scsa": 4,
"scsf_pct": 0.0,
"scgf": 0,
"scga": 1,
"scgf_pct": 0.0,
"hdcf": 0,
"hdca": 3,
"hdcf_pct": 0.0,
"hdsf": 0,
"hdsa": 2,
"hdsf_pct": 0.0,
"hdgf": 0,
"hdga": 0,
"hdgf_pct": null,
"mdcf": 0,
"mdca": 2,
"mdcf_pct": 0.0,
"mdsf": 0,
"mdsa": 2,
"mdsf_pct": 0.0,
"mdgf": 0,
"mdga": 1,
"mdgf_pct": 0.0,
... (cut for display)
Shift chart
GET/api/v1/games/{game_id}/shifts
Every shift of the game with the way it began and the shot attempts for and against during it.
| Parameter | Type | Default | Description |
game_id required, in the path | id | | For the sample: 2025020001. |
Returns: One row per shift.
Example request: /api/v1/games/2025020001/shifts
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1"
},
"data": [
{
"player_id": 8481519,
"team_id": 16,
"period": 1,
"start": 0,
"end": 1200,
"duration": 1200,
"start_type": "NZ",
"cf": 0,
"ca": 0
},
{
"player_id": 8482807,
"team_id": 16,
"period": 1,
"start": 0,
"end": 34,
"duration": 34,
"start_type": "NZ",
"cf": 0,
"ca": 1
},
{
"player_id": 8477450,
"team_id": 16,
"period": 1,
"start": 0,
"end": 39,
"duration": 39,
"start_type": "NZ",
"cf": 0,
"ca": 1
},
{
"player_id": 8482703,
"team_id": 16,
"period": 1,
"start": 0,
"end": 34,
"duration": 34,
"start_type": "NZ",
"cf": 0,
"ca": 1
},
{
"player_id": 8475683,
"team_id": 13,
"period": 1,
"start": 0,
"end": 1200,
"duration": 1200,
"start_type": "NZ",
"cf": 0,
"ca": 0
},
{
"player_id": 8481624,
"team_id": 16,
"period": 1,
"start": 0,
"end": 34,
"duration": 34,
"start_type": "NZ",
"cf": 0,
... (cut for display)
Shot map
GET/api/v1/games/{game_id}/shots
Every shot attempt of the game: place (normalized so the shooting team attacks the positive x direction, feet), type, danger, rush and rebound flags, expected goals.
| Parameter | Type | Default | Description |
game_id required, in the path | id | | For the sample: 2025020001. |
Returns: One row per attempt.
Example request: /api/v1/games/2025020001/shots
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1"
},
"data": [
{
"event_id": 897960,
"period": 1,
"second": 22,
"team_id": 13,
"shooter_id": 8473419,
"result": "block",
"shot_type": "",
"reason": "blocked",
"x": 61,
"y": -3,
"distance": 28.1603,
"angle": 6.1155,
"danger": "LD",
"rush": false,
"rebound": false,
"empty_net": false,
"xg": 0.0,
"strength": "5v5"
},
{
"event_id": 897965,
"period": 1,
"second": 73,
"team_id": 13,
"shooter_id": 8482713,
"result": "block",
"shot_type": "",
"reason": "blocked",
"x": 64,
"y": 16,
"distance": 29.6816,
"angle": 32.6192,
"danger": "MD",
"rush": true,
"rebound": false,
"empty_net": false,
"xg": 0.0,
"strength": "5v5"
},
{
"event_id": 897968,
"period": 1,
"second": 76,
"team_id": 13,
"shooter_id": 8478542,
"result": "shot",
"shot_type": "wrist",
"reason": "",
"x": 58,
"y": 22,
"distance": 38.0132,
"angle": 35.3625,
"danger": "MD",
"rush": false,
"rebound": false,
"empty_net": false,
"xg": 0.0357,
"strength": "5v5"
},
{
"event_id": 897973,
"period": 1,
"second": 95,
... (cut for display)
Games (list)
GET/api/v1/games
Games with date, teams, score, how the game ended and whether its shift chart is available. Filter by seasons, type, team and dates. Newest first.
| Parameter | Type | Default | Description |
seasons required | list of season ids | | One or more seasons, separated by commas: 20252026 or 20242025,20252026. A season id is the start year followed by the end year. |
stype | 1 | 2 | 3 | 2 | Games: 1 preseason, 2 regular season, 3 playoffs. Values: 1, 2, 3 |
fd | date | | First game date, YYYY-MM-DD. |
td | date | | Last game date, YYYY-MM-DD. |
team | ids or abbreviations | | Team ids or current abbreviations, separated by commas: COL or 21,22. Abbreviations that are not unique are refused: use the id. |
limit | number | 100 | Rows to return (1 to 1000). |
offset | number | 0 | Rows to skip. |
sort | column | | Column to sort by. It must be a column of the table. |
order | asc | desc | desc | Sort order. Rows without a value for the column come last. Values: asc, desc |
columns | list of columns | | Return only these columns (identity columns are always returned). |
Returns: One row per game. Supports limit, offset, sort, order, columns.
Example request: /api/v1/games?seasons=20252026&limit=3
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"count": 3,
"total": 82,
"offset": 0,
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"team": [
21
],
"split": true
}
},
"data": [
{
"game_id": 2025021312,
"season": 20252026,
"game_type": 2,
"game_date": "2026-04-16",
"state": "OFF",
"home_team_id": 21,
"home": "COL",
"home_score": 2,
"away_team_id": 55,
"away": "SEA",
"away_score": 0,
"decided_in": "REG",
"venue": "Ball Arena",
"has_shifts": true,
"analyzed": true
},
{
"game_id": 2025021298,
"season": 20252026,
"game_type": 2,
"game_date": "2026-04-14",
"state": "OFF",
"home_team_id": 20,
"home": "CGY",
"home_score": 1,
"away_team_id": 21,
"away": "COL",
"away_score": 3,
"decided_in": "REG",
"venue": "Scotiabank Saddledome",
"has_shifts": true,
"analyzed": true
},
{
"game_id": 2025021289,
"season": 20252026,
"game_type": 2,
"game_date": "2026-04-13",
"state": "OFF",
"home_team_id": 22,
"home": "EDM",
"home_score": 1,
"away_team_id": 21,
"away": "COL",
"away_score": 2,
... (cut for display)
Alternate standings
GET/api/v1/trivia/alternate-standings
The games of one season ranked under another points system, as on the Alternate Standings page: games, wins, losses, overtime or shootout losses, points, point % (0-100 of the points a team could take), regulation wins, regulation and overtime wins, goals for and against and the difference, with the division and conference of each team. Systems: official (2 points for a win, 1 for an overtime or shootout loss), 3pt (the 3-2-1 system: 3 for a regulation win, 2 for an overtime or shootout win, 1 for an overtime or shootout loss), ties (a shootout decides nothing: both teams get 1 point). Views: wildcard (the three best of each division, then the rest of each conference), division, conference, league.
| Parameter | Type | Default | Description |
seasons required | season id | | One season. |
stype | number | 2 | 1 preseason, 2 regular season (default), 3 playoffs. Values: 1, 2, 3 |
system | text | 3pt | Points system. Values: official, 3pt, ties |
view | text | wildcard | How the rows are cut into tables. Values: wildcard, division, conference, league |
Returns: A list of tables, each with a title and its rows.
Example request: /api/v1/trivia/alternate-standings?seasons=20252026
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": [
{
"title": "Atlantic",
"rows": [
{
"team_id": 7,
"team": "BUF",
"name": "Buffalo Sabres",
"division": "Atlantic",
"conference": "East",
"gp": 82,
"w": 50,
"l": 23,
"otl": 9,
"ties": 0,
"rw": 42,
"row": 45,
"points": 151,
"gf": 283,
"ga": 240,
"gd": 43,
"point_pct": 61.3821
},
{
"team_id": 14,
"team": "TBL",
"name": "Tampa Bay Lightning",
"division": "Atlantic",
"conference": "East",
"gp": 82,
"w": 50,
"l": 26,
"otl": 6,
"ties": 0,
"rw": 40,
"row": 46,
"points": 146,
"gf": 286,
"ga": 229,
"gd": 57,
"point_pct": 59.3496
},
{
"team_id": 8,
"team": "MTL",
"name": "Montr\u00e9al Canadiens",
"division": "Atlantic",
"conference": "East",
"gp": 82,
"w": 48,
"l": 24,
"otl": 10,
"ties": 0,
... (cut for display)
Team streaks
GET/api/v1/trivia/streaks
Season highs and active streaks of every team (wins, points, losses, regulation losses) over all games and over home games only and away games only, as on the Streaks page.
| Parameter | Type | Default | Description |
seasons required | season id | | One season. |
stype | number | 2 | 1 preseason, 2 regular season (default), 3 playoffs. Values: 1, 2, 3 |
Returns: An object: the columns and one row per team with its season highs and active streaks.
Example request: /api/v1/trivia/streaks?seasons=20252026
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": {
"columns": [
{
"key": "all_wins",
"label": "Wins"
},
{
"key": "all_points",
"label": "Points"
},
{
"key": "all_losses",
"label": "Losses"
},
{
"key": "all_reg_losses",
"label": "Reg. Losses"
},
{
"key": "home_wins",
"label": "Home Wins"
},
{
"key": "home_points",
"label": "Home Points"
}
],
"teams": [
{
"team_id": 24,
"team": "ANA",
"name": "Anaheim Ducks",
"high": {
"all_wins": 7,
"all_points": 7,
"all_losses": 9,
"all_reg_losses": 5,
"home_wins": 8,
"home_points": 8,
"home_losses": 4,
"home_reg_losses": 3,
"road_wins": 4,
"road_points": 4,
"road_losses": 6,
"road_reg_losses": 5
},
"active": {
"all_wins": 1,
"all_points": 1,
"all_losses": 0,
"all_reg_losses": 0,
"home_wins": 0,
"home_points": 2,
... (cut for display)
Sweater numbers
GET/api/v1/trivia/player-numbers
Every sweater number worn in a season with the players who wore it (a player who changed teams appears with each team): name, position, team and games, as on the Player numbers page. With a number only that number.
| Parameter | Type | Default | Description |
seasons required | season id | | One season. |
number | number | | A sweater number: the players who wore it. |
Returns: A list: one item per number with its players.
Example request: /api/v1/trivia/player-numbers?seasons=20252026
Example response
{
"meta": {
"api": "v1",
"metrics_version": "1",
"filters": {
"seasons": [
20252026
],
"stype": 2,
"sit": "all",
"score": "all",
"rate": "n",
"loc": "B",
"toi": 0.0,
"split": true
}
},
"data": [
{
"number": 97,
"players": [
{
"player_id": 8478402,
"player": "Connor McDavid",
"position": "C",
"team_id": 22,
"team": "Edmonton Oilers",
"abbrev": "EDM",
"gp": 88
},
{
"player_id": 8478864,
"player": "Kirill Kaprizov",
"position": "L",
"team_id": 30,
"team": "Minnesota Wild",
"abbrev": "MIN",
"gp": 89
}
]
}
]
}