Skip to main content

KHL — KHL webcaster mobile API (khl.api.webcaster.pro)

sportsdataverse.hockey.khl — 9 endpoints.

Note: Owner flag (sdv-internal-refs/khl/README.md): the KHL and its webcaster platform are run by Russian operators, some clubs by sanctioned state companies. Fetching on your own machine is fine; any published data release, hosted mirror or redistribution needs owner (sanctions / legal) sign-off first.

khl_webcaster_stages​

Season table: every stage (season END year, regular / playoff) with its khl.ru tournament id and webcaster stage id.

Endpoint URL: GET https://khl.api.webcaster.pro/api/khl_mobile/data.json

Valid URL: https://khl.api.webcaster.pro/api/khl_mobile/data.json?locale=en

API ParameterPythonPatternRequiredNullableDescription
localelocaleYResponse language: en or ru.

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 END year (2026 = 2025-26)
typecharacterregular or playoff
tournament_idintegerkhl.ru tournament (stage) id, tnId: 1369 = 2025-26 regular season, 1370 its playoff; equals webcaster stage khl_id
stage_idintegerWebcaster stage id (its own id space; not a khl.ru tournament id)
season_labelcharacterSeason label as sent (26/27, 2025/2026)
titlecharacterStage title (Regular / Playoff)
display_rulecharacterFront-end display rule key
percent_points_scoredlogicalFront-end flag: rank the stage by points percentage (False in every stage captured; unverified)

return_parsed=False — the raw JSON body (betting fields and the caller's IP removed).

Example​

khl_webcaster_stages()

Last validated n/a.

khl_webcaster_event​

One game: officials, team totals, per-player match stats, goals, penalties (one row; lists as JSON text).

Endpoint URL: GET https://khl.api.webcaster.pro/api/khl_mobile/event_v2.json

Valid URL: https://khl.api.webcaster.pro/api/khl_mobile/event_v2.json?id=2786714&locale=en

API ParameterPythonPatternRequiredNullableDescription
idevent_idYRequired. Webcaster event id (khl_webcaster_events id), not the khl.ru game id.
localelocaleYResponse language: en or ru.

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_state_keycharacterGame state key (finished, ...)
periodintegerPeriod number (box score: 0 = the whole game; 4+ = overtime)
hdlogicalTrue when the broadcast is in HD
idintegerWebcaster id of the arena object (webcaster key space); no khl.ru counterpart in the body
seasoncharacterSeason END year (2026 = 2025-26)
stage_idintegerWebcaster stage id (its own id space; not a khl.ru tournament id)
type_idintegerWebcaster event type code
commentatorlogicalTrue when the broadcast has a commentator
likes_enabledlogicalTrue when likes are enabled on the broadcast page
is_vertical_videologicalTrue when the broadcast video is vertical (portrait)
khl_idintegerkhl.ru game id of the event object (site key space): the join key to khl-rest
arena_idintegerkhl.ru arena id
arena_capacityintegerArena seating capacity
arena_phonecharacterArena phone number as published
arena_websitecharacterArena website URL
arena_namecharacterArena (city) name, from data.ARENAS
arena_addresscharacterArena street address (English with locale=en)
arena_citycharacterArena city (English with locale=en)
arena_imagecharacterArena photo URL on khl.ru
arena_geo_latnumericArena latitude, decimal degrees
arena_geo_longnumericArena longitude, decimal degrees
team_a_idintegerWebcaster id of the team_a object (webcaster key space); join to khl.ru through its khl_id
team_a_khl_idintegerkhl.ru club id of the team_a object (site key space): the join key to khl-rest
team_a_imagecharacterHome team logo URL (webcaster thumbnail)
team_a_namecharacterHome team name (English with locale=en)
team_a_locationcharacterHome team city / region (English with locale=en)
team_a_shotsintegerHome shots on goal
team_a_gfintegerHome team goals (final)
team_a_ppgintegerPower-play goals
team_a_shgintegerShort-handed goals
team_a_ppcintegerCount; equals the team's own penalties in the sample (5 for 10 PIM), so probably penalties taken. UNVERIFIED
team_a_vbrintegerFaceoffs won ('vbr' from Russian вбрасывания; = game/text fow)
team_a_pimintegerPenalty minutes
team_a_total_puck_control_timenumericTeam puck-control time, decimal MINUTES (21.81 = 21:48)
team_a_total_distance_travellednumericDistance skated by the team, km (= game/text dtA)
team_a_offensive_blue_line_crossings_countintegerOffensive blue-line crossings
team_a_top_playerscharacterHome game leaders (hardest shot, ...), JSON list with the webcaster and khl.ru player ids
team_a_start_fivescharacterHome starting lineup, JSON list of players (webcaster id, khl_id, jersey, role)
team_a_playerscharacterHome game roster, JSON list of players (webcaster id, khl_id, jersey, role)
team_a_activelogicalTrue when the home team is active in the webcaster app
team_b_idintegerWebcaster id of the team_b object (webcaster key space); join to khl.ru through its khl_id
team_b_khl_idintegerkhl.ru club id of the team_b object (site key space): the join key to khl-rest
team_b_imagecharacterVisitor team logo URL (webcaster thumbnail)
team_b_namecharacterVisitor team name (English with locale=en)
team_b_locationcharacterVisitor team city / region (English with locale=en)
team_b_shotsintegerVisitor shots on goal
team_b_gfintegerVisitor team goals (final)
team_b_ppgintegerPower-play goals
team_b_shgintegerShort-handed goals
team_b_ppcintegerCount; equals the team's own penalties in the sample (3 for 6 PIM), so probably penalties taken. UNVERIFIED
team_b_vbrintegerFaceoffs won ('vbr' from Russian вбрасывания; = game/text fow)
team_b_pimintegerPenalty minutes
team_b_total_puck_control_timenumericTeam puck-control time, decimal MINUTES (21.81 = 21:48)
team_b_total_distance_travellednumericDistance skated by the team, km (= game/text dtA)
team_b_offensive_blue_line_crossings_countintegerOffensive blue-line crossings
team_b_top_playerscharacterVisitor game leaders (hardest shot, ...), JSON list with the webcaster and khl.ru player ids
team_b_start_fivescharacterVisitor starting lineup, JSON list of players (webcaster id, khl_id, jersey, role)
team_b_playerscharacterVisitor game roster, JSON list of players (webcaster id, khl_id, jersey, role)
team_b_activelogicalTrue when the visitor team is active in the webcaster app
quotescharacterVideo clips (webcaster quotes)
goalscharacterGoals of the game, JSON list (time in game seconds, score, status, author, assistants)
violationscharacterPenalties in order
other_events_with_both_teamscharacterOther games between the two teams, JSON list of webcaster events
social_tagscharacterSocial-media hashtags of the game, JSON list
freelogicalTrue when the broadcast is free to watch (no subscription)
yandex_rightslogicalTrue when Yandex holds rights to the broadcast (unverified)
yandex_idcharacterYandex video id of the broadcast (m-prefixed)
match_idintegerkhl.ru game id as a string (= khl_id)
balancer_typecharacterVideo delivery type (record = archived broadcast)
event_or_quote_type_namecharacterVideo category label in Russian (Архив = archive)
outer_stage_idintegerkhl.ru tournament id of the event's stage (= stage.khl_id)
stage_namecharacterStage label (Regular 2025/2026)
parent_idinteger
namecharacterName (English with locale=en)
mref1characterReferee 1, name in Russian
mref2characterReferee 2, name in Russian
lref1characterLinesman 1, name in Russian
lref2characterLinesman 2, name in Russian
announcecharacter
viewscharacterBroadcast view count as display text ('7,579')
stage_typecharacterStage type: regular or playoff
audio_trackscharacterBroadcast audio tracks, JSON list of id / title (main, intersound)
image_bigcharacterLarge broadcast thumbnail image URL
locationcharacterHome team city / region (English with locale=en)
start_at_dayintegerGame day start (midnight Moscow time), unix seconds
start_atintegerStart time, unix milliseconds
event_start_atintegerPuck-drop time, unix milliseconds
end_atintegerEnd time, unix milliseconds
ticketscharacter
text_eventscharacterSummary text events only; no shot-level play-by-play
not_regularlogicalTrue for a game outside the regular schedule (False in the captured bodies; unverified)
infographicscharacterScoreboard overlay label of the broadcast (With scoreboard)
infographics_enabledlogicalTrue when the broadcast carries the scoreboard overlay
scorecharacterScore after the goal 'a:b'
condensed_game_idintegerWebcaster id of the condensed_game object (webcaster key space); no khl.ru counterpart in the body
condensed_game_namecharacterCondensed-game video title
condensed_game_start_tsintegerCondensed-game video start time, unix milliseconds
condensed_game_m3u8_urlcharacterCondensed-game video HLS (m3u8) stream URL; signed and expiring
condensed_game_feed_urlcharacterCondensed-game video webcaster player feed URL; signed and expiring
condensed_game_iframe_urlcharacterCondensed-game video embeddable player (iframe) URL
condensed_game_iframe_codecharacterCondensed-game video embed HTML (an iframe tag)
condensed_game_finish_tsintegerCondensed-game video end time, unix milliseconds
condensed_game_image_urlcharacterCondensed-game video thumbnail image URL
condensed_game_descriptioncharacterCondensed-game video description text (HTML-escaped; Russian goal list on highlights)
condensed_game_audio_trackscharacterCondensed-game video audio tracks, JSON list of id / title (main, intersound)
condensed_game_is_vertical_videologicalCondensed-game video: True when the video is vertical (portrait)
condensed_game_stage_idintegerCondensed-game video: webcaster stage id (its own id space; not a khl.ru tournament id)
condensed_game_freelogicalCondensed-game video: True when free to watch (no subscription)
condensed_game_yandex_rightslogicalCondensed-game video: True when Yandex holds rights to the video (unverified)
condensed_game_yandex_idcharacterCondensed-game video: Yandex video id of the broadcast (m-prefixed)
condensed_game_match_idintegerkhl.ru game id as a string (= khl_id)
condensed_game_balancer_typecharacterCondensed-game video: video delivery type (record = archived broadcast, file = clip)
condensed_game_event_or_quote_type_namecharacterCondensed-game video: video category label (Архив = archive, Хайлайты = highlights)
condensed_game_outer_stage_idintegerkhl.ru tournament id of the event's stage (= stage.khl_id)
condensed_game_stage_namecharacterCondensed-game video: stage label (Regular 2025/2026)
highlight_idintegerWebcaster id of the highlight object (webcaster key space); no khl.ru counterpart in the body
highlight_namecharacterHighlights video title
highlight_start_tsintegerHighlights video start time, unix milliseconds
highlight_m3u8_urlcharacterHighlights video HLS (m3u8) stream URL; signed and expiring
highlight_feed_urlcharacterHighlights video webcaster player feed URL; signed and expiring
highlight_iframe_urlcharacterHighlights video embeddable player (iframe) URL
highlight_iframe_codecharacterHighlights video embed HTML (an iframe tag)
highlight_finish_tsintegerHighlights video end time, unix milliseconds
highlight_image_urlcharacterHighlights video thumbnail image URL
highlight_descriptioncharacterHighlights video description text (HTML-escaped; Russian goal list on highlights)
highlight_audio_trackscharacterHighlights video audio tracks, JSON list of id / title (main, intersound)
highlight_is_vertical_videologicalHighlights video: True when the video is vertical (portrait)
highlight_stage_idintegerHighlights video: webcaster stage id (its own id space; not a khl.ru tournament id)
highlight_freelogicalHighlights video: True when free to watch (no subscription)
highlight_yandex_rightslogicalHighlights video: True when Yandex holds rights to the video (unverified)
highlight_yandex_idcharacterHighlights video: Yandex video id of the broadcast (m-prefixed)
highlight_match_idintegerkhl.ru game id as a string (= khl_id)
highlight_balancer_typecharacterHighlights video: video delivery type (record = archived broadcast, file = clip)
highlight_event_or_quote_type_namecharacterHighlights video: video category label (Архив = archive, Хайлайты = highlights)
highlight_outer_stage_idintegerkhl.ru tournament id of the event's stage (= stage.khl_id)
highlight_stage_namecharacterHighlights video: stage label (Regular 2025/2026)
outer_urlcharacterkhl.ru page of the game (the game_id and tournament_id are in its path)
m3u8_urlcharacterBroadcast HLS (m3u8) stream URL; empty without rights
feed_urlcharacterBroadcast webcaster player feed URL; empty without rights
iframe_urlcharacterBroadcast embeddable player (iframe) URL
iframe_codecharacterBroadcast embed HTML (an iframe tag)
scores_first_periodcharacter1st-period score 'a:b'
scores_second_periodcharacter2nd-period score 'a:b'
scores_third_periodcharacter3rd-period score 'a:b'
scores_overtimecharacterOvertime score 'a:b' (null if none)
scores_bullittcharacterShootout score 'a:b' (null if none); 'bullitt' is Russian for shootout
this_pair_stat_events_countintegerHead-to-head: games between the two teams on record (scope unverified)
this_pair_stat_team_a_wins_countintegerHead-to-head: home team wins in those games
this_pair_stat_team_a_goals_countintegerHead-to-head: home team goals in those games
this_pair_stat_team_a_points_countintegerHead-to-head: home team standings points in those games
this_pair_stat_team_b_wins_countintegerHead-to-head: visitor team wins in those games
this_pair_stat_team_b_goals_countintegerHead-to-head: visitor team goals in those games
this_pair_stat_team_b_points_countintegerHead-to-head: visitor team standings points in those games
transaction_typescharacterPaid video products (app store)
sscorecharacter
commentators_namescharacterBroadcast commentators, comma-separated
transactionscharacterJSON-encoded list of the team's roster transactions over the requested window.
has_videologicalTrue when the broadcast has a video
geo_errorcharacter

return_parsed=False — the raw JSON body (betting fields and the caller's IP removed).

Example​

khl_webcaster_event(event_id=2786714)

Last validated n/a.

khl_webcaster_events​

Games of a stage, 16 per page (one row per game; khl_id is the khl.ru game id).

Endpoint URL: GET https://khl.api.webcaster.pro/api/khl_mobile/events_v2.json

Valid URL: https://khl.api.webcaster.pro/api/khl_mobile/events_v2.json?season=2026&stage=regular&page=1&locale=en

API ParameterPythonPatternRequiredNullableDescription
seasonseasonYSeason by its END year (2026 = 2025-26), mapped to the KHL webcaster stage id through the webcaster season table (khl_webcaster_stages). None = the current stage.
stagestageYWhich stage of the season: regular or playoff.
stage_idstage_idYWebcaster stage id, sent as is instead of season / stage (370 = 2025-26 regular season; khl_webcaster_stages lists them). Not a khl.ru tournament id.
pagepageY1-based page of 16 games; an empty page ends the stage.
q[team_a_or_team_b_in][]team_idsYWebcaster team id(s) (khl_webcaster_teams id, not a khl.ru club id): games of these teams.
q[start_at_gt_time_from_unixtime]start_afterYGames starting after this unix time (seconds). Needs a stage.
q[start_at_lt_time_from_unixtime]start_beforeYGames starting before this unix time (seconds). Needs a stage.
localelocaleYResponse language: en or ru.

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_state_keycharacterGame state key (only finished observed)
periodintegerPeriod number (box score: 0 = the whole game; 4+ = overtime)
hdlogicalHD video available
idintegerWebcaster id of the event object (webcaster key space); join to khl.ru through its khl_id
stage_idintegerWebcaster stage id (its own id space; not a khl.ru tournament id)
type_idintegerWebcaster event type code
commentatorlogicalCommentary track available
likes_enabledlogicalTrue when likes are enabled on the broadcast page
is_vertical_videologicalTrue when the broadcast video is vertical (portrait)
khl_idintegerkhl.ru game id of the event object (site key space): the join key to khl-rest
team_a_idintegerWebcaster id of the team_a object (webcaster key space); join to khl.ru through its khl_id
team_a_khl_idintegerkhl.ru club id of the team_a object (site key space): the join key to khl-rest
team_a_imagecharacterHome team logo URL (webcaster thumbnail)
team_a_namecharacterHome team name (English with locale=en)
team_a_locationcharacterHome team city / region (English with locale=en)
team_b_idintegerWebcaster id of the team_b object (webcaster key space); join to khl.ru through its khl_id
team_b_khl_idintegerkhl.ru club id of the team_b object (site key space): the join key to khl-rest
team_b_imagecharacterVisitor team logo URL (webcaster thumbnail)
team_b_namecharacterVisitor team name (English with locale=en)
team_b_locationcharacterVisitor team city / region (English with locale=en)
namecharacterMatchup label in English
ticketscharacter
locationcharacterHome team city / region (English with locale=en)
start_at_dayintegerGame day start (midnight Moscow time), unix seconds
start_atintegerStart time, unix milliseconds
event_start_atintegerPuck-drop time, unix milliseconds
end_atintegerEnd time, unix milliseconds
not_regularlogicalTrue for a game outside the regular schedule (False in the captured bodies; unverified)
scorecharacterFinal score 'team_a:team_b'
scores_first_periodcharacter1st-period score 'a:b'
scores_second_periodcharacter2nd-period score 'a:b'
scores_third_periodcharacter3rd-period score 'a:b'
scores_overtimecharacterOvertime score 'a:b' (null if none)
scores_bullittcharacterShootout score 'a:b' (null if none); 'bullitt' is Russian for shootout
sscorecharacter
imagecharacterBroadcast thumbnail image URL
condensed_game_idintegerWebcaster event id of the condensed-game video
highlight_idintegerWebcaster event id of the highlights video
infographicscharacterScoreboard overlay label of the broadcast (With scoreboard)
infographics_enabledlogicalTrue when the broadcast carries the scoreboard overlay
has_videologicalVideo available
m3u8_urlcharacterBroadcast HLS (m3u8) stream URL; empty without rights
feed_urlcharacterBroadcast webcaster player feed URL; empty without rights
iframe_urlcharacterBroadcast embeddable player (iframe) URL
iframe_codecharacterBroadcast embed HTML (an iframe tag)
freelogicalVideo free to watch
yandex_rightslogicalYandex broadcast rights flag
yandex_idcharacterYandex video id of the broadcast (m-prefixed)
match_idintegerkhl.ru game id as a string (= khl_id)
balancer_typecharacterVideo delivery type (record = archived broadcast)
event_or_quote_type_namecharacterVideo category label in Russian (Архив = archive)
outer_stage_idintegerkhl.ru tournament id of the event's stage (= stage.khl_id)
stage_namecharacterStage label (Regular 2025/2026)
previewscharacter

return_parsed=False — the raw JSON body (betting fields and the caller's IP removed).

Example​

khl_webcaster_events(season=2026)

Last validated n/a.

khl_webcaster_leaders​

Stat leaders of a stage: one row per player per category.

Endpoint URL: GET https://khl.api.webcaster.pro/api/khl_mobile/leaders_v2.json

Valid URL: https://khl.api.webcaster.pro/api/khl_mobile/leaders_v2.json?season=2026&stage=regular&locale=en

API ParameterPythonPatternRequiredNullableDescription
seasonseasonYSeason by its END year (2026 = 2025-26), mapped to the KHL webcaster stage id through the webcaster season table (khl_webcaster_stages). None = the current stage.
stagestageYWhich stage of the season: regular or playoff.
stage_idstage_idYWebcaster stage id, sent as is instead of season / stage (370 = 2025-26 regular season; khl_webcaster_stages lists them). Not a khl.ru tournament id.
localelocaleYResponse language: en or ru.

Returns​

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

col_nametypedescription
categorycharacterLeader category
rankinteger1-based position in its table / list
idintegerWebcaster id of the players object (webcaster key space); join to khl.ru through its khl_id
khl_idintegerkhl.ru player id of the players object (site key space): the join key to khl-rest
namecharacterName (English with locale=en)
imagecharacterPlayer photo URL on khl.ru
shirt_numberintegerJersey number (not an id)
role_keycharacterPosition key: goaltender, defensemen, forward
team_idintegerWebcaster id of the team object (webcaster key space); join to khl.ru through its khl_id
team_khl_idintegerkhl.ru club id of the team object (site key space): the join key to khl-rest
team_namecharacterTeam name as the site prints it
team_locationcharacterTeam city / region (English with locale=en)
poscharacterLeader position in the category, as text ('1' = leader)
statscharacterCategory value(s)

return_parsed=False — the raw JSON body (betting fields and the caller's IP removed).

Example​

khl_webcaster_leaders(season=2026)

Last validated n/a.

khl_webcaster_players​

Players with stage-scoped stats (one row per player; khl_id is the khl.ru player id).

Endpoint URL: GET https://khl.api.webcaster.pro/api/khl_mobile/players_v2.json

Valid URL: https://khl.api.webcaster.pro/api/khl_mobile/players_v2.json?q%5Bid_in%5D%5B%5D=33405&q%5Bid_in%5D%5B%5D=1144&season=2026&stage=regular&locale=en

API ParameterPythonPatternRequiredNullableDescription
q[id_in][]player_idsYWebcaster player id(s), not khl.ru ids. None = every player of the stage (a large body).
seasonseasonYSeason by its END year (2026 = 2025-26), mapped to the KHL webcaster stage id through the webcaster season table (khl_webcaster_stages). None = the current stage.
stagestageYWhich stage of the season: regular or playoff.
stage_idstage_idYWebcaster stage id, sent as is instead of season / stage (370 = 2025-26 regular season; khl_webcaster_stages lists them). Not a khl.ru tournament id.
localelocaleYResponse language: en or ru.

Returns​

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

col_nametypedescription
idintegerWebcaster id of the player object (webcaster key space); join to khl.ru through its khl_id
heightintegerPlayer height in cm
weightintegerPlayer weight in kg
ageintegerPlayer age in years
shirt_numberintegerJersey number (not an id)
khl_idintegerkhl.ru player id of the player object (site key space): the join key to khl-rest
rolecharacterPosition: goaltender, defensemen or forward
role_keycharacterPosition key: goaltender, defensemen, forward
countrycharacterCountry (English with locale=en)
imagecharacterPlayer photo URL on khl.ru
flag_image_urlcharacterCountry flag image URL
namecharacterPlayer name (English with locale=en)
birthdayintegerBirth date, unix seconds
stickcharacterShooting hand: l or r
team_idintegerWebcaster id of the team object (webcaster key space); join to khl.ru through its khl_id
team_khl_idintegerkhl.ru club id of the team object (site key space): the join key to khl-rest
team_namecharacterTeam name as the site prints it
team_locationcharacterTeam city / region (English with locale=en)
team_imagecharacterTeam logo URL (webcaster thumbnail)
team_divisioncharacterTeam division name (English with locale=en)
team_division_keycharacterTeam division key (bobrov, tarasov, kharlamov, chernyshev)
team_conferencecharacterTeam conference name (West / East)
team_conference_keycharacterTeam conference key (west / east)
statscharacterStage-scoped stat lines
teamscharacterTeams played for
quotescharacterVideo clips (webcaster quotes)
seasons_count_khlintegerKHL seasons played
seasons_count_teamintegerSeasons played for the current team
positionscharacterPositions played

return_parsed=False — the raw JSON body (betting fields and the caller's IP removed).

Example​

khl_webcaster_players(player_ids=[33405, 1144], season=2026)

Last validated n/a.

khl_webcaster_players_light​

Every current player: webcaster id, khl.ru id, jersey and team (one row per player).

Endpoint URL: GET https://khl.api.webcaster.pro/api/khl_mobile/players_v2_light.json

Valid URL: https://khl.api.webcaster.pro/api/khl_mobile/players_v2_light.json?locale=en

API ParameterPythonPatternRequiredNullableDescription
localelocaleYResponse language: en or ru.

Returns​

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

col_nametypedescription
idintegerWebcaster id of the row object (webcaster key space); join to khl.ru through its khl_id
shirt_numberintegerJersey number (not an id)
khl_idintegerkhl.ru id of the row object (site key space): the join key to khl-rest
imagecharacterPlayer photo URL on khl.ru
namecharacterName (English with locale=en)
team_idintegerWebcaster id of the team object (webcaster key space); join to khl.ru through its khl_id
team_khl_idintegerkhl.ru club id of the team object (site key space): the join key to khl-rest
team_namecharacterTeam name as the site prints it
team_locationcharacterTeam city / region (English with locale=en)
teamcharacterTeam (webcaster)

return_parsed=False — the raw JSON body (betting fields and the caller's IP removed).

Example​

khl_webcaster_players_light()

Last validated n/a.

khl_webcaster_tables​

League table of every season (one row per season per team, from the championship table).

Endpoint URL: GET https://khl.api.webcaster.pro/api/khl_mobile/tables_v2.json

Valid URL: https://khl.api.webcaster.pro/api/khl_mobile/tables_v2.json?locale=en

API ParameterPythonPatternRequiredNullableDescription
localelocaleYResponse language: en or ru.

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 END year (2026 = 2025-26)
season_labelcharacterSeason label as sent (26/27, 2025/2026)
rankinteger1-based position in its table / list
gpintegerGames played (gp = w + otw + sow + sol + otl + l)
wintegerRegulation wins only: overtime (otw) and shootout (sow) wins are separate columns
otwintegerOvertime wins (not counted in w)
sowintegerShootout wins (not counted in w)
solintegerShootout losses
otlintegerOvertime losses
otl_enintegerOvertime losses with the net empty
lintegerRegulation losses only: overtime (otl) and shootout (sol) losses are separate columns
ptsintegerPoints: 2 per win of any kind, 1 per overtime or shootout loss (3-2-1 in early seasons such as 2013-14)
pts_pctnumericPoints percentage
soaintegerShutouts against, 1-7 a season (the refs say shots on goal against; the values do not fit that; unverified)
sointegerShutouts (refs: khl-returns.md tables_v2)
gfintegerGoals scored by the team
gaintegerGoals allowed by the team
pimintegerPenalty minutes
pimaintegerOpponents' penalty minutes
idintegerWebcaster id of the stages object (webcaster key space); no khl.ru counterpart in the body
khl_idintegerkhl.ru club id of the championship object (site key space): the join key to khl-rest
imagecharacterTeam logo URL (webcaster thumbnail)
tv_imagecharacterTeam logo path on the KHL TV front end
namecharacterName (English with locale=en)
locationcharacterTeam city / region (English with locale=en)
divisioncharacterDivision name (English with locale=en)
division_keycharacterDivision key (bobrov, tarasov, kharlamov, chernyshev)
conferencecharacterConference (west / east)
conference_keycharacterConference key (east / west)

return_parsed=False — the raw JSON body (betting fields and the caller's IP removed).

Example​

khl_webcaster_tables()

Last validated n/a.

khl_webcaster_team​

One team with roster, stats and news feed (one row; lists as JSON text).

Endpoint URL: GET https://khl.api.webcaster.pro/api/khl_mobile/team_v2.json

Valid URL: https://khl.api.webcaster.pro/api/khl_mobile/team_v2.json?id=18&season=2026&stage=regular&locale=en

API ParameterPythonPatternRequiredNullableDescription
idteam_idYRequired. Webcaster team id (khl_webcaster_teams id), not the khl.ru club id.
seasonseasonYSeason by its END year (2026 = 2025-26), mapped to the KHL webcaster stage id through the webcaster season table (khl_webcaster_stages). None = the current stage.
stagestageYWhich stage of the season: regular or playoff.
stage_idstage_idYWebcaster stage id, sent as is instead of season / stage (370 = 2025-26 regular season; khl_webcaster_stages lists them). Not a khl.ru tournament id.
localelocaleYResponse language: en or ru.

Returns​

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

col_nametypedescription
idintegerWebcaster id of the team object (webcaster key space); join to khl.ru through its khl_id
stagecharacterStage type the team page answers for: regular or playoff
khl_idintegerkhl.ru club id of the team object (site key space): the join key to khl-rest
namecharacterName (English with locale=en)
locationcharacterTeam city / region (English with locale=en)
feed_itemscharacterTeam news feed, JSON list (type, date, id, title, image)
arena_idintegerWebcaster id of the team's home arena
arena_capacityintegerArena seating capacity
arena_phonecharacterArena phone number as published
arena_websitecharacterArena website URL
arena_namecharacterHome arena name (English with locale=en)
arena_addresscharacterArena street address (English with locale=en)
arena_citycharacterArena city (English with locale=en)
arena_imagecharacterArena photo URL on khl.ru
arena_geo_latnumericArena latitude, decimal degrees
arena_geo_longnumericArena longitude, decimal degrees
arenascharacterHome arenas, JSON list (id, capacity, phone, website, name, address)
calendar_eventscharacterTeam schedule, JSON list of webcaster events
recent_eventscharacterRecent team games, JSON list of webcaster events
websitecharacterClub website URL
mailcharacterClub e-mail address as published
foundation_yearcharacterYear the club was founded, as text
photocharacterTeam photo URL on khl.ru
phonecharacterClub phone number as published
head_coach_photocharacterHead coach photo URL on khl.ru
head_coach_namecharacterHead coach name (English with locale=en)
social_networks_twcharacterClub Twitter / X page URL (empty when none)
social_networks_vkcharacterClub VKontakte page URL
social_networks_okcharacterClub Odnoklassniki page URL
social_networks_fbcharacterClub Facebook page URL (empty when none)
social_networks_instagramcharacterClub Instagram page URL
social_networks_youtubecharacterClub YouTube channel URL (empty when none)
social_networks_telegramcharacterClub Telegram channel URL
apps_ioscharacter
apps_androidcharacter
apps_windowscharacter
addresscharacterClub office address (English with locale=en)
imagecharacterTeam logo URL (webcaster thumbnail)
divisioncharacterDivision name (English with locale=en)
division_keycharacterDivision key (bobrov, tarasov, kharlamov, chernyshev)
conferencecharacterConference (west / east)
conference_keycharacterConference key (east / west)
statscharacterTeam stat lines
playerscharacterRoster (webcaster players)

return_parsed=False — the raw JSON body (betting fields and the caller's IP removed).

Example​

khl_webcaster_team(season=2026, team_id=18)

Last validated n/a.

khl_webcaster_teams​

Teams of a stage (one row per team; khl_id is the khl.ru club id).

Endpoint URL: GET https://khl.api.webcaster.pro/api/khl_mobile/teams_v2.json

Valid URL: https://khl.api.webcaster.pro/api/khl_mobile/teams_v2.json?season=2026&stage=regular&locale=en

API ParameterPythonPatternRequiredNullableDescription
seasonseasonYSeason by its END year (2026 = 2025-26), mapped to the KHL webcaster stage id through the webcaster season table (khl_webcaster_stages). None = the current stage.
stagestageYWhich stage of the season: regular or playoff.
stage_idstage_idYWebcaster stage id, sent as is instead of season / stage (370 = 2025-26 regular season; khl_webcaster_stages lists them). Not a khl.ru tournament id.
localelocaleYResponse language: en or ru.

Returns​

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

col_nametypedescription
idintegerWebcaster id of the team object (webcaster key space); join to khl.ru through its khl_id
khl_idintegerkhl.ru club id of the team object (site key space): the join key to khl-rest
namecharacterTeam name (English with locale=en)
locationcharacterTeam city / region (English with locale=en)
imagecharacterTeam logo URL (webcaster thumbnail)
divisioncharacterDivision name (English with locale=en)
division_keycharacterDivision key (bobrov, tarasov, kharlamov, chernyshev)
conferencecharacterConference (west / east)
conference_keycharacterConference key (east/west)

return_parsed=False — the raw JSON body (betting fields and the caller's IP removed).

Example​

khl_webcaster_teams(season=2026)

Last validated n/a.