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
| Parameter | In | Notes |
|---|---|---|
idx | path | The tournament's UUID v4, from listTournaments |
populate | query | Any 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,sponsorsResponse
{
"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
populatereplaces the default.?populate=divisionsdropsclubfrom the response. Re-list everything you need.divisions.roundsis the cheap way to get round ids. One call gives you every roundidxin the tournament, which is exactly the inputgetRoundwants. You do not needlistDivisionsfor that.- Check for the key, not for an empty array. An un-populated relation is
absent:
tournament.sponsorsisundefined, not[].'sponsors' in tournamentdistinguishes "not asked for" from "none exist". - Hidden categories come back. Filter on
isVisiblebefore rendering a public page. 404is also "wrong organization". The API will not tell you which — see Errors.rankedTiebreakRulesexplains the standings order. If you are rebuilding a standings table and want it to match setto.io, populate the rules and apply them inrankorder rather than trusting the storedrankalone.courtNamesis an object keyed by court number, not an array.
Related
- Data model — what every field means.
- Populate — the full allow-list.
- Reference:
getTournament.
MCP tool: get_tournament