Модель купона и ставки
Полная модель содержит:
- общие данные купона;
- суммы и коэффициенты;
- статус и даты расчета;
- массив
events_dataсо всеми ставками купона.
Один объект events_data описывает одну принятую ставку внутри купона.
Общая структура
{
"coupon_code": "000000000272",
"amount": 10,
"status": 0,
"events_count": 1,
"events_data": [
{
"id": 84521,
"game_id": 737779544,
"bet_id": 1,
"status": 0
}
]
}
Статус купона и статус ставки — разные справочники. Всегда учитывайте, на каком уровне находится поле.
Идентификаторы
| Поле | Где передается | Назначение |
|---|---|---|
coupon_code | Полная модель и callback | Публичный код купона. |
events_data[].id | Полная модель | Внутренний ID принятой ставки. |
events_data[].uuid | Callback | Тот же ID ставки в строковом виде. |
game_id | Полная модель и callback | ID спортивного события или саб-события. |
bet_id | Полная модель | ID исхода в группе ставок. |
batchId | Только callback | ID конкретной версии пакета callback. |
Не путайте эти значения:
coupon_code → купон
id / uuid → конкретная ставка внутри купона
game_id → спортивное событие
bet_id → исход в линии
batchId → пакет callback
Для локального хранения ставки рекомендуется составной ключ:
coupon_code + events_data[].id
При обработке callback сопоставляйте строковый uuid с сохраненным id.
game_id и bet_id могут повторяться в разных купонах, поэтому они не заменяют внутренний ID принятой ставки.
Поля купона
Основные данные
| Поле | Тип | Описание |
|---|---|---|
coupon_code | string | Публичный код купона, обычно состоящий из 12 цифр. |
date | integer | Дата создания купона, Unix-миллисекунды. |
status | integer | Текущий статус всего купона. |
coupon_type | integer | 1 — ординар, 2 — экспресс. |
events_count | integer | Количество ставок в купоне. |
events_data | array | Полный список ставок купона. |
has_return | boolean | true, если в купоне есть возвращенная ставка. |
asian | boolean | true, если купон содержит азиатский рынок. |
events_count должен описывать количество объектов ставок, однако при обработке ответа все равно перебирайте фактический массив events_data.
Суммы
| Поле | Тип | Описание |
|---|---|---|
amount | number | Сумма ставки. |
win | number | Текущая отображаемая выплата: до расчета обычно равна потенциальной, после расчета содержит фактическое значение с учетом возвратов. |
potential_win | number | Исходная возможная выплата при создании купона. |
real_win | number/null | Фактическая выплата после расчета. До финального результата — null. |
Для финансового начисления после финального расчета используйте real_win.
Не используйте potential_win как фактическую выплату: это только возможный результат, рассчитанный при создании купона.
Кратко:
amount → сколько поставлено
potential_win → сколько можно было получить при создании
real_win → сколько фактически нужно выплатить после расчета
Поле win сохраняется для отображения и совместимости. Если партнеру нужно изменить баланс пользователя, основным полем должно быть real_win.
Коэффициенты купона
| Поле | Тип | Описание |
|---|---|---|
coef | number | Рабочий коэффициент: до расчета исходный, после расчета может учитывать возвраты. |
original_coef | number | Исходный коэффициент купона, зафиксированный при создании. |
calculate_coef | number/null | Итоговый расчетный коэффициент. До расчета — null. |
Кратко:
original_coef → коэффициент при создании
coef → текущее отображаемое значение
calculate_coef → окончательный расчетный коэффициент
Для финансовой операции не пересчитывайте выплату самостоятельно по отображаемому coef. Используйте готовое значение real_win.
Дата расчета
| Поле | Тип | Описание |
|---|---|---|
calculate_date | integer/null | Время последнего расчета ставки купона, Unix-миллисекунды. |
До расчета значение всегда равно null:
{
"calculate_date": null
}
Значение 0 для нерассчитанного купона не используется.
Статусы купона
| Код | Имя | Значение | Финальный |
|---|---|---|---|
0 | NEW | Купон активен или экспресс рассчитан частично. | Нет |
2 | WIN | Купон выиграл. | Да |
4 | LOSE | Купон проиграл. | Да |
8 | RETURN | Купон полностью возвращен. | Да |
15 | UPDATE | Купон возвращен на перерасчет и ожидает нового результата. | Нет |
Статус 15 не означает обычное обновление карточки. При нем соответствующая ставка имеет статус 4, а партнер ожидает новый расчетный результат.
Финансовые действия при статусах подробно описаны в разделе «Статусы и расчет выплаты».
Поля ставки в events_data
ID события и саб-события
| Поле | Тип | Описание |
|---|---|---|
id | integer/null | Внутренний ID принятой ставки. |
game_id | integer | ID события или саб-события, на которое сделана ставка. |
main_game_id | integer/null | ID основной игры по данным поставщика. |
is_sub_game | boolean | true, если ставка относится к саб-событию или периоду. |
parent_game_id | integer/null | ID родительского события для саб-события. |
sub_game_key | string/null | Стабильный внутренний ключ саб-события. |
sgame_id | string/null | ID саб-события у поставщика линии. |
game_num | integer/null | Дополнительный номер игры у поставщика. |
stat_id | string/null | ID статистики у поставщика. |
dop_name | string/null | Название периода, тайма, сета, иннинга или другого саб-события. |
Для основной игры часть полей саб-события будет равна null.
Пример основной игры:
{
"game_id": 737779544,
"main_game_id": 737779544,
"is_sub_game": false,
"parent_game_id": null,
"sub_game_key": null,
"dop_name": null
}
Для саб-события game_id идентифицирует выбранное саб-событие, а main_game_id и parent_game_id позволяют связать его с основным матчем.
Исходный указатель и тип линии
| Поле | Тип | Описание |
|---|---|---|
raw_pointer | string | Исходный указатель ставки, использованный при создании купона. |
line_type | string | line для прематча или live для live. |
is_live | boolean | true, если ставка была создана из live-линии. |
raw_pointer сохраняется без изменений:
line#737779544#1#1#0#1.85
Он полезен для технической сверки, но не заменяет events_data[].id как ID принятой ставки.
Спорт, турнир и участники
| Поле | Тип | Описание |
|---|---|---|
sport_id | integer/null | ID вида спорта. |
sport_name | string/null | Полное локализованное название спорта. |
tournament_id | integer/null | ID турнира. |
tournament | string/null | Полное локализованное название турнира. |
event_date | integer/null | Запланированное начало события, Unix-миллисекунды. |
opp1 | string/null | Полное название первой команды или участника. |
opp2 | string/null | Полное название второй команды или участника. |
team1_id | integer/null | ID первой команды или участника. |
team2_id | integer/null | ID второй команды или участника. |
opp_icon1 | integer/null | Совместимый ID первого участника; совпадает с team1_id. |
opp_icon2 | integer/null | Совместимый ID второго участника; совпадает с team2_id. |
opp_icon1 и opp_icon2 — исторические совместимые названия. Несмотря на слово icon, эти поля содержат ID участников, а не URL или файл изображения.
Для нового кода рекомендуется использовать team1_id и team2_id.
Группа ставок и исход
| Поле | Тип | Описание |
|---|---|---|
bet_group_id | integer | ID группы ставок. |
bet_group_name | string/null | Полное локализованное название группы ставок. |
bet_id | integer | ID исхода внутри группы. |
bet_name | string/null | Полное локализованное название исхода. |
rate | string | Параметр исхода: тотал, фора или 0, если параметр не нужен. |
bet_name уже может содержать расшифрованный параметр исхода и имя игрока, если они применимы.
Пример:
{
"bet_group_id": 17,
"bet_group_name": "Тотал голов",
"bet_id": 9,
"bet_name": "Тотал больше 2.5",
"rate": "2.5"
}
Коэффициенты и расчет ставки
| Поле | Тип | Описание |
|---|---|---|
status | integer | Текущий расчетный статус ставки. |
coef | number | Коэффициент ставки, зафиксированный при создании. |
calc_coef | number/null | Расчетный множитель ставки. До расчета — null. |
calculate_date | integer/null | Время расчета ставки, Unix-миллисекунды. До расчета — null. |
settlement_reason_code | string/null | Стабильный машиночитаемый код причины расчета или возврата. До расчета — null. |
settlement_reason | string/null | Текст причины расчета или возврата. До расчета — null. |
calc_coef зависит от результата ставки:
| Статус | Результат | calc_coef |
|---|---|---|
0 | Не рассчитана | null |
1 | Выигрыш | Исходный coef |
2 | Проигрыш | 0 |
3 | Возврат | 1 |
4 | Ожидает перерасчета | null |
21 | Половинный выигрыш | (coef + 1) / 2 |
22 | Половинный проигрыш | 0.5 |
23 | Push | 1 |
Поле calc_coef — расчетный множитель конкретной ставки, а calculate_coef на уровне купона — результат расчета всего купона.
Причина расчета
Поля причины дополняют числовой статус ставки:
settlement_reason_codeподходит для программной обработки и аналитики;settlement_reasonсодержит поясняющий текст и не является стабильным программным значением.
Примеры кодов:
| Код | Значение |
|---|---|
MATCH_CANCELLED | Матч отменен. |
MATCH_POSTPONED | Матч перенесен. |
MARKET_PUSH | Рынок рассчитан как push. |
REMOTE_WIN | Источник расчета передал выигрыш. |
REMOTE_LOSE | Источник расчета передал проигрыш. |
REMOTE_RETURN | Источник расчета вернул ставку. |
REMOTE_HALF_WIN | Источник расчета передал половинный выигрыш. |
REMOTE_HALF_LOSE | Источник расчета передал половинный проигрыш. |
REMOTE_PUSH | Источник расчета передал push. |
AUTOMATIC_MARKET_RETURN | Возврат определен правилами рынка. |
AUTOMATIC_SETTLEMENT | Обычный расчет результата. |
Список кодов может расширяться. Не отклоняйте ответ из-за неизвестного settlement_reason_code: сохраните значение и определяйте финансовый результат по status, calc_coef и итоговому real_win.
Уведомление конечного пользователя
Для понятного сообщения в интерфейсе рекомендуется:
- прочитать
settlement_reason_code; - сопоставить известный код с локализованным текстом партнера;
- если код неизвестен, использовать непустой
settlement_reasonкак запасное пояснение; - сохранить оба исходных поля для последующей сверки.
Например:
| Код | Пример сообщения пользователю |
|---|---|
MATCH_POSTPONED | «Матч перенесен. Ставка рассчитана по правилам возврата.» |
MATCH_CANCELLED | «Матч отменен. Ставка рассчитана по правилам возврата.» |
MARKET_PUSH | «Выбранный рынок рассчитан как возврат.» |
Не предполагайте, что settlement_reason переведен на язык купона: поле может содержать исходный текст источника расчета. Причина предназначена для объяснения результата и не заменяет status, calc_coef или real_win.
Эти поля описывают причину уже выполненного расчета или возврата, а не текущее состояние спортивного события. До расчета оба поля равны null; API не гарантирует отдельное предварительное уведомление о переносе или отмене матча через эти поля.
Счет события
| Поле | Тип | Описание |
|---|---|---|
bet_score | string | Поле совместимости старого API; содержит исходный указатель ставки. |
calculate_score | string/null | Финальный полный счет, использованный для расчета. |
placement_score_full | string/null | Полный счет на момент создания ставки. |
placement_score_periods | string/null | Счет по периодам на момент создания ставки. |
calculation_score_full | string/null | Полный счет при расчете. |
calculation_score_periods | string/null | Счет по периодам при расчете. |
timer | integer/null | Таймер события, если доступен. |
Важно. Несмотря на название,
bet_scoreне является счетом матча. Это совместимое поле, которое содержит исходный указатель ставки. Для счета используйтеcalculate_scoreи расширенные поляplacement_*/calculation_*.
Формат счета зависит от вида спорта и данных поставщика. Храните его как строку и не рассчитывайте результат ставки самостоятельно только по этому полю.
Полный пример активного купона
{
"coupon_code": "000000000272",
"amount": 10,
"win": 18.5,
"potential_win": 18.5,
"real_win": null,
"coef": 1.85,
"original_coef": 1.85,
"calculate_coef": null,
"has_return": false,
"date": 1784970000000,
"status": 0,
"asian": false,
"calculate_date": null,
"coupon_type": 1,
"events_count": 1,
"events_data": [
{
"id": 84521,
"game_id": 737779544,
"main_game_id": 737779544,
"is_sub_game": false,
"parent_game_id": null,
"sub_game_key": null,
"raw_pointer": "line#737779544#1#1#0#1.85",
"line_type": "line",
"is_live": false,
"bet_group_id": 1,
"bet_group_name": "Исход матча",
"bet_id": 1,
"bet_name": "Победа первой команды",
"sport_id": 1,
"sport_name": "Футбол",
"tournament_id": 10001,
"tournament": "Национальная лига",
"event_date": 1784971800000,
"status": 0,
"opp1": "Команда A",
"opp2": "Команда B",
"coef": 1.85,
"calc_coef": null,
"bet_score": "line#737779544#1#1#0#1.85",
"calculate_date": null,
"calculate_score": null,
"settlement_reason_code": null,
"settlement_reason": null,
"placement_score_full": null,
"placement_score_periods": null,
"calculation_score_full": null,
"calculation_score_periods": null,
"timer": null,
"dop_name": null,
"rate": "0",
"sgame_id": null,
"game_num": null,
"stat_id": null,
"team1_id": 101,
"team2_id": 102,
"opp_icon1": 101,
"opp_icon2": 102
}
]
}
После выигрыша ординара основные расчетные поля изменятся:
{
"status": 2,
"real_win": 18.5,
"calculate_coef": 1.85,
"calculate_date": 1784973600000,
"events_data": [
{
"id": 84521,
"status": 1,
"calc_coef": 1.85,
"calculate_date": 1784973600000,
"calculate_score": "2:1",
"settlement_reason_code": "AUTOMATIC_SETTLEMENT",
"settlement_reason": "Calculated automatically",
"calculation_score_full": "2:1"
}
]
}
Это сокращенный снимок изменений, а не отдельный формат ответа.
Nullable-поля
null является штатным значением, если данные:
- еще не рассчитаны;
- не применимы к конкретному виду спорта;
- отсутствуют у поставщика;
- относятся только к live или саб-событиям.
Не заменяйте null автоматически числом 0 или пустой строкой: эти значения могут иметь другое значение в контракте.
Особенно важно сохранить:
real_win = null до финального расчета
calculate_coef = null до финального расчета
calculate_date = null до расчета
calc_coef = null до расчета ставки
settlement_reason_code = null до расчета ставки
settlement_reason = null до расчета ставки
Даты и десятичные значения
Все даты в этой модели передаются в Unix-миллисекундах:
1784973600000
Не путайте их с Unix-секундами.
Суммы и коэффициенты передаются как десятичные числа без фиксированного количества знаков после запятой. Партнер самостоятельно определяет правила отображения и округления в своей системе.
Рекомендуется использовать десятичный тип данных, а не двоичный float, для хранения денег и финансовых расчетов.
Язык названий
Названия спорта, турнира, участников, группы ставок и исхода формируются на языке lang, указанном при создании купона.
API поддерживает около 50 языков. Передается двухбуквенный код языка; полный перечень в документации не публикуется.
Язык фиксируется в момент создания купона. Получить уже созданный купон в другом переводе сейчас нельзя. Поддержка нескольких языковых вариантов одного купона находится в разработке.
Отличия полной модели от callback
Callback передает расчетный снимок, а не всю карточку купона.
| Полная модель API | Callback | Примечание |
|---|---|---|
coupon_code | coupon_code | Один и тот же купон. |
events_data[].id | events_data[].uuid | Один ID ставки; в callback передается строкой. |
real_win | realWin | Фактическая выплата. |
calculate_coef | calculate_coefficient | Расчетный коэффициент купона. |
events_data[].calc_coef | events_data[].calculate_coefficient | Расчетный множитель ставки. |
events_data[].settlement_reason_code | events_data[].settlement_reason_code | Стабильный код причины расчета. |
events_data[].settlement_reason | events_data[].settlement_reason | Текст причины расчета. |
| Полная карточка | Сокращенный расчетный снимок | Названия, сумма и часть исходных данных в callback отсутствуют. |
Нет batchId | Есть batchId | batchId идентифицирует версию пакета доставки. |
В callback отсутствуют, в частности:
amount;- названия спорта, турнира, команд, рынка и исхода;
- часть исходных данных купона.
Если для обработки callback нужны отсутствующие поля, сохраните их при создании купона либо запросите полную модель через клиентский API.
Валюта
Поле currency передается при создании купона, но не входит в полную модель ответа купона и callback.
Если партнеру нужно отображать валюту или связывать с ней финансовые операции, сохраните переданное значение currency в своей системе при успешном создании купона.
Поддерживаются произвольные строковые обозначения обычных, виртуальных, внутренних и вымышленных валют.
Что рекомендуется хранить
Партнер самостоятельно определяет необходимый набор данных. Для надежной интеграции рекомендуется как минимум сохранять:
На уровне купона
coupon_code;amount;- переданную при создании
currency, если она используется; coupon_type;status;real_win;original_coef;calculate_coef;date;calculate_date.
На уровне ставки
coupon_code;events_data[].id;raw_pointer;game_id;bet_group_id;bet_id;coef;status;calc_coef;calculate_date;settlement_reason_code;settlement_reason, если текст нужен для журнала или отображения.
Для отображения сохраняйте также необходимые названия, участников и данные счета.
Хранить весь ответ целиком необязательно. Однако coupon_code нужно сохранить обязательно: это основной связующий ключ между системой партнера и Системой расчета купонов SportAPI.
Контрольный список
coupon_codeхранится как строка с ведущими нулями.- Купон и ставки сохраняются как разные связанные сущности.
- Ставка идентифицируется по
coupon_code + id. uuidиз callback сопоставляется сidполной модели.batchIdне используется как ID купона или ставки.real_winиспользуется для финальной выплаты.potential_winне используется как фактическая выплата.- Статусы купона и ставки читаются по разным справочникам.
calculate_dateдо расчета равенnull, а не0.- Поле
bet_scoreне интерпретируется как счет матча. - Nullable-поля обрабатываются без искусственной замены значений.
- Для логики причины используется
settlement_reason_code, а не текстsettlement_reason. - Даты читаются как Unix-миллисекунды.
- Валюта сохраняется партнером при создании, если она нужна.
- Язык названий фиксируется при создании купона.
Следующий раздел: «Cashout».