---
title: "Submit map scores across multiple matches in one call"
method: POST
path: "/game/matches/batch-scores"
tags: ["Game: Scores"]
---

# Submit map scores across multiple matches in one call

`POST /game/matches/batch-scores`

Submits map scores for up to 50 (match, map) items in a single request. Each item is independently scope-checked against the key's bound game; an off-scope or otherwise failing item is rejected in its per-item envelope (status "failed", error = bare error_* code) WITHOUT failing the whole request. The response is ALWAYS HTTP 200 - inspect per-item status. Requires the game.scores:write permission. Score submission is naturally idempotent: an unconfirmed map is overwritten on re-submit and an already-confirmed map returns a per-item error_score_already_submitted_by_game, so a retried batch is safe without an Idempotency-Key.

## Request body

- GameBatchMatchScoresBody — Request body for submitting map scores across multiple matches in a single call (capped at 50 items).
  - `items` GameMultiMatchScoreItem[], required — Map scores to submit across one or more matches. 1-50 entries.
    - `matchId` string, required — ID of the match this map score belongs to.
    - `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-item submission results. success is true only when every item was confirmed.

- GameBatchMatchScoresResponse — Result of a multi-match batch map-score submission. Always returned with HTTP 200; inspect per-item status.
  - `success` boolean, required — True only when every submitted item was confirmed.
  - `submitted` GameBatchMatchScoreResult[], required — Per-item results, in submission order.
    - `matchId` string, required — Match ID this result refers to.
    - `mapIndex` integer, required — Index of the map this result refers to.
    - `status` string, required — Per-item outcome: "confirmed" on success, "failed" otherwise.
    - `error` string — Bare machine-readable error code (e.g. error_game_scope_mismatch), present only when status is failed. Never the raw message.
  - `count` integer, required — Number of items 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.

## Changes

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

[Change history](https://skmtc.dev/teambattles/apis/teambattles-api/changes/game/matches/batch-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)
