Коды ошибок
Новый клиентский API обычно возвращает бизнес-ошибку с HTTP 200:
{
"code": 0,
"body": null,
"error_code": 471,
"error_message": "Coupon not found",
"date": 1784970000000,
"time_ms": 5,
"path": "/api/partner/coupons/get"
}
Проверяйте:
HTTP-статус → транспортный результат
code → результат бизнес-операции
error_code → конкретная причина ошибки
Не используйте error_message как программный идентификатор.
Краткая таблица нового API
error_code | Этап | Значение | Повтор без изменения запроса |
|---|---|---|---|
10 | Валидация | Не передано обязательное тело или значение. | Нет |
11 | Создание | Неверный формат указателя ставки. | Нет |
12 | Создание | Сумма отсутствует или не является положительной. | Нет |
471 | Чтение | Купон не найден или недоступен текущему аккаунту. | Обычно нет |
501 | Создание | Коэффициент изменился и не разрешен выбранным режимом. | Нет |
502 | Создание | Исход отсутствует в текущей линии. | Нет |
503 | Создание | Исход заблокирован. | Нет |
504 | Создание | Проверка исхода завершилась ошибкой. | Не сразу |
506 | Создание | В экспрессе объединены ставки одного матча. | Нет |
507 | Создание | На клиентском балансе недостаточно средств для всех создаваемых купонов. | После пополнения |
1002 | Валидация | Неверный или неполный набор параметров. | Нет |
1003 | Авторизация | Неверные учетные данные в новом login. | Нет |
1004 | Авторизация | Клиентский аккаунт отключен. | Нет |
1006 | Авторизация | Истекла дата доступа клиента. | Нет |
1007 | Авторизация | Баланс клиентского аккаунта равен нулю или отрицательный. | Нет |
10000 | Сервис | Внутренняя ошибка сервиса. | Зависит от операции |
«Нет» означает, что сначала нужно изменить запрос, обновить данные или устранить причину ошибки.
Ошибки авторизации
HTTP 401
Для защищенных маршрутов нового API означает:
- JWT отсутствует;
- JWT имеет неверный формат или подпись;
- токен истек;
- токен был отозван.
Действие:
- выполнить
POST /api/partner/login; - получить новый
body.token; - повторить безопасный запрос чтения.
После 401 на создании купона сначала убедитесь, что исходный запрос не был принят.
HTTP 403
Означает, что:
- токен не имеет клиентской роли;
- используется административный JWT;
- доступ аккаунта запрещен.
Повторный вход с теми же неправильными учетными данными или типом токена проблему не исправит. Проверьте аккаунт и при необходимости обратитесь к менеджеру.
Бизнес-ошибки POST /api/partner/login
Все перечисленные ответы приходят с HTTP 200 и code = 0:
error_code | error_message | Причина | Действие |
|---|---|---|---|
1002 | Not all params | Не передан логин или пароль. | Исправить тело запроса. |
1003 | Wrong login or password | Неизвестный логин или неверный пароль. | Проверить учетные данные. |
1004 | Client account is disabled | Клиентский аккаунт отключен. | Обратиться к менеджеру для включения аккаунта. |
1006 | Client access has expired | Истекла дата доступа клиента. | Обратиться к менеджеру для продления доступа. |
1007 | Insufficient balance | Баланс клиентского аккаунта равен нулю или отрицательный. | Пополнить клиентский баланс через согласованный процесс. |
Неизвестный логин и неверный пароль намеренно не различаются и возвращают одинаковую ошибку 1003.
В старом API код 1003 используется в другом контексте — для неверного JWT защищенного маршрута. Старый login любой отказ преобразует в код 99. Всегда учитывайте маршрут.
Ошибки запроса
10 — отсутствуют обязательные данные
Возможные примеры:
- не передано JSON-тело создания купона;
- не передан код в
/api/partner/coupons/get.
Для нового POST /api/partner/login отсутствие логина или пароля относится к отдельной бизнес-ошибке 1002.
Проверьте обязательные поля конкретного endpoint.
11 — неверный указатель
Хотя бы один элемент list_bets не соответствует формату:
line_type#game_id#group_id#type_id#rate#coefficient[#player_id]
Действие:
- не считать купон принятым;
- не выполнять окончательное списание;
- получить актуальный готовый указатель из линии;
- не пытаться исправлять указатель по названиям исхода.
12 — неверная сумма
amount отсутствует, имеет несовместимый тип или не является положительным числом.
Проверьте сумму до отправки:
amount > 0
1002 — неверный набор параметров
Используется, в частности, для /api/partner/coupons/results:
- одновременно переданы
coupon_idsи даты; - передана только одна граница периода;
- период неположительный;
- период превышает 24 часа;
- режим запроса невозможно определить.
Исправьте параметры. Повтор неизмененного запроса даст ту же ошибку.
Ошибки проверки исхода
Новый /api/partner/coupons/place возвращает проблемные ставки в:
body.changes[]
Общий формат
{
"code": 0,
"body": {
"changes": [
{
"game_id": 737779544,
"bet_coefficient": 2.19,
"actual_coefficient": 2.09,
"change_type": 2,
"status": "rejected"
}
]
},
"error_code": 501,
"error_message": "Coefficient is change"
}
| Поле | Значение |
|---|---|
game_id | ID события из указателя. |
bet_coefficient | Коэффициент, отправленный партнером. |
actual_coefficient | Актуальный коэффициент либо null. |
change_type | 1 — рост, 2 — снижение, null — направление неприменимо. |
status | rejected, no_data, block или error. |
501 — коэффициент изменился
status = rejected
change_type = 1 или 2
Действие:
- не считать купон принятым;
- показать пользователю актуальный коэффициент;
- получить подтверждение, если это требуется правилами партнера;
- либо использовать заранее согласованный
mode = accept.
502 — исход отсутствует
status = no_data
change_type = null
Исход больше не найден в текущей линии. Удалите или обновите его в корзине.
503 — исход заблокирован
status = block
change_type = null
Прием временно недоступен. Не сохраняйте купон как принятый.
504 — ошибка проверки
status = error
change_type = null
Проверка конкретного исхода не была успешно завершена. Не считайте это подтверждением ставки. Обновите линию и предложите повторить операцию позже.
Важно. Бизнес-коды
502,503и504внутри JSON не равны HTTP-статусам502,503и504. Всегда различайтеerror_codeи HTTP-код.
506 — ставки одного матча
В одном экспрессе передано несколько исходов одного матча, включая основное событие и связанные саб-события.
Например:
- матч и угловые;
- угловые и фолы;
- разные периоды одного матча.
Оставьте только один исход от дерева матча либо создайте отдельные ординары через multi = true.
507 — недостаточный баланс
{
"code": 0,
"error_code": 507,
"error_message": "Insufficient balance",
"date": 1753000000000,
"time_ms": 5,
"path": "/api/partner/coupons/place"
}
Общей суммы на балансе клиентского аккаунта недостаточно для создания купона или всех ординаров при multi = true.
Операция атомарна:
- ни один купон не создается;
- клиентский баланс не изменяется;
- частичный успех при
multi = trueневозможен.
Повторяйте запрос только после пополнения клиентского баланса или осознанного уменьшения общей суммы. Положительный баланс может позволить выполнить login, но оказаться недостаточным для конкретного создания: login тогда успешен, а создание возвращает 507.
Ошибки чтения купона
471 — купон не найден
Новый /api/partner/coupons/get возвращает одинаковую ошибку, если:
- кода не существует;
- купон принадлежит другому партнеру.
Так API не раскрывает существование чужих данных.
Действие:
- проверить
coupon_code; - убедиться, что ведущие нули сохранены;
- проверить, что JWT относится к нужному клиентскому аккаунту.
Не создавайте пустую локальную карточку вместо существующей записи.
Внутренняя ошибка
10000
Означает внутреннюю ошибку сервиса.
Для методов чтения запрос можно повторить с ограничением частоты.
Для POST /api/partner/coupons/place нельзя слепо повторять запрос после неопределенного результата: сначала исключите возможность, что первый запрос был обработан, иначе можно создать дублирующий купон.
Если ошибка повторяется, передайте менеджеру:
- маршрут;
- время запроса;
coupon_code, если он известен;- верхнеуровневые
date,path,time_ms; - безопасный идентификатор запроса из логов партнера.
Не передавайте JWT, пароль или callback secret.
HTTP-ошибки нового API
| HTTP-код | Значение | Действие |
|---|---|---|
400 | Неверный JSON или несовместимый тип параметра. | Исправить запрос. |
401 | Ошибка JWT. | Получить новый клиентский JWT. |
403 | Нет необходимого доступа. | Проверить роль и состояние аккаунта. |
5xx | Серверная ошибка. | Зафиксировать и применить безопасную стратегию повтора. |
HTTP 200 с code = 0 относится к бизнес-ошибкам и обрабатывается по error_code.
Ошибки callback
Callback не использует поле error_code. Получатель сообщает результат HTTP-ответом.
| Ответ партнера | Поведение доставки |
|---|---|
HTTP 200, пустое тело | Успех. |
HTTP 200, success: true, processed = couponCount | Успех. |
HTTP 200, success: false | Финальная ошибка без повтора. |
HTTP 200, processed < couponCount | Финальная ошибка без повтора. |
HTTP 401 | Неверная подпись; финальная ошибка. |
HTTP 403 | Запрос запрещен фильтром; финальная ошибка. |
HTTP 500, 502, 503, 504 | Временная ошибка; выполняются повторы. |
| Timeout или транспортная ошибка | Выполняются повторы. |
| Другой HTTP-код | Финальная ошибка без повтора. |
Для успешного подтверждения требуется именно HTTP 200. Ответы 201, 202 и 204 успехом не считаются и автоматически не повторяются.
Коды старого API
| Код | Маршрут или контекст | Значение |
|---|---|---|
99 | /api/v2/login | Неверный логин или пароль. |
501 | /bet/place | Общая ошибка проверки линии; причина определяется по body[].status. |
505 | /bet/place | Неверные или неполные данные старого запроса. |
506 | /bet/place | Дублирующие ставки одного матча в купоне. |
507 | Создание купона | Недостаточный баланс клиентского аккаунта. |
560 | /coupons/get, /coupons/cashout | Код отсутствует или имеет неверный формат. |
561 | /coupons/get | Купон не найден или принадлежит другому клиенту. |
565 | /coupons/cashout | Cashout недоступен. |
1003 | Защищенные старые маршруты | Неверный JWT; возвращается с HTTP 200. |
10000 | Старые ответы | Неизвестная или внутренняя ошибка. |
Старый POST /bet/place для rejected, no_data, block и error сохраняет общий:
error_code = 501
Точная причина находится в прямом массиве body[].
Историческое описание связывало 507 с общей серверной ошибкой. В актуальном контракте 1.2.0 код имеет определенное значение Insufficient balance; обрабатывайте его как недостаточный клиентский баланс. Код 540 остается историческим и не входит в актуальный OpenAPI-контракт.
Подробнее: «Совместимые старые маршруты».
Что показывать пользователю
| Ситуация | Пример понятного сообщения |
|---|---|
| Коэффициент изменился | «Коэффициент изменился. Проверьте новое значение.» |
| Исход отсутствует | «Выбранная ставка больше недоступна.» |
| Исход заблокирован | «Прием этой ставки временно приостановлен.» |
| Ставки одного матча | «В экспресс можно добавить только одну ставку от одного матча.» |
| Неверная сумма | «Введите положительную сумму ставки.» |
| Недостаточный клиентский баланс | «Недостаточно средств для приема ставки.» |
| Временная ошибка | «Не удалось выполнить операцию. Повторите позже.» |
Не показывайте пользователю:
- JWT;
- пароль;
- callback secret;
- внутренние stack trace;
- детали инфраструктуры;
- полный подписанный callback.
Контрольный список
- Проверяются HTTP-статус,
codeиerror_code. error_messageне используется как ключ логики.- При отказе создания купон не сохраняется как принятый.
- Предварительный резерв суммы освобождается при подтвержденном отказе.
body.changesобрабатывается как массив.- Бизнес-коды
502–504не путаются с HTTP-кодами. - Ошибка
506учитывается в корзине экспресса. - Запрос создания не повторяется вслепую.
- Ошибки callback обрабатываются по отдельному HTTP-контракту.
- Секретные данные не попадают в сообщения и логи.
Следующий раздел: «Переход со старого API».