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-production-ea80.up.railway.app
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-production-ea80.up.railway.app/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, not points. Per-set points are insets[], ordered bynumber.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