Skip to contents

Season player stat table: totals and per-game values, one row per player and stat block.

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

Usage

scb_player_statistics(season, league = "dbbl", display_type = "MAIN_ROUND")

Arguments

season

(required) Season END year (2026 = 2025-26, the sdv key). Sent to the API as its START-year seasonId (season - 1).

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).

display_type

(default "MAIN_ROUND") Which games the table covers: MAIN_ROUND (regular season), PLAYOFFS, PLAYOFFS_TOTAL, MAIN_ROUND_AND_PLAY_OFFS or CUP.

Value

A wehoop_data tibble: Season player stat table: totals and per-game values, one row per player and stat block. An empty valid answer raises wehoop_no_data; the columns are always these, in this order (sdv-py scb_player_statistics):

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.
display_typecharacterWhich games the table covers, echoed from the request (MAIN_ROUND, PLAYOFFS, PLAYOFFS_TOTAL, MAIN_ROUND_AND_PLAY_OFFS or CUP).
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 of the player, kept as text so a 00 jersey survives.
positioncharacterPosition: POINT_GUARD, SHOOTING_GUARD, SMALL_FORWARD, POWER_FORWARD, CENTER.
team_idcharacterClub id; equal to seasonTeamId in every sample. Joins to /teams/{teamId}.
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_idintegerThe API's own season key, the START year (2025 = 2025-26); season minus one.
round_codeintegerProvider round code; 1 for MAIN_ROUND in every sample (mapping unverified).
competitioncharacterCompetition: BBL, BBL_CUP (Pokal), ALLSTAR, CHAMPIONS_CUP on the BBL host; DBBL, DBBL_CUP on the DBBL host.
seconds_playedintegerThe player's season total playing time in SECONDS over displayType.
pointsintegerThe player's season total points over displayType.
two_point_shots_madeintegerThe player's season total 2-point field goals made over displayType.
two_point_shots_attemptedintegerThe player's season total 2-point field goals attempted over displayType.
two_point_shot_success_percentdoubleThe player's season total 2-point field-goal percentage over displaytype, 0-100 (one decimal); 0 when no attempts.
three_point_shots_madeintegerThe player's season total 3-point field goals made over displayType.
three_point_shots_attemptedintegerThe player's season total 3-point field goals attempted over displayType.
three_point_shot_success_percentdoubleThe player's season total 3-point field-goal percentage over displaytype, 0-100 (one decimal); 0 when no attempts.
field_goals_madeintegerThe player's season total field goals made over displayType.
field_goals_attemptedintegerThe player's season total field goals attempted over displayType.
field_goals_success_percentdoubleThe player's season total field-goal percentage over displaytype, 0-100 (one decimal); 0 when no attempts.
free_throws_madeintegerThe player's season total free throws made over displayType.
free_throws_attemptedintegerThe player's season total free throws attempted over displayType.
free_throws_success_percentdoubleThe player's season total free-throw percentage over displaytype, 0-100 (one decimal); 0 when no attempts.
offensive_reboundsintegerThe player's season total offensive rebounds over displayType.
defensive_reboundsintegerThe player's season total defensive rebounds over displayType.
total_reboundsintegerThe player's season total rebounds (offensive + defensive) over displayType.
assistsintegerThe player's season total assists over displayType.
stealsintegerThe player's season total steals over displayType.
turnoversintegerThe player's season total turnovers over displayType.
blocksintegerThe player's season total blocked shots over displayType.
fouls_committedintegerThe player's season total fouls committed over displayType.
efficiencyintegerThe player's season total efficiency (EFF = PTS + REB + AST + STL + BLK - missed FG - missed FT - TO; checked on a 2026 box score) over displayType.
plus_minusintegerThe player's season total plus-minus over displaytype.
games_playedintegerThe player's season total games played over displayType.
seconds_per_gamedoublePer-game average of seconds, seconds.
points_per_gamedoublePer-game average of points.
two_point_shots_made_per_gamedoublePer-game average of 2-point field goals made.
two_point_shots_attempted_per_gamedoublePer-game average of 2-point field goals attempted.
three_point_shots_made_per_gamedoublePer-game average of 3-point field goals made.
three_point_shots_attempted_per_gamedoublePer-game average of 3-point field goals attempted.
field_goals_made_per_gamedoublePer-game average of field goals made.
field_goals_attempted_per_gamedoublePer-game average of field goals attempted.
field_goals_success_percent_per_gamedoublePer-game average of field-goal percentage (0 in every sample: unusable).
free_throws_made_per_gamedoublePer-game average of free throws made.
free_throws_attempted_per_gamedoublePer-game average of free throws attempted.
defensive_rebounds_per_gamedoublePer-game average of defensive rebounds.
offensive_rebounds_per_gamedoublePer-game average of offensive rebounds.
total_rebounds_per_gamedoublePer-game average of rebounds (offensive + defensive).
assists_per_gamedoublePer-game average of assists.
steals_per_gamedoublePer-game average of steals.
turnovers_per_gamedoublePer-game average of turnovers.
blocks_per_gamedoublePer-game average of blocked shots.
fouls_committed_per_gamedoublePer-game average of fouls committed.
efficiency_per_gamedoublePer-game average of efficiency (EFF = PTS + REB + AST + STL + BLK - missed FG - missed FT - TO; checked on a 2026 box score).
plus_minus_per_gamedoublePer-game average of plus-minus (point margin while on court).
double_doubleintegerThe player's season total double-doubles over displayType.
double_double_per_gamedoublePer-game average of double-doubles.
games_startedintegerThe player's season total games started over displayType.
triple_doubleintegerThe player's season total triple-doubles over displayType.
triple_double_per_gamedoublePer-game average of triple-doubles.
fouls_receivedintegerThe player's season total fouls drawn over displayType.
fouls_received_per_gamedoublePer-game average of fouls drawn.
overalllogicalFalse in every sample (meaning unverified).
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.
aggregationcharacterAggregation label as sent: STAGE in player tables, MAIN_ROUND in team tables.

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_player_statistics(season = 2026))
#> Error in scb_player_statistics(season = 2026) : 
#>   www.easycredit-bbl.de/ answered HTTP 503: the API key could not be read.
# }