Tracking Standings
This scenario builds and maintains league tables: the overall, conference, and division views for MLB, tables with ties for NPB, and pool standings plus brackets for cup competitions like the World Baseball Classic.
This scenario is commonly used to:
- Render standings pages with league and division views
- Track division and playoff races
- Build group tables and knockout brackets for cup competitions
Relevant Feeds
| Feed | Purpose |
|---|---|
| Season Standings | Every table view a season defines, one group per view |
| Season Info | The coverage block stating whether standings recalculate in play |
| Season Links | Bracket structure for cup seasons: cup rounds and their wiring |
| Sport Events Updated | The trigger for off-cycle standings refreshes |
High-Level Workflow
Season Info (coverage) → Season Standings → render each group → Season Links for brackets
Integration Steps
1. Pull the season's standings
Season Standings takes a season ID. The response carries one standings entry (type total) whose groups array holds every table view the season defines; MLB 2026 returns nine groups: the full league, both leagues, and all six divisions. The request and the AL Central group, in both formats (the other eight groups are trimmed):
GET https://api.sportradar.com/baseball/trial/v2/en/seasons/sr:season:134469/standings.json
x-api-key: YOUR_API_KEY{
"generated_at": "2026-07-21T17:49:37+00:00",
"standings": [
{
"tie_break_rule": "The MLB overall table is sorted by percentage",
"type": "total",
"round": 1,
"groups": [
{
"stage": {
"order": 1,
"type": "league",
"phase": "division",
"start_date": "2026-03-25",
"end_date": "2026-09-28",
"year": "2026"
},
"id": "sr:league:99741",
"name": "MLB 2026, American League Central",
"live": false,
"standings": [
{
"rank": 1,
"played": 99,
"win": 53,
"loss": 46,
"draw": 0,
"runs_for": 0,
"runs_against": 0,
"runs_diff": 0,
"competitor": {
"id": "sr:competitor:3644",
"name": "Chicago White Sox",
"country": "USA",
"country_code": "USA",
"abbreviation": "CWS",
"gender": "male"
},
"games_behind": 0,
"winning_percentage": 0.535,
"win_home": 31,
"loss_home": 17,
"win_away": 22,
"loss_away": 29,
"win_last_ten": 6,
"loss_last_ten": 4
},
{
"rank": 2,
"played": 101,
"win": 53,
"loss": 48,
"draw": 0,
"runs_for": 0,
"runs_against": 0,
"runs_diff": 0,
"competitor": {
"id": "sr:competitor:3650",
"name": "Cleveland Guardians",
"country": "USA",
"country_code": "USA",
"abbreviation": "CLE",
"gender": "male"
},
"games_behind": 1,
"winning_percentage": 0.525,
"win_home": 26,
"loss_home": 24,
"win_away": 27,
"loss_away": 24,
"win_last_ten": 6,
"loss_last_ten": 4
},
{
"rank": 3,
"played": 101,
"win": 49,
"loss": 52,
"draw": 0,
"runs_for": 0,
"runs_against": 0,
"runs_diff": 0,
"competitor": {
"id": "sr:competitor:3649",
"name": "Minnesota Twins",
"country": "USA",
"country_code": "USA",
"abbreviation": "MIN",
"gender": "male"
},
"games_behind": 5,
"winning_percentage": 0.485,
"win_home": 26,
"loss_home": 25,
"win_away": 23,
"loss_away": 27,
"win_last_ten": 5,
"loss_last_ten": 5
},
{
"rank": 4,
"played": 100,
"win": 47,
"loss": 53,
"draw": 0,
"runs_for": 0,
"runs_against": 0,
"runs_diff": 0,
"competitor": {
"id": "sr:competitor:3648",
"name": "Detroit Tigers",
"country": "USA",
"country_code": "USA",
"abbreviation": "DET",
"gender": "male"
},
"games_behind": 6.5,
"winning_percentage": 0.47,
"win_home": 27,
"loss_home": 23,
"win_away": 20,
"loss_away": 30,
"win_last_ten": 7,
"loss_last_ten": 3
},
{
"rank": 5,
"played": 101,
"win": 41,
"loss": 60,
"draw": 0,
"runs_for": 0,
"runs_against": 0,
"runs_diff": 0,
"competitor": {
"id": "sr:competitor:3651",
"name": "Kansas City Royals",
"country": "USA",
"country_code": "USA",
"abbreviation": "KC",
"gender": "male"
},
"games_behind": 13,
"winning_percentage": 0.406,
"win_home": 24,
"loss_home": 27,
"win_away": 17,
"loss_away": 33,
"win_last_ten": 4,
"loss_last_ten": 6
}
],
"group_name": "American League Central"
}
]
}
]
}<?xml version="1.0" ?>
<season_standings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.sportradar.com/sportsapi/baseball/v2" generated_at="2026-07-21T17:30:01+00:00" xsi:schemaLocation="http://schemas.sportradar.com/sportsapi/baseball/v2 https://schemas.sportradar.com/sportsapi/baseball/v2/schemas/season_standings.xsd">
<standing rank="1" played="100" win="63" loss="37" draw="0" runs_for="510" runs_against="374" runs_diff="136" games_behind="0" winning_percentage="0.63" win_home="33" loss_home="18" win_away="30" loss_away="19" win_last_ten="6" loss_last_ten="4">
<!-- ... other groups omitted for brevity -->
<group id="sr:league:99741" name="MLB 2026, American League Central" live="false" group_name="American League Central">
<stage order="1" type="league" phase="division" start_date="2026-03-25" end_date="2026-09-28" year="2026"/>
<standings>
<standing rank="1" played="99" win="53" loss="46" draw="0" runs_for="0" runs_against="0" runs_diff="0" games_behind="0" winning_percentage="0.535" win_home="31" loss_home="17" win_away="22" loss_away="29" win_last_ten="6" loss_last_ten="4">
<competitor id="sr:competitor:3644" name="Chicago White Sox" country="USA" country_code="USA" abbreviation="CWS" gender="male"/>
</standing>
<standing rank="2" played="101" win="53" loss="48" draw="0" runs_for="0" runs_against="0" runs_diff="0" games_behind="1" winning_percentage="0.525" win_home="26" loss_home="24" win_away="27" loss_away="24" win_last_ten="6" loss_last_ten="4">
<competitor id="sr:competitor:3650" name="Cleveland Guardians" country="USA" country_code="USA" abbreviation="CLE" gender="male"/>
</standing>
<standing rank="3" played="101" win="49" loss="52" draw="0" runs_for="0" runs_against="0" runs_diff="0" games_behind="5" winning_percentage="0.485" win_home="26" loss_home="25" win_away="23" loss_away="27" win_last_ten="5" loss_last_ten="5">
<competitor id="sr:competitor:3649" name="Minnesota Twins" country="USA" country_code="USA" abbreviation="MIN" gender="male"/>
</standing>
<standing rank="4" played="100" win="47" loss="53" draw="0" runs_for="0" runs_against="0" runs_diff="0" games_behind="6.5" winning_percentage="0.47" win_home="27" loss_home="23" win_away="20" loss_away="30" win_last_ten="7" loss_last_ten="3">
<competitor id="sr:competitor:3648" name="Detroit Tigers" country="USA" country_code="USA" abbreviation="DET" gender="male"/>
</standing>
<standing rank="5" played="101" win="41" loss="60" draw="0" runs_for="0" runs_against="0" runs_diff="0" games_behind="13" winning_percentage="0.406" win_home="24" loss_home="27" win_away="17" loss_away="33" win_last_ten="4" loss_last_ten="6">
<competitor id="sr:competitor:3651" name="Kansas City Royals" country="USA" country_code="USA" abbreviation="KC" gender="male"/>
</standing>
</standings>
</group>
</standing>
</season_standings>Reading a row:
rankorders the group;games_behindis the familiar leader-relative gap, andwinning_percentageis the ordering statisticwin_home/loss_homeandwin_away/loss_awayare the venue splits;win_last_ten/loss_last_tenis current formruns_for,runs_against, andruns_diffcarry run productiontie_break_rule, where present, states how equal records are ordered
Because the same team appears in its division, its league, and the overall group, key your storage on the pair of group id and competitor id. Rendered as a front-facing module, the group above maps straight to a table; the values below are the same five rows:
2. Respect the coverage mode
Season Info's coverage block states whether standings recalculate in play (standings: live) or settle after games finish (standings: post); MLB 2026 declares post, while NPB and KBO League seasons declare live. The feed also takes two query parameters: live=false requests the settled table explicitly, and round returns the table as it stood after an earlier round. See Fundamentals for the coverage block itself.
For a live-coverage season, the in-progress game is already counted in the table, and its classification moves with the score. One NPB team's Central League row before their game, and again while they trailed in that game: played has already incremented, the in-progress result is counted against them, and the group carries live: true throughout:
{
"generated_at": "2026-07-25T04:05:05+00:00",
"standings": [
{
"type": "total",
"groups": [
{
"stage": {
"order": 1,
"type": "league",
"phase": "division",
"start_date": "2026-03-27",
"end_date": "2026-09-30",
"year": "2026"
},
"id": "sr:league:103148",
"name": "NPB 2026, Central League",
"live": true,
"group_name": "Central League",
"standings": [
{
"rank": 6,
"played": 92,
"win": 37,
"loss": 54,
"draw": 1,
"runs_for": 310,
"runs_against": 323,
"runs_diff": -13,
"competitor": {
"id": "sr:competitor:67104",
"name": "Chunichi Dragons",
"country": "Japan",
"country_code": "JPN",
"abbreviation": "CHU",
"gender": "male"
},
"games_behind": 13.5,
"winning_percentage": 0.407,
"win_home": 0,
"loss_home": 0,
"win_away": 0,
"loss_away": 0,
"win_last_ten": 0,
"loss_last_ten": 0
}
]
}
]
}
]
}{
"generated_at": "2026-07-25T05:25:14+00:00",
"standings": [
{
"type": "total",
"groups": [
{
"stage": {
"order": 1,
"type": "league",
"phase": "division",
"start_date": "2026-03-27",
"end_date": "2026-09-30",
"year": "2026"
},
"id": "sr:league:103148",
"name": "NPB 2026, Central League",
"live": true,
"group_name": "Central League",
"standings": [
{
"rank": 6,
"played": 93,
"win": 37,
"loss": 55,
"draw": 1,
"runs_for": 310,
"runs_against": 324,
"runs_diff": -14,
"competitor": {
"id": "sr:competitor:67104",
"name": "Chunichi Dragons",
"country": "Japan",
"country_code": "JPN",
"abbreviation": "CHU",
"gender": "male"
},
"games_behind": 13.5,
"winning_percentage": 0.402,
"win_home": 0,
"loss_home": 0,
"win_away": 0,
"loss_away": 0,
"win_last_ten": 0,
"loss_last_ten": 0
}
]
}
]
}
]
}Render live tables directly from the feed rather than adding provisional results yourself; the recalculation is done for you.
3. Handle ties and qualification markers
NPB games can end level, so NPB rows carry a nonzero draw column, and rows in a qualification position carry current_outcome. The Central League top three, with the leader holding one drawn game and a Playoffs marker:
{
"generated_at": "2026-07-21T14:05:04+00:00",
"standings": [
{
"type": "total",
"round": 1,
"groups": [
{
"stage": {
"order": 1,
"type": "league",
"phase": "division",
"start_date": "2026-03-27",
"end_date": "2026-09-30",
"year": "2026"
},
"id": "sr:league:103148",
"name": "NPB 2026, Central League",
"live": false,
"group_name": "Central League",
"standings": [
{
"rank": 1,
"played": 87,
"win": 48,
"loss": 38,
"draw": 1,
"runs_for": 329,
"runs_against": 273,
"runs_diff": 56,
"competitor": {
"id": "sr:competitor:22108",
"name": "Hanshin Tigers",
"country": "Japan",
"country_code": "JPN",
"abbreviation": "HAN",
"gender": "male"
},
"current_outcome": "Playoffs",
"games_behind": 0,
"winning_percentage": 0.558,
"win_home": 22,
"loss_home": 20,
"win_away": 26,
"loss_away": 18,
"win_last_ten": 7,
"loss_last_ten": 3
},
{
"rank": 1,
"played": 88,
"win": 48,
"loss": 38,
"draw": 2,
"runs_for": 286,
"runs_against": 281,
"runs_diff": 5,
"competitor": {
"id": "sr:competitor:34374",
"name": "Yomiuri Giants",
"country": "Japan",
"country_code": "JPN",
"abbreviation": "YOM",
"gender": "male"
},
"current_outcome": "Qualification Playoffs",
"games_behind": 0,
"winning_percentage": 0.558,
"win_home": 25,
"loss_home": 20,
"win_away": 23,
"loss_away": 18,
"win_last_ten": 8,
"loss_last_ten": 2
},
{
"rank": 3,
"played": 88,
"win": 41,
"loss": 46,
"draw": 1,
"runs_for": 271,
"runs_against": 337,
"runs_diff": -66,
"competitor": {
"id": "sr:competitor:67108",
"name": "Tokyo Yakult Swallows",
"country": "Japan",
"country_code": "JPN",
"abbreviation": "YAK",
"gender": "male"
},
"current_outcome": "Qualification Playoffs",
"games_behind": 7.5,
"winning_percentage": 0.471,
"win_home": 17,
"loss_home": 23,
"win_away": 24,
"loss_away": 23,
"win_last_ten": 1,
"loss_last_ten": 9
}
]
}
]
}
]
}current_outcome appears only on rows sitting in a defined qualification or elimination zone; treat it as optional and never derive it from rank yourself. MLB rows gain it once a playoff place is decided: at the end of the 2026 regular season, twelve rows carried Playoffs.
4. Cup competitions: pools plus a bracket
A cup season's standings return one group per pool. The World Baseball Classic 2026 returns Pools A through D; Pool A in full:
{
"generated_at": "2026-07-11T08:05:04+00:00",
"standings": [
{
"tie_break_rule": "If teams are tied the following rules break the tie:\r\n1. Percentage\r\n2. Head-to-head",
"type": "total",
"round": 1,
"groups": [
{
"stage": {
"order": 1,
"type": "league",
"phase": "regular season",
"start_date": "2026-03-06",
"end_date": "2026-03-11",
"year": "2026"
},
"id": "sr:league:94277",
"name": "World Baseball Classic 2026, Pool A",
"live": false,
"group_name": "A",
"standings": [
{
"rank": 1,
"played": 4,
"win": 3,
"loss": 1,
"draw": 0,
"runs_for": 21,
"runs_against": 10,
"runs_diff": 11,
"competitor": {
"id": "sr:competitor:34384",
"name": "Canada",
"country": "Canada",
"country_code": "CAN",
"abbreviation": "CAN",
"gender": "male"
},
"current_outcome": "Playoffs",
"games_behind": 0,
"winning_percentage": 0.75,
"win_home": 1,
"loss_home": 1,
"win_away": 2,
"loss_away": 0,
"win_last_ten": 3,
"loss_last_ten": 1
},
{
"rank": 2,
"played": 4,
"win": 3,
"loss": 1,
"draw": 0,
"runs_for": 15,
"runs_against": 7,
"runs_diff": 8,
"competitor": {
"id": "sr:competitor:34391",
"name": "Puerto Rico",
"country": "Puerto Rico",
"country_code": "PRI",
"abbreviation": "PUR",
"gender": "male"
},
"current_outcome": "Playoffs",
"games_behind": 0,
"winning_percentage": 0.75,
"win_home": 2,
"loss_home": 1,
"win_away": 1,
"loss_away": 0,
"win_last_ten": 3,
"loss_last_ten": 1
},
{
"rank": 3,
"played": 4,
"win": 2,
"loss": 2,
"draw": 0,
"runs_for": 13,
"runs_against": 16,
"runs_diff": -3,
"competitor": {
"id": "sr:competitor:34418",
"name": "Cuba",
"country": "Cuba",
"country_code": "CUB",
"abbreviation": "CUB",
"gender": "male"
},
"games_behind": 1,
"winning_percentage": 0.5,
"win_home": 1,
"loss_home": 1,
"win_away": 1,
"loss_away": 1,
"win_last_ten": 2,
"loss_last_ten": 2
},
{
"rank": 4,
"played": 4,
"win": 1,
"loss": 3,
"draw": 0,
"runs_for": 10,
"runs_against": 23,
"runs_diff": -13,
"competitor": {
"id": "sr:competitor:302286",
"name": "Colombia",
"country": "Colombia",
"country_code": "COL",
"abbreviation": "COL",
"gender": "male"
},
"games_behind": 2,
"winning_percentage": 0.25,
"win_home": 0,
"loss_home": 1,
"win_away": 1,
"loss_away": 2,
"win_last_ten": 1,
"loss_last_ten": 3
},
{
"rank": 5,
"played": 4,
"win": 1,
"loss": 3,
"draw": 0,
"runs_for": 11,
"runs_against": 14,
"runs_diff": -3,
"competitor": {
"id": "sr:competitor:34390",
"name": "Panama",
"country": "Panama",
"country_code": "PAN",
"abbreviation": "PAN",
"gender": "male"
},
"games_behind": 2,
"winning_percentage": 0.25,
"win_home": 0,
"loss_home": 2,
"win_away": 1,
"loss_away": 1,
"win_last_ten": 1,
"loss_last_ten": 3
}
]
}
]
}
]
}The knockout phase lives in Season Links, which returns the bracket as cup_rounds whose linked_cup_rounds wire each round to its feeder and successor rounds. Trimmed to the first two rounds:
{
"generated_at": "2026-07-21T17:20:01+00:00",
"stages": [
{
"order": 1,
"type": "cup",
"phase": "playoffs",
"start_date": "2026-03-13",
"end_date": "2026-03-18",
"year": "2026",
"groups": [
{
"id": "sr:cup:181835",
"group_name": "World Baseball Classic 2026, Playoffs",
"cup_rounds": [
{
"id": "sr:cup_round:2551008",
"sport_events": [
{
"id": "sr:sport_event:68375564",
"start_time": "2026-03-14T19:00:00+00:00",
"start_time_confirmed": true,
"order": 1
}
],
"linked_cup_rounds": [
{
"id": "sr:cup_round:2551016",
"type": "parent",
"name": "semifinal",
"order": 2,
"state": "winner",
"winner_id": "sr:competitor:34394"
}
],
"name": "quarterfinal",
"order": 3,
"state": "winner",
"winner_id": "sr:competitor:34387"
},
{
"id": "sr:cup_round:2551010",
"sport_events": [
{
"id": "sr:sport_event:68375606",
"start_time": "2026-03-15T01:00:00+00:00",
"start_time_confirmed": true,
"order": 1
}
],
"linked_cup_rounds": [
{
"id": "sr:cup_round:2551016",
"type": "parent",
"name": "semifinal",
"order": 2,
"state": "winner",
"winner_id": "sr:competitor:34394"
}
],
"name": "quarterfinal",
"order": 4,
"state": "winner",
"winner_id": "sr:competitor:34394"
}
]
}
]
}
]
}Each cup round lists its sport_events, so bracket cells link straight to game detail. Whether a season carries brackets at all is declared by the brackets coverage flag.
Common Use Cases
Typical builds on this workflow include:
- A standings page with overall, league, and division tabs
- A division race tracker with games-behind deltas
- Wildcard and playoff qualification displays driven by
current_outcome - A tournament hub with pool tables and a knockout bracket
Best Practices
- For
post-coverage seasons, refresh standings once games start closing and again a few minutes after the last game of the day - For
live-coverage seasons, refresh during play at scoreboard cadence - Drive off-cycle refreshes from Sport Events Updated: a late statistics correction to a closed game can move a table; see Monitoring Data Changes
- Render from the group the season defines rather than recomputing tables from game results; tie-break ordering is applied for you
Updated about 6 hours ago
