Изменение коэффициентов и доступности исхода
Между выбором ставки пользователем и отправкой купона состояние исхода в спортивной линии может измениться:
- коэффициент может повыситься или понизиться;
- исход может быть заблокирован;
- исход может исчезнуть из линии;
- проверка исхода может завершиться ошибкой.
Перед созданием купона Система расчета купонов SportAPI проверяет каждый элемент list_bets по актуальной линии.
Коэффициент в указателе
Указатель содержит коэффициент, который был показан пользователю:
line#737779544#1#1#0#1.85
Последнее значение 1.85 — коэффициент, переданный партнером. При создании купона API сравнивает его с текущим коэффициентом этого исхода.
Если значения совпадают и исход доступен, проверка проходит независимо от выбранного режима.
Параметры mode и mode_type
Поведение при изменении коэффициента задают два поля:
{
"mode": "reject",
"mode_type": null
}
| Поле | Возможные значения | Назначение |
|---|---|---|
mode | reject, accept | Отклонить изменившийся коэффициент или разрешить его прием. |
mode_type | 1, 2, 3, null | Уточнить, какое направление изменения можно принять при mode = "accept". |
Если mode не передан или имеет значение null, используется reject.
Режим reject
reject — безопасный режим по умолчанию:
{
"mode": "reject",
"mode_type": null
}
Купон создается только тогда, когда переданный коэффициент совпадает с актуальным. При любом изменении вверх или вниз API отклоняет запрос с error_code = 501.
Используйте этот режим, если пользователь должен самостоятельно подтвердить каждый изменившийся коэффициент.
Режим accept
accept разрешает принять актуальный коэффициент без отдельного повторного подтверждения:
{
"mode": "accept",
"mode_type": 1
}
При mode = "accept" необходимо передать mode_type:
mode_type | Поведение |
|---|---|
1 | Принимать только повышение коэффициента. |
2 | Принимать только понижение коэффициента. |
3 | Принимать повышение и понижение коэффициента. |
Если изменение разрешено выбранным mode_type, купон создается с актуальным коэффициентом из линии.
accept относится только к изменению коэффициента. Он не позволяет принять заблокированный или отсутствующий исход и не игнорирует ошибку проверки.
Пример поведения режимов
Партнер передал коэффициент 2.00.
| Режим | Актуальный коэффициент | Изменение | Результат |
|---|---|---|---|
reject | 2.20 | Повышение | Купон отклонен. |
reject | 1.80 | Понижение | Купон отклонен. |
accept, mode_type = 1 | 2.20 | Повышение | Купон принят с коэффициентом 2.20. |
accept, mode_type = 1 | 1.80 | Понижение | Купон отклонен. |
accept, mode_type = 2 | 2.20 | Повышение | Купон отклонен. |
accept, mode_type = 2 | 1.80 | Понижение | Купон принят с коэффициентом 1.80. |
accept, mode_type = 3 | 2.20 | Повышение | Купон принят с коэффициентом 2.20. |
accept, mode_type = 3 | 1.80 | Понижение | Купон принят с коэффициентом 1.80. |
Партнер должен заранее объяснить пользователю выбранное поведение. Особенно важно учитывать, что mode_type = 2 и mode_type = 3 могут принять коэффициент ниже показанного в корзине.
Четыре основных варианта отказа
Если хотя бы один исход не проходит проверку, новый API возвращает сведения о проблемных исходах в массиве:
body.changes
body.changes всегда является массивом, даже если проблема обнаружена только у одной ставки.
1. Коэффициент понизился
Передан коэффициент 2.19, актуальный коэффициент снизился до 2.09, а выбранный режим не разрешает понижение:
{
"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",
"date": 1784970000000,
"time_ms": 20,
"path": "/api/partner/coupons/place"
}
Основные значения:
status = rejected
change_type = 2
error_code = 501
2. Коэффициент повысился
Передан коэффициент 2.19, актуальный коэффициент повысился до 2.39, а выбранный режим не разрешает повышение:
{
"code": 0,
"body": {
"changes": [
{
"game_id": 737779544,
"bet_coefficient": 2.19,
"actual_coefficient": 2.39,
"change_type": 1,
"status": "rejected"
}
]
},
"error_code": 501,
"error_message": "Coefficient is change",
"date": 1784970000000,
"time_ms": 20,
"path": "/api/partner/coupons/place"
}
Основные значения:
status = rejected
change_type = 1
error_code = 501
3. Исход заблокирован
Исход найден в линии, но прием ставки на него заблокирован:
{
"code": 0,
"body": {
"changes": [
{
"game_id": 737779544,
"bet_coefficient": 2.19,
"actual_coefficient": null,
"change_type": null,
"status": "block"
}
]
},
"error_code": 503,
"error_message": "Bet outcome is blocked",
"date": 1784970000000,
"time_ms": 20,
"path": "/api/partner/coupons/place"
}
Основные значения:
status = block
change_type = null
error_code = 503
Для заблокированного исхода направление изменения коэффициента неприменимо. Поэтому change_type имеет значение null. actual_coefficient также может быть null.
4. Исход недоступен
Исход больше не найден в текущей линии:
{
"code": 0,
"body": {
"changes": [
{
"game_id": 737779544,
"bet_coefficient": 2.19,
"actual_coefficient": null,
"change_type": null,
"status": "no_data"
}
]
},
"error_code": 502,
"error_message": "Bet outcome is not available",
"date": 1784970000000,
"time_ms": 20,
"path": "/api/partner/coupons/place"
}
Основные значения:
status = no_data
change_type = null
error_code = 502
Для отсутствующего исхода актуальный коэффициент неизвестен, поэтому actual_coefficient и change_type имеют значение null.
Поля body.changes
| Поле | Тип | Описание |
|---|---|---|
game_id | integer | ID события из переданного указателя. |
bet_coefficient | number | Коэффициент, переданный партнером. |
actual_coefficient | number/null | Актуальный коэффициент. Может быть null, если исход отсутствует или проверка не была выполнена. |
change_type | integer/null | Направление изменения коэффициента. |
status | string | Причина, по которой исход не прошел проверку. |
Значения change_type
change_type является числом или null:
| Значение | Описание |
|---|---|
1 | Актуальный коэффициент выше переданного. |
2 | Актуальный коэффициент ниже переданного. |
null | Направление изменения неприменимо или не определено. |
Строковые значения, например "increase" или "decrease", не используются.
Для блокировки, отсутствия исхода и ошибки проверки ориентируйтесь на status, а не на change_type.
Причины отказа
| Ситуация | status | change_type | error_code |
|---|---|---|---|
| Коэффициент изменился и не принят выбранным режимом | rejected | 1 или 2 | 501 |
| Исход отсутствует в текущей линии | no_data | null | 502 |
| Исход заблокирован | block | null | 503 |
| Во время проверки исхода произошла ошибка | error | null | 504 |
Ответы 502 и 503 являются результатом проверки текущего состояния линии, а не транспортной ошибкой.
Ни один из режимов accept не позволяет принять исход со статусом no_data, block или error.
Что должна делать система партнера
rejected
- Не сохранять данные корзины как принятый купон.
- Показать пользователю переданный и актуальный коэффициенты.
- Получить обновленный указатель из линии.
- Предложить пользователю подтвердить ставку повторно, если это предусмотрено интерфейсом.
Не изменяйте коэффициент внутри старого указателя вручную — получите актуальный указатель из линии.
no_data
Исход больше недоступен в текущей линии:
- не сохраняйте купон как принятый;
- удалите или отключите исход в корзине;
- сообщите пользователю, что ставка больше недоступна.
block
Исход существует, но временно или окончательно заблокирован:
- не сохраняйте купон как принятый;
- отключите подтверждение этого исхода;
- обновите данные линии перед повторной попыткой.
error
API не смог проверить исход:
- не считайте купон принятым;
- сообщите пользователю, что ставку сейчас невозможно проверить;
- обновите линию и разрешите повторную попытку позднее.
Обработка экспресса
В body.changes может находиться несколько элементов — по каждому изменившемуся или недоступному исходу.
Если ответ содержит code = 0, не сохраняйте экспресс как принятый, даже если часть его исходов прошла проверку. Сначала обработайте все элементы body.changes, обновите корзину и только после этого сформируйте новый запрос.
Совместимый старый маршрут
Старый
POST /bet/placeдля всех четырех причин возвращает общийerror_code = 501. Массив причин находится непосредственно вbody, а отсутствующий исход обозначается старым значениемnodata. В новом/api/partner/coupons/placeиспользуются отдельные коды501–504, массивbody.changesи значениеno_data.
Для новой интеграции используйте только новый формат. Полное сравнение приведено в руководстве «Переход со старого API».
Следующий раздел: «Жизненный цикл расчета».