Skip to contents

The players of a season, with position, nationality, birth date, age and height.

Endpoint: GET https://embed-api.eui.connect.sportradar.com/v1/embed/{website_id}/persons

height is an integer where the site gives one (centimetres; unit unverified). position_code / position_name follow the site locale (the name is translated, the code is not). person_id is stable across seasons and sites.

Usage

atrium_players(
  website_id,
  season = NULL,
  season_id = NULL,
  competition_id = NULL,
  entity_id = NULL,
  locale = NULL
)

Arguments

website_id

(integer required): Site config id: which league site's widget this is (12 LNB France, 14 LNBP Mexico, 3 NBL1 Australia, 13 El Salvador, 22 Panama, 236 Austria, 326 Montenegro). Not a league id: one site serves several competitions.

season

(integer optional): Season END year (2026 = 2025-26 on LNB, site 12, whose own year is the START year; the calendar year on the other sites). Needs competition_id when several competitions share that year (see atrium_seasons()). Omit season and season_id for the site's default season.

season_id

(character optional): Season UUID (season_id in atrium_seasons()); sent as is, skipping the END-year lookup of season.

competition_id

(character optional): Competition UUID (competition_id in atrium_seasons()). Picks the season together with season, and is then not sent; with neither season nor season_id the API filters by it.

entity_id

(character optional): Team UUID (entity_id in atrium_teams() or any fixture row).

locale

(character optional): Locale of the labels, e.g. "en-EN" or "fr-FR". Omitted = the site's own language. Ids and codes never change.

Value

A wehoop_data tibble, one row per (season_id, person_id):

col_nametypedescription
website_idintegerSite config id the body came from (12 LNB, 14 LNBP, 3 NBL1, 13 El Salvador, 22 Panama, 236 Austria, 326 Montenegro), read from the body's links.self.
season_idcharacterSeason UUID of the roster list.
person_idcharacterPlayer UUID (person), shared across seasons and sites.
namecharacterPlayer name as the site prints it.
bibcharacterJersey number, as text.
entity_idcharacterTeam UUID the player is rostered with that season.
team_namecharacterTeam name in the site's language.
position_codecharacterPosition code (C, PG, SF, ...), language-independent.
position_namecharacterPosition name in the site's language.
nationalitycharacterPlayer's nationality in the site's language (e.g. Belgique).
date_of_birthDatePlayer's date of birth.
ageintegerPlayer's age in years when the body was generated.
heightintegerHeight as an integer, centimetres presumed (unit unverified); null when the site gives none.
statuscharacterPlayer status in the site's language (Actif, Blesse).
image_urlcharacterURL of the Sportradar-hosted image (400 px).

Details

Unofficial. This is the public endpoint the Sportradar Atrium / Synergy "Connect" widget calls from every visitor's browser (keyless; the host has no robots.txt). The data is Sportradar's and the leagues'. The wrappers read it on the caller's behalf, one request at least 1 s after the last to the host, and it is not republished as release assets. Keep crawls small and incremental.

Sites and seasons. website_id picks the league site; one site carries many competitions. Seasons are END years (season = 2026): the site's own year is the START year on LNB and the calendar year elsewhere, and a year can hold several competitions, so pair season with competition_id (see atrium_seasons()) or pass season_id. atrium_end_year() maps a site's own year to that END year, and atrium_season_id() finds the season UUID.

Columns are configured per site: a statistic one site omits is NA. A key the documented columns do not list is appended with an inferred type. Player and team ids (UUIDs, character) are shared across sites; the player stat tables carry names only, so person_id there is decoded from the widget link beside each name.

Errors (classed conditions, all inheriting wehoop_error): wehoop_no_data when the site has nothing for the request (HTTP 404, no such season, an empty fixture list, a game with no play-by-play yet, or a fixture id the site does not serve: an unknown id or a game of another site, which the API answers alike with an empty fixture); wehoop_bad_request for HTTP 400 / 422 or an argument that cannot be mapped (an ambiguous END year, season with season_id); wehoop_asset_fetch for any other failed fetch, an error / stub body, or a body that belongs to another site, type, season, game, player or team than the one asked for.

Examples

# \donttest{
  try(atrium_players(
    website_id = 12, season = 2026, competition_id = "3f4064bb-51ad-11f0-aaaf-2923c944b404"
  ))
#> ── Atrium players from embed-api.eui.connect.sportradar.com ──── wehoop 3.1.0 ──
#> ℹ Data updated: 2026-10-22 02:33:49 UTC
#> # A tibble: 294 × 15
#>    website_id season_id  person_id name  bib   entity_id team_name position_code
#>         <int> <chr>      <chr>     <chr> <chr> <chr>     <chr>     <chr>        
#>  1         12 df310a05-… 01173036… Isma… 21    f43b1b0f… Paris     C            
#>  2         12 df310a05-… 03e0ef50… Juha… 23    736b73ae… Monaco    GF           
#>  3         12 df310a05-… 0602120f… Jare… NA    f43b1b0f… Paris     NA           
#>  4         12 df310a05-… 06ded7ee… Dayl… 2     c281453b… Cholet    SG           
#>  5         12 df310a05-… 08ee670c… John… 8     7e9f3d8d… Le Mans   GF           
#>  6         12 df310a05-… 095e7eb6… Davi… 4     7e9f3d8d… Le Mans   FC           
#>  7         12 df310a05-… 0a26b3fe… Just… 1     238ad480… Dijon     PG           
#>  8         12 df310a05-… 0b6849a9… Just… 5     f43b1b0f… Paris     PG           
#>  9         12 df310a05-… 0c8e19b5… Cat … 1     689d1a0a… Saint-Qu… GF           
#> 10         12 df310a05-… 16742263… Aaro… 79    c281453b… Cholet    PG           
#> # ℹ 284 more rows
#> # ℹ 7 more variables: position_name <chr>, nationality <chr>,
#> #   date_of_birth <date>, age <int>, height <int>, status <chr>,
#> #   image_url <chr>
# }