Skip to main content

VTB — VTB United League API (api.vtb-league.com)

sportsdataverse.basketball.vtb — 3 endpoints.

Note: Owner flag (sdv-internal-refs/vtb/README.md): the VTB United League is run from Russia and several clubs are owned or sponsored by sanctioned state companies (the KHL precedent); Infobasket is the Russian basketball federation's stats platform. Fetching on your own machine is fine; any published data release, hosted mirror or redistribution needs owner (sanctions / legal) sign-off first. No accounts or payments are involved.

Note: Unofficial and unsupported: both hosts are keyless public JSON backends of vtb-league.com. No terms of use are published; robots.txt is a 404 on api.vtb-league.com and org.infobasket.su (no rules; vtb-league.com disallows only /wp/wp-admin/). The runtime waits at least 1 s before every request, retries included, and honours Retry-After on 429 / 503. No key, cookie or proxy is used (live-verified direct from the droplet 2026-10-12).

Note: Seasons are END years (2026 = 2025-26) on both backends. Infobasket keys everything by competition id: vtb_infobasket_seasons maps the END year to the season-level CompID, and the season-keyed wrappers do that mapping for you. CompID means three things: a season (50714), a stage below it (50720 regular season, 54281 playoff; stage-level wrappers take the stage id from vtb_infobasket_comp_issue) and, in the player season stats, an END year.

Note: Ids: the v2 matchId is the Infobasket GameID, the v2 teamId the Infobasket TeamID and the v2 venueId the Infobasket ArenaId. team_id is the key on every team route; comp_team_id (a registration in one stage) and the club-record id of the team page are other key spaces. person_id is one person across clubs and seasons.

Note: v2 pages: meta.count is the rows returned (not a total), page is ignored and the default limit is 20, so the matches wrapper asks for 1000 and refuses a body whose count reaches its limit. The API lists new seasons only (from 2024-25; vtb: 2025-2027, wbc: 2026-2027): earlier years answer no rows (NoDataError).

vtb_league_leagues​

The leagues served by the API: vtb, vtbyouth, wbc.

Endpoint URL: GET https://api.vtb-league.com/v2/leagues

Valid URL: https://api.vtb-league.com/v2/leagues

API ParameterPythonPatternRequiredNullableDescription

Returns​

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

col_nametypedescription
league_idintegerv2 league id (1 vtb, 2 vtbyouth, 3 wbc). Not an Infobasket id.
leaguecharacterLeague slug used in the paths: 'vtb' (VTB United League), 'vtbyouth' (youth league), 'wbc' (WINLINE Basket Cup).
league_name_encharacterThe league name in English.
league_name_rucharacterThe league name in Russian.
league_abbrev_encharacterThe league abbreviation in English.
league_abbrev_rucharacterThe league abbreviation in Russian.

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

Example​

vtb_league_leagues()

Last validated n/a.

vtb_league_seasons​

The seasons the API serves for one league (new seasons only, from 2024-25).

Endpoint URL: GET https://api.vtb-league.com/v2/leagues/{league_slug}/seasons

Valid URL: https://api.vtb-league.com/v2/leagues/vtb/seasons

API ParameterPythonPatternRequiredNullableDescription
league_slugleague_slugYLeague slug (league in vtb_league_leagues): vtb (VTB United League), vtbyouth (youth league) or wbc (WINLINE Basket Cup).

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); the sdv season key and the {season} path param.
leaguecharacterLeague slug, echoed.
is_currentlogicalTrue for the current season.
season_namecharacterSeason name ('Season 2025/2026').
season_abbrevcharacterSeason abbreviation ('25/26').

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

Example​

vtb_league_seasons(league_slug='vtb')

Last validated n/a.

vtb_league_matches​

Every match of one league-season (schedule, scores, quarter points, venue), in one request.

Endpoint URL: GET https://api.vtb-league.com/v2/leagues/{league_slug}/seasons/{season}/matches

Valid URL: https://api.vtb-league.com/v2/leagues/vtb/seasons/2026/matches?limit=1000

API ParameterPythonPatternRequiredNullableDescription
league_slugleague_slugYLeague slug (league in vtb_league_leagues): vtb (VTB United League), vtbyouth (youth league) or wbc (WINLINE Basket Cup).
seasonseasonYSeason END year (2026 = 2025-26). The v2 API holds 2025 onwards (vtb: 2025-2027; wbc: 2026-2027); earlier years answer no rows.

Returns​

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

col_nametypedescription
match_idintegerMatch id; equals the Infobasket GameID (/Widget/GetOnline/{gameId}).
leaguecharacterLeague slug, echoed.
seasonintegerSeason END year, echoed.
competitioncharacterCompetition slug: 'vtb' (league games), 'vtb-supercup', 'vtb-allstars', 'wbc'.
phase_idintegerv2 phase id of the stage (not an Infobasket CompID).
phase_name_encharacterThe stage name in English.
phase_name_rucharacterThe stage name in Russian.
match_numbercharacterGame number ('1/2-2' = semi-final 2; regular-season numbers otherwise).
match_typecharacterGame type: REGULAR, FINALS (any playoff or cup knockout game), ALLSTARS.
match_statuscharacterStatus: SCHEDULED, IN_PROGRESS, COMPLETE, POSTPONED, CANCELLED, UNKNOWN (the site filters on the first four).
match_timecharacterTip-off in venue local time, ISO 8601 with offset.
match_time_mskcharacterTip-off in Moscow time (UTC+3), ISO 8601.
match_time_utccharacterTip-off in UTC, ISO 8601.
is_time_setlogicalTrue when the tip-off time is fixed.
time_actualcharacterUnobserved: null in every sample, so its type and meaning are unconfirmed.
time_end_actualcharacterUnobserved: null in every sample, so its type and meaning are unconfirmed.
durationintegerGame duration; 0 in every sample (unverified).
periodsintegerPeriods played (4 in regulation).
extra_periods_usedlogicalTrue when the game went to overtime.
attendanceintegerSpectators (null when not recorded).
hosting_team_idintegerHome team id (Infobasket TeamID).
venue_idintegerVenue id; equals the Infobasket arena id (ArenaId).
venue_name_encharacterThe venue name in English.
venue_name_rucharacterThe venue name in Russian.
venue_region_name_encharacterThe venue city in English.
venue_region_name_rucharacterThe venue city in Russian.
home_team_idintegerInfobasket TeamID of the home team.
home_scoreintegerFinal points of the home team (an integer; 0 for a cancelled match).
home_team_name_encharacterThe home team's name in English.
home_team_name_rucharacterThe home team's name in Russian.
home_team_code_encharacterThe home team's short code in English.
home_team_code_rucharacterThe home team's short code in Russian.
home_region_name_encharacterRegion or city of the home team in English.
home_region_name_rucharacterRegion or city of the home team in Russian.
away_team_idintegerInfobasket TeamID of the away team.
away_scoreintegerFinal points of the away team (an integer; 0 for a cancelled match).
away_team_name_encharacterThe away team's name in English.
away_team_name_rucharacterThe away team's name in Russian.
away_team_code_encharacterThe away team's short code in English.
away_team_code_rucharacterThe away team's short code in Russian.
away_region_name_encharacterRegion or city of the away team in English.
away_region_name_rucharacterRegion or city of the away team in Russian.
subtitle_encharacterThe site subtitle of the match in English.
subtitle_rucharacterThe site subtitle of the match in Russian.
necessary_label_encharacterThe site label of the match in English.
necessary_label_rucharacterThe site label of the match in Russian.
points_by_quarterscharacterPoints per period as [home, away] pairs; null before the game. The home team (isHomeCompetitor true) is listed first in competitors on every probed row (vtb seasons 2025 and 2026, wbc 2026: 620 of 620), and the first value of each pair summed to that team's score on every finished one.
home_q1integerPoints of the home team in period 1.
away_q1integerPoints of the away team in period 1.
home_q2integerPoints of the home team in period 2.
away_q2integerPoints of the away team in period 2.
home_q3integerPoints of the home team in period 3.
away_q3integerPoints of the away team in period 3.
home_q4integerPoints of the home team in period 4.
away_q4integerPoints of the away team in period 4.
home_otintegerPoints of the home team in all overtimes together (null without overtime).
away_otintegerPoints of the away team in all overtimes together (null without overtime).

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

Example​

vtb_league_matches(league_slug='vtb', season=2026)

Last validated n/a.