SETTO API

Get a tournament

Use GET /v1/external/tournaments/{idx} to read one tournament and embed its club, categories, rounds, sponsors, circuit and tiebreak rules with populate.

GET /v1/external/tournaments/{idx} returns one tournament by its UUID, with any of seven relations embedded on request. It is the call behind a tournament landing page: name, dates, venue, categories and sponsors in a single round trip. Without a populate parameter it returns the tournament plus club and divisions.

Request

GET /v1/external/tournaments/3c9b7f52-6d41-4a8e-b1f0-2e7d5c9a4b18?populate=club,club.courts,divisions,divisions.rounds HTTP/1.1
Host: api-production-ea80.up.railway.app
Authorization: Bearer setto_live_…

Parameters

ParameterInNotes
idxpathThe tournament's UUID v4, from listTournaments
populatequeryAny of club, club.courts, divisions, divisions.rounds, sponsors, circuit, circuitCategory, rankedTiebreakRules. Default club,divisions
curl -s -G \
  https://api-production-ea80.up.railway.app/v1/external/tournaments/3c9b7f52-6d41-4a8e-b1f0-2e7d5c9a4b18 \
  -H "Authorization: Bearer $SETTO_API_TOKEN" \
  -d populate=club,divisions,divisions.rounds,sponsors

Response

200 OK (trimmed)
{
  "idx": "3c9b7f52-6d41-4a8e-b1f0-2e7d5c9a4b18",
  "slug": "torneo-apertura-2026",
  "name": "Torneo Apertura 2026",
  "type": "TOURNAMENT",
  "sport": "PADEL",
  "status": "IN_PROGRESS",
  "startDate": "2026-09-18T00:00:00.000Z",
  "endDate": "2026-09-20T00:00:00.000Z",
  "timezone": "America/Monterrey",
  "courtNames": { "1": "Cancha Central", "2": "Cancha 2" },
  "scheduleType": "ASSIGNED",
  "isPublic": true,
  "isFormatComplete": true,
  "displayPoints": true,
  "standingColumns": [
    { "ordering": 1, "type": "GAMES_WON" },
    { "ordering": 2, "type": "POINTS_DIFFERENCE" }
  ],
  "createdAt": "2026-06-02T18:21:07.442Z",
  "publicUrl": "https://www.setto.io/t/torneo-apertura-2026",
  "organization": {
    "idx": "6f1d9c2e-4a7b-4f3d-9d2c-8b5e1a0f7c43",
    "name": "Club Padel Monterrey",
    "slug": "club-padel-monterrey"
  },
  "club": {
    "idx": "5e2b8c04-1a76-4f93-b8d5-7c0e3a9f41b2",
    "name": "Club Padel Monterrey",
    "address": "Av. Lázaro Cárdenas 2400, Monterrey",
    "website": "https://clubpadelmty.mx",
    "image": "https://cdn.setto.io/clubs/club-padel-monterrey.jpg",
    "location": {
      "formattedAddress": "Av. Lázaro Cárdenas 2400, Monterrey, N.L., México",
      "city": "Monterrey",
      "country": "México",
      "lat": 25.6514,
      "lng": -100.3561,
      "postalCode": "64920",
      "province": "Nuevo León"
    }
  },
  "divisions": [
    {
      "idx": "7b2f4d16-9c83-4e50-a7d1-3f6c8b204e59",
      "name": "Cuarta Fuerza Varonil",
      "number": 1,
      "color": "#2563eb",
      "isDoubles": true,
      "isVisible": true,
      "price": 900,
      "minParticipants": 8,
      "maxParticipants": 32,
      "createdAt": "2026-06-02T18:24:55.901Z",
      "tournament": { "idx": "3c9b7f52-6d41-4a8e-b1f0-2e7d5c9a4b18" },
      "rounds": [
        {
          "idx": "9d3c6a84-7e15-4b02-8f6d-1c4a9e7b53f2",
          "name": "Pool Play",
          "type": "ROUND_ROBIN_ROUND",
          "number": 1,
          "isSetup": true,
          "isVisible": true,
          "numberOfSets": 3,
          "division": {
            "idx": "7b2f4d16-9c83-4e50-a7d1-3f6c8b204e59",
            "name": "Cuarta Fuerza Varonil"
          }
        },
        {
          "idx": "2e7f5b10-8c94-4d63-a1b8-7f0e3d6c2a95",
          "name": "Playoffs",
          "type": "SINGLE_ELIMINATION_ROUND",
          "number": 2,
          "isSetup": true,
          "isVisible": true,
          "drawSize": 8,
          "division": {
            "idx": "7b2f4d16-9c83-4e50-a7d1-3f6c8b204e59",
            "name": "Cuarta Fuerza Varonil"
          }
        }
      ]
    }
  ],
  "sponsors": [
    {
      "idx": "af03d7e5-6b18-4c92-8d40-1e7b5a2c9f36",
      "name": "Head",
      "logoUrl": "https://cdn.setto.io/sponsors/head.png",
      "websiteUrl": "https://head.com",
      "position": 1
    }
  ]
}

Tips and pitfalls

  • populate replaces the default. ?populate=divisions drops club from the response. Re-list everything you need.
  • divisions.rounds is the cheap way to get round ids. One call gives you every round idx in the tournament, which is exactly the input getRound wants. You do not need listDivisions for that.
  • Check for the key, not for an empty array. An un-populated relation is absent: tournament.sponsors is undefined, not []. 'sponsors' in tournament distinguishes "not asked for" from "none exist".
  • Hidden categories come back. Filter on isVisible before rendering a public page.
  • 404 is also "wrong organization". The API will not tell you which — see Errors.
  • rankedTiebreakRules explains the standings order. If you are rebuilding a standings table and want it to match setto.io, populate the rules and apply them in rank order rather than trusting the stored rank alone.
  • courtNames is an object keyed by court number, not an array.

MCP tool: get_tournament

On this page