Skip to main content

NL — National League app API (www.nationalleague.ch/api, Switzerland) — Other

nl_schedule​

Schedule and results for one season: NL plus exhibitions.

Endpoint URL: GET https://www.nationalleague.ch/api/games

Valid URL: https://www.nationalleague.ch/api/games?season=2026

API ParameterPythonPatternRequiredNullableDescription
seasonseasonYSeason END year: 2026 = 2025/26. Diffing 2026 vs 2027 changes every list, and /player/{playerId} gp (51 vs 7), so it scopes. Lists are served for 2019-2027 (the app's season picker, /api/content/metadata seasons) and patchily before: 2012 and 2017 answered, 2010/2014/2015/2016/2018 answered [] (probed 2026-10-12).

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
game_idintegerSIHF game id <season(4)><competition(4)><sequence(6)> (Int64; e.g. 20261105000325, 1105 = National League). The same id as the sihf family's game_id; its first four digits are the season END year.
home_team_short_namecharacterHome team abbreviation (e.g. HCD)
home_team_namecharacterHome team display name
away_team_short_namecharacterAway team abbreviation
away_team_namecharacterAway team display name
home_team_idintegerHome team. SIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
away_team_idintegerAway team. SIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
vimeo_video_idintegerFull-game video. Vimeo video id (Int64): vimeo.com/.
datecharacterScheduled start, ISO 8601 with UTC offset
statuscharacterGame state: finished, canceled, beforeStartOfPlay (others appear live)
base_statuscharacterCoarse game state; equal to status in every sampled game
home_team_resultintegerHome team goals (final or current score; 0 before the game)
away_team_resultintegerAway team goals (final or current score; 0 before the game)
is_overtimelogicalGame went to overtime
is_shootoutlogicalGame went to a shootout
highlight_vimeo_video_idintegerHighlights video. Vimeo video id (Int64): vimeo.com/.
has_highlightlogicalA highlight video exists
is_currentlogicalGame belongs to the current game day
is_current_for_teamlogicalGame is the team's current game (team-scoped views)
tv_partnercharacterBroadcaster logo image URLs; unobserved: null, absent or empty in every sampled row
spectatorsintegerAttendance (Int64; the API sends a digit string).
has_my_sportslogicalBroadcast on MySports
refereescharacterOfficials as '# ' strings (referees and linesmen; one entry in some games)
is_exhibitionlogicalExhibition game, not NL competition (competition code other than 1105)
home_team_coachcharacterHome head coach name; filled in a game's overview, null in the season lists; unobserved: null, absent or empty in every sampled row
away_team_coachcharacterAway head coach name; filled in a game's overview, null in the season lists; unobserved: null, absent or empty in every sampled row
game_timeintegerElapsed game minutes; 0 on every game in the season lists, 60 in a finished game's overview
show_game_timelogicalApp flag: show gameTime
arenacharacterName of the arena the game is played in

return_parsed=False — the raw JSON Dict payload, unparsed.

Example​

nl_schedule(season=2026)

Last validated n/a.

nl_current_games​

The current or next game day.

Endpoint URL: GET https://www.nationalleague.ch/api/games/current

Valid URL: https://www.nationalleague.ch/api/games/current?season=2027

API ParameterPythonPatternRequiredNullableDescription
seasonseasonYThe running season's END year (2027 on 2026-10-12). Season END year: 2026 = 2025/26. Diffing 2026 vs 2027 changes every list, and /player/{playerId} gp (51 vs 7), so it scopes. Lists are served for 2019-2027 (the app's season picker, /api/content/metadata seasons) and patchily before: 2012 and 2017 answered, 2010/2014/2015/2016/2018 answered [] (probed 2026-10-12).

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
game_idintegerSIHF game id <season(4)><competition(4)><sequence(6)> (Int64; e.g. 20261105000325, 1105 = National League). The same id as the sihf family's game_id; its first four digits are the season END year.
home_team_short_namecharacterHome team abbreviation (e.g. HCD)
home_team_namecharacterHome team display name
away_team_short_namecharacterAway team abbreviation
away_team_namecharacterAway team display name
home_team_idintegerHome team. SIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
away_team_idintegerAway team. SIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
vimeo_video_idintegerFull-game video. Vimeo video id (Int64): vimeo.com/.
datecharacterScheduled start, ISO 8601 with UTC offset
statuscharacterGame state: finished, canceled, beforeStartOfPlay (others appear live)
base_statuscharacterCoarse game state; equal to status in every sampled game
home_team_resultintegerHome team goals (final or current score; 0 before the game)
away_team_resultintegerAway team goals (final or current score; 0 before the game)
is_overtimelogicalGame went to overtime
is_shootoutlogicalGame went to a shootout
highlight_vimeo_video_idintegerHighlights video. Vimeo video id (Int64): vimeo.com/.
has_highlightlogicalA highlight video exists
is_currentlogicalGame belongs to the current game day
is_current_for_teamlogicalGame is the team's current game (team-scoped views)
tv_partnercharacterBroadcaster logo image URLs
spectatorsintegerAttendance (Int64; the API sends a digit string).
has_my_sportslogicalBroadcast on MySports
refereescharacterOfficials as '# ' strings (referees and linesmen; one entry in some games); unobserved: null, absent or empty in every sampled row
is_exhibitionlogicalExhibition game, not NL competition (competition code other than 1105)
home_team_coachcharacterHome head coach name; filled in a game's overview, null in the season lists; unobserved: null, absent or empty in every sampled row
away_team_coachcharacterAway head coach name; filled in a game's overview, null in the season lists; unobserved: null, absent or empty in every sampled row
game_timeintegerElapsed game minutes; 0 on every game in the season lists, 60 in a finished game's overview
show_game_timelogicalApp flag: show gameTime
arenacharacterName of the arena the game is played in

return_parsed=False — the raw JSON Dict payload, unparsed.

Example​

nl_current_games(season=2027)

Last validated n/a.

nl_playoffs​

Playoff and play-in series by round: one row per game, with its series score.

Endpoint URL: GET https://www.nationalleague.ch/api/games/playoffs

Valid URL: https://www.nationalleague.ch/api/games/playoffs?season=2026

API ParameterPythonPatternRequiredNullableDescription
seasonseasonYSeason END year: 2026 = 2025/26. Diffing 2026 vs 2027 changes every list, and /player/{playerId} gp (51 vs 7), so it scopes. Lists are served for 2019-2027 (the app's season picker, /api/content/metadata seasons) and patchily before: 2012 and 2017 answered, 2010/2014/2015/2016/2018 answered [] (probed 2026-10-12).

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
series_groupintegerSeries number within the round (1 = first pairing; 0 seen in playouts)
series_home_team_short_namecharacterAbbreviation of the team with home ice
series_away_team_short_namecharacterAbbreviation of the other team
series_home_team_idintegerTeam with home ice in the series. SIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
series_away_team_idintegerThe other team in the series. SIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
series_home_team_resultintegerSeries wins of the team with home ice
series_away_team_resultintegerSeries wins of the other team
series_best_ofintegerSeries length in games (7; 2 in the play-in)
series_titlecharacterSeries length label, e.g. 'Best of 7'
roundcharacterRound key: final, semifinal, quarterfinal, playIn (/playoffs); leagueQualifications, playoutFinal (/playouts)
game_idintegerSIHF game id <season(4)><competition(4)><sequence(6)> (Int64; e.g. 20261105000325, 1105 = National League). The same id as the sihf family's game_id; its first four digits are the season END year.
home_team_short_namecharacterHome team abbreviation (e.g. HCD)
home_team_namecharacterHome team display name
away_team_short_namecharacterAway team abbreviation
away_team_namecharacterAway team display name
home_team_idintegerHome team. SIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
away_team_idintegerAway team. SIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
vimeo_video_idintegerFull-game video. Vimeo video id (Int64): vimeo.com/.
datecharacterScheduled start, ISO 8601 with UTC offset
statuscharacterGame state: finished, canceled, beforeStartOfPlay (others appear live)
base_statuscharacterCoarse game state; equal to status in every sampled game
home_team_resultintegerHome team goals (final or current score; 0 before the game)
away_team_resultintegerAway team goals (final or current score; 0 before the game)
is_overtimelogicalGame went to overtime
is_shootoutlogicalGame went to a shootout
highlight_vimeo_video_idintegerHighlights video. Vimeo video id (Int64): vimeo.com/.
has_highlightlogicalA highlight video exists
is_currentlogicalGame belongs to the current game day
is_current_for_teamlogicalGame is the team's current game (team-scoped views)
tv_partnercharacterBroadcaster logo image URLs
spectatorsintegerAttendance (Int64; the API sends a digit string).
has_my_sportslogicalBroadcast on MySports
refereescharacterOfficials as '# ' strings (referees and linesmen; one entry in some games)
is_exhibitionlogicalExhibition game, not NL competition (competition code other than 1105)
home_team_coachcharacterHome head coach name; filled in a game's overview, null in the season lists; unobserved: null, absent or empty in every sampled row
away_team_coachcharacterAway head coach name; filled in a game's overview, null in the season lists; unobserved: null, absent or empty in every sampled row
game_timeintegerElapsed game minutes; 0 on every game in the season lists, 60 in a finished game's overview
show_game_timelogicalApp flag: show gameTime
arenacharacterName of the arena the game is played in

return_parsed=False — the raw JSON Dict payload, unparsed.

Example​

nl_playoffs(season=2026)

Last validated n/a.

nl_playouts​

Playout and league-qualification series by round: one row per game, with its series score.

Endpoint URL: GET https://www.nationalleague.ch/api/games/playouts

Valid URL: https://www.nationalleague.ch/api/games/playouts?season=2026

API ParameterPythonPatternRequiredNullableDescription
seasonseasonYSeason END year: 2026 = 2025/26. Diffing 2026 vs 2027 changes every list, and /player/{playerId} gp (51 vs 7), so it scopes. Lists are served for 2019-2027 (the app's season picker, /api/content/metadata seasons) and patchily before: 2012 and 2017 answered, 2010/2014/2015/2016/2018 answered [] (probed 2026-10-12).

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
series_groupintegerSeries number within the round (1 = first pairing; 0 seen in playouts)
series_home_team_short_namecharacterAbbreviation of the team with home ice
series_away_team_short_namecharacterAbbreviation of the other team
series_home_team_idintegerTeam with home ice in the series. SIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
series_away_team_idintegerThe other team in the series. SIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
series_home_team_resultintegerSeries wins of the team with home ice
series_away_team_resultintegerSeries wins of the other team
series_best_ofintegerSeries length in games (7; 2 in the play-in)
series_titlecharacterSeries length label, e.g. 'Best of 7'
roundcharacterRound key: final, semifinal, quarterfinal, playIn (/playoffs); leagueQualifications, playoutFinal (/playouts)
game_idintegerSIHF game id <season(4)><competition(4)><sequence(6)> (Int64; e.g. 20261105000325, 1105 = National League). The same id as the sihf family's game_id; its first four digits are the season END year.
home_team_short_namecharacterHome team abbreviation (e.g. HCD)
home_team_namecharacterHome team display name
away_team_short_namecharacterAway team abbreviation
away_team_namecharacterAway team display name
home_team_idintegerHome team. SIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
away_team_idintegerAway team. SIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
vimeo_video_idintegerFull-game video. Vimeo video id (Int64): vimeo.com/.
datecharacterScheduled start, ISO 8601 with UTC offset
statuscharacterGame state: finished, canceled, beforeStartOfPlay (others appear live)
base_statuscharacterCoarse game state; equal to status in every sampled game
home_team_resultintegerHome team goals (final or current score; 0 before the game)
away_team_resultintegerAway team goals (final or current score; 0 before the game)
is_overtimelogicalGame went to overtime
is_shootoutlogicalGame went to a shootout
highlight_vimeo_video_idintegerHighlights video. Vimeo video id (Int64): vimeo.com/.
has_highlightlogicalA highlight video exists
is_currentlogicalGame belongs to the current game day
is_current_for_teamlogicalGame is the team's current game (team-scoped views)
tv_partnercharacterBroadcaster logo image URLs
spectatorsintegerAttendance (Int64; the API sends a digit string).
has_my_sportslogicalBroadcast on MySports
refereescharacterOfficials as '# ' strings (referees and linesmen; one entry in some games)
is_exhibitionlogicalExhibition game, not NL competition (competition code other than 1105)
home_team_coachcharacterHome head coach name; filled in a game's overview, null in the season lists; unobserved: null, absent or empty in every sampled row
away_team_coachcharacterAway head coach name; filled in a game's overview, null in the season lists; unobserved: null, absent or empty in every sampled row
game_timeintegerElapsed game minutes; 0 on every game in the season lists, 60 in a finished game's overview
show_game_timelogicalApp flag: show gameTime
arenacharacterName of the arena the game is played in

return_parsed=False — the raw JSON Dict payload, unparsed.

Example​

nl_playouts(season=2026)

Last validated n/a.

nl_game_overview​

One game's header: teams, date, status, final and per-period score, coaches, referees, arena, attendance.

Endpoint URL: GET https://www.nationalleague.ch/api/games/{game_id}

Valid URL: https://www.nationalleague.ch/api/games/20261105000325

API ParameterPythonPatternRequiredNullableDescription
game_idgame_idYSIHF game id, 14 digits <season(4)><competition(4)><sequence(6)> (game_id in nl_schedule; the same id as the sihf family's game_id), e.g. 20261105000325.

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
game_idintegerSIHF game id <season(4)><competition(4)><sequence(6)> (Int64; e.g. 20261105000325, 1105 = National League). The same id as the sihf family's game_id; its first four digits are the season END year.
home_team_short_namecharacterHome team abbreviation (e.g. HCD)
home_team_namecharacterHome team display name
away_team_short_namecharacterAway team abbreviation
away_team_namecharacterAway team display name
home_team_idintegerHome team. SIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
away_team_idintegerAway team. SIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
vimeo_video_idintegerFull-game video. Vimeo video id (Int64): vimeo.com/.
datecharacterScheduled start, ISO 8601 with UTC offset
statuscharacterGame state: finished, canceled, beforeStartOfPlay (others appear live)
base_statuscharacterCoarse game state; equal to status in every sampled game
home_team_resultintegerHome team goals (final or current score; 0 before the game)
away_team_resultintegerAway team goals (final or current score; 0 before the game)
is_overtimelogicalGame went to overtime
is_shootoutlogicalGame went to a shootout
highlight_vimeo_video_idintegerHighlights video. Vimeo video id (Int64): vimeo.com/.
has_highlightlogicalA highlight video exists
is_currentlogicalGame belongs to the current game day
is_current_for_teamlogicalGame is the team's current game (team-scoped views)
tv_partnercharacterBroadcaster logo image URLs
spectatorsintegerAttendance (Int64; the API sends a digit string).
has_my_sportslogicalBroadcast on MySports
refereescharacterOfficials as '# ' strings (referees and linesmen; one entry in some games)
is_exhibitionlogicalExhibition game, not NL competition (competition code other than 1105)
home_team_coachcharacterHome head coach name; filled in a game's overview, null in the season lists
away_team_coachcharacterAway head coach name; filled in a game's overview, null in the season lists
game_timeintegerElapsed game minutes; 0 on every game in the season lists, 60 in a finished game's overview
show_game_timelogicalApp flag: show gameTime
arenacharacterName of the arena the game is played in
home_team_first_resultintegerHome goals in the 1st period
away_team_first_resultintegerAway goals in the 1st period
home_team_second_resultintegerHome goals in the 2nd period
away_team_second_resultintegerAway goals in the 2nd period
home_team_third_resultintegerHome goals in the 3rd period
away_team_third_resultintegerAway goals in the 3rd period
home_team_overtime_resultintegerHome overtime goals, all overtime periods
away_team_overtime_resultintegerAway overtime goals, all overtime periods
home_team_overtime1_resultintegerHome goals in overtime period 1 (playoff games can have several)
away_team_overtime1_resultintegerAway goals in overtime period 1
home_team_overtime2_resultintegerHome goals in overtime period 2
away_team_overtime2_resultintegerAway goals in overtime period 2
home_team_overtime3_resultintegerHome goals in overtime period 3
away_team_overtime3_resultintegerAway goals in overtime period 3
home_team_shootout_resultintegerHome shootout goals
away_team_shootout_resultintegerAway shootout goals
home_aggregated_scorecharacterHome aggregate over a two-legged tie; unobserved: null or empty in every sampled row
away_aggregated_scorecharacterAway aggregate over a two-legged tie; unobserved: null or empty in every sampled row

return_parsed=False — the raw JSON Dict payload, unparsed.

Example​

nl_game_overview(game_id=20261105000325)

Last validated n/a.

nl_pbp​

One game's event timeline: goals with assists, penalties, goaltender changes, revoked goals.

Endpoint URL: GET https://www.nationalleague.ch/api/games/{game_id}

Valid URL: https://www.nationalleague.ch/api/games/20261105000325

API ParameterPythonPatternRequiredNullableDescription
game_idgame_idYSIHF game id, 14 digits <season(4)><competition(4)><sequence(6)> (game_id in nl_schedule; the same id as the sihf family's game_id), e.g. 20261105000325.

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
game_idintegerSIHF game id <season(4)><competition(4)><sequence(6)> (Int64; e.g. 20261105000325, 1105 = National League). The same id as the sihf family's game_id; its first four digits are the season END year.
event_indexinteger1-based position of the event in the game's timeline.
team_sidecharacterhome or away: the side of the team this row belongs to.
game_secondsintegerElapsed game time of the event in seconds, from the MMSS time (822 = 8:22 -> 502).
team_idintegerSIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
home_teamlogicalEvent belongs to the home team
timecharacterGame clock elapsed as an MMSS string without separator ('822' = 8:22, '5954' = 59:54)
video_timeintegerSeconds into the game video; 0 when there is no clip
video_vimeo_idintegerClip of this event. Vimeo video id (Int64): vimeo.com/.
actioncharacterEvent type: goal, foul (penalty), in / out (goaltender enters / leaves), revokedGoal
foul_typeintegerSIHF penalty code (116-125 in the sample); 0 on non-penalty events
foul_minutesintegerPenalty minutes; 0 on non-penalty events
player_first_namecharacterShooter's first name, from the game's lineup.
player_last_namecharacterShooter's last name, from the game's lineup.
player_numbercharacterShooter's sweater number, from the game's lineup (a string).
player_totalintegerScorer's goals this season including this one; 0 on non-goal events
periodintegerPeriod number, an integer (the parent third is a string)
overtimeintegerOvertime period number; 0 in regulation
goal_situationcharacterGoal kind; 'normal' on every sampled event
home_team_resultintegerHome score after the event
away_team_resultintegerAway score after the event
assist1_first_namecharacterFirst assist: first name
assist1_last_namecharacterFirst assist: last name
assist1_numbercharacterFirst assist: sweater number, a string
assist1_totalintegerFirst assister's assists this season including this one
assist2_first_namecharacterSecond assist: first name
assist2_last_namecharacterSecond assist: last name
assist2_numbercharacterSecond assist: sweater number, a string
assist2_totalintegerSecond assister's assists this season including this one
situationcharacterGoal tags, comma-separated: EQ (even strength), PP1 (power play), GWG (game-winning goal); null on non-goals
revoked_goal_typeintegerRevoked-goal category code (1 on every sampled event)
revoked_goal_sub_typeintegerRevoked-goal reason code (1 on the revoked goal, 0 elsewhere)
review_successfulcharacterVideo-review outcome; unobserved: null or empty in every sampled row
review_goal_countslogicalGoal stood after review

return_parsed=False — the raw JSON Dict payload, unparsed.

Example​

nl_pbp(game_id=20261105000325)

Last validated n/a.

nl_lineups​

One game's lineups: every dressed player by unit, with licence number, position and line.

Endpoint URL: GET https://www.nationalleague.ch/api/games/{game_id}

Valid URL: https://www.nationalleague.ch/api/games/20261105000325

API ParameterPythonPatternRequiredNullableDescription
game_idgame_idYSIHF game id, 14 digits <season(4)><competition(4)><sequence(6)> (game_id in nl_schedule; the same id as the sihf family's game_id), e.g. 20261105000325.

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
game_idintegerSIHF game id <season(4)><competition(4)><sequence(6)> (Int64; e.g. 20261105000325, 1105 = National League). The same id as the sihf family's game_id; its first four digits are the season END year.
team_sidecharacterhome or away: the side of the team this row belongs to.
team_idintegerSIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
unitcharacterLineup group: goalkeeper, or the line number 1-4 as a string.
player_idintegerSIHF licence number (Int64; e.g. 305519 = Tobias Geisser). Joins the sihf family's player_id and every SIHF *LicenceNr.
positioncharactergoalkeeper, defender or forwarder (sic)
lineintegerLine number, an integer (goalkeepers 1-2 = first / backup)
first_namecharacterFirst (given) name of the player
last_namecharacterLast (family) name of the player
numbercharacterSweater number, a string
is_topscorerlogicalWears the team's PostFinance Top Scorer jersey
is_captainlogicalWhether the player is the team captain
first_goalkeeperlogicalStarting goaltender

return_parsed=False — the raw JSON Dict payload, unparsed.

Example​

nl_lineups(game_id=20261105000325)

Last validated n/a.

nl_shots​

One game's shot attempts with rink location (metres) and expected goals (xG); NL games only.

Endpoint URL: GET https://www.nationalleague.ch/api/games/{game_id}

Valid URL: https://www.nationalleague.ch/api/games/20261105000325

API ParameterPythonPatternRequiredNullableDescription
game_idgame_idYSIHF game id, 14 digits <season(4)><competition(4)><sequence(6)> (game_id in nl_schedule; the same id as the sihf family's game_id), e.g. 20261105000325.

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
game_idintegerSIHF game id <season(4)><competition(4)><sequence(6)> (Int64; e.g. 20261105000325, 1105 = National League). The same id as the sihf family's game_id; its first four digits are the season END year.
team_sidecharacterhome or away: the side of the team this row belongs to.
team_idintegerSIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
player_idintegerSIHF licence number (Int64; e.g. 305519 = Tobias Geisser). Joins the sihf family's player_id and every SIHF *LicenceNr.
player_numbercharacterShooter's sweater number, from the game's lineup (a string).
player_first_namecharacterShooter's first name, from the game's lineup.
player_last_namecharacterShooter's last name, from the game's lineup.
periodintegerPeriod number (1-3; overtime follows)
timeintegerGame clock elapsed in seconds (period 2 starts at 1200)
strengthcharacterStrength: EQ (even), PP (power play), PK (shorthanded)
shot_typecharacterOutcome: SOG (saved shot on goal), MISS, POST, BLOCK, GOAL
pos_xnumericAcross-ice position in metres, 0-30 (rink width). Both axes run in metres on a 30 x 60 m rink.
pos_ynumericDistance in metres from the end boards of the attacked end, 0-60 along the rink length. Shots are mirrored to one attacking end (inferred); above 30 is a shot from beyond centre; the goal line is 4 m out.
pos_x_percentagenumericposX / 30 (verified on 475 shots)
pos_y_percentagenumericpos_y / 24, the depth of the app's zone drawing; above 1 for long shots.
video_timeintegerSeconds into the game video (= unix - unixStart; verified on 475 shots)
xgnumericExpected goals of this shot, 0-1. Non-zero from the 2023 season (one sampled game per season; 0 in the 2021 and 2022 games); always 0 on a BLOCK.
xg_sumnumericRunning sum of this team's xg up to and including this shot
unixintegerWall-clock time of the shot, Unix epoch seconds
unix_startintegerWall-clock start of the game video, Unix epoch seconds

return_parsed=False — the raw JSON Dict payload, unparsed.

Example​

nl_shots(game_id=20261105000325)

Last validated n/a.

nl_top_scorers​

Top scorers (same row shape as /player).

Endpoint URL: GET https://www.nationalleague.ch/api/player/topscorer

Valid URL: https://www.nationalleague.ch/api/player/topscorer?take=3&season=2026&phase=4940

API ParameterPythonPatternRequiredNullableDescription
taketakeYNumber of rows (take=3 answered 3).
seasonseasonYSeason END year: 2026 = 2025/26. Diffing 2026 vs 2027 changes every list, and /player/{playerId} gp (51 vs 7), so it scopes. Lists are served for 2019-2027 (the app's season picker, /api/content/metadata seasons) and patchily before: 2012 and 2017 answered, 2010/2014/2015/2016/2018 answered [] (probed 2026-10-12).
phasephaseYSIHF phase id (see x-phase-ids). On /player, omitting it served the regular season (byte-identical to phase=4940); that default is assumed but unverified on this route. Phase ids change every season; whether the metadata ids apply to 2027 is unverified.

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
player_idintegerSIHF licence number (Int64; e.g. 305519 = Tobias Geisser). Joins the sihf family's player_id and every SIHF *LicenceNr.
first_namecharacterFirst (given) name of the player
last_namecharacterLast (family) name of the player
team_idintegerSIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
team_short_namecharacterTeam abbreviation
team_namecharacterTeam name as the league app displays it
numbercharacterSweater number, a string
positioncharactergoalkeeper, defender or forwarder (sic); one of 502 rows in the full 2026 body has the integer 0
topscorer_pointsintegerPostFinance Top Scorer game score (an app fantasy rating, not on-ice points)
topscorer_point_averagenumericPostFinance Top Scorer game score per game
topscorer_market_valueintegerPostFinance Top Scorer game market value
topscorer_market_value_trendintegerMarket-value trend: 1 up, 0 flat, -1 down
topscorer_amountintegerCHF amount credited to the team's Top Scorer jersey holder (non-zero for 14 players, one per team)
is_topscorerlogicalWears the team's PostFinance Top Scorer jersey (one per team)
nationalitycharacterNationality; unobserved: null or empty in every sampled row
birthcharacterDate of birth, YYYY-MM-DD
heightintegerHeight; unobserved: null or empty in every sampled row
weightintegerWeight; unobserved: null or empty in every sampled row
handcharacterShooting or catching hand; unobserved: null or empty in every sampled row
lcridintegerNot determined (small integer, 0-4 in 2026)
nocintegerNot determined (small integer, 0-2 in 2026)
gpintegerNumber of games played
gintegerNumber of goals scored
a1integerFirst (primary) assists credited
a2integerSecond (secondary) assists credited
penaltiesintegerPenalties taken (upstream fo: fo2 + fo5 + fo10 + gm + mp). Not faceoffs: see face_offs / fot.
pimintegerPenalty minutes
geqintegerEven-strength goals
gppintegerPower-play goals
gpkintegerShorthanded goals
gwgintegerGame-winning goals
psintegerShootout shots taken
pgintegerNot determined; 0 on every 2026 row
plintegerPlus count: on ice for an even-strength or shorthanded goal for
miintegerMinus count: on ice for a goal against
toiintegerTime on ice, seconds
toi_eqintegerEven-strength time on ice, seconds
toippintegerPower-play time on ice, seconds (lower-case pp, unlike the box score's toiPp)
toi_pkintegerShorthanded time on ice, seconds
sogintegerNumber of shots on goal
shmintegerShots that missed the net
shpintegerShots that hit the post
shbintegerOwn shots blocked by an opponent
bksintegerOpponent shots blocked
fowintegerNumber of faceoffs won
folintegerNumber of faceoffs lost
shiintegerNumber of shifts played
gwgkintegerNot determined; 0 on every 2026 row
gwintegerGoaltender wins (incl. overtime and shootout)
glintegerGoaltender losses (incl. overtime and shootout)
fkintegerGames started in goal (inferred: fk <= gp; 42 of 44 for the 2026 games-played leader)
gaintegerGoals against: number of goals conceded
saintegerShots on goal against
svsintegerNumber of saves made by the goaltender
sointegerNumber of shutouts (games without a goal conceded)
mipintegerGoaltender time played, hundredths of a minute (6000 = 60:00; = seconds / 0.6)
assistsintegerAssists (a1 + a2; verified on every 2026 row)
pointsintegerPoints (g + assists; verified)
goal_efficiencynumericShooting percentage, 100 * g / sog (verified); -1 with no shots
save_percentagenumericSave percentage, 0-100
face_offs_percentagenumericFaceoff win percentage, 0-100; -1 with no faceoffs
face_offsintegerFaceoffs taken (fow + fol; verified)
is_captainlogicalWhether the player is the team captain
first_goalkeeperlogicalTeam's first-choice goaltender
ga_per_gamenumericGoals against per game (ga / gp; verified)
points_per_gamenumericPoints per game
svs_per_gamenumericGoaltender saves per game played
bks_per_gamenumericBlocked shots per game
sog_per_gamenumericShots on goal per game
shm_per_gamenumericMissed shots per game
shp_per_gamenumericPost hits per game
fow_per_gamenumericFaceoffs won per game
fol_per_gamenumericFaceoffs lost per game
toi_eq_per_gamenumericEven-strength time on ice per game, seconds
toi_pp_per_gamenumericPower-play time on ice per game, seconds
toi_pk_per_gamenumericShorthanded time on ice per game, seconds
face_offs_per_game_percentagenumericNot determined; 0 on the sampled rows
toi_averagenumericTime on ice per game, seconds
plus_minusintegerPlus/minus (pl - mi; verified)
tgsintegerTeam's total game time, seconds (about 3600 per game incl. overtime)
sepintegerGoaltender time played, seconds
toi_percentagenumericShare of the team's game time in goal, 100 * sep / tgs (verified)
gwitintegerWins in regulation time (gw = gwit + overtime/shootout wins; verified)
glitintegerLosses in regulation time (gl = glit + overtime/shootout losses; verified)
sagintegerShots on goal against that were saved (= svs on every 2026 goaltender row)
sagointegerShots on goal against that went in (= ga on every 2026 goaltender row)
samintegerShots against that missed the net
sapintegerShots against that hit the post
sabintegerShots against that were blocked
saslotintegerSlot shots against
sagoslotintegerSlot shots against that went in
aeqintegerEven-strength assists
appintegerPower-play assists
apkintegerShorthanded assists
haintegerHat tricks (inferred; at most 2 in 2026)
fo2integerMinor (2-minute) penalties
fo5integerMajor (5-minute) penalties
fo10integer10-minute misconducts
gmintegerGame misconducts
mpintegerMatch penalties
pmintegerNot determined; 0 on every 2026 row
pwgintegerNot determined; 0 on every 2026 row
sgointegerNot determined. Equals gff + gfd on every team row; skater values are close to but not always g
fowozintegerOffensive-zone faceoffs won
fownzintegerNeutral-zone faceoffs won
fowdzintegerDefensive-zone faceoffs won
folozintegerOffensive-zone faceoffs lost
folnzintegerNeutral-zone faceoffs lost
foldzintegerDefensive-zone faceoffs lost
psgintegerGoals scored in shootouts
pssvsintegerSaves made in shootouts
gotintegerOvertime goals (a subset of g)
ot_rankintegerOvertime-scoring rank; 0 on the 2026 rows (filled in 2027)
ot_gintegerOvertime goals in the overtime table; 0 on every 2026 row
ot_a1integerOvertime first assists; 0 on every 2026 row
ot_a2integerOvertime second assists; 0 on every 2026 row
ot_toiintegerOvertime time on ice, seconds; 0 on every 2026 row
ot_aintegerOvertime assists; 0 on every 2026 row
ot_pintegerOvertime points; 0 on every 2026 row
psgwgintegerGame-deciding shootout goals; 0 on every 2026 row
sogslotintegerShots on goal from the slot
pswgintegerShootout winners (inferred)
toishinumericTime on ice per shift, seconds
shigpnumericShifts per game
saslotgpnumericSlot shots against per game
samgpnumericMissed shots against per game
sapgpnumericPost hits against per game
svs_pslotnumericSlot save percentage, 100 * (saslot - sagoslot) / saslot
sa_per_gamenumericShots on goal against per game
otwintegerGoaltender overtime or shootout wins
otlintegerGoaltender overtime or shootout losses
fopoznumericOffensive-zone faceoff win percentage, 0-100
fopnznumericNeutral-zone faceoff win percentage, 0-100
fopdznumericDefensive-zone faceoff win percentage, 0-100
fotintegerFaceoffs taken (fow + fol)
fogpnumericFaceoffs taken per game
psmintegerShootout misses (inferred; ps = psg + psm fails for 67 of 447 skaters)
ps_percentagenumericShootout success percentage, 0-100
gw_shutoutintegerNot determined; equals gw on goaltender rows
sogslot_per_gamenumericSlot shots on goal per game
psagintegerShootout goals against (equals ps on goaltender rows)
pssvs_percentagenumericShootout save percentage, 0-100; -1 with no shootout shots faced
show_ranklogicalApp flag: show the row's rank
chfintegerCHF credited for the player's points: 300 * points on every 2026 row (PostFinance youth-fund scheme; inferred)
team_statscharacterPer-team split for a player who changed teams; unobserved: null or empty in every sampled row

return_parsed=False — the raw JSON Dict payload, unparsed.

Example​

nl_top_scorers(phase=4940, season=2026, take=3)

Last validated n/a.

nl_standings​

Standings with team season stats.

Endpoint URL: GET https://www.nationalleague.ch/api/teams

Valid URL: https://www.nationalleague.ch/api/teams?season=2026&phase=4940

API ParameterPythonPatternRequiredNullableDescription
seasonseasonYSeason END year: 2026 = 2025/26. Diffing 2026 vs 2027 changes every list, and /player/{playerId} gp (51 vs 7), so it scopes. Lists are served for 2019-2027 (the app's season picker, /api/content/metadata seasons) and patchily before: 2012 and 2017 answered, 2010/2014/2015/2016/2018 answered [] (probed 2026-10-12).
phasephaseYSIHF phase id (see x-phase-ids). On /player, omitting it served the regular season (byte-identical to phase=4940); that default is assumed but unverified on this route. Phase ids change every season; whether the metadata ids apply to 2027 is unverified.

Returns​

return_parsed=True (default) — a tidy polars.DataFrame with the columns below; pass return_as_pandas=True for a pandas.DataFrame.

col_nametypedescription
rankintegerPosition of the team in the standings table
team_idintegerSIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
namecharacterTeam name as the league app displays it
short_namecharacterTeam abbreviation
streakcharacterLast results, most recent first: W or L
gpintegerNumber of games played
gwintegerWins, all kinds
gwotintegerOvertime + shootout wins (gwo + gwpe)
gwpeintegerNumber of wins decided in a shootout
glintegerLosses, all kinds
glotintegerOvertime + shootout losses (glo + glpe)
glpeintegerShootout losses
pointegerStandings points: 3 per regulation win, 2 per overtime/shootout win, 1 per overtime/shootout loss (verified)
gintegerNumber of goals scored
geqintegerEven-strength goals (geq + gpp + gpk can fall short of g)
gppintegerPower-play goals
gpkintegerShorthanded goals
gaintegerGoals against: number of goals conceded
gaeqintegerEven-strength goals against
gappintegerShorthanded goals allowed on the power play
gapkintegerPower-play goals allowed while shorthanded
gointegerGoal difference, g - ga (verified)
ppointegerPower-play opportunities
pksintegerTimes shorthanded
sogintegerNumber of shots on goal
penaltiesintegerPenalties taken (upstream fo: fo2 + fo5 + fo10 + gm + mp). Not faceoffs: see face_offs / fot.
pimintegerPenalty minutes
fowintegerNumber of faceoffs won
folintegerNumber of faceoffs lost
shmintegerShots that missed the net
shpintegerShots that hit the post
shbintegerOwn shots blocked by an opponent
bksintegerOpponent shots blocked
saintegerShots on goal against
samintegerShots against that missed the net; 0 on every 2026 team row
sapintegerShots against that hit the post; 0 on every 2026 team row
sabintegerShots against that were blocked; 0 on every 2026 team row
sort_orderintegerApp sort key; not the rank
websitecharacterClub website URL
position_changecharacterRank movement since the last round ('none' on every 2026 row)
is_livelogicalTeam is playing now
current_resultintegerTeam's goals in a live game; 0 otherwise
current_opponent_resultintegerOpponent's goals in a live game; 0 otherwise
posintegerStandings position (= rank on every 2026 row)
hgintegerHome games played (gp / 2 on every 2026 row)
gsowintegerShootout wins; duplicate of gwpe (equal on every 2026 row)
gfdintegerGoals by defenders
gffintegerGoals by forwards
gfiintegerGoals by import (non-Swiss-licence) players (inferred; cf. the sihf/ teamGoalPosNation table)
gasowintegerShootout losses; duplicate of glpe (equal on every 2026 row)
ppintegerPower-play time, seconds
bpintegerShorthanded (box-play) time, seconds
fo2integerMinor (2-minute) penalties
fo5integerMajor (5-minute) penalties
fo10integer10-minute misconducts
gmintegerGame misconducts
mpintegerMatch penalties
psintegerShootout attempts taken
psgintegerGoals scored in shootouts
psmintegerShootout misses (ps = psg + psm on every 2026 team row)
psaintegerShootout shots faced (psga + pssvs)
psgaintegerShootout goals against
pssvsintegerSaves made in shootouts
specintegerTotal home attendance
capintegerTotal home arena capacity over the home games
fowozintegerOffensive-zone faceoffs won
fownzintegerNeutral-zone faceoffs won
fowdzintegerDefensive-zone faceoffs won
folozintegerOffensive-zone faceoffs lost
folnzintegerNeutral-zone faceoffs lost
foldzintegerDefensive-zone faceoffs lost
sgointegerNot determined. Equals gff + gfd on every team row; skater values are close to but not always g
sslotintegerShots from the slot
sagintegerShots on goal against that were saved; 0 on every 2026 team row (use sa)
sagointegerShots on goal against that went in; 0 on every 2026 team row (use ga)
saslotintegerSlot shots against
qualification_statuscharacterClinch marker ('none' on every 2026 row)
is_qualified_chllogicalQualified for the Champions Hockey League
goal_efficiencynumericShooting percentage, 100 * g / sog (verified); -1 with no shots
ppg_efficiencynumericPower-play percentage, 100 * gpp / ppo (verified)
ppggpnumericPower-play goals per game
ppopgpnumericPower-play opportunities per game
ppgpnumericPower-play time per game, seconds
gpgnumericGoals scored per game played
gagpnumericGoals against per game
gappgpnumericShorthanded goals against per game
geqgpnumericEven-strength goals per game
gaeqgpnumericEven-strength goals against per game
bks_per_gamenumericBlocked shots per game
pim_per_gamenumericPenalty minutes per game
ps_percentagenumericShootout success percentage, 0-100
attendanceintegerAverage home attendance (spec / hg)
capacityintegerArena capacity (cap / hg)
utilizationnumericCapacity utilisation, 100 * spec / cap
soggpnumericShots on goal per game
sslotgpnumericSlot shots per game
shmgpnumericMissed shots per game
shpgpnumericPost hits per game
gpkgpnumericShorthanded goals per game
pk_efficiencynumericPenalty-kill percentage, 100 * (1 - gapk / pks) (verified)
pksgpnumericTimes shorthanded per game
gapkgpnumericPower-play goals against per game
bpgpnumericShorthanded time per game, seconds
fotintegerFaceoffs taken (fow + fol)
face_offs_percentagenumericFaceoff win percentage, 0-100; -1 with no faceoffs
fogpnumericFaceoffs taken per game
fowgpnumericFaceoffs won per game
folgpnumericFaceoffs lost per game
fopoznumericOffensive-zone faceoff win percentage, 0-100
fopnznumericNeutral-zone faceoff win percentage, 0-100
fopdznumericDefensive-zone faceoff win percentage, 0-100
sagpnumericShots on goal against per game
saslotgpnumericSlot shots against per game
gffdintegerGoals by forwards and defenders (gff + gfd; verified)
gffpnumericShare of goals by forwards, 100 * gff / g
gfdpnumericShare of goals by defenders, 100 * gfd / g
gfipnumericShare of goals by import players, 100 * gfi / g
pssvs_percentagenumericShootout save percentage, 0-100; -1 with no shootout shots faced
pgpnumericStandings points per game
gwitintegerWins in regulation time (gw = gwit + overtime/shootout wins; verified)
gwointegerNumber of wins in overtime
glitintegerLosses in regulation time (gl = glit + overtime/shootout losses; verified)
glointegerOvertime losses

return_parsed=False — the raw JSON Dict payload, unparsed.

Example​

nl_standings(phase=4940, season=2026)

Last validated n/a.