SleevedSleeved Docs

Submit match telemetry

Record a completed Grand Archive match. Requires the telemetry:write scope, a currently-gated partner capability.

This endpoint requires an API key with the telemetry:write scope. This is a currently-gated, case-by-case partner capability — email engineering@endlessgalaxy.dev to request it.

Always returns 202 { "status": "accepted" } on a well-formed request. Whether a slot's deck.sleevedLinkId actually bound to a Sleeved account and deck is never revealed in the response — this is deliberate oracle safety. Do not infer binding success or failure from the response.

Submissions are idempotent by matchId (a client-generated UUID v4) — resubmitting the same matchId is a safe no-op, not a duplicate record.

See Private Deck Links for what deck.sleevedLinkId values are and how to obtain them.

POST
/telemetry/matches
X-API-Key<token>

Your Sleeved API key. Format: slvd_live_<hex>. Contact Sleeved to obtain a key.

In: header

schemaVersionstring
Value in"1.0"
gamestring
Value in"grand-archive"
clientobject
playedAtstring

ISO 8601 timestamp of when the match was played.

Formatdate-time
matchIdstring

Client-generated UUID v4 specifically (the format: uuid hint alone permits other UUID versions; the pattern above is what the API actually enforces). Also the idempotency key — resubmitting the same matchId is a safe no-op, not a duplicate record.

Match^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
Formatuuid
turnsinteger
Range1 <= value
playersarray<TelemetryPlayerSlot>

1 or 2 player slots — both players in a match if both use Sleeved. playerSlot values must be unique within the array.

Items1 <= items <= 2

Response Body

curl -X POST "https://api.sleeved.gg/v1/telemetry/matches" \  -H "Content-Type: application/json" \  -d '{    "schemaVersion": "1.0",    "game": "grand-archive",    "client": {      "name": "clarent",      "version": "0.0.1"    },    "playedAt": "2026-07-14T00:57:40.000Z",    "matchId": "be57b792-740e-4edb-81cd-4a3dcb304ab7",    "turns": 6,    "players": [      {        "playerSlot": "p1",        "result": "win",        "wentFirst": true,        "endState": {          "myChampionHp": 12        },        "opponent": {          "archetype": "Water Aetherwing",          "champion": "..."        },        "deck": {          "sleevedLinkId": "pd_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",          "snapshot": [            {              "editionId": "abcd123456",              "zone": "main",              "qty": 1            }          ]        },        "stats": {          "ActivateCardCalls": 12,          "ActivateCard": {            "abcd123456": 2          }        }      }    ]  }'
{
  "status": "accepted"
}

{
  "error": "Invalid request body",
  "code": "VALIDATION_ERROR"
}

{
  "error": "API key required"
}

{
  "error": "Insufficient scope"
}
{
  "error": "Rate limit exceeded"
}
{
  "error": "Internal server error"
}