---
title: "Submit league match scores in a batch"
method: POST
path: "/leagues/{identifier}/matches/{matchId}/scores"
tags: ["League: Scores"]
---

# Submit league match scores in a batch

`POST /leagues/{identifier}/matches/{matchId}/scores`

## Request

- Base URL: `https://teambattles.gg/api/v1`
- URL: `https://teambattles.gg/api/v1/leagues/{identifier}/matches/{matchId}/scores`
- Auth: HTTP bearer

Submits scores for one or more maps in a league match; league admin scores are auto-confirmed. Requires a personal or developer API key whose owner is currently a league ADMIN of the league in the path, with the league scores capability enabled on the key. League API access is gated at api_pro on the league owner's plan.

## Path parameters

- `identifier` string, required: League slug.
- `matchId` string, required: Match ID.

## Request body

- GameBatchScoresBody: Request body for submitting one or more map scores in a single call.
  - `maps` GameMapScoreInput[], required: Map scores to submit. Must contain at least one entry.
    - `mapIndex` integer, required: Zero-based index of the map within the series.
    - `mapId` string, required: Identifier of the map that was played.
    - `creatorTeamScore` integer, required: Score for the creator team (integer, 0-1000).
    - `opponentTeamScore` integer, required: Score for the opponent (accepted) team (integer, 0-1000).
    - `screenshotUrls` string[]: Optional external screenshot URLs supporting the reported score. Each must be a public https URL. Prefer screenshotStorageIds (validated blobs) where possible.
    - `screenshotStorageIds` string[]: Optional storage IDs for screenshots uploaded via POST /uploads/image-url. Preferred over screenshotUrls: each is validated (size, content-type, ownership) and resolved to a URL server-side.
    - `playerStats` object: Optional per-player stats keyed by user ID.

## Response `200`

Per-map submission results. success is true only when every map was confirmed.

- GameBatchScoresResponse: Result of a batch map-score submission.
  - `success` boolean, required: True only when every submitted map score was confirmed.
  - `submitted` GameBatchScoreResult[], required: Per-map results, in submission order.
    - `mapIndex` integer, required: Index of the map this result refers to.
    - `status` string, required: Per-map outcome: "confirmed" on success, "failed" otherwise.
    - `error` string: Failure reason, present only when status is failed.
  - `count` integer, required: Number of map scores that were confirmed.

## 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.

## Changes

- **2026-06-10** `82f2480cdb83`: 2 info
  - api tag `League: Scores` added
  - api tag `Leagues` removed
- **2026-06-08** `4bed7522e6f8`: 2 breaking, 2 warning
  - the `maps/items/creatorTeamScore` request property type changed from `number` to `integer`
  - the `maps/items/opponentTeamScore` request property type changed from `number` to `integer`
  - the `maps/items/creatorTeamScore` request property's max was set to `1000.00`
  - the `maps/items/opponentTeamScore` request property's max was set to `1000.00`
- **2026-06-08** `33b01a4694a7`: 1 info
  - added the new optional request property `maps/items/screenshotStorageIds`
- **2026-06-07** `ca335a5932cc`: 1 info
  - endpoint added
- **2026-06-04** `f22bd61fd595`: 1 breaking
  - api path removed without deprecation

[Operation history](https://skmtc.dev/teambattles/apis/teambattles-api/changes/leagues/:identifier/matches/:matchId/scores/post.md)

---

[API](https://skmtc.dev/teambattles/apis/teambattles-api.md) - [All operations](https://skmtc.dev/teambattles/apis/teambattles-api/llms.txt) - [OpenAPI document](https://skmtc.dev/teambattles/apis/teambattles-api/revisions/75b07daef7dc?raw)
