Skip to main content

SIHF — SIHF statistics API (data.sihf.ch; National League, Swiss League and every SIHF league) — Player

sihf_player_stats​

Skater season totals: games, goals, assists, points, penalty minutes, plus-minus.

Endpoint URL: GET https://data.sihf.ch/statistic/api/cms/table

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=player&searchQuery=1%2F%2F1&language=en&filterBy=Season&filterQuery=2026

API ParameterPythonPatternRequiredNullableDescription
SeasonseasonYRequired. Season by its END year (2026 = 2025-26). A season SIHF does not have raises NoDataError (the API itself silently answers another one).
Leagueleague_idYSIHF league id: 1 = National League, 2 = Swiss League, 100 = MyHockey League, 3 = 1. Liga, 43 = SWHL B, 113 = U21-Elit (the body's League filter lists them). An id SIHF does not have for the season raises NoDataError.
Phasephase_idYSIHF phase id (regular season, a playoff round, ...; the body's Phase filter lists them). None = no phase filter: the season summary over every phase (player / goalie tables), every game (results), the regular-season table (standings).
languagelanguageYResponse language. Only part of the body is translated: status, position and penalty names stay German.

Returns​

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

col_nametypedescription
seasonintegerSeason by its END year (2026 = 2025-26), from the body's echo of the Season filter.
phase_idintegerSIHF phase id (regular season, a playoff round, ...); null unless a phase filter is passed.
rankintegerRank in the table; null on a summary row.
playercharacterPlayer name as SIHF prints it, last name first (e.g., "Dahlbeck Klas").
team_idintegerSIHF team id (Int64 join key).
team_namecharacterTeam display name as SIHF publishes it.
team_acronymcharacterTeam abbreviation as SIHF publishes it (e.g., "HCD").
positioncharacterPosition, German whatever the language (e.g., "Stürmer").
games_playedintegerGames the player played in the selection.
goalsintegerGoals scored by the player.
assistsintegerAssists (primary + secondary).
pointsintegerPoints (goals + assists).
points_per_gamedoublePoints per game.
pim_totalintegerPenalty minutes.
plus_minusintegerPlus-minus: even-strength and shorthanded goals for, minus against, while on ice.
row_typecharacter"data" for a regular row; "average" or "total" for a summary row SIHF mixes into the table.

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

Example​

sihf_player_stats(season=2026, league_id=1)

Last validated n/a.

sihf_player_goals_assists​

Skater goals and assists by situation: even strength, power play, short-handed, game-winning and overtime goals, hat tricks.

Endpoint URL: GET https://data.sihf.ch/statistic/api/cms/table

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=playerGoalAssist&searchQuery=1%2F%2F1&language=en&filterBy=Season&filterQuery=2026

API ParameterPythonPatternRequiredNullableDescription
SeasonseasonYRequired. Season by its END year (2026 = 2025-26). A season SIHF does not have raises NoDataError (the API itself silently answers another one).
Leagueleague_idYSIHF league id: 1 = National League, 2 = Swiss League, 100 = MyHockey League, 3 = 1. Liga, 43 = SWHL B, 113 = U21-Elit (the body's League filter lists them). An id SIHF does not have for the season raises NoDataError.
Phasephase_idYSIHF phase id (regular season, a playoff round, ...; the body's Phase filter lists them). None = no phase filter: the season summary over every phase.
languagelanguageYResponse language. Only part of the body is translated: status, position and penalty names stay German.

Returns​

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

col_nametypedescription
seasonintegerSeason by its END year (2026 = 2025-26), from the body's echo of the Season filter.
phase_idintegerSIHF phase id (regular season, a playoff round, ...); null unless a phase filter is passed.
rankintegerRank in the table; null on a summary row, and on a goaltender below the qualification line.
playercharacterPlayer name as SIHF prints it, last name first (e.g., "Dahlbeck Klas"); season tables carry no player id.
team_idintegerSIHF team id (Int64 join key); null on a summary row (the pseudo-team 100000).
team_namecharacterTeam display name as SIHF publishes it; "Durchschnitt" on the league-average row, "Total" on the attendance total row.
team_acronymcharacterTeam abbreviation as SIHF publishes it (e.g., "HCD"); null on a summary row.
positioncharacterPosition, German whatever the language (e.g., "Stürmer"); null when SIHF prints "-".
games_playedintegerGames played in the table's scope.
goalsintegerGoals scored (total).
assistsintegerAssists credited.
assists1integerPrimary assists.
assists2integerSecondary assists.
game_winning_goalsintegerGame-winning goals.
eq_goalsintegerEven-strength goals.
eq_assistsintegerEven-strength assists.
pp_goalsintegerPower-play goals.
pp_assistsintegerPower-play assists.
pk_goalsintegerShort-handed goals.
pk_assistsintegerShort-handed assists.
overtime_goalsintegerOvertime goals.
hattricksintegerHat tricks (games with three or more goals).
row_typecharacter"data" for a regular row; "average" (league average) or "total" (attendance total) for a summary row SIHF mixes into the table.

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

Example​

sihf_player_goals_assists(season=2026, league_id=1)

Last validated n/a.

sihf_player_shots​

Skater shots: on goal (total, slot, shooting percentage), missed, post and blocked, with per-game rates.

Endpoint URL: GET https://data.sihf.ch/statistic/api/cms/table

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=playerShotDetail&searchQuery=1%2F%2F1&language=en&filterBy=Season&filterQuery=2026

API ParameterPythonPatternRequiredNullableDescription
SeasonseasonYRequired. Season by its END year (2026 = 2025-26). A season SIHF does not have raises NoDataError (the API itself silently answers another one).
Leagueleague_idYSIHF league id: 1 = National League, 2 = Swiss League, 100 = MyHockey League, 3 = 1. Liga, 43 = SWHL B, 113 = U21-Elit (the body's League filter lists them). An id SIHF does not have for the season raises NoDataError.
Phasephase_idYSIHF phase id (regular season, a playoff round, ...; the body's Phase filter lists them). None = no phase filter: the season summary over every phase.
languagelanguageYResponse language. Only part of the body is translated: status, position and penalty names stay German.

Returns​

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

col_nametypedescription
seasonintegerSeason by its END year (2026 = 2025-26), from the body's echo of the Season filter.
phase_idintegerSIHF phase id (regular season, a playoff round, ...); null unless a phase filter is passed.
rankintegerRank in the table; null on a summary row, and on a goaltender below the qualification line.
playercharacterPlayer name as SIHF prints it, last name first (e.g., "Dahlbeck Klas"); season tables carry no player id.
team_idintegerSIHF team id (Int64 join key); null on a summary row (the pseudo-team 100000).
team_namecharacterTeam display name as SIHF publishes it; "Durchschnitt" on the league-average row, "Total" on the attendance total row.
team_acronymcharacterTeam abbreviation as SIHF publishes it (e.g., "HCD"); null on a summary row.
positioncharacterPosition, German whatever the language (e.g., "Stürmer"); null when SIHF prints "-".
games_playedintegerGames played in the table's scope.
sog_sogintegerShots on goal (saved or scored).
sog_sog_percentdoubleShooting percentage (goals / shots on goal).
sog_sog_quotientdoubleShots on goal per game.
sog_sog_slotintegerSlot shots on goal.
sog_sog_slot_per_gamedoubleSlot shots on goal per game.
sog_missedintegerMissed shots, total.
sog_missed_per_gamedoubleMissed shots per game.
sog_postintegerPost/crossbar shots, total.
sog_post_per_gamedoublePost/crossbar shots per game.
blockingsintegerNumber of shots blocked.
blockings_per_gamedoubleBlocked shots per game.
row_typecharacter"data" for a regular row; "average" (league average) or "total" (attendance total) for a summary row SIHF mixes into the table.

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

Example​

sihf_player_shots(season=2026, league_id=1)

Last validated n/a.

sihf_player_penalties​

Skater penalties: penalty minutes, 2-, 5- and 10-minute penalties, game misconducts and match penalties.

Endpoint URL: GET https://data.sihf.ch/statistic/api/cms/table

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=playerFoul&searchQuery=1%2F%2F1&language=en&filterBy=Season&filterQuery=2026

API ParameterPythonPatternRequiredNullableDescription
SeasonseasonYRequired. Season by its END year (2026 = 2025-26). A season SIHF does not have raises NoDataError (the API itself silently answers another one).
Leagueleague_idYSIHF league id: 1 = National League, 2 = Swiss League, 100 = MyHockey League, 3 = 1. Liga, 43 = SWHL B, 113 = U21-Elit (the body's League filter lists them). An id SIHF does not have for the season raises NoDataError.
Phasephase_idYSIHF phase id (regular season, a playoff round, ...; the body's Phase filter lists them). None = no phase filter: the season summary over every phase.
languagelanguageYResponse language. Only part of the body is translated: status, position and penalty names stay German.

Returns​

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

col_nametypedescription
seasonintegerSeason by its END year (2026 = 2025-26), from the body's echo of the Season filter.
phase_idintegerSIHF phase id (regular season, a playoff round, ...); null unless a phase filter is passed.
rankintegerRank in the table; null on a summary row, and on a goaltender below the qualification line.
playercharacterPlayer name as SIHF prints it, last name first (e.g., "Dahlbeck Klas"); season tables carry no player id.
team_idintegerSIHF team id (Int64 join key); null on a summary row (the pseudo-team 100000).
team_namecharacterTeam display name as SIHF publishes it; "Durchschnitt" on the league-average row, "Total" on the attendance total row.
team_acronymcharacterTeam abbreviation as SIHF publishes it (e.g., "HCD"); null on a summary row.
positioncharacterPosition, German whatever the language (e.g., "Stürmer"); null when SIHF prints "-".
games_playedintegerGames played in the table's scope.
pim_totalintegerPenalty minutes, total.
pim2integerNumber of 2-minute minor penalties.
pim5integerNumber of 5-minute major penalties.
pim10integerNumber of 10-minute misconducts.
game_misconductsintegerNumber of game misconducts.
match_penaltiesintegerNumber of match penalties.
row_typecharacter"data" for a regular row; "average" (league average) or "total" (attendance total) for a summary row SIHF mixes into the table.

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

Example​

sihf_player_penalties(season=2026, league_id=1)

Last validated n/a.

sihf_player_shootouts​

Skater shootouts: attempts, goals, misses, percentage and shootout-winning goals.

Endpoint URL: GET https://data.sihf.ch/statistic/api/cms/table

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=playerShootout&searchQuery=1%2F%2F1&language=en&filterBy=Season&filterQuery=2026

API ParameterPythonPatternRequiredNullableDescription
SeasonseasonYRequired. Season by its END year (2026 = 2025-26). A season SIHF does not have raises NoDataError (the API itself silently answers another one).
Leagueleague_idYSIHF league id: 1 = National League, 2 = Swiss League, 100 = MyHockey League, 3 = 1. Liga, 43 = SWHL B, 113 = U21-Elit (the body's League filter lists them). An id SIHF does not have for the season raises NoDataError.
Phasephase_idYSIHF phase id (regular season, a playoff round, ...; the body's Phase filter lists them). None = no phase filter: the season summary over every phase.
languagelanguageYResponse language. Only part of the body is translated: status, position and penalty names stay German.

Returns​

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

col_nametypedescription
seasonintegerSeason by its END year (2026 = 2025-26), from the body's echo of the Season filter.
phase_idintegerSIHF phase id (regular season, a playoff round, ...); null unless a phase filter is passed.
rankintegerRank in the table; null on a summary row, and on a goaltender below the qualification line.
playercharacterPlayer name as SIHF prints it, last name first (e.g., "Dahlbeck Klas"); season tables carry no player id.
team_idintegerSIHF team id (Int64 join key); null on a summary row (the pseudo-team 100000).
team_namecharacterTeam display name as SIHF publishes it; "Durchschnitt" on the league-average row, "Total" on the attendance total row.
team_acronymcharacterTeam abbreviation as SIHF publishes it (e.g., "HCD"); null on a summary row.
positioncharacterPosition, German whatever the language (e.g., "Stürmer"); null when SIHF prints "-".
games_playedintegerGames played in the table's scope.
pen_shotsintegerShootout/penalty shots taken.
pen_shot_goalsintegerShootout/penalty goals.
pen_shots_missedintegerShootout/penalty shots missed.
pen_shots_percentdoubleShootout/penalty conversion percentage.
pen_shot_winning_goalsintegerDeciding shootout goals.
row_typecharacter"data" for a regular row; "average" (league average) or "total" (attendance total) for a summary row SIHF mixes into the table.

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

Example​

sihf_player_shootouts(season=2026, league_id=1)

Last validated n/a.

sihf_player_faceoffs​

Skater faceoffs: taken, won, lost, per game, and win percentage overall and by zone.

Endpoint URL: GET https://data.sihf.ch/statistic/api/cms/table

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=playerFaceoff&searchQuery=1%2F%2F1&language=en&filterBy=Season&filterQuery=2026

API ParameterPythonPatternRequiredNullableDescription
SeasonseasonYRequired. Season by its END year (2026 = 2025-26). A season SIHF does not have raises NoDataError (the API itself silently answers another one).
Leagueleague_idYSIHF league id: 1 = National League, 2 = Swiss League, 100 = MyHockey League, 3 = 1. Liga, 43 = SWHL B, 113 = U21-Elit (the body's League filter lists them). An id SIHF does not have for the season raises NoDataError.
Phasephase_idYSIHF phase id (regular season, a playoff round, ...; the body's Phase filter lists them). None = no phase filter: the season summary over every phase.
languagelanguageYResponse language. Only part of the body is translated: status, position and penalty names stay German.

Returns​

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

col_nametypedescription
seasonintegerSeason by its END year (2026 = 2025-26), from the body's echo of the Season filter.
phase_idintegerSIHF phase id (regular season, a playoff round, ...); null unless a phase filter is passed.
rankintegerRank in the table; null on a summary row, and on a goaltender below the qualification line.
playercharacterPlayer name as SIHF prints it, last name first (e.g., "Dahlbeck Klas"); season tables carry no player id.
team_idintegerSIHF team id (Int64 join key); null on a summary row (the pseudo-team 100000).
team_namecharacterTeam display name as SIHF publishes it; "Durchschnitt" on the league-average row, "Total" on the attendance total row.
team_acronymcharacterTeam abbreviation as SIHF publishes it (e.g., "HCD"); null on a summary row.
positioncharacterPosition, German whatever the language (e.g., "Stürmer"); null when SIHF prints "-".
games_playedintegerGames played in the table's scope.
faceoffsintegerFaceoffs taken, total.
faceoffs_per_gamedoubleFaceoffs taken per game.
faceoffs_percentdoubleFaceoff win percentage; '-' with no faceoffs.
faceoffs_wonintegerNumber of faceoffs won.
faceoffs_lostintegerNumber of faceoffs lost.
faceoffs_won_per_gamedoubleFaceoffs won per game.
faceoffs_lost_per_gamedoubleFaceoffs lost per game.
faceoffs_offensive_percentdoubleFaceoff win percentage, offensive zone.
faceoffs_neutral_percentdoubleFaceoff win percentage, neutral zone.
faceoffs_defensive_percentdoubleFaceoff win percentage, defensive zone.
row_typecharacter"data" for a regular row; "average" (league average) or "total" (attendance total) for a summary row SIHF mixes into the table.

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

Example​

sihf_player_faceoffs(season=2026, league_id=1)

Last validated n/a.

sihf_player_faceoffs_by_zone​

Skater faceoffs by zone (offensive, neutral, defensive): taken, won, lost and win percentage.

Endpoint URL: GET https://data.sihf.ch/statistic/api/cms/table

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=playerFaceoffZone&searchQuery=1%2F%2F1&language=en&filterBy=Season&filterQuery=2026

API ParameterPythonPatternRequiredNullableDescription
SeasonseasonYRequired. Season by its END year (2026 = 2025-26). A season SIHF does not have raises NoDataError (the API itself silently answers another one).
Leagueleague_idYSIHF league id: 1 = National League, 2 = Swiss League, 100 = MyHockey League, 3 = 1. Liga, 43 = SWHL B, 113 = U21-Elit (the body's League filter lists them). An id SIHF does not have for the season raises NoDataError.
Phasephase_idYSIHF phase id (regular season, a playoff round, ...; the body's Phase filter lists them). None = no phase filter: the season summary over every phase.
languagelanguageYResponse language. Only part of the body is translated: status, position and penalty names stay German.

Returns​

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

col_nametypedescription
seasonintegerSeason by its END year (2026 = 2025-26), from the body's echo of the Season filter.
phase_idintegerSIHF phase id (regular season, a playoff round, ...); null unless a phase filter is passed.
rankintegerRank in the table; null on a summary row, and on a goaltender below the qualification line.
playercharacterPlayer name as SIHF prints it, last name first (e.g., "Dahlbeck Klas"); season tables carry no player id.
team_idintegerSIHF team id (Int64 join key); null on a summary row (the pseudo-team 100000).
team_namecharacterTeam display name as SIHF publishes it; "Durchschnitt" on the league-average row, "Total" on the attendance total row.
team_acronymcharacterTeam abbreviation as SIHF publishes it (e.g., "HCD"); null on a summary row.
positioncharacterPosition, German whatever the language (e.g., "Stürmer"); null when SIHF prints "-".
games_playedintegerGames played in the table's scope.
faceoffs_offensiveintegerFaceoffs taken, offensive zone.
faceoffs_offensive_percentdoubleFaceoff win percentage, offensive zone.
faceoffs_won_offensiveintegerFaceoffs won, offensive zone.
faceoffs_lost_offensiveintegerFaceoffs lost, offensive zone.
faceoffs_neutralintegerFaceoffs taken, neutral zone.
faceoffs_neutral_percentdoubleFaceoff win percentage, neutral zone.
faceoffs_won_neutralintegerFaceoffs won, neutral zone.
faceoffs_lost_neutralintegerFaceoffs lost, neutral zone.
faceoffs_defensiveintegerFaceoffs taken, defensive zone.
faceoffs_defensive_percentdoubleFaceoff win percentage, defensive zone.
faceoffs_won_defensiveintegerFaceoffs won, defensive zone.
faceoffs_lost_defensiveintegerFaceoffs lost, defensive zone.
row_typecharacter"data" for a regular row; "average" (league average) or "total" (attendance total) for a summary row SIHF mixes into the table.

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

Example​

sihf_player_faceoffs_by_zone(season=2026, league_id=1)

Last validated n/a.

sihf_player_faceoffs_by_zone_per_game​

Skater faceoffs by zone (offensive, neutral, defensive) per game: taken, won and lost.

Endpoint URL: GET https://data.sihf.ch/statistic/api/cms/table

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=playerFaceoffZoneGame&searchQuery=1%2F%2F1&language=en&filterBy=Season&filterQuery=2026

API ParameterPythonPatternRequiredNullableDescription
SeasonseasonYRequired. Season by its END year (2026 = 2025-26). A season SIHF does not have raises NoDataError (the API itself silently answers another one).
Leagueleague_idYSIHF league id: 1 = National League, 2 = Swiss League, 100 = MyHockey League, 3 = 1. Liga, 43 = SWHL B, 113 = U21-Elit (the body's League filter lists them). An id SIHF does not have for the season raises NoDataError.
Phasephase_idYSIHF phase id (regular season, a playoff round, ...; the body's Phase filter lists them). None = no phase filter: the season summary over every phase.
languagelanguageYResponse language. Only part of the body is translated: status, position and penalty names stay German.

Returns​

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

col_nametypedescription
seasonintegerSeason by its END year (2026 = 2025-26), from the body's echo of the Season filter.
phase_idintegerSIHF phase id (regular season, a playoff round, ...); null unless a phase filter is passed.
rankintegerRank in the table; null on a summary row, and on a goaltender below the qualification line.
playercharacterPlayer name as SIHF prints it, last name first (e.g., "Dahlbeck Klas"); season tables carry no player id.
team_idintegerSIHF team id (Int64 join key); null on a summary row (the pseudo-team 100000).
team_namecharacterTeam display name as SIHF publishes it; "Durchschnitt" on the league-average row, "Total" on the attendance total row.
team_acronymcharacterTeam abbreviation as SIHF publishes it (e.g., "HCD"); null on a summary row.
positioncharacterPosition, German whatever the language (e.g., "Stürmer"); null when SIHF prints "-".
games_playedintegerGames played in the table's scope.
faceoffs_offensive_per_gamedoubleFaceoffs taken per game, offensive zone.
faceoffs_won_offensive_per_gamedoubleFaceoffs won per game, offensive zone.
faceoffs_lost_offensive_per_gamedoubleFaceoffs lost per game, offensive zone.
faceoffs_neutral_per_gamedoubleFaceoffs taken per game, neutral zone.
faceoffs_won_neutral_per_gamedoubleFaceoffs won per game, neutral zone.
faceoffs_lost_neutral_per_gamedoubleFaceoffs lost per game, neutral zone.
faceoffs_defensive_per_gamedoubleFaceoffs taken per game, defensive zone.
faceoffs_won_defensive_per_gamedoubleFaceoffs won per game, defensive zone.
faceoffs_lost_defensive_per_gamedoubleFaceoffs lost per game, defensive zone.
row_typecharacter"data" for a regular row; "average" (league average) or "total" (attendance total) for a summary row SIHF mixes into the table.

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

Example​

sihf_player_faceoffs_by_zone_per_game(season=2026, league_id=1)

Last validated n/a.

sihf_player_time_on_ice​

Skater ice time by situation (even strength, power play, penalty kill), totals and per game, plus shifts.

Endpoint URL: GET https://data.sihf.ch/statistic/api/cms/table

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=playerTimeOnIce&searchQuery=1%2F%2F1&language=en&filterBy=Season&filterQuery=2026

API ParameterPythonPatternRequiredNullableDescription
SeasonseasonYRequired. Season by its END year (2026 = 2025-26). A season SIHF does not have raises NoDataError (the API itself silently answers another one).
Leagueleague_idYSIHF league id: 1 = National League, 2 = Swiss League, 100 = MyHockey League, 3 = 1. Liga, 43 = SWHL B, 113 = U21-Elit (the body's League filter lists them). An id SIHF does not have for the season raises NoDataError.
Phasephase_idYSIHF phase id (regular season, a playoff round, ...; the body's Phase filter lists them). None = no phase filter: the season summary over every phase.
languagelanguageYResponse language. Only part of the body is translated: status, position and penalty names stay German.

Returns​

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

col_nametypedescription
seasonintegerSeason by its END year (2026 = 2025-26), from the body's echo of the Season filter.
phase_idintegerSIHF phase id (regular season, a playoff round, ...); null unless a phase filter is passed.
rankintegerRank in the table; null on a summary row, and on a goaltender below the qualification line.
playercharacterPlayer name as SIHF prints it, last name first (e.g., "Dahlbeck Klas"); season tables carry no player id.
team_idintegerSIHF team id (Int64 join key); null on a summary row (the pseudo-team 100000).
team_namecharacterTeam display name as SIHF publishes it; "Durchschnitt" on the league-average row, "Total" on the attendance total row.
team_acronymcharacterTeam abbreviation as SIHF publishes it (e.g., "HCD"); null on a summary row.
positioncharacterPosition, German whatever the language (e.g., "Stürmer"); null when SIHF prints "-".
games_playedintegerGames played in the table's scope.
time_on_ice_eqcharacterEven-strength time on ice, mm:ss string (minutes may exceed 59), not seconds.
time_on_ice_eq_per_gamecharacterEven-strength time on ice per game, mm:ss string (minutes may exceed 59), not seconds.
time_on_ice_ppcharacterPower-play time on ice, mm:ss string (minutes may exceed 59), not seconds.
time_on_ice_pp_per_gamecharacterPower-play time on ice per game, mm:ss string (minutes may exceed 59), not seconds.
time_on_ice_pkcharacterShort-handed time on ice, mm:ss string (minutes may exceed 59), not seconds.
time_on_ice_pk_per_gamecharacterShort-handed time on ice per game, mm:ss string (minutes may exceed 59), not seconds.
time_on_icecharacterTime on ice, total, mm:ss string (minutes may exceed 59), not seconds.
time_on_ice_per_gamecharacterTime on ice per game, mm:ss string (minutes may exceed 59), not seconds.
shiftsintegerNumber of shifts on ice.
time_on_ice_per_shiftcharacterAverage time on ice per shift, mm:ss string (minutes may exceed 59), not seconds; '-' with no shifts.
shifts_per_gamedoubleShifts per game.
row_typecharacter"data" for a regular row; "average" (league average) or "total" (attendance total) for a summary row SIHF mixes into the table.

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

Example​

sihf_player_time_on_ice(season=2026, league_id=1)

Last validated n/a.