SETTO API

Obtener una ronda

Usa GET /v1/external/rounds/{idx} para leer los grupos, clasificación, partidos, marcadores y cuadro de eliminación de una ronda — el endpoint más rico de la API externa de SETTO.

GET /v1/external/rounds/{idx} es donde viven los resultados. Una ronda es una fase de una categoría — juego de grupos, playoffs, calificación — y este endpoint devuelve sus grupos y clasificación, su lista plana de partidos y la estructura de su cuadro, con 22 rutas de populate para elegir. Un marcador en vivo, una tabla de clasificación y un cuadro son todos esta misma llamada con un populate distinto.

Los ids de ronda salen de getTournament con populate=divisions.rounds, o de listDivisions.

Petición

GET /v1/external/rounds/9d3c6a84-7e15-4b02-8f6d-1c4a9e7b53f2 HTTP/1.1
Host: api.setto.io
Authorization: Bearer setto_live_…

Parámetros

ParámetroEnNotas
idxrutaEl UUID v4 de la ronda
populateconsultaHasta 22 rutas — consulta Populate

Enviada sin populate, el endpoint aplica un valor por defecto generoso: 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 y draws.rounds.games.score.sets.

# Tabla de clasificación de una ronda de fase de grupos
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.teamStats

Respuesta — fase de grupos

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

El valor por defecto no incluye games.score

El arreglo plano games de arriba no tiene clave score, porque el populate por defecto cubre draws.rounds.games.score pero no games.score. Para tener marcadores en la lista plana, pídelos — y recuerda que populate reemplaza el valor por defecto, así que vuelve a listar lo que aún necesites: populate=division,pools,pools.teams,games,games.homeTeam,games.awayTeam,games.winner,games.score,games.score.sets.

Respuesta — cuadro de eliminación

200 OK (SINGLE_ELIMINATION_ROUND, recortado)
{
  "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"
              }
            }
          ]
        }
      ]
    }
  ]
}

Consejos y trampas

  • Los partidos pueden aparecer dos veces. Un partido de cuadro está en draws[].rounds[].games[] y puede estar también en el games[] plano. Elimina duplicados por game.idx antes de contar cualquier cosa.
  • Ordena las rondas del cuadro por order, no por su posición en el arreglo, y acomódalas de izquierda a derecha. label (Quarterfinals, Semifinals, Final) es una cadena en inglés que produce SETTO — tradúcela tú si tu sitio no está en inglés.
  • placement separa los cuadros. placement: 1 es el cuadro principal; los valores mayores son cuadros de consolación y de tercer lugar. Filtra en lugar de dar por hecho draws[0].
  • Los huecos vacíos son normales. Antes de que se llene un cuadro, homeTeam/awayTeam son null y homeTeamDetails te dice de dónde va a salir el equipo. Renderiza sourceResult + sourceGameNumber (Ganador del juego 5) en lugar del label almacenado en inglés.
  • score.home / score.away son sets ganados, no puntos. Los puntos por set están en sets[], ordenados por number.
  • status no es solo UPCOMING/FINISHED. Maneja BYE (un pase sin rival), FORFEIT y CANCELLED — un BYE tiene un equipo y un ganador pero ningún marcador con sentido.
  • rank es el rango almacenado. El sitio público aplica encima los desempates head-to-head, así que una tabla armada solo con rank puede diferir de la de setto.io. Consulta Modelo de datos.
  • Las rondas de liga por equipos pueden tener division: null. La ronda pertenece al torneo, no a una categoría; no supongas que puedes agrupar cada ronda bajo una categoría.
  • Las rondas ocultas regresan con isVisible: false. Revísalo antes de publicar.
  • Este es el payload que vale la pena cachear. Cambia solo cuando alguien captura un resultado. Combina una caché de 30–60 s del lado del servidor con If-None-Match — consulta Límites de uso.

Relacionado

Herramienta MCP: get_round

En esta página