SETTO API

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

ParameterInNotes
idxpathThe round's UUID v4
populatequeryUp 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.teamStats

Response — group stage

200 OK (ROUND_ROBIN_ROUND, trimmed)
{
  "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

200 OK (SINGLE_ELIMINATION_ROUND, trimmed)
{
  "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 flat games[]. De-duplicate on game.idx before 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.
  • placement separates brackets. placement: 1 is the main draw; higher values are consolation and third-place brackets. Filter rather than assuming draws[0].
  • Empty slots are normal. Before a bracket fills, homeTeam/awayTeam are null and homeTeamDetails tells you where the team will come from. Render sourceResult + sourceGameNumber (Winner of game 5) rather than the stored English label.
  • score.home / score.away are sets won, not points. Per-set points are in sets[], ordered by number.
  • status is not just UPCOMING/FINISHED. Handle BYE (an unopposed advance), FORFEIT and CANCELLED — a BYE has one team and a winner but no meaningful score.
  • rank is the stored rank. The public site applies head-to-head tiebreaks on top, so a table built from rank alone 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.

MCP tool: get_round

On this page