Skip to contents

Goals of a game with scorer, assists, strength and the jerseys on ice for both teams.

Usage

vhl_goals(season, game_id, stage = "regular", return_parsed = TRUE)

Arguments

season

Season END year (2026 = 2025/26; the calendar covers 2010/11 on). With stage it is mapped to the site's tournament id, see vhl_tn().

game_id

Required. Game id (game_id in vhl_schedule; the report's and the broadcast's idgame), e.g. 899223.

stage

Season stage: "regular" (default) or "playoff".

return_parsed

TRUE (default) returns the parsed tibble; FALSE returns the page's parsed record (a named list, the sdv-internal-refs capture shape, plus _request with the season, stage, tn and the ids asked for).

Value

A fastRhockey_data tibble with one row per goal:

col_nametypedescription
game_idintegerGame id (the calendar's game_id; the report's and the broadcast's idgame). The report and broadcast pages do not print it: it comes from the request.
seasonintegerSeason END year (2026 = 2025/26).
stagecharacterSeason stage: regular or playoff.
game_numberintegerOfficial game number (from 'No.984'); checked against the request.
team_sidecharacterSide of the game the row belongs to: home or away.
team_page_idintegerTeam page id (vhlru.ru /en/teams/{team_page_id}/), stable across seasons; for report rows the page id of the row's side.
goal_numberintegerGoal number in the game (G).
periodcharacterPeriod (Per) as printed: '1', '2', '3', overtime unverified, 'RB' (Cyrillic even on /en/: shootout, reshayushchiy brosok).
timecharacterElapsed game time 'mm:ss' from the opening faceoff (Time); the shootout row says '65:00'.
scorecharacterScore after the goal 'home:away' (Score).
strengthcharacterGoal strength code (PMG): eq (even), ppg (power play), shg (shorthanded); null on the shootout row.
scorer_idintegerPlayer id of the scorer: the {player_id} of /en/players/{player_id}/, stable across seasons and teams; also the photo id on img.khl.ru. Same numeric sequence as khl.ru player ids; whether it equals the same person's khl.ru id is unverified.
scorercharacterGoal scorer's name, 'Surname Given' as the report prints it.
scorer_jerseyintegerScorer jersey number.
scorer_season_totalintegerThe scorer's season goal count after this goal (the '(13)' suffix); null on the shootout row.
assist1_idintegerPlayer id of the first assist; null when unassisted.
assist1characterFirst assist name; null when unassisted.
assist1_jerseyintegerFirst assist jersey number.
assist1_season_totalintegerThe first assist's season assist count after this goal (the '(14)' suffix).
assist2_idintegerPlayer id of the second assist; null when none.
assist2characterSecond assist name; null when none.
assist2_jerseyintegerSecond assist jersey number.
assist2_season_totalintegerThe second assist's season assist count after this goal.
home_on_icelist of integerJersey numbers of the home players on ice at the goal (goalie included); the column header is the home team's short name. Shootout row: the goalie only.
away_on_icelist of integerJersey numbers of the away players on ice at the goal (goalie included); the column header is the away team's short name. Empty on the shootout row.

With return_parsed = FALSE, the page's parsed record (a named list) instead.

Details

One report page feeds vhl_game_info(), vhl_goals(), vhl_penalties(), vhl_player_box() and vhl_goalie_box(). Each call fetches it (and, for the first game of a season, that season's calendar, cached for the R session). Use return_parsed = FALSE to keep the page's record.

Source: GET https://www.vhlru.ru/en/report/{season}/ (server-rendered HTML, keyless; parsed with rvest). Unofficial use of a public source; payloads are not redistributed.

Owner flag (sanctions)

The VHL is run by Russian league operators, and several clubs are owned or sponsored by sanctioned state companies. Fetching on your own machine is fine; a published data release or a hosted mirror of this data needs the owner's sanctions / legal sign-off first.

Errors

  • fastRhockey_no_data: the VHL has nothing for the request (a season without that stage, a game not in the season's calendar, an unknown game, player or team page).

  • fastRhockey_bad_request: a bad season / stage / id, a missing argument, or HTTP 400 / 422.

  • fastRhockey_asset_fetch: the page could not be fetched, or it is not the page asked for (another season, game or player; a missing table or header drift).

Examples

# \donttest{
  try(vhl_goals(season = 2026, game_id = 899223))
#> ── VHL Goals Information from vhlru.ru ─────────────── fastRhockey 1.0.0.9000 ──
#> ℹ Data updated: 2026-10-13 02:00:21 UTC
#> # A tibble: 5 × 25
#>   game_id season stage   game_number team_side team_page_id goal_number period
#>     <int>  <int> <chr>         <int> <chr>            <int>       <int> <chr> 
#> 1  899223   2026 regular         984 away            505612           1 1     
#> 2  899223   2026 regular         984 away            505612           2 1     
#> 3  899223   2026 regular         984 home               390           3 3     
#> 4  899223   2026 regular         984 home               390           4 3     
#> 5  899223   2026 regular         984 away            505612           5 РБ    
#> # ℹ 17 more variables: time <chr>, score <chr>, strength <chr>,
#> #   scorer_id <int>, scorer <chr>, scorer_jersey <int>,
#> #   scorer_season_total <int>, assist1_id <int>, assist1 <chr>,
#> #   assist1_jersey <int>, assist1_season_total <int>, assist2_id <int>,
#> #   assist2 <chr>, assist2_jersey <int>, assist2_season_total <int>,
#> #   home_on_ice <list>, away_on_ice <list>
# }