Tracking Tournaments
This integration scenario explains how to track soccer tournaments using the Sportradar Soccer API. It covers how tournament structures are represented, how to build tournament brackets or stage views, and which feeds to use to track matches, statistics, and live match events throughout the tournament.
This scenario is commonly used to:
- Display tournament brackets and stage progression
- Render group stage standings and knockout rounds
- Track scheduled, live, and completed matches
- Monitor match events such as goals, cards, and substitutions
- Retrieve team and player statistics for tournament matches
- Power tournament dashboards and live match centers
Overview
Soccer tournaments typically consist of multiple stages, which may include:
- Group stages
- Qualification rounds
- Knockout rounds
- Two-legged ties
- Final championship matches
From an integration perspective:
- Each match in a tournament is represented as a sport event
- Tournament structure is derived from season, stage, round, and group metadata
- Some tournaments include group stages followed by knockout rounds, which are represented in the API through stage and group structures before advancing to bracket-based rounds
- Some competitions use league-style stages or playoffs (such as MLS) where standings determine advancement before entering knockout rounds
- Bracket progression is constructed using Season Links
- Match events and statistics are retrieved using Sport Event endpoints
Applications track tournament progression using season-level feeds to retrieve the tournament structure and sport event feeds to retrieve match events, statistics, and results.
If your product supports richer match experiences or analytics, the Soccer Extended API provides additional endpoints with deeper statistics, expanded events, and event coordinate data.
Tournament Structure Example
Competitions in the Soccer API follow a hierarchical structure:
competition
└ season
└ stage
└ round
└ match (sport_event)
For example, a tournament like the FIFA World Cup may appear structurally as:
World Cup
├ group stage
│ ├ group A
│ ├ group B
│ ├ group C
│ └ group D
└ knockout stage
├ round_of_16
├ quarterfinal
├ semifinal
└ final
Each match within this structure corresponds to a sport_event.id, which you can use to retrieve match events, statistics, and live updates.
Tournament Structure UpdatesFor Tier 1 competitions, tournament structures and match relationships are typically published shortly after official schedules are released. As matches are completed, advancing teams and future matchups are reflected in the Season Links feed.
The Update Frequencies page outlines how often data is refreshed and provides recommended call intervals for each REST endpoint. Use it to optimize your polling strategy before, during, and after matches while avoiding unnecessary requests.
Relevant Feeds
The following feeds are commonly used when tracking soccer tournaments:
| Feed | Purpose |
|---|---|
| Competitions | Discover available competitions and obtain the competition id for the tournament. |
| Competition Seasons | Retrieve seasons associated with a competition. |
| Season Links | Build tournament brackets, retrieve tournament matches, and track match progression across rounds. |
| Sport Event Lineups | Retrieve pre-match and in-match lineup information, including starters, bench players, substitutions, and formation data when available. |
| Sport Event Timeline | Retrieve play-by-play match events such as goals, substitutions, and cards. |
| Sport Event Summary | Retrieve match statistics including team and player stats. |
| Season Standings | Retrieve current tournament standings for group stages or league-style phases, including post-match table updates. |
| Live Summaries | Retrieve match summaries for all currently live matches. |
| Live Timelines | Retrieve play-by-play timelines for all currently live matches. |
| Sport Event Extended Timeline | Provides expanded event detail and XY event coordinates (Soccer Extended package). |
| Sport Event Extended Summary | Provides deeper team and player statistics for a match (Soccer Extended package). |
High-Level Workflow
Discover competition → Build tournament structure → Track lineups, match events, statistics, and standings → Refresh bracket progression
- Discover the tournament competition and season
- Build the tournament structure and retrieve matches using Season Links
- Track pre-match lineups, live match events, statistics, and standings
- Refresh the tournament structure after matches complete
Integration Steps
1. Discover the Tournament Competition and Season
Start by retrieving competitions to locate the tournament and its competition id.
- Call the Competitions endpoint to retrieve the list of available competitions.
- Identify the
competition.idfor the tournament you want to access. - Call the Competition Seasons endpoint using the
competition.idto retrieve theseason.idfor the tournament edition you want to track.
The season.id is required for retrieving tournament structure, matches, events, and statistics.
Understanding Competitions and Seasons
A Competition in soccer represents a league or tournament, such as the English Premier League, UEFA Champions League, or FIFA World Cup. Each competition has a unique
competition_id.A Season represents a specific edition of that competition, typically aligned with a year or competition cycle (e.g., Premier League 2024–25 or World Cup 2026). Each season has a unique
season_idand includes all matches, teams, standings, and results associated with that edition of the competition.
2. Build the Tournament Structure
Use the Season Links endpoint to construct the tournament structure. This feed is especially useful for tournaments where:
- competitors are not yet known
- matches appear as TBD vs TBD
- matches are linked across knockout rounds
GET https://api.sportradar.com/soccer/{access_level}/v4/{language_code}/seasons/{season_id}/stages_groups_cup_rounds.{format}<season_stages_groups_cup_rounds
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" generated_at="2026-03-04T11:33:10+00:00"
xmlns="http://schemas.sportradar.com/sportsapi/soccer/v4" xsi:schemaLocation="http://schemas.sportradar.com/sportsapi/soccer/v4 https://schemas.sportradar.com/sportsapi/soccer/v4/schemas/season_stages_groups_cup_rounds.xsd">
<stages>
<stage order="1" type="cup" phase="playoffs" start_date="2024-06-29" end_date="2024-07-14" year="2024">
<groups>
<group id="sr:cup:157967" group_name="Knockout stage">
<cup_rounds>
<cup_round id="sr:cup_round:1984283" name="round_of_16" order="1" state="winner" winner_id="sr:competitor:4698">
<sport_events>
<sport_event id="sr:sport_event:45843695" start_time="2024-06-30T19:00:00+00:00" start_time_confirmed="true" order="1"/>
</sport_events>
<linked_cup_rounds>
<cup_round id="sr:cup_round:1984299" type="parent" name="quarterfinal" order="1" state="winner" winner_id="sr:competitor:4698"/>
</linked_cup_rounds>
</cup_round>
<cup_round id="sr:cup_round:1984285" name="round_of_16" order="2" state="winner" winner_id="sr:competitor:4711">
<sport_events>
<sport_event id="sr:sport_event:45843693" start_time="2024-06-29T19:00:00+00:00" start_time_confirmed="true" order="1"/>
</sport_events>
<linked_cup_rounds>
<cup_round id="sr:cup_round:1984299" type="parent" name="quarterfinal" order="1" state="winner" winner_id="sr:competitor:4698"/>
</linked_cup_rounds>
</cup_round>{
"generated_at": "2026-03-04T10:31:59+00:00",
"stages": [
{
"order": 1,
"type": "cup",
"phase": "playoffs",
"start_date": "2024-06-29",
"end_date": "2024-07-14",
"year": "2024",
"groups": [
{
"id": "sr:cup:157967",
"group_name": "Knockout stage",
"cup_rounds": [
{
"id": "sr:cup_round:1984283",
"sport_events": [
{
"id": "sr:sport_event:45843695",
"start_time": "2024-06-30T19:00:00+00:00",
"start_time_confirmed": true,
"order": 1
}
],
"linked_cup_rounds": [
{
"id": "sr:cup_round:1984299",
"type": "parent",
"name": "quarterfinal",
"order": 1,
"state": "winner",
"winner_id": "sr:competitor:4698"
}
],
"name": "round_of_16",
"order": 1,
"state": "winner",
"winner_id": "sr:competitor:4698"
},
{
"id": "sr:cup_round:1984285",
"sport_events": [
{
"id": "sr:sport_event:45843693",
"start_time": "2024-06-29T19:00:00+00:00",
"start_time_confirmed": true,
"order": 1
}
],
"linked_cup_rounds": [
{
"id": "sr:cup_round:1984299",
"type": "parent",
"name": "quarterfinal",
"order": 1,
"state": "winner",
"winner_id": "sr:competitor:4698"
}
],
"name": "round_of_16",
"order": 2,
"state": "winner",
"winner_id": "sr:competitor:4711"
},In addition to bracket relationships, the feed also returns sport event identifiers and scheduling information when available, allowing applications to both build the tournament structure and identify the matches that belong to each round. Typical structure elements returned include:
groupscup_roundsport_event.idother_sport_event_id(for two-legged ties)- scheduled match timing
Using the relationships returned in the Season Links feed, you can construct a tournament bracket similar to the knockout stage used in competitions such as the FIFA World Cup or the MLS Cup Playoffs.
Each match in the bracket corresponds to a sport_event.id, while progression between rounds is determined using the linked_cup_rounds relationships.
Implementing a Bracket Data Model
Many applications store tournament brackets using a simple round-based or tree structure derived from the Season Links response:
{
"round_of_16": [
{ "match_id": "sr:sport_event:123", "next_round": "quarterfinal_1" },
{ "match_id": "sr:sport_event:124", "next_round": "quarterfinal_1" }
]
}
Each match becomes a node in the bracket, while linked rounds determine where winners advance. Here is the recommended logic:
- Iterate through rounds returned by the Season Links feed.
- Group matches under their respective round or stage.
- Store the
sport_event.idfor each match. - Link matches across rounds using round identifiers.
- Handle two-legged ties by pairing matches using the linked event id.
3. Track Match Events, Statistics, Standings, and Lineups
Once you have the sport_event.id for each tournament match, use sport event endpoints to retrieve pre-match and live match data.
Use the Sport Event Lineups feed before match start to retrieve lineup information when available, including:
- starting players
- bench players
- formations
- substitutions
- lineup confirmation status
This is useful for powering pregame match centers, lineup cards, and formation displays.
Use the Sport Event Timeline feed to retrieve play-by-play match events:
- goals
- substitutions
- yellow and red cards
- match clock updates
- period transitions
- penalty shootout events
Use the Sport Event Summary feed to retrieve match statistics including:
- scoring
- player statistics
- match status
- venue information
Use the Season Standings feed to retrieve current tournament standings for group stages and league-style phases.
This is useful for:
- showing live or near-live table movement during matchday
- retrieving updated standings after matches complete
- rendering group tables alongside knockout progression where applicable
For post-match standings, re-pull Season Standings after matches reach a completed state and official table updates have been published.
For previous-round standings, applications should typically store their own standings snapshots over time if historical round-by-round table views are required, since integrations often need to preserve how a table looked at specific points in the tournament.
If deeper statistical coverage is required, the Soccer Extended API provides:
- Sport Event Extended Timeline
- Sport Event Extended Summary
These provide 100+ advanced statistics and event coordinates.
Monitoring All Live MatchesIf you want to retrieve information for all matches currently live, use the Live feeds:
These feeds return match status, scoring updates, statistics, and play-by-play events for all currently live soccer matches.
Because these feeds are not limited to a specific tournament, applications should filter results using:
competition.idseason.idThis approach is useful for tournament dashboards that need to quickly detect which matches in the tournament are currently live.
4. Refresh the Tournament Structure After Matches Complete
After a match reaches a completed state, re-pull Season Links to refresh the tournament bracket. Refreshing updates:
- advancing competitors
- resolved TBD placeholders
- future round matchups
Typical refresh workflow:
- Monitor match statuses using the Sport Event Timeline or Sport Event Summary feeds.
- When a match reaches
ended, re-call Season Links. - Update your stored bracket structure
This ensures your bracket remains synchronized with official results.
FIFA RankingsFor World Cup competitions, use our FIFA Ranking endpoint to display each team's world ranking.
Best Practices
Tournament Structure
- Use Season Links as the source of tournament bracket structure.
- Store
sport_event.idfor all tournament matches. - Re-pull Season Links after matches reach a completed state to keep tournament brackets updated with advancing competitors and future matchups.
Match Events, Statistics, and Lineups
- Use Sport Event Lineups before matches start to retrieve starters, bench players, formations, and lineup confirmation status.
- Use Sport Event Timeline for match events.
- Use Sport Event Summary for match statistics.
- Use Season Standings for current and post-match tournament tables.
- Store your own standings snapshots if you need to show historical standings by round or matchday.
- Use Soccer Extended endpoints when deeper statistics or advanced event data is required.
Live Match Monitoring
- Use Live endpoints when you need to detect all currently live matches.
- Filter live results by
competition.idorseason.idwhen monitoring a specific tournament.
Updated 5 days ago
