Skip to contents

One game header: teams, score by period, officials, venue and top scorer.

Endpoint: GET https://api.basketball-bundesliga.de/games/{game_id} (DBBL: the same route on https://api-1.dbbl.scb.world).

Usage

scb_game(game_id, league = "dbbl")

Arguments

game_id

(required) Game id (game_id in scb_games), e.g. 2006920 (BBL) or 10130 (DBBL). One sequence per league.

league

(default "dbbl", the women's DBBL) League: bbl (men, easyCredit Basketball Bundesliga, api.basketball-bundesliga.de) or dbbl (women, Toyota Damen-Basketball-Bundesliga, api-1.dbbl.scb.world). The two share one API; game ids overlap, so a game is (league, game_id).

Value

A wehoop_data tibble: One game header: teams, score by period, officials, venue and top scorer. An empty valid answer raises wehoop_no_data; the columns are always these, in this order (sdv-py scb_game):

col_nametypedescription
leaguecharacterLeague the row belongs to: bbl (men) or dbbl (women); BBL and DBBL game ids overlap, so a game is (league, game_id).
seasonintegerSeason END year (2026 = 2025-26), the sdv key; the API's season_id plus one.
season_idintegerSeason, START year (2026 = 2026-27).
game_idcharacterGame id, a string; unique within a league only (BBL and DBBL overlap), and not chronological.
competitioncharacterCompetition: BBL, BBL_CUP (Pokal), ALLSTAR, CHAMPIONS_CUP on the BBL host; DBBL, DBBL_CUP on the DBBL host.
stagecharacterStage: MAIN_ROUND (Hauptrunde, regular season), PLAYINS, FIRST_ROUND, SECOND_ROUND, ROUND_OF_16 (Achtelfinale), ROUND_OF_8 (Viertelfinale), SEMI_FINALS, FINALS, THIRD_PLACE_GAME, QUALIFICATION, GROUP_STAGE.
statuscharacterGame status: PRE (scheduled), LIVE, POST (ended, not yet official), OFFICIAL (final).
stat_statuscharacterLive-stats feed status code. Observed: E (ended; German Ende), N (not started), 1 (old games), empty string. Meaning inferred.
game_progresscharacterLive progress code: E (ended), empty or null before the game. Meaning inferred.
scheduled_timecharacterScheduled tip-off, ISO 8601 UTC.
match_dayintegerRound number within the stage (Spieltag).
is_tbdlogicalDate or time not yet fixed.
is_hiddenlogicalTrue when the API hides the game (0/1 on /games, a boolean on the header).
home_team_idcharacterClub id; equal to seasonTeamId in every sample. Joins to /teams/{teamId}.
home_season_team_idcharacterSeason-team id; equal to the club teamId in every sample (BBL 2005-2026, DBBL 2024-2026).
home_team_namecharacterTeam name as listed that season (sponsor names included, e.g. 'EWE Baskets Oldenburg').
home_tlccharacterThree-letter club code.
home_is_foreignlogicalThe team is not in this league (cup opponents from the ProA / ProB).
home_rankintegerThe team's current table position.
home_streakcharacterCurrent streak: W or L; empty when none.
home_streak_countintegerLength of the current streak.
home_last10_victoriesintegerWins in the last 10 games.
home_last10_lossesintegerLosses in the last 10 games.
home_total_gamesintegerGames the home team has played so far (the API sends it as a string).
guest_team_idcharacterClub id; equal to seasonTeamId in every sample. Joins to /teams/{teamId}.
guest_season_team_idcharacterSeason-team id; equal to the club teamId in every sample (BBL 2005-2026, DBBL 2024-2026).
guest_team_namecharacterTeam name as listed that season (sponsor names included, e.g. 'EWE Baskets Oldenburg').
guest_tlccharacterThree-letter club code.
guest_is_foreignlogicalThe team is not in this league (cup opponents from the ProA / ProB).
guest_rankintegerThe team's current table position.
guest_streakcharacterCurrent streak: W or L; empty when none.
guest_streak_countintegerLength of the current streak.
guest_last10_victoriesintegerWins in the last 10 games.
guest_last10_lossesintegerLosses in the last 10 games.
guest_total_gamesintegerGames the guest team has played so far (the API sends it as a string).
home_scoreintegerHome team final score.
guest_scoreintegerGuest team final score.
latest_periodintegerNumber of the last period played (4 = Q4, 5 = OT1, ...); the API sends Q4 on /games and 4 on /games/recent. Null before the game.
spectatorsintegerAttendance; 0 when not recorded.
home_q1_scoreintegerHome team points in quarter 1; 0 when quarter scores were not recorded.
home_q2_scoreintegerHome team points in quarter 2; 0 when quarter scores were not recorded.
home_q3_scoreintegerHome team points in quarter 3; 0 when quarter scores were not recorded.
home_q4_scoreintegerHome team points in quarter 4; 0 when quarter scores were not recorded.
home_ot1_scoreintegerHome team points in overtime 1; 0 when not played (null from OT5 on in old seasons).
home_ot2_scoreintegerHome team points in overtime 2; 0 when not played (null from OT5 on in old seasons).
home_ot3_scoreintegerHome team points in overtime 3; 0 when not played (null from OT5 on in old seasons).
home_ot4_scoreintegerHome team points in overtime 4; 0 when not played (null from OT5 on in old seasons).
home_ot5_scoreintegerHome team points in overtime 5; 0 when not played (null from OT5 on in old seasons).
home_ot6_scoreintegerHome team points in overtime 6; 0 when not played (null from OT5 on in old seasons).
home_ot7_scoreintegerHome team points in overtime 7; 0 when not played (null from OT5 on in old seasons).
home_ot8_scoreintegerHome team points in overtime 8; 0 when not played (null from OT5 on in old seasons).
home_ot9_scoreintegerHome team points in overtime 9; 0 when not played (null from OT5 on in old seasons).
guest_q1_scoreintegerGuest team points in quarter 1; 0 when quarter scores were not recorded.
guest_q2_scoreintegerGuest team points in quarter 2; 0 when quarter scores were not recorded.
guest_q3_scoreintegerGuest team points in quarter 3; 0 when quarter scores were not recorded.
guest_q4_scoreintegerGuest team points in quarter 4; 0 when quarter scores were not recorded.
guest_ot1_scoreintegerGuest team points in overtime 1; 0 when not played (null from OT5 on in old seasons).
guest_ot2_scoreintegerGuest team points in overtime 2; 0 when not played (null from OT5 on in old seasons).
guest_ot3_scoreintegerGuest team points in overtime 3; 0 when not played (null from OT5 on in old seasons).
guest_ot4_scoreintegerGuest team points in overtime 4; 0 when not played (null from OT5 on in old seasons).
guest_ot5_scoreintegerGuest team points in overtime 5; 0 when not played (null from OT5 on in old seasons).
guest_ot6_scoreintegerGuest team points in overtime 6; 0 when not played (null from OT5 on in old seasons).
guest_ot7_scoreintegerGuest team points in overtime 7; 0 when not played (null from OT5 on in old seasons).
guest_ot8_scoreintegerGuest team points in overtime 8; 0 when not played (null from OT5 on in old seasons).
guest_ot9_scoreintegerGuest team points in overtime 9; 0 when not played (null from OT5 on in old seasons).
referee1_idcharacterOfficial id; joins to /referees refId (= its id). /referees lists only the current officials (44), so older games' officials can be missing there: all 40 of 2026-27's matched, 6 of 10 of 2008-09's.
referee1_first_namecharacterOfficial's given name.
referee1_last_namecharacterOfficial's family name.
referee2_idcharacterOfficial id; joins to /referees refId (= its id). /referees lists only the current officials (44), so older games' officials can be missing there: all 40 of 2026-27's matched, 6 of 10 of 2008-09's.
referee2_first_namecharacterOfficial's given name.
referee2_last_namecharacterOfficial's family name.
referee3_idcharacterOfficial id; joins to /referees refId (= its id). /referees lists only the current officials (44), so older games' officials can be missing there: all 40 of 2026-27's matched, 6 of 10 of 2008-09's.
referee3_first_namecharacterOfficial's given name.
referee3_last_namecharacterOfficial's family name.
commissioner_idcharacterOfficial id; joins to /referees refId (= its id). /referees lists only the current officials (44), so older games' officials can be missing there: all 40 of 2026-27's matched, 6 of 10 of 2008-09's.
commissioner_first_namecharacterOfficial's given name.
commissioner_last_namecharacterOfficial's family name.
venue_idcharacterArena id, stable across seasons (Uber Arena = 2 in both 2025-26 and 2026-27); a different key space from /teams seasonVenues.id, and no captured route is keyed by it. A string in /games and /games/{gameId}, an integer in /games/recent.
venue_namecharacterName of the arena the game is played in; venue_id is its stable arena id.
venue_addresscharacterPostal address, German.
venue_capacityintegerArena capacity, spectators.
venue_is_mainlogicalThe club's main arena.
tv_channelcharacterTV channel(s) showing the game, comma-joined (a list on some routes, an empty string when none).
tv_typecharacterTV coverage type; empty or null in every sample.
is_free_tvlogicalShown on free-to-air TV.
live_stream_urlcharacterLive-stream link (DBBL games link YouTube); empty when none.
top_scoreintegerPoints of the game's top scorer; null before the game.
top_scorer_season_player_idcharacterSeason-player id. BBL: a string equal to id. DBBL: an INTEGER that matches /seasons/{seasonId} seasonPlayerId (5 of 5 rows checked, 2026-27). Joins to /season-players/{seasonPlayerId}.
top_scorer_real_player_idcharacterGlobal person id: the same across clubs and seasons. Joins to realPlayerId everywhere.
top_scorer_first_namecharacterPlayer's given name.
top_scorer_last_namecharacterPlayer's family name.

Details

  • Unofficial use of a public source: these wrappers read the front-end API of the German Bundesliga sites (easycredit-bbl.de, toyota-dbbl.de), run by SCB; payloads are not redistributed as release assets.

  • Legal notice: the BBL Impressum forbids storing BBL content (Inhalte) in an information system without BBL's written permission. That is a copyright term, not a robots rule (the API host has no robots.txt). The owner reviewed it and accepted the intake (2026-10-12 ruling); keep requests slow (the runtime waits at least 1 s per host) and raise any published data release with the owner. The DBBL host is the same operator and API; its site notice was not separately reviewed.

  • Both hosts need two headers: a constant x-api-key and an x-api-secret that rotates. The runtime derives the secret on first use from the key embedded in an easycredit-bbl.de page (reversed, : turned into -) and never logs or returns it. The derivation was reverse-engineered from observed requests and responses and has not been checked against the site's own front-end code; if the site changes how it signs requests, every call fails with wehoop_asset_fetch.

  • Id key spaces: seasonId is the START year (2025 = 2025-26), so a wrapper's END-year season is sent as season - 1. Teams are keyed by teamId (seasonTeamId equals it in every sample). seasonPlayerId is per player per season and per club (a player traded mid-season has two); realPlayerId is the person. playerId is ambiguous (the seasonPlayerId in box scores, records and /season-players; the person in /transfers). Game ids are strings.

  • Errors are classed conditions: wehoop_no_data (404, 204, a 400 "not a valid" id, no rows, a box score of a game not yet started), wehoop_bad_request (a bad argument, another 400 / 422) and wehoop_asset_fetch (a refused secret after one re-derive, any other non-2xx, an HTML / non-JSON / error-shaped body, a truncated page, a body for another game, season, club or league, a box score still in play), all inheriting wehoop_error. Wrappers raise; they never return an empty frame.

Examples

# \donttest{
  try(scb_game(game_id = "2006920"))
#> Error in scb_game(game_id = "2006920") : 
#>   www.easycredit-bbl.de/ answered HTTP 503: the API key could not be read.
# }