Skip to main content

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

sihf_goalie_stats​

Goaltender season totals: games, starts, goals against, GAA, shots, saves, save percentage, ice time.

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

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=goalkeeper&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").
games_playedintegerGames the goaltender dressed for.
first_keeperintegerGames listed as the starting goaltender.
goals_againstintegerGoals allowed by the goaltender.
goals_against_averagedoubleGoals against per 60 minutes.
shots_againstintegerShots on goal faced.
savesintegerShots on goal saved by the goaltender.
saves_percentagedoubleSave percentage on a 0-100 scale (91.25 = .9125).
seconds_playedcharacterIce time as "mm:ss" (a string, despite the upstream name). Minutes are not capped at 59: an overtime game reads "65:00", a season total "3615:02".
penalty_in_minutesintegerPenalty minutes.
goalsintegerGoals scored by the goaltender (almost always 0).
assistsintegerAssists by the goaltender.
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_goalie_stats(season=2026, league_id=1)

Last validated n/a.

sihf_goalie_shots​

Goaltender shots against: on goal (total, slot), missed, post, with per-game rates and the slot save percentage.

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

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=goalkeeperShotDetail&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.
games_playedintegerGames played in the table's scope.
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.
soga_missedintegerMissed shots against.
soga_missed_per_gamedoubleMissed shots against per game.
soga_postintegerPost/crossbar shots against.
soga_post_per_gamedoublePost/crossbar shots against per game.
saves_slot_percentagedoubleSave percentage on slot shots.
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_goalie_shots(season=2026, league_id=1)

Last validated n/a.

sihf_goalie_wins​

Goaltender decisions: starts, wins and losses in regulation, overtime and shootout, and shutouts.

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

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=goalkeeperWin&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.
games_playedintegerGames played in the table's scope.
first_keeperintegerGames started as goalkeeper (GPI).
winsintegerWins, all decision types.
wins_intimeintegerWins in regulation.
wins_overtimeintegerGames won in overtime.
wins_penaltyintegerGames won in a shootout.
lossesintegerLosses, all decision types.
losses_intimeintegerLosses in regulation.
losses_overtimeintegerOvertime losses.
losses_penaltyintegerShootout losses.
shutoutintegerShutouts (games with no goal against).
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_goalie_wins(season=2026, league_id=1)

Last validated n/a.

sihf_goalie_shootouts​

Goaltender shootouts: attempts faced, goals against, saves and save percentage.

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

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

Last validated n/a.