Skip to contents

Box score of a finished game: one row per player line of both teams (2002-03 on).

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

Usage

scb_game_players(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: Box score of a finished game: one row per player line of both teams (2002-03 on). An empty valid answer raises wehoop_no_data; the columns are always these, in this order (sdv-py scb_game_players):

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).
game_idcharacterGame id, a string. Joins to /games/{gameId}.
seasonintegerSeason END year (2026 = 2025-26), the sdv key; the API's season_id plus one.
sidecharacterhome or guest (the away side), for the team the row belongs to.
team_idcharacterClub id; equal to seasonTeamId in every sample. Joins to /teams/{teamId}.
season_player_idcharacterSeason-player id: one player's engagement with one club (kept across seasons while he stays, new after a move; see README). Joins to box-score seasonPlayer.id, action seasonPlayerId and /season-players/{seasonPlayerId}.
real_player_idintegerGlobal person id: the same across clubs and seasons. Joins to realPlayerId everywhere.
first_namecharacterPlayer's given name.
last_namecharacterPlayer's family name.
shirt_numbercharacterJersey number. A number or a numeric string across rows.
positioncharacterPosition: POINT_GUARD, SHOOTING_GUARD, SMALL_FORWARD, POWER_FORWARD, CENTER.
season_team_idcharacterSeason-team id; equal to the club teamId in every sample (BBL 2005-2026, DBBL 2024-2026).
team_namecharacterTeam name as listed that season (sponsor names included, e.g. 'EWE Baskets Oldenburg').
team_tlccharacterThree-letter club code.
season_idintegerSeason, START year (2026 = 2026-27).
seconds_playedintegerThe player's playing time in SECONDS in the game.
pointsintegerThe player's points in the game.
two_point_shots_madeintegerThe player's 2-point field goals made in the game.
two_point_shots_attemptedintegerThe player's 2-point field goals attempted in the game.
two_point_shot_success_percentdoubleThe player's 2-point field-goal percentage in the game, 0-100 (one decimal); 0 when no attempts.
three_point_shots_madeintegerThe player's 3-point field goals made in the game.
three_point_shots_attemptedintegerThe player's 3-point field goals attempted in the game.
three_point_shot_success_percentdoubleThe player's 3-point field-goal percentage in the game, 0-100 (one decimal); 0 when no attempts.
field_goals_madeintegerThe player's field goals made in the game.
field_goals_attemptedintegerThe player's field goals attempted in the game.
field_goals_success_percentdoubleThe player's field-goal percentage in the game, 0-100 (one decimal); 0 when no attempts.
free_throws_madeintegerThe player's free throws made in the game.
free_throws_attemptedintegerThe player's free throws attempted in the game.
free_throws_success_percentdoubleThe player's free-throw percentage in the game, 0-100 (one decimal); 0 when no attempts.
offensive_reboundsintegerThe player's offensive rebounds in the game.
defensive_reboundsintegerThe player's defensive rebounds in the game.
total_reboundsintegerThe player's rebounds (offensive + defensive) in the game.
assistsintegerThe player's assists in the game.
stealsintegerThe player's steals in the game.
turnoversintegerThe player's turnovers in the game.
blocksintegerThe player's blocked shots in the game.
fouls_committedintegerThe player's fouls committed in the game.
efficiencyintegerThe player's efficiency (EFF = PTS + REB + AST + STL + BLK - missed FG - missed FT - TO; checked on a 2026 box score) in the game.
plus_minusintegerThe player's plus-minus (point margin while on court); null when the API sends an empty string (2005-06).
is_starting_fivelogicalStarted the game.
double_doubleintegerThe player's double-doubles in the game.
triple_doubleintegerThe player's triple-doubles in the game.
fouls_receivedintegerThe player's fouls drawn in the game.
opponent_team_namecharacterOpponent's name.
field_goals_recomputedlogicalTrue when the API's field-goal totals disagreed with its 2-point plus 3-point parts (2005-06 box scores) and were recomputed from the parts.

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_players(game_id = "2006920"))
#> Error in scb_game_players(game_id = "2006920") : 
#>   www.easycredit-bbl.de/ answered HTTP 503: the API key could not be read.
# }