Get a round
Use GET /v1/external/rounds/{idx} to read one round's groups, standings, games, scores and knockout bracket — the richest endpoint in the SETTO External API.
GET /v1/external/rounds/{idx} is where the results live. One round is one phase
of a category — group play, playoffs, qualifiers — and this endpoint returns its
pools and standings, its flat list of games, and its bracket structure, with 22
populate paths to choose from. A live scoreboard, a standings table and a draw
sheet are all this one call with a different populate.
Round ids come from getTournament with
populate=divisions.rounds, or from
listDivisions.
Request
GET /v1/external/rounds/9d3c6a84-7e15-4b02-8f6d-1c4a9e7b53f2 HTTP/1.1
Host: api.setto.io
Authorization: Bearer setto_live_…Parameters
| Parameter | In | Notes |
|---|---|---|
idx | path | The round's UUID v4 |
populate | query | Up to 22 paths — see Populate |
Sent with no populate, the endpoint applies a generous default: division,
pools, pools.teams, games, games.homeTeam, games.awayTeam,
games.winner, draws.rounds, draws.rounds.games,
draws.rounds.games.homeTeam, draws.rounds.games.awayTeam,
draws.rounds.games.winner, draws.rounds.games.score and
draws.rounds.games.score.sets.
# Standings table for a group-stage round
curl -s -G \
https://api.setto.io/v1/external/rounds/9d3c6a84-7e15-4b02-8f6d-1c4a9e7b53f2 \
-H "Authorization: Bearer $SETTO_API_TOKEN" \
-d populate=pools.standings.team,pools.standings.teamStatsResponse — group stage
{
"idx": "9d3c6a84-7e15-4b02-8f6d-1c4a9e7b53f2",
"name": "Pool Play",
"type": "ROUND_ROBIN_ROUND",
"number": 1,
"isSetup": true,
"isVisible": true,
"numberOfSets": 3,
"proSets": false,
"playAllSets": false,
"gamesPerTeam": 3,
"hasNextRoundTransitioned": true,
"createdAt": "2026-06-02T18:25:10.338Z",
"division": {
"idx": "7b2f4d16-9c83-4e50-a7d1-3f6c8b204e59",
"name": "Cuarta Fuerza Varonil"
},
"pools": [
{
"idx": "5a8d2c71-3f96-4e18-b0d7-9c2e6a4f8b13",
"name": "Grupo A",
"number": 1,
"standings": [
{
"idx": "3f8b0d25-7a14-4e69-b2c8-0d5e9f1a6c73",
"rank": 1,
"awardedPoints": 6,
"team": {
"idx": "e0c4b839-2d17-4a56-9fb3-6e8d1c05a274",
"name": "Álvarez / Peña"
},
"teamStats": {
"idx": "7c1a4e08-9d35-42b7-8f60-3a2e5b9d1f47",
"points": 6,
"wins": 2,
"losses": 0,
"ties": 0,
"cancelled": 0,
"forfeits": 0,
"pointsFor": 4,
"pointsAgainst": 1,
"setsPointsFor": 48,
"setsPointsAgainst": 31,
"totalGamesPlayed": 2,
"pointsDifference": 3,
"setsPointsDifference": 17
}
}
]
}
],
"games": [
{
"idx": "4f6e9b27-5a03-4c81-bd52-7e1a8c3f9d06",
"number": 1,
"displayNumber": 1,
"status": "FINISHED",
"time": "2026-09-18T17:00:00.000Z",
"lengthInMinutes": 90,
"courtNumber": 3,
"matchDay": null,
"isRetirement": false,
"homeTeamDetails": null,
"awayTeamDetails": null,
"createdAt": "2026-06-02T18:26:44.019Z",
"homeTeam": {
"idx": "e0c4b839-2d17-4a56-9fb3-6e8d1c05a274",
"name": "Álvarez / Peña"
},
"awayTeam": {
"idx": "b71f3a05-6c28-49ed-8a94-2f5b0d7e1c63",
"name": "Ramos / Ortega"
},
"winner": {
"idx": "e0c4b839-2d17-4a56-9fb3-6e8d1c05a274",
"name": "Álvarez / Peña"
}
}
]
}The default does not include games.score
The flat games array above has no score key, because the default populate
covers draws.rounds.games.score but not games.score. For scores on the
flat list, ask for them — and remember populate replaces the default, so
re-list what you still need:
populate=division,pools,pools.teams,games,games.homeTeam,games.awayTeam,games.winner,games.score,games.score.sets.
Response — knockout bracket
{
"idx": "2e7f5b10-8c94-4d63-a1b8-7f0e3d6c2a95",
"name": "Playoffs",
"type": "SINGLE_ELIMINATION_ROUND",
"number": 2,
"isSetup": true,
"isVisible": true,
"drawSize": 8,
"numQualifiers": 8,
"placements": [1, 3],
"division": {
"idx": "7b2f4d16-9c83-4e50-a7d1-3f6c8b204e59",
"name": "Cuarta Fuerza Varonil"
},
"draws": [
{
"idx": "8e5c2a90-4b17-4d63-9f28-1c7a0e3b5d64",
"placement": 1,
"rounds": [
{
"idx": "d16b8f43-0c95-4e72-a835-6b2d9f1c4e07",
"label": "Semifinals",
"order": 2,
"games": [
{
"idx": "0a7d3c58-6e21-4b94-8f05-2d9c1e7a4b36",
"number": 5,
"displayNumber": 5,
"status": "FINISHED",
"time": "2026-09-20T16:00:00.000Z",
"courtNumber": 1,
"homeTeam": {
"idx": "e0c4b839-2d17-4a56-9fb3-6e8d1c05a274",
"name": "Álvarez / Peña"
},
"awayTeam": {
"idx": "b71f3a05-6c28-49ed-8a94-2f5b0d7e1c63",
"name": "Ramos / Ortega"
},
"winner": {
"idx": "e0c4b839-2d17-4a56-9fb3-6e8d1c05a274",
"name": "Álvarez / Peña"
},
"homeTeamDetails": null,
"awayTeamDetails": null,
"score": {
"idx": "1b9d7c36-4e58-40af-92c1-6d3f8a05b7e2",
"home": 2,
"away": 1,
"playerPointsBalanced": null,
"sets": [
{
"idx": "aa1c4e72-0b96-4d38-85f7-3e2a9c1d6b04",
"number": 1,
"home": 6,
"away": 4,
"isTieBreak": false
},
{
"idx": "bb2d5f83-1c07-4e49-96a8-4f3b0d2e7c15",
"number": 2,
"home": 3,
"away": 6,
"isTieBreak": false
},
{
"idx": "cc3e6094-2d18-4f5a-a7b9-5041ce3f8d26",
"number": 3,
"home": 7,
"away": 5,
"isTieBreak": false
}
]
}
}
]
},
{
"idx": "e27c9a56-1d08-4f83-b946-7c3e0a2f5b18",
"label": "Final",
"order": 3,
"games": [
{
"idx": "5c8f1b04-7a26-4d93-8e51-0b4d9c2a7f63",
"number": 7,
"displayNumber": 7,
"status": "UPCOMING",
"time": "2026-09-20T19:00:00.000Z",
"homeTeam": null,
"awayTeam": null,
"winner": null,
"homeTeamDetails": {
"label": "Winner of Game 5",
"teamNumber": null,
"poolNumber": null,
"poolRank": null,
"sourceGameNumber": 5,
"sourceResult": "WINNER"
},
"awayTeamDetails": {
"label": "Winner of Game 6",
"teamNumber": null,
"poolNumber": null,
"poolRank": null,
"sourceGameNumber": 6,
"sourceResult": "WINNER"
}
}
]
}
]
}
]
}Tips and pitfalls
- Games can appear twice. A bracket game is in
draws[].rounds[].games[]and may also be in the flatgames[]. De-duplicate ongame.idxbefore counting anything. - Sort draw rounds by
order, not by array position, and lay them out left to right.label(Quarterfinals,Semifinals,Final) is an English string produced by SETTO — translate it yourself if your site is not in English. placementseparates brackets.placement: 1is the main draw; higher values are consolation and third-place brackets. Filter rather than assumingdraws[0].- Empty slots are normal. Before a bracket fills,
homeTeam/awayTeamarenullandhomeTeamDetailstells you where the team will come from. RendersourceResult+sourceGameNumber(Winner of game 5) rather than the stored Englishlabel. score.home/score.awayare sets won in the racket sports, not points. Per-set points are insets[], ordered bynumber.- In
FUTBOLthose same fields are goals.score.home/score.awayare the full-time goals, andsets[]holds exactly one element repeating them withisTieBreak: false. The deciders are separate fields, all threenullfor the racket sports — null-check before you read them.score.extraTimecounts only the goals scored during extra time (add them toscore.home/score.awayfor the after-extra-time total) and isnullwhen no extra time was played;score.penaltiescounts converted shootout kicks — never goals, never in the standings — and isnullwhen no shootout was held;score.decisionMethod(REGULATION,EXTRA_TIME,SHOOTOUT,WALKOVER) says what settled the game, and isnullonly until the game reaches an official result (FINISHEDorFORFEIT). So a finished fútbol group game decided in regulation readsextraTime: null,penalties: nullanddecisionMethod: "REGULATION"— the deciders are empty, the method is not. A group or league game that finishes level is simply a draw, withwinner: null. statusis not just UPCOMING/FINISHED. HandleBYE(an unopposed advance),FORFEITandCANCELLED— aBYEhas one team and a winner but no meaningful score.rankis the stored rank. The public site applies head-to-head tiebreaks on top, so a table built fromrankalone can differ from setto.io's. See Data model.- Team-league rounds may have
division: null. The round belongs to the tournament, not to a category; do not assume you can group every round under a division. - Hidden rounds come back with
isVisible: false. Check it before publishing. - This is the payload worth caching. It changes only when someone enters a
score. Combine a 30–60 s server-side cache with
If-None-Match— see Rate limits.
Related
- Populate — all 22 paths and the default list.
- Data model — pools, draws, games, scores.
- Reference:
getRound.
MCP tool: get_round