/promo-code/activate
Метод активирует промокод и начисляет игроку его награды. Один код активируется одним игроком не более одного раза.
Адрес метода
/promo-code/activate
Требует сессию пользователя
Параметры
| Параметр | Обязательный | Тип | Описание |
|---|---|---|---|
| code | ДА | string | Промокод, как его ввел игрок. Регистр и окружающие пробелы значения не имеют |
Результат
{
"response": {
"success": true,
"code": "TESTCODE2"
},
"update": {
"member": {
"wallet": [],
"options": {},
"skills": []
}
},
"events": [
{
"type": "reward",
"payload": {
"reasonType": "promo_code",
"reasonId": "TESTCODE2",
"rewards": [
{ "type": "soft", "amount": 50 }
]
}
}
]
}
code
Код в каноническом виде, как он записан в конфиге, — не в том, как его ввел игрок.
Награды
Выданные награды приходят в секции events reward-событием с reasonType promo_code, как и у остальных источников наград в проекте; в теле ответа они не дублируются. Обновленные значения кошелька, опыта и фрагментов приходят в update.member.
Ошибки
Отказ — это успешный HTTP-ответ с success: false и идентификатором причины в поле error:
{
"response": {
"success": false,
"error": "promo_code_expired"
}
}
| Ситуация | error |
|---|---|
| Кода нет в конфиге версии, на которую закреплен игрок | promo_code_not_found |
| Игрок уже активировал этот код | promo_code_already_used |
| Срок действия кода истек | promo_code_expired |
Срок действия задается в конфиге колонкой validUntil и работает включительно: код с validUntil = 2026-08-29 действует весь день 29 августа и перестает работать на границе следующих игровых суток. Пустое значение означает бессрочный код. Граница считается по игровому времени пользователя, то есть учитывает сдвиг часов из /dev/time/shift.