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
| API Parameter | Python | Pattern | Required | Nullable | Description |
|---|---|---|---|---|---|
Season | season | Y | Required. Season by its END year (2026 = 2025-26). A season SIHF does not have raises NoDataError (the API itself silently answers another one). | ||
League | league_id | Y | SIHF 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. | ||
Phase | phase_id | Y | SIHF 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). | ||
language | language | Y | Response 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_name | type | description |
|---|---|---|
season | integer | Season by its END year (2026 = 2025-26), from the body's echo of the Season filter. |
phase_id | integer | SIHF phase id (regular season, a playoff round, ...); null unless a phase filter is passed. |
rank | integer | Rank in the table; null on a summary row. |
player | character | Player name as SIHF prints it, last name first (e.g., "Dahlbeck Klas"). |
team_id | integer | SIHF team id (Int64 join key). |
team_name | character | Team display name as SIHF publishes it. |
team_acronym | character | Team abbreviation as SIHF publishes it (e.g., "HCD"). |
games_played | integer | Games the goaltender dressed for. |
first_keeper | integer | Games listed as the starting goaltender. |
goals_against | integer | Goals allowed by the goaltender. |
goals_against_average | double | Goals against per 60 minutes. |
shots_against | integer | Shots on goal faced. |
saves | integer | Shots on goal saved by the goaltender. |
saves_percentage | double | Save percentage on a 0-100 scale (91.25 = .9125). |
seconds_played | character | Ice 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_minutes | integer | Penalty minutes. |
goals | integer | Goals scored by the goaltender (almost always 0). |
assists | integer | Assists by the goaltender. |
row_type | character | "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
| API Parameter | Python | Pattern | Required | Nullable | Description |
|---|---|---|---|---|---|
Season | season | Y | Required. Season by its END year (2026 = 2025-26). A season SIHF does not have raises NoDataError (the API itself silently answers another one). | ||
League | league_id | Y | SIHF 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. | ||
Phase | phase_id | Y | SIHF phase id (regular season, a playoff round, ...; the body's Phase filter lists them). None = no phase filter: the season summary over every phase. | ||
language | language | Y | Response 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_name | type | description |
|---|---|---|
season | integer | Season by its END year (2026 = 2025-26), from the body's echo of the Season filter. |
phase_id | integer | SIHF phase id (regular season, a playoff round, ...); null unless a phase filter is passed. |
rank | integer | Rank in the table; null on a summary row, and on a goaltender below the qualification line. |
player | character | Player name as SIHF prints it, last name first (e.g., "Dahlbeck Klas"); season tables carry no player id. |
team_id | integer | SIHF team id (Int64 join key); null on a summary row (the pseudo-team 100000). |
team_name | character | Team display name as SIHF publishes it; "Durchschnitt" on the league-average row, "Total" on the attendance total row. |
team_acronym | character | Team abbreviation as SIHF publishes it (e.g., "HCD"); null on a summary row. |
games_played | integer | Games played in the table's scope. |
soga_sog | integer | Shots on goal against, total. |
soga_sog_per_game | double | Shots on goal against per game. |
soga_sog_slot | integer | Slot shots on goal against. |
soga_sog_slot_per_game | double | Slot shots on goal against per game. |
soga_missed | integer | Missed shots against. |
soga_missed_per_game | double | Missed shots against per game. |
soga_post | integer | Post/crossbar shots against. |
soga_post_per_game | double | Post/crossbar shots against per game. |
saves_slot_percentage | double | Save percentage on slot shots. |
row_type | character | "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
| API Parameter | Python | Pattern | Required | Nullable | Description |
|---|---|---|---|---|---|
Season | season | Y | Required. Season by its END year (2026 = 2025-26). A season SIHF does not have raises NoDataError (the API itself silently answers another one). | ||
League | league_id | Y | SIHF 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. | ||
Phase | phase_id | Y | SIHF phase id (regular season, a playoff round, ...; the body's Phase filter lists them). None = no phase filter: the season summary over every phase. | ||
language | language | Y | Response 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_name | type | description |
|---|---|---|
season | integer | Season by its END year (2026 = 2025-26), from the body's echo of the Season filter. |
phase_id | integer | SIHF phase id (regular season, a playoff round, ...); null unless a phase filter is passed. |
rank | integer | Rank in the table; null on a summary row, and on a goaltender below the qualification line. |
player | character | Player name as SIHF prints it, last name first (e.g., "Dahlbeck Klas"); season tables carry no player id. |
team_id | integer | SIHF team id (Int64 join key); null on a summary row (the pseudo-team 100000). |
team_name | character | Team display name as SIHF publishes it; "Durchschnitt" on the league-average row, "Total" on the attendance total row. |
team_acronym | character | Team abbreviation as SIHF publishes it (e.g., "HCD"); null on a summary row. |
games_played | integer | Games played in the table's scope. |
first_keeper | integer | Games started as goalkeeper (GPI). |
wins | integer | Wins, all decision types. |
wins_intime | integer | Wins in regulation. |
wins_overtime | integer | Games won in overtime. |
wins_penalty | integer | Games won in a shootout. |
losses | integer | Losses, all decision types. |
losses_intime | integer | Losses in regulation. |
losses_overtime | integer | Overtime losses. |
losses_penalty | integer | Shootout losses. |
shutout | integer | Shutouts (games with no goal against). |
row_type | character | "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
| API Parameter | Python | Pattern | Required | Nullable | Description |
|---|---|---|---|---|---|
Season | season | Y | Required. Season by its END year (2026 = 2025-26). A season SIHF does not have raises NoDataError (the API itself silently answers another one). | ||
League | league_id | Y | SIHF 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. | ||
Phase | phase_id | Y | SIHF phase id (regular season, a playoff round, ...; the body's Phase filter lists them). None = no phase filter: the season summary over every phase. | ||
language | language | Y | Response 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_name | type | description |
|---|---|---|
season | integer | Season by its END year (2026 = 2025-26), from the body's echo of the Season filter. |
phase_id | integer | SIHF phase id (regular season, a playoff round, ...); null unless a phase filter is passed. |
rank | integer | Rank in the table; null on a summary row, and on a goaltender below the qualification line. |
player | character | Player name as SIHF prints it, last name first (e.g., "Dahlbeck Klas"); season tables carry no player id. |
team_id | integer | SIHF team id (Int64 join key); null on a summary row (the pseudo-team 100000). |
team_name | character | Team display name as SIHF publishes it; "Durchschnitt" on the league-average row, "Total" on the attendance total row. |
team_acronym | character | Team abbreviation as SIHF publishes it (e.g., "HCD"); null on a summary row. |
games_played | integer | Games played in the table's scope. |
pen_shots_against | integer | Shootout/penalty shots faced. |
pen_shot_goals_against | integer | Shootout/penalty goals allowed. |
pen_shot_saves | integer | Shootout/penalty shots saved. |
pen_shot_saves_percent | double | Shootout/penalty save percentage. |
row_type | character | "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.