WardenCoredocs
APIЭндпоинты

Клейм-коды

Выпуск, список и отзыв клейм-кодов на паки для ваших игроков.

Клейм-код — погашаемый токен, привязанный к паку. Выпустите его для конкретного игрока, выдайте код, а игрок погасит его в игре или через Discord и получит пак. Эти эндпоинты позволяют выпускать, смотреть список (историю кодов) и отзывать коды.

Погашения попадают в историю выдач паков с source: "claim".

POST /v1/claim-codes

Выпустить адресный клейм-код на пак.

Скоуп: claim_codes:write.

ПолеТипСмысл
pack_idstring (положительное целое)Пак для выдачи. Резолвится по id.
steam_idstring (17 цифр)Получатель — только он сможет погасить код.
max_usesinteger (≥ 1)Сколько раз можно погасить. По умолчанию 1.
expiry_daysinteger (0–3650)Через сколько дней истекает. 0 = никогда. По умолчанию 0.
POST /v1/claim-codes
Content-Type: application/json

{ "pack_id": "5", "steam_id": "76561198000000000", "max_uses": 1, "expiry_days": 7 }
{
  "code": "scrap_50units-VRBC7A",
  "pack": { "id": 5, "name": "starter", "display_name": "Starter Pack" },
  "target": { "steam_id": "76561198000000000", "discord_id": "123456789012345678" },
  "max_uses": 1,
  "expires_at": "2026-01-10 12:00:00",
  "dm_status": "sent"
}

Если получатель привязан к Discord, код также отправляется ему в ЛС; dm_status показывает статус этой отправки. expires_at равен null, если код не истекает. Объект pack — стандартная ссылка на пак: слаг каталога плюс отображаемый заголовок.

Выпуск НЕ идемпотентен — шлите Idempotency-Key

Каждый вызов выпускает новый код. Повтор при сбое выпустит второй. Шлите Idempotency-Key, чтобы повтор воспроизвёл первый код.

GET /v1/claim-codes

Список выпущенных кодов с их статусом погашения (история кодов).

Скоуп: claim_codes:read.

ПараметрТипСмысл
pack_idstring (положительное целое)Только коды этого пака.
sourcewargm | discord | panelКак код был создан.
statusactive | expired | exhausted | revokedСтатус погашения.
targetstring (цифры Steam64)Совпадение по Steam64 получателя (допускается частичное).
cursorstringНепрозрачный курсор.
limitinteger (1–100)Размер страницы. По умолчанию 50.
{
  "data": [
    {
      "code": "scrap_50units-VRBC7A",
      "pack": { "id": 5, "name": "starter", "display_name": "Starter Pack" },
      "target": { "steam_id": "76561198000000000", "discord_id": "123456789012345678" },
      "source": "panel",
      "status": "active",
      "max_uses": 1,
      "uses_remaining": 1,
      "created_at": "2026-01-03 12:00:00",
      "expires_at": "2026-01-10 12:00:00",
      "dm": { "channel_id": "111111111111111111", "message_id": "222222222222222222" }
    }
  ],
  "has_more": false,
  "next_cursor": null,
  "total": 1
}

target равен null для публичного (безадресного) кода. target.discord_id — текущая привязка Discord получателя (Discord едет рядом со Steam — null, когда не привязан).

DELETE /v1/claim-codes/{code}

Отозвать код — погасить его больше нельзя. 404 not_found, если кода нет.

Скоуп: claim_codes:write.

{ "code": "scrap_50units-VRBC7A", "revoked": true }

Ошибки

Стандартный конверт ошибки.

КодСтатусКогда
insufficient_scope403У ключа нет claim_codes:read (список) или claim_codes:write (выпуск / отзыв).
premium_required403План игрового сервера не включает фичу паков/магазина.
not_found404Неизвестный pack_id (выпуск) или неизвестный код (отзыв).
validation_error400Плохой pack_id/steam_id, max_uses/expiry_days вне диапазона, source/status вне списка, или отказ игрового сервера (его сообщение в error.details.mod_message).
idempotency_conflict409Присланный Idempotency-Key уже использовался с другим телом запроса. Переиспользуйте ключ только для повтора того же самого выпуска.
server_unavailable503Игровой сервер офлайн или недоступен.
gateway_timeout504Сервер не ответил вовремя.

Содержание