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

Модель купона и ставки

Полная модель содержит:

  • общие данные купона;
  • суммы и коэффициенты;
  • статус и даты расчета;
  • массив 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[].uuidCallbackТот же ID ставки в строковом виде.
game_idПолная модель и callbackID спортивного события или саб-события.
bet_idПолная модельID исхода в группе ставок.
batchIdТолько callbackID конкретной версии пакета 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_codestringПубличный код купона, обычно состоящий из 12 цифр.
dateintegerДата создания купона, Unix-миллисекунды.
statusintegerТекущий статус всего купона.
coupon_typeinteger1 — ординар, 2 — экспресс.
events_countintegerКоличество ставок в купоне.
events_dataarrayПолный список ставок купона.
has_returnbooleantrue, если в купоне есть возвращенная ставка.
asianbooleantrue, если купон содержит азиатский рынок.

events_count должен описывать количество объектов ставок, однако при обработке ответа все равно перебирайте фактический массив events_data.

Суммы

ПолеТипОписание
amountnumberСумма ставки.
winnumberТекущая отображаемая выплата: до расчета обычно равна потенциальной, после расчета содержит фактическое значение с учетом возвратов.
potential_winnumberИсходная возможная выплата при создании купона.
real_winnumber/nullФактическая выплата после расчета. До финального результата — null.

Для финансового начисления после финального расчета используйте real_win.

Не используйте potential_win как фактическую выплату: это только возможный результат, рассчитанный при создании купона.

Кратко:

amount        → сколько поставлено
potential_win → сколько можно было получить при создании
real_win      → сколько фактически нужно выплатить после расчета

Поле win сохраняется для отображения и совместимости. Если партнеру нужно изменить баланс пользователя, основным полем должно быть real_win.

Коэффициенты купона

ПолеТипОписание
coefnumberРабочий коэффициент: до расчета исходный, после расчета может учитывать возвраты.
original_coefnumberИсходный коэффициент купона, зафиксированный при создании.
calculate_coefnumber/nullИтоговый расчетный коэффициент. До расчета — null.

Кратко:

original_coef  → коэффициент при создании
coef           → текущее отображаемое значение
calculate_coef → окончательный расчетный коэффициент

Для финансовой операции не пересчитывайте выплату самостоятельно по отображаемому coef. Используйте готовое значение real_win.

Дата расчета

ПолеТипОписание
calculate_dateinteger/nullВремя последнего расчета ставки купона, Unix-миллисекунды.

До расчета значение всегда равно null:

{
  "calculate_date": null
}

Значение 0 для нерассчитанного купона не используется.

Статусы купона

КодИмяЗначениеФинальный
0NEWКупон активен или экспресс рассчитан частично.Нет
2WINКупон выиграл.Да
4LOSEКупон проиграл.Да
8RETURNКупон полностью возвращен.Да
15UPDATEКупон возвращен на перерасчет и ожидает нового результата.Нет

Статус 15 не означает обычное обновление карточки. При нем соответствующая ставка имеет статус 4, а партнер ожидает новый расчетный результат.

Финансовые действия при статусах подробно описаны в разделе «Статусы и расчет выплаты».

Поля ставки в events_data

ID события и саб-события

ПолеТипОписание
idinteger/nullВнутренний ID принятой ставки.
game_idintegerID события или саб-события, на которое сделана ставка.
main_game_idinteger/nullID основной игры по данным поставщика.
is_sub_gamebooleantrue, если ставка относится к саб-событию или периоду.
parent_game_idinteger/nullID родительского события для саб-события.
sub_game_keystring/nullСтабильный внутренний ключ саб-события.
sgame_idstring/nullID саб-события у поставщика линии.
game_numinteger/nullДополнительный номер игры у поставщика.
stat_idstring/nullID статистики у поставщика.
dop_namestring/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_pointerstringИсходный указатель ставки, использованный при создании купона.
line_typestringline для прематча или live для live.
is_livebooleantrue, если ставка была создана из live-линии.

raw_pointer сохраняется без изменений:

line#737779544#1#1#0#1.85

Он полезен для технической сверки, но не заменяет events_data[].id как ID принятой ставки.

Спорт, турнир и участники

ПолеТипОписание
sport_idinteger/nullID вида спорта.
sport_namestring/nullПолное локализованное название спорта.
tournament_idinteger/nullID турнира.
tournamentstring/nullПолное локализованное название турнира.
event_dateinteger/nullЗапланированное начало события, Unix-миллисекунды.
opp1string/nullПолное название первой команды или участника.
opp2string/nullПолное название второй команды или участника.
team1_idinteger/nullID первой команды или участника.
team2_idinteger/nullID второй команды или участника.
opp_icon1integer/nullСовместимый ID первого участника; совпадает с team1_id.
opp_icon2integer/nullСовместимый ID второго участника; совпадает с team2_id.

opp_icon1 и opp_icon2 — исторические совместимые названия. Несмотря на слово icon, эти поля содержат ID участников, а не URL или файл изображения.

Для нового кода рекомендуется использовать team1_id и team2_id.

Группа ставок и исход

ПолеТипОписание
bet_group_idintegerID группы ставок.
bet_group_namestring/nullПолное локализованное название группы ставок.
bet_idintegerID исхода внутри группы.
bet_namestring/nullПолное локализованное название исхода.
ratestringПараметр исхода: тотал, фора или 0, если параметр не нужен.

bet_name уже может содержать расшифрованный параметр исхода и имя игрока, если они применимы.

Пример:

{
  "bet_group_id": 17,
  "bet_group_name": "Тотал голов",
  "bet_id": 9,
  "bet_name": "Тотал больше 2.5",
  "rate": "2.5"
}

Коэффициенты и расчет ставки

ПолеТипОписание
statusintegerТекущий расчетный статус ставки.
coefnumberКоэффициент ставки, зафиксированный при создании.
calc_coefnumber/nullРасчетный множитель ставки. До расчета — null.
calculate_dateinteger/nullВремя расчета ставки, Unix-миллисекунды. До расчета — null.
settlement_reason_codestring/nullСтабильный машиночитаемый код причины расчета или возврата. До расчета — null.
settlement_reasonstring/nullТекст причины расчета или возврата. До расчета — null.

calc_coef зависит от результата ставки:

СтатусРезультатcalc_coef
0Не рассчитанаnull
1ВыигрышИсходный coef
2Проигрыш0
3Возврат1
4Ожидает перерасчетаnull
21Половинный выигрыш(coef + 1) / 2
22Половинный проигрыш0.5
23Push1

Поле 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.

Уведомление конечного пользователя

Для понятного сообщения в интерфейсе рекомендуется:

  1. прочитать settlement_reason_code;
  2. сопоставить известный код с локализованным текстом партнера;
  3. если код неизвестен, использовать непустой settlement_reason как запасное пояснение;
  4. сохранить оба исходных поля для последующей сверки.

Например:

КодПример сообщения пользователю
MATCH_POSTPONED«Матч перенесен. Ставка рассчитана по правилам возврата.»
MATCH_CANCELLED«Матч отменен. Ставка рассчитана по правилам возврата.»
MARKET_PUSH«Выбранный рынок рассчитан как возврат.»

Не предполагайте, что settlement_reason переведен на язык купона: поле может содержать исходный текст источника расчета. Причина предназначена для объяснения результата и не заменяет status, calc_coef или real_win.

Эти поля описывают причину уже выполненного расчета или возврата, а не текущее состояние спортивного события. До расчета оба поля равны null; API не гарантирует отдельное предварительное уведомление о переносе или отмене матча через эти поля.

Счет события

ПолеТипОписание
bet_scorestringПоле совместимости старого API; содержит исходный указатель ставки.
calculate_scorestring/nullФинальный полный счет, использованный для расчета.
placement_score_fullstring/nullПолный счет на момент создания ставки.
placement_score_periodsstring/nullСчет по периодам на момент создания ставки.
calculation_score_fullstring/nullПолный счет при расчете.
calculation_score_periodsstring/nullСчет по периодам при расчете.
timerinteger/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 передает расчетный снимок, а не всю карточку купона.

Полная модель APICallbackПримечание
coupon_codecoupon_codeОдин и тот же купон.
events_data[].idevents_data[].uuidОдин ID ставки; в callback передается строкой.
real_winrealWinФактическая выплата.
calculate_coefcalculate_coefficientРасчетный коэффициент купона.
events_data[].calc_coefevents_data[].calculate_coefficientРасчетный множитель ставки.
events_data[].settlement_reason_codeevents_data[].settlement_reason_codeСтабильный код причины расчета.
events_data[].settlement_reasonevents_data[].settlement_reasonТекст причины расчета.
Полная карточкаСокращенный расчетный снимокНазвания, сумма и часть исходных данных в callback отсутствуют.
Нет batchIdЕсть batchIdbatchId идентифицирует версию пакета доставки.

В 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».