Skip to contents

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

Usage

khl_webcaster_events(
  season = NULL,
  stage = "regular",
  page = 1,
  stage_id = NULL,
  team_ids = NULL,
  start_after = NULL,
  start_before = NULL,
  locale = "en",
  return_parsed = TRUE
)

Arguments

season

Season by its END year (2026 = 2025-26), mapped to the KHL webcaster stage id through the webcaster season table (khl_webcaster_stages). NULL = the current stage.

stage

Which stage of the season: regular or playoff. One of regular, playoff.

page

1-based page of 16 games; an empty page ends the stage.

stage_id

Webcaster 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.

team_ids

Webcaster team id(s) (khl_webcaster_teams id, not a khl.ru club id): games of these teams.

start_after

Games starting after this unix time (seconds). Needs a stage.

start_before

Games starting before this unix time (seconds). Needs a stage.

locale

Response language: en or ru. One of en, ru.

return_parsed

Logical. TRUE (default) returns the parsed fastRhockey_data tibble; FALSE returns the raw JSON body as a list (betting fields and the caller's IP removed).

Value

A fastRhockey_data tibble (54 columns; zero rows with the same columns when the payload is empty), or the raw body as a list when return_parsed = FALSE. Raises fastRhockey_no_data (nothing there, or an unknown season / stage), fastRhockey_asset_fetch (an error envelope, an answer for another id than the one asked, or a failed fetch) and fastRhockey_bad_request (an invalid argument or an HTTP 400 / 422).

col_nametypesdescription
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
ticketscharacterUndocumented provider field tickets; carried as sent.
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
sscorecharacterUndocumented provider field sscore; carried as sent.
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 (Arkhiv = archive)
outer_stage_idintegerkhl.ru tournament id of the event's stage (= stage.khl_id)
stage_namecharacterStage label (Regular 2025/2026)
previewscharacterUndocumented provider field previews; carried as sent.

Details

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

The webcaster API is keyless JSON. Neither backend takes a year: season (the END year, 2026 = 2025/26) and stage are mapped to the webcaster stage id through the season table of khl_webcaster_stages() (cached for the R session), or pass stage_id. Honours getOption("fastRhockey.proxy"); betting fields and the caller's IP are removed from every body.

Ids and counts are integers (sdv-py Int64); a column holding values past 2^31 (epoch milliseconds) is returned as a whole-number double.

At least one second is left between two requests to a host.

Owner flag (sanctions). 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.

Examples

# \donttest{
  try(khl_webcaster_events(season = 2026))
#> ── KHL Webcaster Events from khl.api.webcaster.pro ─── fastRhockey 1.0.0.9000 ──
#> ℹ Data updated: 2026-10-13 01:55:04 UTC
#> # A tibble: 16 × 54
#>    game_state_key period hd        id stage_id type_id commentator likes_enabled
#>    <chr>           <int> <lgl>  <int>    <int>   <int> <lgl>       <lgl>        
#>  1 finished           -1 TRUE  2.79e6      370      18 TRUE        FALSE        
#>  2 finished           -1 TRUE  2.79e6      370      18 TRUE        NA           
#>  3 finished           -1 TRUE  2.79e6      370      18 TRUE        NA           
#>  4 finished           -1 TRUE  2.78e6      370      18 TRUE        NA           
#>  5 finished           -1 TRUE  2.79e6      370      18 TRUE        FALSE        
#>  6 finished           -1 TRUE  2.79e6      370      18 TRUE        NA           
#>  7 finished           -1 TRUE  2.79e6      370      18 TRUE        NA           
#>  8 finished           -1 TRUE  2.79e6      370      18 TRUE        NA           
#>  9 finished           -1 TRUE  2.79e6      370      18 TRUE        NA           
#> 10 finished           -1 TRUE  2.79e6      370      18 TRUE        NA           
#> 11 finished           -1 TRUE  2.79e6      370      18 TRUE        NA           
#> 12 finished           -1 TRUE  2.79e6      370      18 TRUE        NA           
#> 13 finished           -1 TRUE  2.79e6      370      18 TRUE        NA           
#> 14 finished           -1 TRUE  2.79e6      370      18 TRUE        NA           
#> 15 finished           -1 TRUE  2.79e6      370      18 TRUE        NA           
#> 16 finished           -1 TRUE  2.79e6      370      18 TRUE        NA           
#> # ℹ 46 more variables: is_vertical_video <lgl>, khl_id <int>, team_a_id <int>,
#> #   team_a_khl_id <int>, team_a_image <chr>, team_a_name <chr>,
#> #   team_a_location <chr>, team_b_id <int>, team_b_khl_id <int>,
#> #   team_b_image <chr>, team_b_name <chr>, team_b_location <chr>, name <chr>,
#> #   tickets <chr>, location <chr>, start_at_day <int>, start_at <dbl>,
#> #   event_start_at <dbl>, end_at <dbl>, not_regular <lgl>, score <chr>,
#> #   scores_first_period <chr>, scores_second_period <chr>, …
# }