Skip to main content

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

nl_team_schedule​

One team's games for one season.

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

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

API ParameterPythonPatternRequiredNullableDescription
team_idteam_idYSIHF team id (team_id in nl_standings; the same id as the sihf family's team_id), e.g. 101144 = EV Zug.
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_team_schedule(season=2026, team_id=101144)

Last validated n/a.

nl_team_stats​

One game's team totals: shots by period, faceoffs by zone, power play and penalty kill.

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.
gintegerNumber of goals scored
gaintegerGoals against: number of goals conceded
saintegerShots on goal against
sog1integerShots on goal in the 1st period
sog2integerShots on goal in the 2nd period
sog3integerShots on goal in the 3rd period
sog_otintegerShots on goal in overtime, all periods
sog_ot1integerShots on goal in overtime period 1
sog_ot2integerShots on goal in overtime period 2
sog_ot3integerShots on goal in overtime period 3
shmintegerShots that missed the net
shpintegerShots that hit the post
shbintegerOwn shots blocked by an opponent
bksintegerOpponent shots blocked
fow_dintegerDefensive-zone faceoffs won (0 in every sampled game)
fow_nintegerNeutral-zone faceoffs won (0 in every sampled game)
fow_ointegerOffensive-zone faceoffs won (0 in every sampled game)
fol_nintegerNeutral-zone faceoffs lost (0 in every sampled game)
fol_ointegerOffensive-zone faceoffs lost (0 in every sampled game)
fol_dintegerDefensive-zone faceoffs lost (0 in every sampled game)
pptintegerPower-play time, seconds
ppointegerPower-play opportunities
ppgintegerPower-play goals
ppgaintegerShorthanded goals allowed while on the power play
pktintegerShorthanded time, seconds
pksintegerTimes shorthanded
pkgintegerShorthanded goals scored
pkgaintegerPower-play goals allowed while shorthanded
faceoffsintegerFaceoffs taken (upstream fo: fow + fol). Not penalties.
pimintegerPenalty minutes
sogintegerNumber of shots on goal
sog_percentagenumericShooting percentage, 100 * g / sog
pp_percentagenumericPower-play percentage, 100 * ppg / ppo
pk_percentagenumericPenalty-kill percentage, 0-100
fowintegerNumber of faceoffs won
folintegerNumber of faceoffs lost
faceoffs_percentagenumericFaceoff win percentage (upstream foPercentage); -1 without faceoffs.

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

Example​

nl_team_stats(game_id=20261105000325)

Last validated n/a.

nl_team_player_stats​

Season stats for one team's players.

Endpoint URL: GET https://www.nationalleague.ch/api/player/team/{team_id}

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

API ParameterPythonPatternRequiredNullableDescription
team_idteam_idYSIHF team id (team_id in nl_standings; the same id as the sihf family's team_id), e.g. 101144 = EV Zug.
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_team_player_stats(phase=4940, season=2026, team_id=101144)

Last validated n/a.

nl_team_info​

Club CMS record: names, logo, website, ticket links.

Endpoint URL: GET https://www.nationalleague.ch/api/teams/{team_id}/info

Valid URL: https://www.nationalleague.ch/api/teams/101144/info

API ParameterPythonPatternRequiredNullableDescription
team_idteam_idYSIHF team id (team_id in nl_standings; the same id as the sihf family's team_id), e.g. 101144 = EV Zug.

Returns​

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

col_nametypedescription
namecharacterClub name from the club's CMS record
cms_node_idintegerUmbraco CMS node id of the club page (Int64; not a team id).
url_segmentcharacterURL slug of the club page
typecharacterCMS node kind ('Content')
content_typecharacterCMS document type ('club')
urlcharacterSite path of the club page
fields_gridcharacterPage layout blocks; unobserved: null or empty in every sampled row
fields_logo_namecharacterTitle of the club logo media item in the club CMS
fields_logo_idintegerUmbraco CMS media id; not a team id
fields_logo_url_segmentcharacterURL slug; unobserved: null or empty in every sampled row
fields_logo_typecharacterCMS node kind ('Media')
fields_logo_content_typecharacterMedia kind ('Image')
fields_logo_urlcharacterSite path of the image
fields_logo_fields_umbraco_file_srccharacterSite path of the file
fields_logo_fields_umbraco_file_focal_pointcharacterCrop focal point; unobserved: null or empty in every sampled row
fields_logo_fields_umbraco_file_cropscharacterCrop presets; unobserved: null or empty in every sampled row
fields_logo_fields_umbraco_widthintegerImage width, pixels
fields_logo_fields_umbraco_heightintegerImage height, pixels
fields_logo_fields_umbraco_bytesintegerFile size, bytes
fields_logo_fields_umbraco_extensioncharacterFile extension of the club logo media file
team_idintegerSIHF team id (Int64; e.g. 101151 = HC Davos). The same key space as the sihf family's team_id.
fields_websitecharacterClub website URL
fields_ticket_urlcharacterClub ticket-shop URL
fields_game_ticket_urlcharacterPer-game ticket URL template; empty string in the sample
fields_overriden_namecharacterDisplay-name override (sic); empty string in the sample
fields_playerscharacterRoster override; empty string in the sample
fields_api_namecharacterClub key in the app's backend (e.g. 'evz')

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

Example​

nl_team_info(team_id=101144)

Last validated n/a.