---
title: "Start a tournament"
method: POST
path: "/tournaments/{identifier}/start"
tags: ["Tournament: Lifecycle"]
---

# Start a tournament

`POST /tournaments/{identifier}/start`

Seeds the participants, generates the bracket structure and moves the tournament to IN_PROGRESS. ASYNCHRONOUS: this answers 202 and RETURNS BEFORE ANY MATCH EXISTS. The actual matches are generated by a background scheduler chain that runs after the response, and that chain can partially fail - it gives a node ONE attempt and then moves on, so a 202 is not a promise that every match will appear. Poll `GET /tournaments/{identifier}/bracket` to observe real matches, and use `POST /tournaments/{identifier}/regenerate-matches` to re-attempt any that are missing. Preconditions: the tournament must be APPROVED and in REGISTRATION_OPEN or REGISTRATION_CLOSED, otherwise 403 error_approval_required or 400. WARNING - when check-in is required, starting REMOVES every approved participant who has not checked in, and the run is then rejected with 400 if fewer than `minParticipants` remain (the removals are rolled back with it). Requires an API key holding the tournaments lifecycle capability whose owner is a tournament ADMIN - a tournamentStaff MODERATOR is NOT sufficient and receives 403.

## Path parameters

- `identifier` string, required — Tournament slug.

## Request body

- TournamentStartRequestBody — Tournament start payload.
  - `seedMethod` 'manual' | 'random' | 'registration', required — How to order participants into seeds. `manual` requires `manualOrder`. `random` is deterministic for a given tournament, not re-rollable. `registration` seeds by registration order.
  - `manualOrder` string[] — Participant ids in seed order, seed 1 first. REQUIRED when `seedMethod` is `manual`. Every id must belong to this tournament (a foreign id answers 404) and duplicates are rejected. The list must still match the participant set AFTER the check-in drop below, so build it from the participants that are actually checked in.

## Response `202`

The tournament started and the bracket was created. Match generation is still in flight - poll the bracket.

- TournamentStartResponse — Acknowledgement that a tournament was started. Matches follow asynchronously.
  - `accepted` true, required — The tournament was started and the bracket structure persisted. It does NOT mean matches exist yet.
  - `status` 'IN_PROGRESS', required — The lifecycle status this call set.
  - `nodeCount` integer, required — Size of the generated BRACKET STRUCTURE (nodes), not a count of playable matches and not a count of matches that will be generated. Do not use it as a completion target.
  - `matchGeneration` 'pending', required — Always `pending`. Match generation runs asynchronously after this response and can partially fail, so there is no success value to report here.
  - `timestamp` string, required

## Other responses

- `400` — Bad request (invalid body, cursor, limit, or date).
- `401` — Missing or invalid API key.
- `403` — API key lacks the required permission.
- `404` — Resource not found.
- `429` — Rate limited.
- `500` — Internal server error.

---

[API](https://skmtc.net/teambattles/apis/teambattles-api.md) · [All operations](https://skmtc.net/teambattles/apis/teambattles-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/teambattles/teambattles-api/revisions/2ffe8fb53b7d/schema)
