Skip to main content

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

sihf_team_goals​

Team goals for and against per season: totals and per game, even strength, power play and short-handed.

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

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=teamGoal&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.
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.
games_playedintegerGames played in the table's scope.
goals_forintegerGoals scored (goals for).
goals_for_quotientdoubleGoals for per game.
goals_againstintegerGoals conceded (goals against).
goals_against_quotientdoubleGoals against per game.
even_goals_forintegerEven-strength goals for.
even_goals_for_quotientdoubleEven-strength goals for per game.
even_goals_againstintegerEven-strength goals against.
even_goals_against_quotientdoubleEven-strength goals against per game.
pp_goals_forintegerPower-play goals for.
pp_goals_for_quotientdoublePower-play goals for per game.
pp_goals_againstintegerGoals against while on the power play.
pp_goals_against_quotientdoubleGoals against while on the power play, per game.
sh_goalsintegerShort-handed goals for.
sh_goals_quotientdoubleShort-handed goals for per game.
pk_goals_againstintegerGoals against while short-handed.
pk_goals_against_quotientdoubleGoals against while short-handed, 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_team_goals(season=2026, league_id=1)

Last validated n/a.

sihf_team_goals_by_position​

Team goals by scorer: forwards, defensemen and import players (totals and shares), plus shootout-winning goals for and against.

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

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=teamGoalPosNation&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.
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.
games_playedintegerGames played in the table's scope.
goals_for_fw_dfintegerGoals by forwards and defencemen.
goals_for_fwintegerGoals by forwards.
goals_for_fw_percentdoubleShare of goals by forwards, percent.
goals_for_dfintegerGoals by defencemen.
goals_for_df_percentdoubleShare of goals by defencemen, percent.
goals_for_imintegerGoals by import (foreign-licence) players.
goals_for_im_percentdoubleShare of goals by import players, percent.
sow_goals_forintegerDeciding shootout goals scored.
sow_goals_againstintegerDeciding shootout goals conceded.
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_team_goals_by_position(season=2026, league_id=1)

Last validated n/a.

sihf_team_shots​

Team shots per season: on goal (total, slot, shooting percentage), missed, post, blocked, and shots against, 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=teamShotDetail&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.
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.
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.
soga_sogintegerShots on goal against, total.
soga_sog_per_gamedoubleShots on goal against per game.
soga_sog_slotintegerSlot shots on goal against.
soga_sog_slot_per_gamedoubleSlot shots on goal against 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_team_shots(season=2026, league_id=1)

Last validated n/a.

sihf_team_power_play​

Team power play per season: opportunities, goals, conversion percentage, power-play time, and short-handed goals against.

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

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=teamPp&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.
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.
games_playedintegerGames played in the table's scope.
pp_opportunitiesintegerPower-play opportunities.
pp_opportunities_quotientdoublePower-play opportunities per game.
pp_goals_forintegerPower-play goals for.
pp_goals_for_quotientdoublePower-play goals for per game.
pp_percentdoublePower-play percentage.
power_play_timecharacterTime on the power play, mm:ss string (minutes may exceed 59), not seconds.
power_play_time_quotientcharacterTime on the power play per game, mm:ss string (minutes may exceed 59), not seconds.
pp_goals_againstintegerGoals against while on the power play.
pp_goals_against_quotientdoubleGoals against while on the power play, 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_team_power_play(season=2026, league_id=1)

Last validated n/a.

sihf_team_penalty_kill​

Team penalty kill per season: times short-handed, goals against, kill percentage, penalty-kill time, and short-handed goals for.

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

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=teamPk&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.
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.
games_playedintegerGames played in the table's scope.
pk_situationsintegerShort-handed situations.
pk_situations_quotientdoubleShort-handed situations per game.
pk_goals_againstintegerGoals against while short-handed.
pk_goals_against_quotientdoubleGoals against while short-handed, per game.
pk_percentdoublePenalty-kill percentage.
penalty_kill_timecharacterTime short-handed, mm:ss string (minutes may exceed 59), not seconds.
penalty_kill_time_quotientcharacterTime short-handed per game, mm:ss string (minutes may exceed 59), not seconds.
sh_goalsintegerShort-handed goals for.
sh_goals_quotientdoubleShort-handed goals for 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_team_penalty_kill(season=2026, league_id=1)

Last validated n/a.

sihf_team_penalties​

Team penalties per season: 2-, 5- and 10-minute penalties, game misconducts, match penalties and penalty minutes.

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

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=teamFoul&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.
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.
games_playedintegerGames played in the table's scope.
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.
pim_totalintegerPenalty minutes, total.
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_team_penalties(season=2026, league_id=1)

Last validated n/a.

sihf_team_shootouts​

Team shootouts per season: shootout wins and losses, attempts, goals and percentage, and attempts, goals against and saves.

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

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=teamShootout&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.
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.
games_playedintegerGames played in the table's scope.
games_won_penaltyintegerGames won in a shootout.
games_lost_penaltyintegerShootout losses.
pen_shotsintegerShootout/penalty shots taken.
pen_shot_goalsintegerShootout/penalty goals.
pen_shots_missedintegerShootout/penalty shots missed.
pen_shots_percentdoubleShootout/penalty conversion percentage.
pen_shots_againstintegerShootout/penalty shots faced.
pen_shot_goals_againstintegerShootout/penalty goals allowed.
pen_shot_savesintegerShootout/penalty shots saved.
pen_shot_saves_percentdoubleShootout/penalty save percentage.
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_team_shootouts(season=2026, league_id=1)

Last validated n/a.

sihf_team_faceoffs​

Team faceoffs per season: 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=teamFaceoff&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.
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.
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_team_faceoffs(season=2026, league_id=1)

Last validated n/a.

sihf_team_faceoffs_by_zone​

Team faceoffs by zone (offensive, neutral, defensive) per season: 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=teamFaceoffZone&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.
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.
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_team_faceoffs_by_zone(season=2026, league_id=1)

Last validated n/a.

sihf_team_faceoffs_by_zone_per_game​

Team 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=teamFaceoffZoneGame&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.
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.
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_team_faceoffs_by_zone_per_game(season=2026, league_id=1)

Last validated n/a.

sihf_team_attendance​

Team home attendance per season: home games, total and average spectators, average arena capacity and utilisation.

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

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=teamSpectator&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.
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.
home_gamesintegerNumber of home games.
spectatorsintegerTotal home attendance (SIHF prints a ’ thousands separator; dropped here).
stadium_capacity_quotientdoubleAverage arena capacity.
spectators_quotientdoubleAverage home attendance per game.
stadium_capacity_percentdoubleAverage arena utilisation, percent.
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_team_attendance(season=2026, league_id=1)

Last validated n/a.