Skip to main content

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

sihf_results​

Games of a league season: date, teams, score, per-period score, decision, status and game_id.

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

Valid URL: https://data.sihf.ch/statistic/api/cms/table?alias=results&searchQuery=1%2F%2F1&language=en&filterBy=Season%2CDate&filterQuery=2026%2F01.07.2025-30.06.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.
daycharacterWeekday abbreviation, German (e.g., "Di").
datecharacterGame date (local).
timecharacterScheduled local start time, "hh:mm".
home_team_idintegerSIHF team id of the home team.
home_team_namecharacterHome team display name.
home_team_acronymcharacterHome team abbreviation.
away_team_idintegerSIHF team id of the away team.
away_team_namecharacterAway team display name.
away_team_acronymcharacterAway team abbreviation.
score_homeintegerFinal home score.
score_awayintegerFinal away score.
score_per_period_homeintegerHome goals per period (overtime included as its own period).
score_per_period_awayintegerAway goals per period (overtime included as its own period).
decisioncharacterHow the game was decided beyond regulation: "OT" or "SO"; null in regulation.
status_idintegerSIHF game-status id (12 = finished).
status_namecharacterGame-status name; German whatever the language (e.g., "Ende").
status_percentintegerGame progress, 0-100 (100 once the game is over).
status_canceledlogicalWhether the game was cancelled.
start_date_timecharacterScheduled start, ISO-8601 with UTC offset, as a string.
end_date_timecharacterEnd of the game, ISO-8601 with UTC offset, as a string.
update_date_timecharacterWhen SIHF last updated the record, ISO-8601 with UTC offset, as a string.
game_idintegerSIHF game id (Int64 join key; the details link of sihf_results, the searchQuery of the game wrappers).
broadcastscharacterBroadcasters, comma-joined (e.g., "MYSPORTS,TV24").
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_results(season=2026, league_id=1)

Last validated n/a.

sihf_standings​

League table of a season (every game, or home / away games only): rank, games, points, regulation / overtime / shootout wins and losses, goals, streak.

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

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

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 regular-season table.
ContentTypevenueYWhich games the table counts: All (the full table), Home or Away. Always sent: without it SIHF answers the away-games table (26 of the 52 National League games).
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.
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 team played in the selection (every game, or home / away games only, per venue).
pointsintegerTable points earned in the standings.
points_quotientdoublePoints per game.
games_won_in_timeintegerWins in regulation.
games_won_extra_timeintegerWins in overtime.
games_won_penaltyintegerWins in a shootout.
games_lost_penaltyintegerLosses in a shootout.
games_lost_extra_timeintegerLosses in overtime.
games_lost_in_timeintegerLosses in regulation.
goals_forintegerGoals scored by the team.
goals_againstintegerGoals allowed by the team.
goals_differenceintegerGoal difference.
streakcharacterRecent results, newest first, as SIHF prints them (e.g., "W+L-"; "+" regulation, "-" after regulation).
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_standings(season=2026, league_id=1)

Last validated n/a.

sihf_phases​

Phases of a league season (regular season, play-in and playoff rounds, playout): the phase_id values the table wrappers take, with each phase's name and game count.

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

Valid URL: https://data.sihf.ch/statistic/api/cms/table?searchQuery=1%2F%2F1&alias=results&language=en&filterBy=Season%2CPhase%2CDate&filterQuery=2026%2F%2F01.07.2025-30.06.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.
aliastableYSIHF table whose phase list to read; each table lists its own. results (sihf_results) lists every round with its game count; player / goalkeeper (sihf_player_stats / sihf_goalie_stats) add the Playoff Overall and Play-In Overall totals; standing (sihf_standings) lists only the phases played as a table (the regular season, in some seasons a playout round).
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 (Int64), the value the phase_id argument of sihf_results, sihf_standings, sihf_player_stats and sihf_goalie_stats takes. Ids differ by league, season and table.
phase_namecharacterPhase name as SIHF publishes it, without the trailing count (e.g., "Regular Season", "Playoff 1/4 Final", "Playoff Overall").
n_gamesintegerGames played in the phase, from the results table's phase list; null for the other tables and for a phase still in progress.

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

Example​

sihf_phases(season=2026, league_id=1)

Last validated n/a.

sihf_pbp​

Event timeline of one game: goals, penalties, goaltender changes, revoked goals and shootout attempts.

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

Valid URL: https://data.sihf.ch/statistic/api/cms/gameoverview?alias=gameDetail&searchQuery=20261105000325&language=en

API ParameterPythonPatternRequiredNullableDescription
searchQuerygame_idYRequired. SIHF game id (game_id in sihf_results), e.g. 20261105000325.
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
game_idintegerSIHF game id (Int64 join key; the details link of sihf_results, the searchQuery of the game wrappers).
event_indexinteger1-based event order within the game.
period_numberinteger1-based period (4 = first overtime); the shootout follows the last period.
periodcharacterPeriod name as SIHF prints it, German (e.g., "1. Drittel", "Shootout").
event_typecharacterEvent kind: "goal", "penalty", "goalie", "revoked_goal" or "shootout".
timecharacterElapsed game time of the event, "mm:ss" (null on shootout rows).
game_secondsintegerElapsed game time of the event in seconds.
team_idintegerSIHF team id of the team the event belongs to.
team_sidecharacterSide of the game the row belongs to: "home" or "away".
player_idintegerLicence number of the scorer, penalized player, goaltender (goalie rows) or shooter.
player_namecharacterName of the scorer, penalized player, goaltender (goalie rows) or shooter.
player_jerseyintegerJersey number of the player in player_id.
assist1_player_idintegerLicence number of the first assist.
assist1_player_namecharacterName of the first assist.
assist2_player_idintegerLicence number of the second assist.
assist2_player_namecharacterName of the second assist.
goalie_idintegerLicence number of the goaltender faced (shootout rows).
goalie_namecharacterName of the goaltender faced (shootout rows).
strengthcharacterFirst goal tag: "EQ" even strength, "PP1" power play, "SH1" shorthanded, ...
goal_tagscharacterEvery goal tag, comma-joined as SIHF prints them (e.g., "PP1,GWG").
score_homeintegerHome score after the goal.
score_awayintegerAway score after the goal.
plus_player_idsintegerLicence numbers credited +1 on the goal (listed only where plus-minus applies).
minus_player_idsintegerLicence numbers charged -1 on the goal (listed only where plus-minus applies).
penalty_idintegerSIHF penalty-type id.
penalty_namecharacterPenalty name, German whatever the language (e.g., "Haken").
penalty_minutesintegerPenalty length in minutes.
penalty_startcharacterGame time the penalty starts, "mm:ss".
penalty_endcharacterGame time the penalty ended, "mm:ss" (earlier than its full length when a goal ended it).
goalie_changecharacterGoaltender change direction: "in" or "out".
revoke_reasoncharacterWhy the goal was disallowed, as SIHF prints it (e.g., "CC-Offiside").
shootout_numberinteger1-based shootout attempt number.
shootout_scoredlogicalWhether the shootout attempt scored.
textcharacterEvent text exactly as SIHF prints it (markdown bold included).

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

Example​

sihf_pbp(game_id=20261105000325)

Last validated n/a.