Sport

The basketball pages fans get — teams, players, coaches, games, standings and stats — with live scores and widgets.

2026-11-07

Basketball data pages

The basketball pages are what makes this site EuroLeague Basketball's rather than a news site. They are Euro League's own — the basketball domain does not exist in the Publishing Hub template — and they draw their data from the Competition Engine, ELB's competition data service, not from Contentful. Editors do not author these pages; where Contentful holds something about a team or a player (an editorial name, a crest, a picture, socials, a biography), the editor's value wins when it is set and the engine fills in everything else.

Every area follows the same shape: a list per competition, and one page per team, player, coach or game whichever competitions it plays in. A bare area address (/en/teams) takes the visitor to the default competition's list (EuroLeague's).

Area What fans get Example addresses Status
Teams Every club of a season as a card (record, rank, form, next game), with a search and a season filter; each club's page with its games and stats, and its roster as a page of its own /en/teams/euroleague, /en/teams/<team>, /en/teams/<team>/roster Available
Players The players of a competition, 24 to a page, with search and a players-stats view; each player's page with their stats, news & video, profile and records /en/players/euroleague, /en/players/euroleague/stats, /en/players/<player> Available
Coaches Each coach's page: their profile, record with the club and career records /en/coaches/<coach> Available (page) · lists are a temporary page
Games The schedule, round by round and season by season, with live scores; each game's own page — the Game Centre (below) /en/games/eurocup, /en/games/eurocup/season/2025-26/round/12, /en/games/<game> Available
Standings A competition's table for the current or a past season, and a Format view of the play-off structure /en/standings/euroleague, /en/standings/euroleague/format Available (the play-off bracket is provisional)
Stats A season's stats hub: league leaders for players and teams (this season or all time), the players table and the team rankings /en/stats/euroleague, /en/stats/euroleague/players Available

Notes on the statuses:

  • Coaches lists are a temporary page (the area's header, the competitions to choose from and a note) because the Competition Engine does not yet list coaches and the list has no design. A coach's own page is real. The temporary page's address is final, so nothing that links to it will change when the real list replaces it.
  • The play-off bracket is worked out from the games the engine serves, because the engine has no endpoint describing the play-off structure yet. It is replaced as soon as one exists.
  • Corporate has no data areas: /en/teams/corporate is not found, by configuration (club.config.ts → sections.capabilities).

Each list and page is indexed by search engines and carries structured data (teams, people, games). Every page has exactly one address: tabs on a team, player or coach page are reached in the page itself, and old or alternative spellings of an address redirect to the one it has.

The header's club crests

Every page carries a strip of the current competition's club crests in the header, each linking to that club's page. It comes from the Competition Engine and follows the section the visitor is in (EuroCup's clubs inside EuroCup's section, EuroLeague's everywhere else).

Switching the area off

The whole domain can be switched off for an environment with BASKETBALL_ROUTES=false: every data page and its live-data endpoints answer "not found", the sitemap leaves them out, the header's crests are not drawn and the widgets below disappear. Staging runs that way until basketball is switched on there. Links that editors have pointed at these areas in the navigation are theirs to remove.

For developers: @v4/basketball-app (the routes), @v4/competition-engine (the data and the Contentful merge) and @v4/ghost-basketball (the 139 UI components).

Game Centre and live scores

The Game Centre

Every game has one page, /en/games/<game>, that is its Game Centre before, during and after the game — the address never changes, so a link shared before tip-off still works at the final buzzer. The page shows the score card and the game's modules in tabs: the box score, team statistics, play-by-play (filterable by period, scoring plays, team and substitutions), the score by minute, the two clubs' head-to-head meetings, their season so far and their squads' season records, and the game's news and videos.

A module is shown only when the engine has data for it — a game the live feed never covered has no play-by-play, for example — and nothing is filled with placeholder content. Line-ups, the media in the hero and a partner card have no data source yet and are not shown.

Watching the game: the Game Centre links out to EuroLeague TV (the address is configurable per environment, NEXT_PUBLIC_ELTV_WATCH_URL, and defaults to https://euroleague.tv). An embedded ELTV player has been built but is not yet placed on the page — see The video section.

Capability Status
One Game Centre page per game, pre-match to full time Available
Live score card and modules while the game is played Available
News and videos about the game Available
Line-ups, hero media, partner card Planned (no data source yet)
Watch on EuroLeague TV Available as a link out; embedded player In development

Live scores

Live scores are real, and they come from the Competition Engine. While a game can be live, the visitor's browser asks the site for its latest state at the interval the engine asks for (every few seconds during play, less often before tip-off) and stops asking once the game is final. The site passes the engine's answer straight through and never stores a live answer in its own cache, so what a fan sees is always current.

Live updates reach:

  • the Game Centre — the score card and every module;
  • the schedule on the Games page — each game's score and status;
  • the home page hero — while one of today's games is being played, its widgets give way to the game's score card, points by quarter and game situation (see Widgets across the site).

This is ordinary polling of the site's own endpoints (/api/games/live, /api/live/games), not a realtime push service: no third-party realtime provider is involved. The motion that marks a score change decorates the update but never delays it.

Widgets across the site

Basketball data does not stay in the data pages. Small panels of live competition data — the header widgets of ELB's "Header widgets · EuroLeague" specification — appear on editorial pages too, so a fan reading the news is one click from the game.

The home page hero

The home page's hero has three widget areas, filled for the homepage's competition (Corporate's homepage shows EuroLeague's):

  • the standings — in season, after the latest round; off season, the final table;
  • the MVP — the latest complete round's most valuable player (the highest performance index rating in that round's box scores);
  • league leaders per game (points, rebounds, assists) — or, on a game day before tip-off, that day's games in their place.

While one of today's games is being played, the areas switch to that game, live.

Article headers

An article's header shows up to two widgets beside its picture, chosen by what the article is about, using the associations an editor sets on it (its game, round, teams and competition): the article's game as it stands right now (upcoming, live or final), then more on the game or on the clubs involved. What a widget shows is decided when the page is read, not when the article was published — an old article about a team shows that team's next game today. A widget with no data simply does not appear, and with none at all the picture spans the full header.

Team, player and coach pages

The heroes of the team, player and coach pages carry their own widgets: a club's form and next game, and a coach's record with the club.

Capability Status
Home hero widgets Available
Article header widgets Available (some planned widgets — head to head, top players, round MVP — are not built yet and drop out)
Team, player and coach hero widgets Available

All of these switch off with the basketball area (BASKETBALL_ROUTES=false): the home hero's areas stay empty and articles show their picture full width.

Competition sections

The site is one website for every competition — EuroLeague, EuroCup, NextGen and the Corporate site — rather than a site each. Each competition is a Competition entry in Contentful, and its slug is its section's address. EuroLeague is the default competition, so its pages have no prefix.

What EuroLeague (the default) Another competition
Home page /en /en/eurocup
A content page /en/about /en/eurocup/about
News /en/news /en/news/eurocup
Video /en/video /en/video/eurocup
Teams, players, games, standings, stats /en/teams/euroleague /en/teams/eurocup
A team, player, coach, game or article one address whichever competition it belongs to (/en/teams/<team>, /en/news/<article>)

What fans notice:

  • The menus follow the section. Inside EuroCup's section, the navigation's Home, News, Video and data links lead to EuroCup's pages.
  • A competition switcher in the header moves between the competitions' sections.
  • Competition themes. EuroCup's and NextGen's sections wear their own colours (Token Studio themes in packages/tokens-euro-league); every other page — EuroLeague's, and the single pages of teams, players, games and articles — wears EuroLeague's.
  • Every competition has its news. If an editor has not set up a listing for a competition, the site generates one from the articles tagged with it.
  • Corporate is different by configuration: it has no basketball data pages, no video home and no place in the competition switcher (club.config.ts → sections.capabilities). A new competition needs no configuration: it gets everything.
Capability Status
Per-competition home, content, news and data pages Available
Competition switcher and section-aware menus Available
EuroCup and NextGen themes Available
Per-competition video homes Available where a competition has its own Video Landing Page; otherwise a temporary page

The full address rules, redirects and how a page's section is decided are in Competition sections.

Add to calendar

The Games page offers Add to calendar through ECAL: a fan chooses all of a competition's games or a single team's, and ECAL's own screens take them through subscribing in their calendar app. Each competition's ECAL display is configured in club.config.ts.

Status: Available, switched on by environment — the button appears only where NEXT_PUBLIC_ECAL_API_KEY is set. See @v4/ecal.

Motion

Movement on the site follows ELB's own motion specification (EuroLeague Motion Spec v0.3, a draft for pilot): cards and table rows arrive in a short cascade, live scores and figures change, tables reorder, and tabs and menus open. What a fan or reviewer should notice:

  • Data never waits for motion. A live score, a sorted table or a filter result is on the page at once; motion only decorates its arrival.
  • Entrances play once per visit. Scrolling back or returning to a page does not replay them; new data (a new round, season or sort) does.
  • Reduced motion is respected completely. A visitor who has asked their device for less motion gets the finished page instantly, with nothing moving.

Status: Available, tracking a draft specification. How motion is specified, built and tested is in Motion.