---
title: "Configure tournament league points"
method: POST
path: "/tournaments/{identifier}/league-points"
tags: ["Tournament: Lifecycle"]
---

# Configure tournament league points

`POST /tournaments/{identifier}/league-points`

Sets whether a league-hosted tournament awards league points on finalization, and the placement curve it awards them by. LEAGUE HOSTS ONLY - a tournament hosted by a user or an organization answers 400. Editable until the tournament finalizes; a COMPLETED or CANCELLED tournament answers 400. These two settings are NOT material fields, so this endpoint applies them directly and never routes them through re-approval, even on an approved tournament - that is exactly why they are not editable via the update endpoint. 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

- TournamentLeaguePointsRequestBody — League placement-points configuration.
  - `leaguePointsEnabled` boolean, required — Whether finishing this tournament awards league points to the league season.
  - `leaguePointsByPlacement` TournamentPlacementPointsEntry[] — The placement curve. OMIT the field entirely to fall back to the platform default curve - an empty array is NOT the way to award nothing and is rejected as EMPTY (use `leaguePointsEnabled: false` for that). The table is validated even when `leaguePointsEnabled` is false.
    - `placement` integer, required — Final placement, 1 = champion.
    - `points` number, required — League points awarded, 0-1000.

## Response `200`

The configuration was saved.

- TournamentLeaguePointsResponse — The league placement-points configuration now in effect.
  - `success` true, required
  - `leaguePointsEnabled` boolean, required
  - `placementCount` integer, nullable, required — Number of rows in the stored curve, or null when no explicit curve is stored and the platform default applies.
  - `timestamp` string, required

## Other responses

- `400` — Bad request - includes a machine-readable placement-table reject reason.
- `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/versions/2ffe8fb53b7d/schema)
