Клейм-коды
Выпуск, список и отзыв клейм-кодов на паки для ваших игроков.
Клейм-код — погашаемый токен, привязанный к паку. Выпустите его для конкретного игрока, выдайте код, а игрок погасит его в игре или через Discord и получит пак. Эти эндпоинты позволяют выпускать, смотреть список (историю кодов) и отзывать коды.
Погашения попадают в историю выдач паков с
source: "claim".
POST /v1/claim-codes
Выпустить адресный клейм-код на пак.
Скоуп: claim_codes:write.
| Поле | Тип | Смысл |
|---|---|---|
pack_id | string (положительное целое) | Пак для выдачи. Резолвится по id. |
steam_id | string (17 цифр) | Получатель — только он сможет погасить код. |
max_uses | integer (≥ 1) | Сколько раз можно погасить. По умолчанию 1. |
expiry_days | integer (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_id | string (положительное целое) | Только коды этого пака. |
source | wargm | discord | panel | Как код был создан. |
status | active | expired | exhausted | revoked | Статус погашения. |
target | string (цифры Steam64) | Совпадение по Steam64 получателя (допускается частичное). |
cursor | string | Непрозрачный курсор. |
limit | integer (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_scope | 403 | У ключа нет claim_codes:read (список) или claim_codes:write (выпуск / отзыв). |
premium_required | 403 | План игрового сервера не включает фичу паков/магазина. |
not_found | 404 | Неизвестный pack_id (выпуск) или неизвестный код (отзыв). |
validation_error | 400 | Плохой pack_id/steam_id, max_uses/expiry_days вне диапазона, source/status вне списка, или отказ игрового сервера (его сообщение в error.details.mod_message). |
idempotency_conflict | 409 | Присланный Idempotency-Key уже использовался с другим телом запроса. Переиспользуйте ключ только для повтора того же самого выпуска. |
server_unavailable | 503 | Игровой сервер офлайн или недоступен. |
gateway_timeout | 504 | Сервер не ответил вовремя. |