Skip to contents

Regular-season standings: one row per team per table (league, conferences, divisions).

Usage

khl_standings(
  season = NULL,
  headers = NULL,
  tournament_id = NULL,
  return_parsed = TRUE
)

Arguments

season

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

headers

Named list of extra request headers, merged over the defaults (X-Requested-With, Origin, Referer). The cookie jar and sessid are kept in-process, so nothing needs reusing across calls.

tournament_id

khl.ru tournament id (tnId), sent as is instead of season / stage (1369 = 2025-26 regular season, 1370 its playoff; the schedule's tournament_id column). The All-Star games have their own.

return_parsed

Logical. TRUE (default) returns the parsed fastRhockey_data tibble; FALSE returns the raw khl.ru envelope as a list (status, data, errors; betting fields removed).

Value

A fastRhockey_data tibble (17 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
tablecharacterStandings table: league, a conference (west / east) or a division key
rankinteger1-based position in its table / list
club_idintegerkhl.ru CLUB id (stable across seasons; joins webcaster team khl_id)
namecharacterName in Russian (Cyrillic); the *_en / *en sibling holds the English transliteration
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)
goals_forintegerGoals scored by the team
goals_againstintegerGoals allowed by the team
is_out_playofflogicalEliminated from playoff contention
linkcharacterRelative khl.ru page path

Details

Endpoint: POST https://www.khl.ru/rest/standings/regular/.

khl.ru REST needs a primed session (a GET of the site root sets the cookie jar and the Bitrix sessid, then each call POSTs a form); this is done for you, one session per host per R session, re-primed when the site rotates its cookie or the sessid expires. No route takes a year: season (the END year, 2026 = 2025/26) and stage are mapped to the tournament id (tnId) through the webcaster season table, or pass tournament_id (the All-Star games have their own tnId).

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_standings(season = 2026))
#> ── KHL Standings from khl.ru ───────────────────────── fastRhockey 1.0.0.9000 ──
#> ℹ Data updated: 2026-10-13 01:55:02 UTC
#> # A tibble: 69 × 17
#>    table   rank club_id name       gp     w   otw   sow   sol   otl otl_en     l
#>    <chr>  <int>   <int> <chr>   <int> <int> <int> <int> <int> <int>  <int> <int>
#>  1 league     1      37 Металл…    68    37     8     4     3     4      0    12
#>  2 league     2      34 Аванга…    68    36     6     5     1     4      0    16
#>  3 league     3       1 Локомо…    68    34     6     6     2     4      0    16
#>  4 league     4      53 Ак Барс    68    38     2     3     6     2      0    17
#>  5 league     5     207 Динамо…    68    33     2     4     5     5      0    19
#>  6 league     6      56 Северс…    68    29     9     2     4     2      0    22
#>  7 league     7       2 ЦСКА       68    33     3     2     7     1      0    22
#>  8 league     8     190 Автомо…    68    32     4     4     0     4      0    24
#>  9 league    NA      NA NA         NA    NA    NA    NA    NA    NA     NA    NA
#> 10 league     9      24 СКА        68    28     7     2     4     3      0    24
#> # ℹ 59 more rows
#> # ℹ 5 more variables: pts <int>, goals_for <int>, goals_against <int>,
#> #   is_out_playoff <lgl>, link <chr>
# }