SportAPI Документация
RU
C Документация продуктаCoupon API
v1
Услуга и цены ↗ Получить доступ ↗
Coupon API / Коды ошибок

Коды ошибок

Новый клиентский 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 имеет неверный формат или подпись;
  • токен истек;
  • токен был отозван.

Действие:

  1. выполнить POST /api/partner/login;
  2. получить новый body.token;
  3. повторить безопасный запрос чтения.

После 401 на создании купона сначала убедитесь, что исходный запрос не был принят.

HTTP 403

Означает, что:

  • токен не имеет клиентской роли;
  • используется административный JWT;
  • доступ аккаунта запрещен.

Повторный вход с теми же неправильными учетными данными или типом токена проблему не исправит. Проверьте аккаунт и при необходимости обратитесь к менеджеру.

Бизнес-ошибки POST /api/partner/login

Все перечисленные ответы приходят с HTTP 200 и code = 0:

error_codeerror_messageПричинаДействие
1002Not all paramsНе передан логин или пароль.Исправить тело запроса.
1003Wrong login or passwordНеизвестный логин или неверный пароль.Проверить учетные данные.
1004Client account is disabledКлиентский аккаунт отключен.Обратиться к менеджеру для включения аккаунта.
1006Client access has expiredИстекла дата доступа клиента.Обратиться к менеджеру для продления доступа.
1007Insufficient 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_idID события из указателя.
bet_coefficientКоэффициент, отправленный партнером.
actual_coefficientАктуальный коэффициент либо null.
change_type1 — рост, 2 — снижение, null — направление неприменимо.
statusrejected, 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/cashoutCashout недоступен.
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».