{"openapi":"3.1.0","info":{"title":"BetCore: клиентское API","description":"API для партнеров BetCore: вход, создание купонов и безопасное чтение собственных результатов. Административные методы в эту спецификацию не входят. После входа используйте клиентский Bearer JWT; JWT администратора и `X-Client-Id` не дают доступ к данным клиента. Все суммы передаются десятичными числами, а время — Unix timestamp в миллисекундах, кроме `event_date` и `start_game` в Unix-секундах. `info.version` совпадает с `api_version` в JSON-ответах: DEMO использует суффикс `-DEMO`, production — релизную версию без суффикса окружения. Совместимые маршруты старого API `/api/v3/partner/bet/*` продолжают работать и указаны в описании каждого метода. Для прямых запросов из браузера origin приложения должен быть добавлен администратором в список CORS-разрешений конкретного клиента.\n\nСкачать полную Markdown-документацию: [RU](/docs/client-api.ru.md), [UA](/docs/client-api.ua.md), [EN](/docs/client-api.en.md).\n\n---\n\n<details>\n<summary><strong>История изменений клиентского API BetCore</strong></summary>\n\n## [1.6.3] - 2026-08-14\n\n### Изменено\n\n- `calculate_score` теперь содержит разбивку итогового счета по таймам, сетам или периодам в скобках, когда поставщик результата передал эти данные. Примеры: `2:1 (1:0, 1:1)` и `2:1 (6:4, 3:6, 7:5)`.\n- Сырые расчетные поля и формулы определения исхода не изменены.\n\n## [1.6.2] - 2026-08-11\n\n### Документация\n\n- Swagger и руководства RU, UA и EN синхронизированы с актуальным публичным контрактом без раскрытия внутренних проверок приема купона.\n\n## [1.6.1] - 2026-08-10\n\n### Исправлено\n\n- При расчете экспресса и cashout коэффициенты отдельных ставок больше не усекаются до двух знаков перед перемножением.\n- `calculate_coefficient` и `realWin` теперь вычисляются с полной точностью коэффициентов ставок; усечение до двух знаков выполняется только для итогового коэффициента и итоговой выплаты.\n- Пустой купон не может быть ошибочно рассчитан как выигрышный.\n\n## [1.6.0] - 2026-08-08\n\n### Добавлено\n\n- Для браузерных интеграций поддерживается CORS с индивидуальным списком разрешенных origin для каждого клиента.\n- Preflight-запросы `OPTIONS` возвращают разрешенные методы и заголовки только для настроенных origin.\n- Защищенный запрос дополнительно проверяет, что его `Origin` разрешен именно владельцу CLIENT JWT.\n\n### Документация\n\n- В руководства RU, UA и EN добавлены требования к прямым запросам из браузера и формат origin без пути.\n\n## [1.5.0] - 2026-08-07\n\n### Добавлено\n\n- Все современные и совместимые старые JSON-оболочки содержат `api_version`.\n- Версия в Swagger `info.version`, JSON-ответах и примерах Swagger формируется из одного параметра `BET_CORE_API_VERSION`.\n\n### Документация\n\n- На DEMO сервере возвращается `1.5.0-DEMO`; на production — `1.5.0` без суффикса окружения.\n- Полные руководства RU, UA и EN синхронизированы со Swagger и описывают назначение `api_version`.\n\n## [1.4.1] - 2026-08-06\n\n### Исправлено\n\n- Названия полей ставки в полной модели приведены к фактическому JSON: `sub_game` и `live`.\n- Для `event_date` и старого алиаса `start_game` явно указаны Unix-секунды; остальные даты остаются в Unix-миллисекундах.\n- Уточнены типы старых полей `tournament_name` и `start_game`, алиасы поиска купона и назначение `user_id`.\n- Примеры Swagger дополнены всеми полями DTO и защищены тестом точного соответствия сериализованному JSON.\n\n## [1.4.0] - 2026-08-05\n\n### Добавлено\n\n- Клиентский Swagger поддерживает русский, украинский и английский языки.\n- При первом открытии язык выбирается по языку браузера; неизвестный язык приводит к английскому.\n- Ручной выбор языка сохраняется в браузере и имеет приоритет при следующих открытиях.\n- Полная Markdown-документация доступна отдельными файлами RU, UA и EN.\n\n### Документация\n\n- Добавлен отдельный отчет о различиях DTO settlement webhook и coupon list для миграции клиентов со старого API.\n\n## [1.3.0] - 2026-08-05\n\n### Добавлено\n\n- Полная Markdown-документация доступна для скачивания прямо из клиентского Swagger.\n\n### Документация\n\n- Явно зафиксированы различия полей webhook (`realWin`, `calculate_coefficient`, `uuid`) и полной coupon list (`real_win`, `calculate_coef`, `id`).\n- Добавлены `settlement_reason_code` и `settlement_reason`, актуальные ошибки доступа и адреса production/test.\n\n## [1.2.0] - 2026-07-31\n\n### Добавлено\n\n- Новый маршрут входа различает неверные учетные данные (`1003`), отключенный аккаунт (`1004`) и истекший доступ (`1006`). Старый маршрут сохраняет совместимый общий код `99`.\n- В ставках купона и callback добавлены `settlement_reason_code` и `settlement_reason`. Для возвратов расчетки распознаются отмена, перенос и обычный market push, при этом исходный текст расчетки сохраняется.\n\n## [1.1.2] - 2026-07-30\n\n### Исправлено\n\n- Совместимый `POST /bet/place` снова полностью повторяет старый контракт ошибок проверки линии: общий `error_code = 501`, `error_message = \"Coefficient is change\"` и прямой массив причин в `body`.\n- Поле `change_type` зафиксировано как `1` для роста коэффициента, `2` для снижения и `null` для остальных причин.\n\n## [1.1.1] - 2026-07-30\n\n### Исправлено\n\n- Поле `calculate_date` унифицировано: до расчета возвращается `null`, после расчета — Unix timestamp в миллисекундах.\n\n## [1.1.0] - 2026-07-29\n\n### Добавлено\n\n- В ставки купона нового и совместимого старого API добавлены `opp_icon1` и `opp_icon2` без дополнительных запросов к поставщику линии.\n\n## [1.0.0] - 2026-07-25\n\n### Добавлено\n\n- Зафиксирована базовая версия нового клиентского API `/api/partner/**` и совместимых старых маршрутов.\n- Добавлены безопасное чтение купонов и подписанный HMAC-SHA256 callback.\n\n</details>","version":"1.6.2-DEMO"},"servers":[{"url":"/","description":"Текущий сервер BetCore"}],"security":[{"clientBearerAuth":[]}],"tags":[{"name":"Общее","description":"Проверка доступности клиентского API."},{"name":"Авторизация","description":"Вход клиента и получение JWT для остальных методов."},{"name":"Купоны","description":"Создание купонов и безопасное чтение только собственных купонов."},{"name":"Совместимость старого API","description":"Маршруты и JSON-форматы старой версии API. Они работают параллельно с новым клиентским API."}],"paths":{"/bet/place":{"post":{"tags":["Совместимость старого API"],"summary":"Создать купон через старый API","description":"Принимает тот же JSON старой версии и возвращает `body` как массив купонов без современной обертки `coupons`. При отказе из-за изменения коэффициента, блокировки или отсутствия исхода (`rejected`, `block`, `no_data`) сохраняется старый контракт: `error_code = 501`, `error_message = \"Coefficient is change\"`, а `body` содержит прямой массив причин. `change_type` всегда число `1`/`2` либо `null`, строковые значения `increase`/`decrease` не используются. Поля `callback_url`, `mode`, `mode_type` и `multi` поддерживаются. Новый маршрут: `POST /api/partner/coupons/place`.","operationId":"legacyPlace","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceCouponRequest"}}},"required":true},"responses":{"200":{"description":"Купон создан либо запрос отклонен с бизнес-кодом","content":{"application/json":{"schema":{"type":"object","description":"Совместимая оболочка старого клиентского API, дополненная полем `api_version`; при успехе `error_code` и `error_message` равны `null`, при обычной ошибке `body` равен `null`.","properties":{"code":{"type":"integer","format":"int32","description":"1 — успех, 0 — ошибка.","example":1},"api_version":{"type":"string","description":"Версия API, сформировавшая ответ. DEMO использует SemVer-суффикс `-DEMO`; production возвращает релизную версию без суффикса окружения.","example":"1.6.2-DEMO"},"body":{"type":"null","description":"Данные ответа.","oneOf":[{"type":"array","description":"Успех: массив созданных купонов.","items":{"$ref":"#/components/schemas/LegacyCouponResponse"}},{"type":"array","description":"Ошибка 501: массив причин отказа проверки линии.","items":{"$ref":"#/components/schemas/CoefficientChange"}},{"type":"boolean","description":"`false` только при ошибке JWT старого API."}]},"error_code":{"type":["integer","null"],"format":"int32","description":"Числовой код ошибки или `null` при успехе.","example":561},"error_message":{"type":["string","null"],"description":"Текст ошибки или `null` при успехе.","example":"Coupon not found"},"date":{"type":"integer","format":"int64","description":"Время формирования ответа, Unix timestamp в миллисекундах.","example":1753000000000}},"required":["api_version","body","code","date","error_code","error_message"]},"examples":{"success":{"summary":"Купон создан","value":{"code":1,"api_version":"1.6.2-DEMO","body":[{"coupon_code":"000000000272","amount":1.0,"win":1.85,"coef":1.85,"date":1753000000000,"status":0,"asian":false,"live":false,"calculate_date":null,"coupon_type":1,"events_count":1,"events_data":[{"game_id":737779544,"selection_id":null,"bet_group_id":1,"bet_group_name":"Исход матча","bet_id":1,"bet_name":"Победа Эйюпспора","uuid":"912","sport_id":1,"tournament":"Товарищеские матчи клубов","event_date":1753010800,"status":0,"opp1":"Эйюпспор","opp2":"Мардин 1969 Спор","opp_icon1":3080,"opp_icon2":363075,"coef":1.85,"calc_coef":null,"bet_score":"line#737779544#1#1#0#1.85","calculate_date":null,"calculate_score":"","settlement_reason_code":null,"settlement_reason":null,"timer":0,"dop_name":"","rate":"0","sport_name":"Футбол","tournament_id":10001,"tournament_name":"Товарищеские матчи клубов","main_game_id":null,"start_game":1753010800,"player_id":null}]}],"error_code":null,"error_message":null,"date":1753000000000}},"coefficientIncreased":{"summary":"Коэффициент вырос: change_type = 1","value":{"code":0,"api_version":"1.6.2-DEMO","body":[{"game_id":738917381,"bet_coefficient":1.85,"actual_coefficient":1.92,"change_type":1,"status":"rejected"}],"error_code":501,"error_message":"Coefficient is change","date":1753000000000}},"coefficientDecreased":{"summary":"Коэффициент снизился: change_type = 2","value":{"code":0,"api_version":"1.6.2-DEMO","body":[{"game_id":738917381,"bet_coefficient":2.19,"actual_coefficient":2.09,"change_type":2,"status":"rejected"}],"error_code":501,"error_message":"Coefficient is change","date":1753000000000}},"outcomeBlocked":{"summary":"Исход заблокирован: change_type = null","value":{"code":0,"api_version":"1.6.2-DEMO","body":[{"game_id":738917381,"bet_coefficient":1.85,"actual_coefficient":1.85,"change_type":null,"status":"block"}],"error_code":501,"error_message":"Coefficient is change","date":1753000000000}},"outcomeUnavailable":{"summary":"Исход отсутствует: change_type = null","value":{"code":0,"api_version":"1.6.2-DEMO","body":[{"game_id":738917381,"bet_coefficient":3.6,"actual_coefficient":null,"change_type":null,"status":"no_data"}],"error_code":501,"error_message":"Coefficient is change","date":1753000000000}},"wrongData":{"summary":"Неверные или неполные данные","value":{"code":0,"api_version":"1.6.2-DEMO","body":null,"error_code":505,"error_message":"Wrong data","date":1753000000000}},"wrongToken":{"summary":"Неверный JWT","value":{"code":0,"api_version":"1.6.2-DEMO","body":false,"error_code":1003,"error_message":"Wrong token","date":1753000000000}}}}}},"400":{"description":"Некорректный JSON или несовместимый тип поля в запросе"},"500":{"description":"Необработанная внутренняя ошибка HTTP-приложения"}},"security":[{"clientBearerAuth":[]}]}},"/api/v2/login":{"post":{"tags":["Совместимость старого API"],"summary":"Войти через старый клиентский API","description":"Полностью совместимый маршрут старой версии. При успехе `body` содержит только поле `token`. Новый расширенный маршрут: `POST /api/partner/login`.","operationId":"legacyLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientLoginRequest"},"examples":{"legacyLogin":{"summary":"Вход","value":{"login":"partner-demo","password":"strong-password"}}}}},"required":true},"responses":{"200":{"description":"JWT выдан либо учетные данные отклонены","content":{"application/json":{"schema":{"type":"object","description":"Совместимая оболочка старого клиентского API, дополненная полем `api_version`; при успехе `error_code` и `error_message` равны `null`, при обычной ошибке `body` равен `null`.","properties":{"code":{"type":"integer","format":"int32","description":"1 — успех, 0 — ошибка.","example":1},"api_version":{"type":"string","description":"Версия API, сформировавшая ответ. DEMO использует SemVer-суффикс `-DEMO`; production возвращает релизную версию без суффикса окружения.","example":"1.6.2-DEMO"},"body":{"type":"null","$ref":"#/components/schemas/LegacyClientLoginResponse","description":"Данные ответа."},"error_code":{"type":["integer","null"],"format":"int32","description":"Числовой код ошибки или `null` при успехе.","example":561},"error_message":{"type":["string","null"],"description":"Текст ошибки или `null` при успехе.","example":"Coupon not found"},"date":{"type":"integer","format":"int64","description":"Время формирования ответа, Unix timestamp в миллисекундах.","example":1753000000000}},"required":["api_version","body","code","date","error_code","error_message"]},"examples":{"success":{"summary":"Успешный вход","value":{"code":1,"api_version":"1.6.2-DEMO","body":{"token":"eyJhbGciOiJIUzI1NiJ9..."},"error_code":null,"error_message":null,"date":1753000000000}},"wrongCredentials":{"summary":"Неверный логин или пароль","value":{"code":0,"api_version":"1.6.2-DEMO","body":null,"error_code":99,"error_message":"Wrong login or password","date":1753000000000}}}}}},"400":{"description":"Некорректный JSON или несовместимый тип поля в запросе"},"500":{"description":"Необработанная внутренняя ошибка HTTP-приложения"}},"security":[]}},"/api/partner/login":{"post":{"tags":["Авторизация"],"summary":"Войти в клиентский API","description":"Проверяет логин и пароль клиента из раздела партнеров и выдает JWT роли `CLIENT`.\n\nПолученный `body.token` передавайте во всех операциях с купонами как\n`Authorization: Bearer <token>`. Идентификатор владельца сервер берет исключительно из подписанного\nтокена. Заголовок `X-Client-Id` больше не используется и не позволяет выбрать другой аккаунт.\n\nНовый маршрут различает неверные учетные данные (`1003`), отключенный аккаунт (`1004`) и\nистекший доступ (`1006`). Неизвестный логин и неверный пароль имеют одинаковый ответ, чтобы не\nраскрывать существование чужого аккаунта.\nСовместимый старый маршрут сохраняет общий код `99`.\n\n**Совместимый маршрут старого API:** `POST /api/v2/login`.","operationId":"login","requestBody":{"description":"Учетные данные клиента. Можно передать `username` или совместимое поле `login`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientLoginRequest"},"examples":{"username":{"summary":"Вход по имени пользователя","value":{"username":"partner-demo","password":"strong-password"}}}}},"required":true},"responses":{"200":{"description":"JWT выдан либо учетные данные отклонены","content":{"application/json":{"schema":{"type":"object","description":"Единая оболочка BetCore. `code = 1` означает успех, `code = 0` — бизнес-ошибку. Бизнес-ошибка обычно также возвращается с HTTP 200.","properties":{"code":{"type":"integer","format":"int32","description":"1 — успех, 0 — ошибка.","example":1},"api_version":{"type":"string","description":"Версия API, сформировавшая ответ. DEMO использует SemVer-суффикс `-DEMO`; production возвращает релизную версию без суффикса окружения.","example":"1.6.2-DEMO"},"body":{"type":"null","$ref":"#/components/schemas/ClientLoginResponse","description":"Данные ответа."},"error_code":{"type":["integer","null"],"format":"int32","description":"Числовой код бизнес-ошибки; отсутствует при успехе.","example":501},"error_message":{"type":["string","null"],"description":"Текст бизнес-ошибки; отсутствует при успехе.","example":"Coefficient is change"},"date":{"type":"integer","format":"int64","description":"Время формирования ответа, Unix timestamp в миллисекундах.","example":1753000000000},"time_ms":{"type":["integer","null"],"format":"int64","description":"Время обработки запроса сервером в миллисекундах.","example":12},"path":{"type":["string","null"],"description":"HTTP-путь обработанного запроса.","example":"/api/partner/coupons/place"}}},"examples":{"success":{"summary":"Успешный вход","value":{"code":1,"body":{"token":"eyJhbGciOiJIUzI1NiJ9...","user_id":17,"username":"partner-demo"},"date":1753000000000}},"wrongCredentials":{"summary":"Неверные учетные данные","value":{"code":0,"api_version":"1.6.2-DEMO","error_code":1003,"error_message":"Wrong login or password","date":1753000000000,"time_ms":5,"path":"/api/partner/login"}},"disabled":{"summary":"Аккаунт отключен","value":{"code":0,"api_version":"1.6.2-DEMO","error_code":1004,"error_message":"Client account is disabled","date":1753000000000,"time_ms":5,"path":"/api/partner/login"}},"expired":{"summary":"Срок доступа истек","value":{"code":0,"api_version":"1.6.2-DEMO","error_code":1006,"error_message":"Client access has expired","date":1753000000000,"time_ms":5,"path":"/api/partner/login"}}}}}},"400":{"description":"Некорректный JSON или несовместимый тип поля в запросе"},"500":{"description":"Необработанная внутренняя ошибка HTTP-приложения"}},"security":[]}},"/api/partner/coupons/results":{"post":{"tags":["Купоны"],"summary":"Получить свои купоны и результаты","description":"Возвращает купоны только авторизованного клиента. Поддерживаются два взаимоисключающих режима:\n\n1. `coupon_ids` — список до 100 отображаемых кодов купонов. Короткие числовые коды дополняются нулями\n   слева до 12 символов. Чужие и неизвестные коды не возвращаются и неотличимы друг от друга.\n2. `start_date` + `end_date` — все купоны клиента, созданные в указанном диапазоне. Оба значения — Unix\n   timestamp в миллисекундах; диапазон должен быть положительным и не превышать ровно 24 часа.\n\nНельзя одновременно передавать список кодов и даты. В ответ входят как рассчитанные, так и еще\nактивные купоны; финальные результаты определяются по `status`, `real_win`, `calculate_coef` и данным\n`events_data`.","operationId":"results","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientCouponResultsRequest"},"examples":{"byIds":{"summary":"По списку кодов","value":{"coupon_ids":["000000000272","000000000273"]}},"byTime":{"summary":"По времени создания","value":{"start_date":1753000000000,"end_date":1753086400000}}}}},"required":true},"responses":{"200":{"description":"Собственные купоны клиента либо ошибка параметров","content":{"application/json":{"schema":{"type":"object","description":"Единая оболочка BetCore. `code = 1` означает успех, `code = 0` — бизнес-ошибку. Бизнес-ошибка обычно также возвращается с HTTP 200.","properties":{"code":{"type":"integer","format":"int32","description":"1 — успех, 0 — ошибка.","example":1},"api_version":{"type":"string","description":"Версия API, сформировавшая ответ. DEMO использует SemVer-суффикс `-DEMO`; production возвращает релизную версию без суффикса окружения.","example":"1.6.2-DEMO"},"body":{"type":"null","$ref":"#/components/schemas/ClientCouponResultsResponse","description":"Данные ответа."},"error_code":{"type":["integer","null"],"format":"int32","description":"Числовой код бизнес-ошибки; отсутствует при успехе.","example":501},"error_message":{"type":["string","null"],"description":"Текст бизнес-ошибки; отсутствует при успехе.","example":"Coefficient is change"},"date":{"type":"integer","format":"int64","description":"Время формирования ответа, Unix timestamp в миллисекундах.","example":1753000000000},"time_ms":{"type":["integer","null"],"format":"int64","description":"Время обработки запроса сервером в миллисекундах.","example":12},"path":{"type":["string","null"],"description":"HTTP-путь обработанного запроса.","example":"/api/partner/coupons/place"}}},"examples":{"byIds":{"summary":"Результат выборки по кодам","value":{"code":1,"body":{"query_type":"ids","coupons":[{"coupon_code":"000000000272","amount":1.0,"win":1.85,"potential_win":1.85,"real_win":1.85,"coef":1.85,"original_coef":1.85,"calculate_coef":1.85,"has_return":false,"date":1753000000000,"status":2,"asian":false,"calculate_date":1753003600000,"coupon_type":1,"events_count":1,"events_data":[{"id":912,"selection_id":null,"game_id":737779544,"main_game_id":737779544,"sub_game":false,"parent_game_id":null,"sub_game_key":null,"raw_pointer":"line#737779544#1#1#0#1.85","line_type":"line","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":1753010800,"status":1,"opp1":"Эйюпспор","opp2":"Мардин 1969 Спор","team1_id":3080,"team2_id":363075,"opp_icon1":3080,"opp_icon2":363075,"coef":1.85,"calc_coef":1.85,"bet_score":"line#737779544#1#1#0#1.85","calculate_date":1753003600000,"calculate_score":"2:1 (1:0, 1:1)","placement_score_full":null,"placement_score_periods":null,"calculation_score_full":"2:1","calculation_score_periods":null,"settlement_reason_code":"AUTOMATIC_SETTLEMENT","settlement_reason":"Calculated automatically","timer":null,"dop_name":null,"rate":"0","sgame_id":null,"game_num":null,"stat_id":null}]}]},"date":1753000000000}},"invalidRange":{"summary":"Интервал больше суток","value":{"code":0,"api_version":"1.6.2-DEMO","error_code":1002,"error_message":"Date range must be positive and not exceed 24 hours","date":1753000000000,"time_ms":5,"path":"/api/partner/coupons/results"}}}}}},"400":{"description":"Некорректный JSON или несовместимый тип поля в запросе"},"500":{"description":"Необработанная внутренняя ошибка HTTP-приложения"}},"security":[{"clientBearerAuth":[]}]}},"/api/partner/coupons/place":{"post":{"tags":["Купоны"],"summary":"Создать купон","description":"Проверяет ставки по актуальной линии и сохраняет купон партнера.\n\n**Формат каждого элемента `list_bets`:**\n`line_type#game_id#group_id#type_id#rate#coefficient[#player_id]`.\nВместо `#` допускается разделитель `|`.\n\n- `line_type`: `line` для прематча или `live` для лайва;\n- `game_id`: идентификатор события или саб-игры в линии;\n- `group_id`: идентификатор группы ставок;\n- `type_id`: идентификатор исхода;\n- `rate`: параметр исхода, например значение тотала или форы; для исхода без параметра передается `0`;\n- `coefficient`: коэффициент, который видел клиент;\n- `player_id`: необязательный идентификатор игрока для персональных рынков.\n\nПо умолчанию изменение коэффициента приводит к отказу (`mode = reject`). Для `mode = accept`\nпараметр `mode_type` задает допустимое направление: `1` — только повышение, `2` — только понижение,\n`3` — любое изменение. При `multi = false` все ставки создают один одиночный/экспресс-купон;\nповтор одного основного матча внутри такого купона запрещен. При `multi = true` каждая ставка становится\nотдельным купоном.\n\nОрдинар отправляется после окончательного расчета. Экспресс до первого проигрыша отправляется после\nкаждого нового расчета ставки. При первом проигрыше результат отправляется сразу, следующие промежуточные\nрасчеты подавляются, а окончательный снимок отправляется после расчета всех ставок экспресса.\nПакет формируется в течение 5–10 секунд и содержит не более 100 снимков купонов одного клиента\nс одним callback URL.\nЕсли поле отсутствует, равно `null` или содержит пустую строку, callback не отправляется. Отправка также\nне выполняется, когда она выключена в настройках партнера.\n\nJSON сериализуется один раз в точные байты UTF-8. Заголовок `X-Coupon-Signature` содержит\n`sha256=<HMAC-SHA256(raw_json_body, callback_secret)>`; на сервер отправляются те же байты, по которым\nрассчитана подпись. Секрет в JSON и заголовках не передается. Только HTTP `200` означает успешную\nдоставку. При timeout или HTTP `500`, `502`, `503`, `504` выполняются повторы через 1, 5, 15 и 60 минут.\n\nБизнес-ошибки возвращаются с HTTP 200 и `code = 0`; подробности находятся в `error_code`,\n`error_message` и, при изменении линии, в `body.changes`.\n\n**Совместимый маршрут старого API:** `POST /api/v3/partner/bet/place`.","operationId":"place","requestBody":{"description":"Параметры создаваемого купона. Неизвестные поля игнорируются.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceCouponRequest"},"examples":{"single":{"summary":"Одиночная прематч-ставка","value":{"list_bets":["line#737779544#1#1#0#1.85"],"amount":1.0,"user_id":501,"currency":"UAH","callback_url":"https://partner.example/api/betcore/coupon-result","lang":"ru","mode":"reject","multi":false}},"accept-change":{"summary":"Принять любое изменение коэффициента","value":{"list_bets":["live|737779544|17|9|2.5|1.92"],"amount":1.0,"currency":"UAH","lang":"ru","mode":"accept","mode_type":3,"multi":false}}}}},"required":true},"responses":{"200":{"description":"Купон создан либо запрос отклонен с бизнес-кодом ошибки","content":{"application/json":{"schema":{"type":"object","description":"Единая оболочка BetCore. `code = 1` означает успех, `code = 0` — бизнес-ошибку. Бизнес-ошибка обычно также возвращается с HTTP 200.","properties":{"code":{"type":"integer","format":"int32","description":"1 — успех, 0 — ошибка.","example":1},"api_version":{"type":"string","description":"Версия API, сформировавшая ответ. DEMO использует SemVer-суффикс `-DEMO`; production возвращает релизную версию без суффикса окружения.","example":"1.6.2-DEMO"},"body":{"type":"null","$ref":"#/components/schemas/PartnerCouponPlacementBody","description":"Данные ответа."},"error_code":{"type":["integer","null"],"format":"int32","description":"Числовой код бизнес-ошибки; отсутствует при успехе.","example":501},"error_message":{"type":["string","null"],"description":"Текст бизнес-ошибки; отсутствует при успехе.","example":"Coefficient is change"},"date":{"type":"integer","format":"int64","description":"Время формирования ответа, Unix timestamp в миллисекундах.","example":1753000000000},"time_ms":{"type":["integer","null"],"format":"int64","description":"Время обработки запроса сервером в миллисекундах.","example":12},"path":{"type":["string","null"],"description":"HTTP-путь обработанного запроса.","example":"/api/partner/coupons/place"}}},"examples":{"success":{"summary":"Купон создан","value":{"code":1,"api_version":"1.6.2-DEMO","body":{"coupons":[{"coupon_code":"000000000272","amount":1.0,"win":1.85,"potential_win":1.85,"real_win":null,"coef":1.85,"original_coef":1.85,"calculate_coef":null,"has_return":false,"date":1753000000000,"status":0,"asian":false,"calculate_date":null,"coupon_type":1,"events_count":1,"events_data":[{"id":912,"selection_id":null,"game_id":737779544,"main_game_id":737779544,"sub_game":false,"parent_game_id":null,"sub_game_key":null,"raw_pointer":"line#737779544#1#1#0#1.85","line_type":"line","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":1753010800,"status":0,"opp1":"Эйюпспор","opp2":"Мардин 1969 Спор","team1_id":3080,"team2_id":363075,"opp_icon1":3080,"opp_icon2":363075,"coef":1.85,"calc_coef":null,"bet_score":"line#737779544#1#1#0#1.85","calculate_date":null,"calculate_score":null,"placement_score_full":null,"placement_score_periods":null,"calculation_score_full":null,"calculation_score_periods":null,"settlement_reason_code":null,"settlement_reason":null,"timer":null,"dop_name":null,"rate":"0","sgame_id":null,"game_num":null,"stat_id":null}]}]},"date":1753000000000,"time_ms":24,"path":"/api/partner/coupons/place"}},"coefficientChanged":{"summary":"Коэффициент изменился","value":{"code":0,"api_version":"1.6.2-DEMO","body":{"changes":[{"game_id":737779544,"bet_coefficient":1.85,"actual_coefficient":1.92,"change_type":1,"status":"rejected"}]},"error_code":501,"error_message":"Coefficient is change","date":1753000000000,"time_ms":18,"path":"/api/partner/coupons/place"}},"outcomeUnavailable":{"summary":"Исход отсутствует в линии","value":{"code":0,"api_version":"1.6.2-DEMO","body":{"changes":[{"game_id":738917381,"bet_coefficient":3.6,"actual_coefficient":null,"change_type":null,"status":"no_data"}]},"error_code":502,"error_message":"Bet outcome is not available","date":1753000000000,"time_ms":18,"path":"/api/partner/coupons/place"}},"outcomeBlocked":{"summary":"Исход заблокирован","value":{"code":0,"api_version":"1.6.2-DEMO","body":{"changes":[{"game_id":738917381,"bet_coefficient":3.6,"actual_coefficient":null,"change_type":null,"status":"block"}]},"error_code":503,"error_message":"Bet outcome is blocked","date":1753000000000,"time_ms":18,"path":"/api/partner/coupons/place"}},"invalidPointer":{"summary":"Неверный формат указателя","value":{"code":0,"api_version":"1.6.2-DEMO","error_code":11,"error_message":"Invalid bet pointer format","date":1753000000000,"time_ms":5,"path":"/api/partner/coupons/place"}},"clientNotFound":{"summary":"Клиент не найден","value":{"code":0,"api_version":"1.6.2-DEMO","error_code":1005,"error_message":"Client not found","date":1753000000000,"time_ms":5,"path":"/api/partner/coupons/place"}}}}}},"400":{"description":"Некорректный JSON или несовместимый тип поля в запросе"},"500":{"description":"Необработанная внутренняя ошибка HTTP-приложения"}},"callbacks":{"couponSettled":{"{$request.body#/callback_url}":{"post":{"summary":"Получить пакет обновлений расчета купонов","description":"BetCore собирает снимки расчета купонов одного клиента в течение 5–10 секунд и отправляет до 100 снимков одним POST. Экспресс до первого проигрыша сообщает каждый рассчитанный исход; после проигрыша сообщает его сразу и затем только окончательное завершение всех исходов. Для одного купона `coupon_version` монотонно растет. Доставка выполняется как минимум один раз, поэтому получатель должен дедуплицировать повторный `batchId` и применять только версию купона, которая больше уже сохраненной. Порядок элементов `events_data` не является контрактом: synthetic-исход сопоставляется по `selection_id`, а его внутренний ID — по `uuid`. `X-Coupon-Signature` содержит HMAC-SHA256 точных байтов UTF-8 тела с секретом партнера в формате `sha256=<hex>`. Только HTTP 200 подтверждает доставку. При timeout или HTTP 500, 502, 503, 504 BetCore повторяет отправку через 1, 5, 15 и 60 минут.","parameters":[{"name":"X-Coupon-Signature","in":"header","description":"Подпись `sha256=<HMAC-SHA256(raw_json_body, callback_secret)>`.","required":true,"schema":{"type":"string","example":"sha256=4f1f6f9d..."}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientCouponSettlementCallback"},"examples":{"settled":{"summary":"Пакет результатов купонов","value":{"event":"coupons.settled","batchId":"d407e986f3a64d9d36a77bf532322ef8","clientId":1,"couponCount":2,"coupons":[{"coupon_code":"000000000272","coupon_version":17,"realWin":1.85,"calculate_coefficient":1.85,"status":2,"calculate_date":1753003600000,"events_data":[{"uuid":"912","selection_id":null,"status":1,"calculate_coefficient":1.85,"calculate_date":1753003600000,"calculate_score":"2:1 (1:0, 1:1)","settlement_reason_code":"REMOTE_WIN","settlement_reason":"Win","timer":0}]},{"coupon_code":"000000000273","coupon_version":11,"realWin":0.0,"calculate_coefficient":0.0,"status":0,"calculate_date":1753003605000,"events_data":[{"uuid":"913","selection_id":null,"status":1,"calculate_coefficient":1.7,"calculate_date":1753003605000,"calculate_score":"1:0","settlement_reason_code":"AUTOMATIC_SETTLEMENT","settlement_reason":"Calculated automatically","timer":0},{"uuid":"914","selection_id":null,"status":0,"calculate_coefficient":null,"calculate_date":null,"calculate_score":"","settlement_reason_code":null,"settlement_reason":null,"timer":0}]}]}}}}},"required":true},"responses":{"200":{"description":"Callback доставлен"},"401":{"description":"Неверная подпись"},"403":{"description":"IP сервера BetCore запрещен получателем"},"503":{"description":"На стороне получателя не настроен callback-секрет; повтор через 1, 5, 15 и 60 минут"},"default":{"description":"Иная ошибка доставки"}}}}}},"security":[{"clientBearerAuth":[]}]}},"/api/v3/partner/bet/place":{"post":{"tags":["Купоны"],"summary":"Создать купон","description":"Проверяет ставки по актуальной линии и сохраняет купон партнера.\n\n**Формат каждого элемента `list_bets`:**\n`line_type#game_id#group_id#type_id#rate#coefficient[#player_id]`.\nВместо `#` допускается разделитель `|`.\n\n- `line_type`: `line` для прематча или `live` для лайва;\n- `game_id`: идентификатор события или саб-игры в линии;\n- `group_id`: идентификатор группы ставок;\n- `type_id`: идентификатор исхода;\n- `rate`: параметр исхода, например значение тотала или форы; для исхода без параметра передается `0`;\n- `coefficient`: коэффициент, который видел клиент;\n- `player_id`: необязательный идентификатор игрока для персональных рынков.\n\nПо умолчанию изменение коэффициента приводит к отказу (`mode = reject`). Для `mode = accept`\nпараметр `mode_type` задает допустимое направление: `1` — только повышение, `2` — только понижение,\n`3` — любое изменение. При `multi = false` все ставки создают один одиночный/экспресс-купон;\nповтор одного основного матча внутри такого купона запрещен. При `multi = true` каждая ставка становится\nотдельным купоном.\n\nОрдинар отправляется после окончательного расчета. Экспресс до первого проигрыша отправляется после\nкаждого нового расчета ставки. При первом проигрыше результат отправляется сразу, следующие промежуточные\nрасчеты подавляются, а окончательный снимок отправляется после расчета всех ставок экспресса.\nПакет формируется в течение 5–10 секунд и содержит не более 100 снимков купонов одного клиента\nс одним callback URL.\nЕсли поле отсутствует, равно `null` или содержит пустую строку, callback не отправляется. Отправка также\nне выполняется, когда она выключена в настройках партнера.\n\nJSON сериализуется один раз в точные байты UTF-8. Заголовок `X-Coupon-Signature` содержит\n`sha256=<HMAC-SHA256(raw_json_body, callback_secret)>`; на сервер отправляются те же байты, по которым\nрассчитана подпись. Секрет в JSON и заголовках не передается. Только HTTP `200` означает успешную\nдоставку. При timeout или HTTP `500`, `502`, `503`, `504` выполняются повторы через 1, 5, 15 и 60 минут.\n\nБизнес-ошибки возвращаются с HTTP 200 и `code = 0`; подробности находятся в `error_code`,\n`error_message` и, при изменении линии, в `body.changes`.\n\n**Совместимый маршрут старого API:** `POST /api/v3/partner/bet/place`.","operationId":"place_2","requestBody":{"description":"Параметры создаваемого купона. Неизвестные поля игнорируются.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaceCouponRequest"},"examples":{"single":{"summary":"Одиночная прематч-ставка","value":{"list_bets":["line#737779544#1#1#0#1.85"],"amount":1.0,"user_id":501,"currency":"UAH","callback_url":"https://partner.example/api/betcore/coupon-result","lang":"ru","mode":"reject","multi":false}},"accept-change":{"summary":"Принять любое изменение коэффициента","value":{"list_bets":["live|737779544|17|9|2.5|1.92"],"amount":1.0,"currency":"UAH","lang":"ru","mode":"accept","mode_type":3,"multi":false}}}}},"required":true},"responses":{"200":{"description":"Купон создан либо запрос отклонен с бизнес-кодом ошибки","content":{"application/json":{"schema":{"type":"object","description":"Единая оболочка BetCore. `code = 1` означает успех, `code = 0` — бизнес-ошибку. Бизнес-ошибка обычно также возвращается с HTTP 200.","properties":{"code":{"type":"integer","format":"int32","description":"1 — успех, 0 — ошибка.","example":1},"api_version":{"type":"string","description":"Версия API, сформировавшая ответ. DEMO использует SemVer-суффикс `-DEMO`; production возвращает релизную версию без суффикса окружения.","example":"1.6.2-DEMO"},"body":{"type":"null","$ref":"#/components/schemas/PartnerCouponPlacementBody","description":"Данные ответа."},"error_code":{"type":["integer","null"],"format":"int32","description":"Числовой код бизнес-ошибки; отсутствует при успехе.","example":501},"error_message":{"type":["string","null"],"description":"Текст бизнес-ошибки; отсутствует при успехе.","example":"Coefficient is change"},"date":{"type":"integer","format":"int64","description":"Время формирования ответа, Unix timestamp в миллисекундах.","example":1753000000000},"time_ms":{"type":["integer","null"],"format":"int64","description":"Время обработки запроса сервером в миллисекундах.","example":12},"path":{"type":["string","null"],"description":"HTTP-путь обработанного запроса.","example":"/api/partner/coupons/place"}}},"examples":{"success":{"summary":"Купон создан","value":{"code":1,"api_version":"1.6.2-DEMO","body":{"coupons":[{"coupon_code":"000000000272","amount":1.0,"win":1.85,"potential_win":1.85,"real_win":null,"coef":1.85,"original_coef":1.85,"calculate_coef":null,"has_return":false,"date":1753000000000,"status":0,"asian":false,"calculate_date":null,"coupon_type":1,"events_count":1,"events_data":[{"id":912,"selection_id":null,"game_id":737779544,"main_game_id":737779544,"sub_game":false,"parent_game_id":null,"sub_game_key":null,"raw_pointer":"line#737779544#1#1#0#1.85","line_type":"line","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":1753010800,"status":0,"opp1":"Эйюпспор","opp2":"Мардин 1969 Спор","team1_id":3080,"team2_id":363075,"opp_icon1":3080,"opp_icon2":363075,"coef":1.85,"calc_coef":null,"bet_score":"line#737779544#1#1#0#1.85","calculate_date":null,"calculate_score":null,"placement_score_full":null,"placement_score_periods":null,"calculation_score_full":null,"calculation_score_periods":null,"settlement_reason_code":null,"settlement_reason":null,"timer":null,"dop_name":null,"rate":"0","sgame_id":null,"game_num":null,"stat_id":null}]}]},"date":1753000000000,"time_ms":24,"path":"/api/partner/coupons/place"}},"coefficientChanged":{"summary":"Коэффициент изменился","value":{"code":0,"api_version":"1.6.2-DEMO","body":{"changes":[{"game_id":737779544,"bet_coefficient":1.85,"actual_coefficient":1.92,"change_type":1,"status":"rejected"}]},"error_code":501,"error_message":"Coefficient is change","date":1753000000000,"time_ms":18,"path":"/api/partner/coupons/place"}},"outcomeUnavailable":{"summary":"Исход отсутствует в линии","value":{"code":0,"api_version":"1.6.2-DEMO","body":{"changes":[{"game_id":738917381,"bet_coefficient":3.6,"actual_coefficient":null,"change_type":null,"status":"no_data"}]},"error_code":502,"error_message":"Bet outcome is not available","date":1753000000000,"time_ms":18,"path":"/api/partner/coupons/place"}},"outcomeBlocked":{"summary":"Исход заблокирован","value":{"code":0,"api_version":"1.6.2-DEMO","body":{"changes":[{"game_id":738917381,"bet_coefficient":3.6,"actual_coefficient":null,"change_type":null,"status":"block"}]},"error_code":503,"error_message":"Bet outcome is blocked","date":1753000000000,"time_ms":18,"path":"/api/partner/coupons/place"}},"invalidPointer":{"summary":"Неверный формат указателя","value":{"code":0,"api_version":"1.6.2-DEMO","error_code":11,"error_message":"Invalid bet pointer format","date":1753000000000,"time_ms":5,"path":"/api/partner/coupons/place"}},"clientNotFound":{"summary":"Клиент не найден","value":{"code":0,"api_version":"1.6.2-DEMO","error_code":1005,"error_message":"Client not found","date":1753000000000,"time_ms":5,"path":"/api/partner/coupons/place"}}}}}},"400":{"description":"Некорректный JSON или несовместимый тип поля в запросе"},"500":{"description":"Необработанная внутренняя ошибка HTTP-приложения"}},"callbacks":{"couponSettled":{"{$request.body#/callback_url}":{"post":{"summary":"Получить пакет обновлений расчета купонов","description":"BetCore собирает снимки расчета купонов одного клиента в течение 5–10 секунд и отправляет до 100 снимков одним POST. Экспресс до первого проигрыша сообщает каждый рассчитанный исход; после проигрыша сообщает его сразу и затем только окончательное завершение всех исходов. Для одного купона `coupon_version` монотонно растет. Доставка выполняется как минимум один раз, поэтому получатель должен дедуплицировать повторный `batchId` и применять только версию купона, которая больше уже сохраненной. Порядок элементов `events_data` не является контрактом: synthetic-исход сопоставляется по `selection_id`, а его внутренний ID — по `uuid`. `X-Coupon-Signature` содержит HMAC-SHA256 точных байтов UTF-8 тела с секретом партнера в формате `sha256=<hex>`. Только HTTP 200 подтверждает доставку. При timeout или HTTP 500, 502, 503, 504 BetCore повторяет отправку через 1, 5, 15 и 60 минут.","parameters":[{"name":"X-Coupon-Signature","in":"header","description":"Подпись `sha256=<HMAC-SHA256(raw_json_body, callback_secret)>`.","required":true,"schema":{"type":"string","example":"sha256=4f1f6f9d..."}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientCouponSettlementCallback"},"examples":{"settled":{"summary":"Пакет результатов купонов","value":{"event":"coupons.settled","batchId":"d407e986f3a64d9d36a77bf532322ef8","clientId":1,"couponCount":2,"coupons":[{"coupon_code":"000000000272","coupon_version":17,"realWin":1.85,"calculate_coefficient":1.85,"status":2,"calculate_date":1753003600000,"events_data":[{"uuid":"912","selection_id":null,"status":1,"calculate_coefficient":1.85,"calculate_date":1753003600000,"calculate_score":"2:1 (1:0, 1:1)","settlement_reason_code":"REMOTE_WIN","settlement_reason":"Win","timer":0}]},{"coupon_code":"000000000273","coupon_version":11,"realWin":0.0,"calculate_coefficient":0.0,"status":0,"calculate_date":1753003605000,"events_data":[{"uuid":"913","selection_id":null,"status":1,"calculate_coefficient":1.7,"calculate_date":1753003605000,"calculate_score":"1:0","settlement_reason_code":"AUTOMATIC_SETTLEMENT","settlement_reason":"Calculated automatically","timer":0},{"uuid":"914","selection_id":null,"status":0,"calculate_coefficient":null,"calculate_date":null,"calculate_score":"","settlement_reason_code":null,"settlement_reason":null,"timer":0}]}]}}}}},"required":true},"responses":{"200":{"description":"Callback доставлен"},"401":{"description":"Неверная подпись"},"403":{"description":"IP сервера BetCore запрещен получателем"},"503":{"description":"На стороне получателя не настроен callback-секрет; повтор через 1, 5, 15 и 60 минут"},"default":{"description":"Иная ошибка доставки"}}}}}},"security":[{"clientBearerAuth":[]}]}},"/coupons/get":{"get":{"tags":["Совместимость старого API"],"summary":"Получить свой купон через старый API","description":"Принимает обязательный 12-значный `coupon_code`. Купон другого клиента не возвращается. Новый маршрут: `GET /api/partner/coupons/get`.","operationId":"legacyGetCoupon","parameters":[{"name":"coupon_code","in":"query","description":"Ровно 12 цифр.","required":true,"schema":{"type":"string"},"example":"000000000272"}],"responses":{"200":{"description":"Купон найден либо возвращена бизнес-ошибка","content":{"application/json":{"schema":{"type":"object","description":"Совместимая оболочка старого клиентского API, дополненная полем `api_version`; при успехе `error_code` и `error_message` равны `null`, при обычной ошибке `body` равен `null`.","properties":{"code":{"type":"integer","format":"int32","description":"1 — успех, 0 — ошибка.","example":1},"api_version":{"type":"string","description":"Версия API, сформировавшая ответ. DEMO использует SemVer-суффикс `-DEMO`; production возвращает релизную версию без суффикса окружения.","example":"1.6.2-DEMO"},"body":{"type":"null","$ref":"#/components/schemas/LegacyCouponResponse","description":"Данные ответа."},"error_code":{"type":["integer","null"],"format":"int32","description":"Числовой код ошибки или `null` при успехе.","example":561},"error_message":{"type":["string","null"],"description":"Текст ошибки или `null` при успехе.","example":"Coupon not found"},"date":{"type":"integer","format":"int64","description":"Время формирования ответа, Unix timestamp в миллисекундах.","example":1753000000000}},"required":["api_version","body","code","date","error_code","error_message"]},"examples":{"success":{"summary":"Купон найден","value":{"code":1,"api_version":"1.6.2-DEMO","body":{"coupon_code":"000000000272","amount":1.0,"win":1.85,"coef":1.85,"date":1753000000000,"status":0,"asian":false,"live":false,"calculate_date":null,"coupon_type":1,"events_count":1,"events_data":[{"game_id":737779544,"selection_id":null,"bet_group_id":1,"bet_group_name":"Исход матча","bet_id":1,"bet_name":"Победа Эйюпспора","uuid":"912","sport_id":1,"tournament":"Товарищеские матчи клубов","event_date":1753010800,"status":0,"opp1":"Эйюпспор","opp2":"Мардин 1969 Спор","opp_icon1":3080,"opp_icon2":363075,"coef":1.85,"calc_coef":null,"bet_score":"line#737779544#1#1#0#1.85","calculate_date":null,"calculate_score":"","settlement_reason_code":null,"settlement_reason":null,"timer":0,"dop_name":"","rate":"0","sport_name":"Футбол","tournament_id":10001,"tournament_name":"Товарищеские матчи клубов","main_game_id":null,"start_game":1753010800,"player_id":null}]},"error_code":null,"error_message":null,"date":1753000000000}},"invalid":{"summary":"Неверный код","value":{"code":0,"api_version":"1.6.2-DEMO","body":null,"error_code":560,"error_message":"Missing or invalid format coupon_code","date":1753000000000}},"notFound":{"summary":"Купон не найден","value":{"code":0,"api_version":"1.6.2-DEMO","body":null,"error_code":561,"error_message":"Coupon not found","date":1753000000000}}}}}},"400":{"description":"Некорректный JSON или несовместимый тип поля в запросе"},"500":{"description":"Необработанная внутренняя ошибка HTTP-приложения"}},"security":[{"clientBearerAuth":[]}]}},"/coupons/cashout":{"get":{"tags":["Совместимость старого API"],"summary":"Проверить текущую стоимость купона","description":"Совместимый расчет cashout старого API. Доступен только для активного собственного купона. Сервис повторно проверяет каждый незавершенный исход по актуальной линии и возвращает старые и новые коэффициенты.","operationId":"legacyCashout","parameters":[{"name":"coupon_code","in":"query","description":"12-значный код купона.","required":true,"schema":{"type":"string"},"example":"000000000272"}],"responses":{"200":{"description":"Расчет cashout либо бизнес-ошибка","content":{"application/json":{"schema":{"type":"object","description":"Совместимая оболочка старого клиентского API, дополненная полем `api_version`; при успехе `error_code` и `error_message` равны `null`, при обычной ошибке `body` равен `null`.","properties":{"code":{"type":"integer","format":"int32","description":"1 — успех, 0 — ошибка.","example":1},"api_version":{"type":"string","description":"Версия API, сформировавшая ответ. DEMO использует SemVer-суффикс `-DEMO`; production возвращает релизную версию без суффикса окружения.","example":"1.6.2-DEMO"},"body":{"type":"null","$ref":"#/components/schemas/LegacyCouponCashoutResponse","description":"Данные ответа."},"error_code":{"type":["integer","null"],"format":"int32","description":"Числовой код ошибки или `null` при успехе.","example":561},"error_message":{"type":["string","null"],"description":"Текст ошибки или `null` при успехе.","example":"Coupon not found"},"date":{"type":"integer","format":"int64","description":"Время формирования ответа, Unix timestamp в миллисекундах.","example":1753000000000}},"required":["api_version","body","code","date","error_code","error_message"]},"examples":{"success":{"summary":"Расчет выполнен","value":{"code":1,"api_version":"1.6.2-DEMO","body":{"amount":10.0,"old_coef":2.0,"old_win":20.0,"new_coef":2.1,"new_win":21.0,"events_data":[{"uuid":"912","old_coef":2.0,"new_coef":2.1,"has_change":true}]},"error_code":null,"error_message":null,"date":1753000000000}},"notAvailable":{"summary":"Продажа недоступна","value":{"code":0,"api_version":"1.6.2-DEMO","body":null,"error_code":565,"error_message":"The coupon cannot be sold.","date":1753000000000}}}}}},"400":{"description":"Некорректный JSON или несовместимый тип поля в запросе"},"500":{"description":"Необработанная внутренняя ошибка HTTP-приложения"}},"security":[{"clientBearerAuth":[]}]}},"/coupons/calculated":{"get":{"tags":["Совместимость старого API"],"summary":"Получить рассчитанные купоны через старый API","description":"Возвращает собственные окончательно рассчитанные купоны за последние `time` минут. По умолчанию 5 минут, максимум 120. Все словарные названия возвращаются в полном виде.","operationId":"legacyCalculated_1","parameters":[{"name":"arg1","in":"query","required":false,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Список рассчитанных купонов","content":{"application/json":{"schema":{"type":"object","description":"Совместимая оболочка старого клиентского API, дополненная полем `api_version`; при успехе `error_code` и `error_message` равны `null`, при обычной ошибке `body` равен `null`.","properties":{"code":{"type":"integer","format":"int32","description":"1 — успех, 0 — ошибка.","example":1},"api_version":{"type":"string","description":"Версия API, сформировавшая ответ. DEMO использует SemVer-суффикс `-DEMO`; production возвращает релизную версию без суффикса окружения.","example":"1.6.2-DEMO"},"body":{"type":["array","null"],"description":"Данные ответа.","items":{"$ref":"#/components/schemas/LegacyCouponResponse"}},"error_code":{"type":["integer","null"],"format":"int32","description":"Числовой код ошибки или `null` при успехе.","example":561},"error_message":{"type":["string","null"],"description":"Текст ошибки или `null` при успехе.","example":"Coupon not found"},"date":{"type":"integer","format":"int64","description":"Время формирования ответа, Unix timestamp в миллисекундах.","example":1753000000000}},"required":["api_version","body","code","date","error_code","error_message"]},"examples":{"success":{"summary":"Результат","value":{"code":1,"api_version":"1.6.2-DEMO","body":[{"coupon_code":"000000000272","amount":1.0,"win":1.85,"coef":1.85,"date":1753000000000,"status":2,"asian":false,"live":false,"calculate_date":1753003600000,"coupon_type":1,"events_count":1,"events_data":[{"game_id":737779544,"selection_id":null,"bet_group_id":1,"bet_group_name":"Исход матча","bet_id":1,"bet_name":"Победа Эйюпспора","uuid":"912","sport_id":1,"tournament":"Товарищеские матчи клубов","event_date":1753010800,"status":1,"opp1":"Эйюпспор","opp2":"Мардин 1969 Спор","opp_icon1":3080,"opp_icon2":363075,"coef":1.85,"calc_coef":1.85,"bet_score":"line#737779544#1#1#0#1.85","calculate_date":1753003600000,"calculate_score":"2:1 (1:0, 1:1)","settlement_reason_code":"AUTOMATIC_SETTLEMENT","settlement_reason":"Calculated automatically","timer":0,"dop_name":"","rate":"0","sport_name":"Футбол","tournament_id":10001,"tournament_name":"Товарищеские матчи клубов","main_game_id":null,"start_game":1753010800,"player_id":null}]}],"error_code":null,"error_message":null,"date":1753000000000}}}}}},"400":{"description":"Некорректный JSON или несовместимый тип поля в запросе"},"500":{"description":"Необработанная внутренняя ошибка HTTP-приложения"}},"security":[{"clientBearerAuth":[]}]}},"/api/v3/partner/bet/list":{"get":{"tags":["Совместимость старого API"],"summary":"Получить список своих купонов через старый API","description":"Параметры `start_date` и `end_date` передаются в Unix-миллисекундах. Если обе даты отсутствуют, возвращаются последние сутки. Можно передать только одну границу; вторая будет вычислена на сутки. Интервал не может превышать 24 часа.","operationId":"legacyCouponList_1","parameters":[{"name":"start_date","in":"query","description":"Начало периода, Unix-миллисекунды.","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"end_date","in":"query","description":"Конец периода, Unix-миллисекунды.","required":false,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"Список собственных купонов","content":{"application/json":{"schema":{"type":"object","description":"Совместимая оболочка старого клиентского API, дополненная полем `api_version`; при успехе `error_code` и `error_message` равны `null`, при обычной ошибке `body` равен `null`.","properties":{"code":{"type":"integer","format":"int32","description":"1 — успех, 0 — ошибка.","example":1},"api_version":{"type":"string","description":"Версия API, сформировавшая ответ. DEMO использует SemVer-суффикс `-DEMO`; production возвращает релизную версию без суффикса окружения.","example":"1.6.2-DEMO"},"body":{"type":["array","null"],"description":"Данные ответа.","items":{"$ref":"#/components/schemas/LegacyCouponResponse"}},"error_code":{"type":["integer","null"],"format":"int32","description":"Числовой код ошибки или `null` при успехе.","example":561},"error_message":{"type":["string","null"],"description":"Текст ошибки или `null` при успехе.","example":"Coupon not found"},"date":{"type":"integer","format":"int64","description":"Время формирования ответа, Unix timestamp в миллисекундах.","example":1753000000000}},"required":["api_version","body","code","date","error_code","error_message"]},"examples":{"success":{"summary":"Результат","value":{"code":1,"api_version":"1.6.2-DEMO","body":[{"coupon_code":"000000000272","amount":1.0,"win":1.85,"coef":1.85,"date":1753000000000,"status":0,"asian":false,"live":false,"calculate_date":null,"coupon_type":1,"events_count":1,"events_data":[{"game_id":737779544,"selection_id":null,"bet_group_id":1,"bet_group_name":"Исход матча","bet_id":1,"bet_name":"Победа Эйюпспора","uuid":"912","sport_id":1,"tournament":"Товарищеские матчи клубов","event_date":1753010800,"status":0,"opp1":"Эйюпспор","opp2":"Мардин 1969 Спор","opp_icon1":3080,"opp_icon2":363075,"coef":1.85,"calc_coef":null,"bet_score":"line#737779544#1#1#0#1.85","calculate_date":null,"calculate_score":"","settlement_reason_code":null,"settlement_reason":null,"timer":0,"dop_name":"","rate":"0","sport_name":"Футбол","tournament_id":10001,"tournament_name":"Товарищеские матчи клубов","main_game_id":null,"start_game":1753010800,"player_id":null}]}],"error_code":null,"error_message":null,"date":1753000000000}}}}}},"400":{"description":"Некорректный JSON или несовместимый тип поля в запросе"},"500":{"description":"Необработанная внутренняя ошибка HTTP-приложения"}},"security":[{"clientBearerAuth":[]}]}},"/coupons/list":{"get":{"tags":["Совместимость старого API"],"summary":"Получить список своих купонов через старый API","description":"Параметры `start_date` и `end_date` передаются в Unix-миллисекундах. Если обе даты отсутствуют, возвращаются последние сутки. Можно передать только одну границу; вторая будет вычислена на сутки. Интервал не может превышать 24 часа.","operationId":"legacyCouponList_3","parameters":[{"name":"start_date","in":"query","description":"Начало периода, Unix-миллисекунды.","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"end_date","in":"query","description":"Конец периода, Unix-миллисекунды.","required":false,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"Список собственных купонов","content":{"application/json":{"schema":{"type":"object","description":"Совместимая оболочка старого клиентского API, дополненная полем `api_version`; при успехе `error_code` и `error_message` равны `null`, при обычной ошибке `body` равен `null`.","properties":{"code":{"type":"integer","format":"int32","description":"1 — успех, 0 — ошибка.","example":1},"api_version":{"type":"string","description":"Версия API, сформировавшая ответ. DEMO использует SemVer-суффикс `-DEMO`; production возвращает релизную версию без суффикса окружения.","example":"1.6.2-DEMO"},"body":{"type":["array","null"],"description":"Данные ответа.","items":{"$ref":"#/components/schemas/LegacyCouponResponse"}},"error_code":{"type":["integer","null"],"format":"int32","description":"Числовой код ошибки или `null` при успехе.","example":561},"error_message":{"type":["string","null"],"description":"Текст ошибки или `null` при успехе.","example":"Coupon not found"},"date":{"type":"integer","format":"int64","description":"Время формирования ответа, Unix timestamp в миллисекундах.","example":1753000000000}},"required":["api_version","body","code","date","error_code","error_message"]},"examples":{"success":{"summary":"Результат","value":{"code":1,"api_version":"1.6.2-DEMO","body":[{"coupon_code":"000000000272","amount":1.0,"win":1.85,"coef":1.85,"date":1753000000000,"status":0,"asian":false,"live":false,"calculate_date":null,"coupon_type":1,"events_count":1,"events_data":[{"game_id":737779544,"selection_id":null,"bet_group_id":1,"bet_group_name":"Исход матча","bet_id":1,"bet_name":"Победа Эйюпспора","uuid":"912","sport_id":1,"tournament":"Товарищеские матчи клубов","event_date":1753010800,"status":0,"opp1":"Эйюпспор","opp2":"Мардин 1969 Спор","opp_icon1":3080,"opp_icon2":363075,"coef":1.85,"calc_coef":null,"bet_score":"line#737779544#1#1#0#1.85","calculate_date":null,"calculate_score":"","settlement_reason_code":null,"settlement_reason":null,"timer":0,"dop_name":"","rate":"0","sport_name":"Футбол","tournament_id":10001,"tournament_name":"Товарищеские матчи клубов","main_game_id":null,"start_game":1753010800,"player_id":null}]}],"error_code":null,"error_message":null,"date":1753000000000}}}}}},"400":{"description":"Некорректный JSON или несовместимый тип поля в запросе"},"500":{"description":"Необработанная внутренняя ошибка HTTP-приложения"}},"security":[{"clientBearerAuth":[]}]}},"/api/partner/health":{"get":{"tags":["Общее"],"summary":"Проверить доступность клиентского API","description":"Легкий запрос без авторизации и без обращения к линии. Используйте его для health-check и проверки, что HTTP-приложение BetCore запущено. Успешный ответ содержит `code = 1` и `body = \"ok\"`.","operationId":"health","responses":{"200":{"description":"Клиентское API доступно","content":{"application/json":{"schema":{"type":"object","description":"Единая оболочка BetCore. `code = 1` означает успех, `code = 0` — бизнес-ошибку. Бизнес-ошибка обычно также возвращается с HTTP 200.","properties":{"code":{"type":"integer","format":"int32","description":"1 — успех, 0 — ошибка.","example":1},"api_version":{"type":"string","description":"Версия API, сформировавшая ответ. DEMO использует SemVer-суффикс `-DEMO`; production возвращает релизную версию без суффикса окружения.","example":"1.6.2-DEMO"},"body":{"type":["string","null"],"description":"Строка `ok`."},"error_code":{"type":["integer","null"],"format":"int32","description":"Числовой код бизнес-ошибки; отсутствует при успехе.","example":501},"error_message":{"type":["string","null"],"description":"Текст бизнес-ошибки; отсутствует при успехе.","example":"Coefficient is change"},"date":{"type":"integer","format":"int64","description":"Время формирования ответа, Unix timestamp в миллисекундах.","example":1753000000000},"time_ms":{"type":["integer","null"],"format":"int64","description":"Время обработки запроса сервером в миллисекундах.","example":12},"path":{"type":["string","null"],"description":"HTTP-путь обработанного запроса.","example":"/api/partner/coupons/place"}}},"examples":{"success":{"summary":"Успешная проверка","value":{"code":1,"body":"ok","date":1753000000000,"time_ms":2,"path":"/api/partner/health"}}}}}},"400":{"description":"Некорректный JSON или несовместимый тип поля в запросе"},"500":{"description":"Необработанная внутренняя ошибка HTTP-приложения"}},"security":[]}},"/api/partner/coupons/get":{"get":{"tags":["Купоны"],"summary":"Получить купон по коду","description":"Возвращает один купон текущего партнера, включая все ставки, исходы и расчетные данные.\n\nКод можно передать в любом из совместимых параметров: `code`, `coupon_code`, `coupon_id` или `bet_code`.\nИспользуется первый непустой параметр в указанном порядке. Короткий числовой код автоматически\nдополняется нулями слева до 12 символов. Купон другого партнера намеренно возвращается как\n`error_code = 471` (`Coupon not found`).\n\n**Совместимый маршрут старого API:** `GET /api/v3/partner/bet/get`.","operationId":"getCoupon_2","parameters":[{"name":"arg1","in":"query","required":false,"schema":{"type":"string"},"example":"000000000272"},{"name":"coupon_code","in":"query","description":"Совместимый алиас параметра `code`.","required":false,"schema":{"type":"string"},"example":"000000000272"},{"name":"coupon_id","in":"query","description":"Совместимый алиас; принимает код купона, а не внутренний ID базы данных.","required":false,"schema":{"type":"string"},"example":"000000000272"},{"name":"bet_code","in":"query","description":"Совместимый алиас параметра `code` для старых интеграций.","required":false,"schema":{"type":"string"},"example":"000000000272"}],"responses":{"200":{"description":"Купон найден либо возвращена бизнес-ошибка","content":{"application/json":{"schema":{"type":"object","description":"Единая оболочка BetCore. `code = 1` означает успех, `code = 0` — бизнес-ошибку. Бизнес-ошибка обычно также возвращается с HTTP 200.","properties":{"code":{"type":"integer","format":"int32","description":"1 — успех, 0 — ошибка.","example":1},"api_version":{"type":"string","description":"Версия API, сформировавшая ответ. DEMO использует SemVer-суффикс `-DEMO`; production возвращает релизную версию без суффикса окружения.","example":"1.6.2-DEMO"},"body":{"type":"null","$ref":"#/components/schemas/PartnerCouponResponse","description":"Данные ответа."},"error_code":{"type":["integer","null"],"format":"int32","description":"Числовой код бизнес-ошибки; отсутствует при успехе.","example":501},"error_message":{"type":["string","null"],"description":"Текст бизнес-ошибки; отсутствует при успехе.","example":"Coefficient is change"},"date":{"type":"integer","format":"int64","description":"Время формирования ответа, Unix timestamp в миллисекундах.","example":1753000000000},"time_ms":{"type":["integer","null"],"format":"int64","description":"Время обработки запроса сервером в миллисекундах.","example":12},"path":{"type":["string","null"],"description":"HTTP-путь обработанного запроса.","example":"/api/partner/coupons/place"}}},"examples":{"settled":{"summary":"Рассчитанный выигрышный купон","value":{"code":1,"body":{"coupon_code":"000000000272","amount":1.0,"win":1.85,"potential_win":1.85,"real_win":1.85,"coef":1.85,"original_coef":1.85,"calculate_coef":1.85,"has_return":false,"date":1753000000000,"status":2,"asian":false,"calculate_date":1753003600000,"coupon_type":1,"events_count":1,"events_data":[{"id":912,"selection_id":null,"game_id":737779544,"main_game_id":737779544,"sub_game":false,"parent_game_id":null,"sub_game_key":null,"raw_pointer":"line#737779544#1#1#0#1.85","line_type":"line","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":1753010800,"status":1,"opp1":"Эйюпспор","opp2":"Мардин 1969 Спор","team1_id":3080,"team2_id":363075,"opp_icon1":3080,"opp_icon2":363075,"coef":1.85,"calc_coef":1.85,"bet_score":"line#737779544#1#1#0#1.85","calculate_date":1753003600000,"calculate_score":"2:1 (1:0, 1:1)","placement_score_full":null,"placement_score_periods":null,"calculation_score_full":"2:1","calculation_score_periods":null,"settlement_reason_code":"AUTOMATIC_SETTLEMENT","settlement_reason":"Calculated automatically","timer":null,"dop_name":null,"rate":"0","sgame_id":null,"game_num":null,"stat_id":null}]},"date":1753000000000,"time_ms":11,"path":"/api/partner/coupons/get"}},"missingCode":{"summary":"Код не передан","value":{"code":0,"api_version":"1.6.2-DEMO","error_code":10,"error_message":"Missing coupon code","date":1753000000000,"time_ms":5,"path":"/api/partner/coupons/get"}},"notFound":{"summary":"Купон не найден","value":{"code":0,"api_version":"1.6.2-DEMO","error_code":471,"error_message":"Coupon not found","date":1753000000000,"time_ms":5,"path":"/api/partner/coupons/get"}}}}}},"400":{"description":"Некорректный JSON или несовместимый тип поля в запросе"},"500":{"description":"Необработанная внутренняя ошибка HTTP-приложения"}},"security":[{"clientBearerAuth":[]}]}},"/api/v3/partner/bet/get":{"get":{"tags":["Купоны"],"summary":"Получить купон по коду","description":"Возвращает один купон текущего партнера, включая все ставки, исходы и расчетные данные.\n\nКод можно передать в любом из совместимых параметров: `code`, `coupon_code`, `coupon_id` или `bet_code`.\nИспользуется первый непустой параметр в указанном порядке. Короткий числовой код автоматически\nдополняется нулями слева до 12 символов. Купон другого партнера намеренно возвращается как\n`error_code = 471` (`Coupon not found`).\n\n**Совместимый маршрут старого API:** `GET /api/v3/partner/bet/get`.","operationId":"getCoupon_3","parameters":[{"name":"arg1","in":"query","required":false,"schema":{"type":"string"},"example":"000000000272"},{"name":"coupon_code","in":"query","description":"Совместимый алиас параметра `code`.","required":false,"schema":{"type":"string"},"example":"000000000272"},{"name":"coupon_id","in":"query","description":"Совместимый алиас; принимает код купона, а не внутренний ID базы данных.","required":false,"schema":{"type":"string"},"example":"000000000272"},{"name":"bet_code","in":"query","description":"Совместимый алиас параметра `code` для старых интеграций.","required":false,"schema":{"type":"string"},"example":"000000000272"}],"responses":{"200":{"description":"Купон найден либо возвращена бизнес-ошибка","content":{"application/json":{"schema":{"type":"object","description":"Единая оболочка BetCore. `code = 1` означает успех, `code = 0` — бизнес-ошибку. Бизнес-ошибка обычно также возвращается с HTTP 200.","properties":{"code":{"type":"integer","format":"int32","description":"1 — успех, 0 — ошибка.","example":1},"api_version":{"type":"string","description":"Версия API, сформировавшая ответ. DEMO использует SemVer-суффикс `-DEMO`; production возвращает релизную версию без суффикса окружения.","example":"1.6.2-DEMO"},"body":{"type":"null","$ref":"#/components/schemas/PartnerCouponResponse","description":"Данные ответа."},"error_code":{"type":["integer","null"],"format":"int32","description":"Числовой код бизнес-ошибки; отсутствует при успехе.","example":501},"error_message":{"type":["string","null"],"description":"Текст бизнес-ошибки; отсутствует при успехе.","example":"Coefficient is change"},"date":{"type":"integer","format":"int64","description":"Время формирования ответа, Unix timestamp в миллисекундах.","example":1753000000000},"time_ms":{"type":["integer","null"],"format":"int64","description":"Время обработки запроса сервером в миллисекундах.","example":12},"path":{"type":["string","null"],"description":"HTTP-путь обработанного запроса.","example":"/api/partner/coupons/place"}}},"examples":{"settled":{"summary":"Рассчитанный выигрышный купон","value":{"code":1,"body":{"coupon_code":"000000000272","amount":1.0,"win":1.85,"potential_win":1.85,"real_win":1.85,"coef":1.85,"original_coef":1.85,"calculate_coef":1.85,"has_return":false,"date":1753000000000,"status":2,"asian":false,"calculate_date":1753003600000,"coupon_type":1,"events_count":1,"events_data":[{"id":912,"selection_id":null,"game_id":737779544,"main_game_id":737779544,"sub_game":false,"parent_game_id":null,"sub_game_key":null,"raw_pointer":"line#737779544#1#1#0#1.85","line_type":"line","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":1753010800,"status":1,"opp1":"Эйюпспор","opp2":"Мардин 1969 Спор","team1_id":3080,"team2_id":363075,"opp_icon1":3080,"opp_icon2":363075,"coef":1.85,"calc_coef":1.85,"bet_score":"line#737779544#1#1#0#1.85","calculate_date":1753003600000,"calculate_score":"2:1 (1:0, 1:1)","placement_score_full":null,"placement_score_periods":null,"calculation_score_full":"2:1","calculation_score_periods":null,"settlement_reason_code":"AUTOMATIC_SETTLEMENT","settlement_reason":"Calculated automatically","timer":null,"dop_name":null,"rate":"0","sgame_id":null,"game_num":null,"stat_id":null}]},"date":1753000000000,"time_ms":11,"path":"/api/partner/coupons/get"}},"missingCode":{"summary":"Код не передан","value":{"code":0,"api_version":"1.6.2-DEMO","error_code":10,"error_message":"Missing coupon code","date":1753000000000,"time_ms":5,"path":"/api/partner/coupons/get"}},"notFound":{"summary":"Купон не найден","value":{"code":0,"api_version":"1.6.2-DEMO","error_code":471,"error_message":"Coupon not found","date":1753000000000,"time_ms":5,"path":"/api/partner/coupons/get"}}}}}},"400":{"description":"Некорректный JSON или несовместимый тип поля в запросе"},"500":{"description":"Необработанная внутренняя ошибка HTTP-приложения"}},"security":[{"clientBearerAuth":[]}]}},"/api/partner/coupons/calculated":{"get":{"tags":["Купоны"],"summary":"Получить недавно рассчитанные купоны","description":"Возвращает только окончательно рассчитанные купоны авторизованного клиента за последние `time` минут.\nИнтервал определяется по моменту окончательного расчета купона, а не по времени его создания.\n\nЕсли `time` не передан, равен нулю или отрицателен, используется 5 минут. Значения больше 120 минут\nограничиваются до 120. Активные купоны и купоны других клиентов в ответ не попадают.\n\nМетод предназначен для резервного polling результатов, если callback временно не был получен.\n\nКаждый элемент `events_data` содержит полные длинные названия из клиентских словарей: спорт,\nтурнир, участников, группу ставок и исход. Короткие варианты словарей в этот ответ не подставляются.\n\n**Полностью совместимый маршрут старого API:** `GET /coupons/calculated?time=5`.","operationId":"calculated_1","parameters":[{"name":"arg1","in":"query","required":false,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Список недавно рассчитанных купонов текущего клиента","content":{"application/json":{"schema":{"type":"object","description":"Единая оболочка BetCore. `code = 1` означает успех, `code = 0` — бизнес-ошибку. Бизнес-ошибка обычно также возвращается с HTTP 200.","properties":{"code":{"type":"integer","format":"int32","description":"1 — успех, 0 — ошибка.","example":1},"api_version":{"type":"string","description":"Версия API, сформировавшая ответ. DEMO использует SemVer-суффикс `-DEMO`; production возвращает релизную версию без суффикса окружения.","example":"1.6.2-DEMO"},"body":{"type":["array","null"],"description":"Данные ответа.","items":{"$ref":"#/components/schemas/PartnerCouponResponse"}},"error_code":{"type":["integer","null"],"format":"int32","description":"Числовой код бизнес-ошибки; отсутствует при успехе.","example":501},"error_message":{"type":["string","null"],"description":"Текст бизнес-ошибки; отсутствует при успехе.","example":"Coefficient is change"},"date":{"type":"integer","format":"int64","description":"Время формирования ответа, Unix timestamp в миллисекундах.","example":1753000000000},"time_ms":{"type":["integer","null"],"format":"int64","description":"Время обработки запроса сервером в миллисекундах.","example":12},"path":{"type":["string","null"],"description":"HTTP-путь обработанного запроса.","example":"/api/partner/coupons/place"}}},"examples":{"success":{"summary":"Рассчитанные за последние 5 минут купоны","value":{"code":1,"body":[{"coupon_code":"000000000272","amount":1.0,"win":1.85,"potential_win":1.85,"real_win":1.85,"coef":1.85,"original_coef":1.85,"calculate_coef":1.85,"has_return":false,"date":1753000000000,"status":2,"asian":false,"calculate_date":1753003600000,"coupon_type":1,"events_count":1,"events_data":[{"id":912,"selection_id":null,"game_id":737779544,"main_game_id":737779544,"sub_game":false,"parent_game_id":null,"sub_game_key":null,"raw_pointer":"line#737779544#1#1#0#1.85","line_type":"line","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":1753010800,"status":1,"opp1":"Эйюпспор","opp2":"Мардин 1969 Спор","team1_id":3080,"team2_id":363075,"opp_icon1":3080,"opp_icon2":363075,"coef":1.85,"calc_coef":1.85,"bet_score":"line#737779544#1#1#0#1.85","calculate_date":1753003600000,"calculate_score":"2:1 (1:0, 1:1)","placement_score_full":null,"placement_score_periods":null,"calculation_score_full":"2:1","calculation_score_periods":null,"settlement_reason_code":"AUTOMATIC_SETTLEMENT","settlement_reason":"Calculated automatically","timer":null,"dop_name":null,"rate":"0","sgame_id":null,"game_num":null,"stat_id":null}]}],"date":1753000000000,"time_ms":12,"path":"/api/partner/coupons/calculated"}},"empty":{"summary":"Новых расчетов нет","value":{"code":1,"body":[],"date":1753000000000}}}}}},"400":{"description":"Некорректный JSON или несовместимый тип поля в запросе"},"500":{"description":"Необработанная внутренняя ошибка HTTP-приложения"}},"security":[{"clientBearerAuth":[]}]}},"/api/partner/coupons/active":{"get":{"tags":["Купоны"],"summary":"Получить активные купоны","description":"Возвращает все еще не рассчитанные купоны авторизованного клиента. Владелец определяется по JWT; купоны других партнеров в ответ не попадают. Пустой список является успешным результатом. Совместимый маршрут старого API: `GET /api/v3/partner/bet/active`.","operationId":"active","responses":{"200":{"description":"Список активных купонов либо бизнес-ошибка","content":{"application/json":{"schema":{"type":"object","description":"Единая оболочка BetCore. `code = 1` означает успех, `code = 0` — бизнес-ошибку. Бизнес-ошибка обычно также возвращается с HTTP 200.","properties":{"code":{"type":"integer","format":"int32","description":"1 — успех, 0 — ошибка.","example":1},"api_version":{"type":"string","description":"Версия API, сформировавшая ответ. DEMO использует SemVer-суффикс `-DEMO`; production возвращает релизную версию без суффикса окружения.","example":"1.6.2-DEMO"},"body":{"type":["array","null"],"description":"Данные ответа.","items":{"$ref":"#/components/schemas/PartnerCouponResponse"}},"error_code":{"type":["integer","null"],"format":"int32","description":"Числовой код бизнес-ошибки; отсутствует при успехе.","example":501},"error_message":{"type":["string","null"],"description":"Текст бизнес-ошибки; отсутствует при успехе.","example":"Coefficient is change"},"date":{"type":"integer","format":"int64","description":"Время формирования ответа, Unix timestamp в миллисекундах.","example":1753000000000},"time_ms":{"type":["integer","null"],"format":"int64","description":"Время обработки запроса сервером в миллисекундах.","example":12},"path":{"type":["string","null"],"description":"HTTP-путь обработанного запроса.","example":"/api/partner/coupons/place"}}},"examples":{"success":{"summary":"Один активный купон","value":{"code":1,"body":[{"coupon_code":"000000000272","amount":1.0,"win":1.85,"potential_win":1.85,"real_win":null,"coef":1.85,"original_coef":1.85,"calculate_coef":null,"has_return":false,"date":1753000000000,"status":0,"asian":false,"calculate_date":null,"coupon_type":1,"events_count":1,"events_data":[{"id":912,"selection_id":null,"game_id":737779544,"main_game_id":737779544,"sub_game":false,"parent_game_id":null,"sub_game_key":null,"raw_pointer":"line#737779544#1#1#0#1.85","line_type":"line","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":1753010800,"status":0,"opp1":"Эйюпспор","opp2":"Мардин 1969 Спор","team1_id":3080,"team2_id":363075,"opp_icon1":3080,"opp_icon2":363075,"coef":1.85,"calc_coef":null,"bet_score":"line#737779544#1#1#0#1.85","calculate_date":null,"calculate_score":null,"placement_score_full":null,"placement_score_periods":null,"calculation_score_full":null,"calculation_score_periods":null,"settlement_reason_code":null,"settlement_reason":null,"timer":null,"dop_name":null,"rate":"0","sgame_id":null,"game_num":null,"stat_id":null}]}],"date":1753000000000,"time_ms":15,"path":"/api/partner/coupons/active"}},"empty":{"summary":"Активных купонов нет","value":{"code":1,"body":[],"date":1753000000000}},"clientNotFound":{"summary":"Клиент не найден","value":{"code":0,"api_version":"1.6.2-DEMO","error_code":1005,"error_message":"Client not found","date":1753000000000,"time_ms":5,"path":"/api/partner/coupons/active"}}}}}},"400":{"description":"Некорректный JSON или несовместимый тип поля в запросе"},"500":{"description":"Необработанная внутренняя ошибка HTTP-приложения"}},"security":[{"clientBearerAuth":[]}]}},"/api/v3/partner/bet/active":{"get":{"tags":["Купоны"],"summary":"Получить активные купоны","description":"Возвращает все еще не рассчитанные купоны авторизованного клиента. Владелец определяется по JWT; купоны других партнеров в ответ не попадают. Пустой список является успешным результатом. Совместимый маршрут старого API: `GET /api/v3/partner/bet/active`.","operationId":"active_1","responses":{"200":{"description":"Список активных купонов либо бизнес-ошибка","content":{"application/json":{"schema":{"type":"object","description":"Единая оболочка BetCore. `code = 1` означает успех, `code = 0` — бизнес-ошибку. Бизнес-ошибка обычно также возвращается с HTTP 200.","properties":{"code":{"type":"integer","format":"int32","description":"1 — успех, 0 — ошибка.","example":1},"api_version":{"type":"string","description":"Версия API, сформировавшая ответ. DEMO использует SemVer-суффикс `-DEMO`; production возвращает релизную версию без суффикса окружения.","example":"1.6.2-DEMO"},"body":{"type":["array","null"],"description":"Данные ответа.","items":{"$ref":"#/components/schemas/PartnerCouponResponse"}},"error_code":{"type":["integer","null"],"format":"int32","description":"Числовой код бизнес-ошибки; отсутствует при успехе.","example":501},"error_message":{"type":["string","null"],"description":"Текст бизнес-ошибки; отсутствует при успехе.","example":"Coefficient is change"},"date":{"type":"integer","format":"int64","description":"Время формирования ответа, Unix timestamp в миллисекундах.","example":1753000000000},"time_ms":{"type":["integer","null"],"format":"int64","description":"Время обработки запроса сервером в миллисекундах.","example":12},"path":{"type":["string","null"],"description":"HTTP-путь обработанного запроса.","example":"/api/partner/coupons/place"}}},"examples":{"success":{"summary":"Один активный купон","value":{"code":1,"body":[{"coupon_code":"000000000272","amount":1.0,"win":1.85,"potential_win":1.85,"real_win":null,"coef":1.85,"original_coef":1.85,"calculate_coef":null,"has_return":false,"date":1753000000000,"status":0,"asian":false,"calculate_date":null,"coupon_type":1,"events_count":1,"events_data":[{"id":912,"selection_id":null,"game_id":737779544,"main_game_id":737779544,"sub_game":false,"parent_game_id":null,"sub_game_key":null,"raw_pointer":"line#737779544#1#1#0#1.85","line_type":"line","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":1753010800,"status":0,"opp1":"Эйюпспор","opp2":"Мардин 1969 Спор","team1_id":3080,"team2_id":363075,"opp_icon1":3080,"opp_icon2":363075,"coef":1.85,"calc_coef":null,"bet_score":"line#737779544#1#1#0#1.85","calculate_date":null,"calculate_score":null,"placement_score_full":null,"placement_score_periods":null,"calculation_score_full":null,"calculation_score_periods":null,"settlement_reason_code":null,"settlement_reason":null,"timer":null,"dop_name":null,"rate":"0","sgame_id":null,"game_num":null,"stat_id":null}]}],"date":1753000000000,"time_ms":15,"path":"/api/partner/coupons/active"}},"empty":{"summary":"Активных купонов нет","value":{"code":1,"body":[],"date":1753000000000}},"clientNotFound":{"summary":"Клиент не найден","value":{"code":0,"api_version":"1.6.2-DEMO","error_code":1005,"error_message":"Client not found","date":1753000000000,"time_ms":5,"path":"/api/partner/coupons/active"}}}}}},"400":{"description":"Некорректный JSON или несовместимый тип поля в запросе"},"500":{"description":"Необработанная внутренняя ошибка HTTP-приложения"}},"security":[{"clientBearerAuth":[]}]}}},"components":{"schemas":{"PlaceCouponRequest":{"type":"object","description":"Запрос на создание одного купона либо набора одиночных купонов.","properties":{"list_bets":{"type":"array","description":"Один или несколько указателей ставок в формате `line_type#game_id#group_id#type_id#rate#coefficient[#player_id]`.","items":{"type":"string","example":"line#737779544#1#1#0#1.85"},"minItems":1},"amount":{"type":"number","format":"decimal","description":"Сумма ставки в валюте купона. Должна быть больше нуля.","example":1.0},"user_id":{"type":["integer","null"],"format":"int64","description":"Необязательный ID пользователя в системе партнера. Сохраняется как метаданные и не определяет владельца купона.","example":501},"currency":{"type":["string","null"],"description":"Код валюты купона, например UAH. Если не передан, сохраняется `null`.","example":"UAH"},"callback_url":{"type":["string","null"],"format":"uri","description":"Необязательный HTTP(S) URL для результата именно этого купона. Если поле отсутствует, равно `null` или пустое, callback не отправляется.","example":"https://partner.example/api/betcore/coupon-result"},"lang":{"type":"string","default":"ru","description":"Язык названий: `ru`, `ua` или `en`; `uk` является алиасом `ua`. Неизвестное значение нормализуется в `en`.","example":"ru"},"mode":{"type":"string","default":"reject","description":"Политика изменения коэффициента: `reject` или `accept`.","example":"reject"},"mode_type":{"type":["integer","null"],"format":"int32","description":"Для `mode=accept`: 1 — повышение, 2 — понижение, 3 — любое изменение.","example":3},"multi":{"type":"boolean","default":false,"description":"`false`: один купон из всех ставок; `true`: отдельный купон на каждую ставку.","example":false}},"required":["amount","list_bets"]},"ClientLoginRequest":{"type":"object","description":"Логин и пароль клиента. Достаточно одного из полей `username` или `login`.","properties":{"username":{"type":["string","null"],"description":"Основное поле логина клиента.","example":"partner-demo"},"login":{"type":["string","null"],"description":"Совместимый алиас поля `username`.","example":"partner-demo"},"password":{"type":"string","format":"password","description":"Пароль клиента.","example":"strong-password"}},"required":["password"]},"ClientLoginResponse":{"type":"object","description":"Данные успешной клиентской авторизации.","properties":{"token":{"type":"string","description":"Подписанный JWT роли CLIENT.","example":"eyJhbGciOiJIUzI1NiJ9..."},"user_id":{"type":"integer","format":"int64","description":"ID авторизованного клиента.","example":17},"username":{"type":"string","description":"Имя авторизованного клиента.","example":"partner-demo"}},"required":["token","user_id","username"]},"ClientCouponResultsRequest":{"type":"object","description":"Один из двух режимов выборки: `coupon_ids` либо пара `start_date`/`end_date`.","properties":{"coupon_ids":{"type":["array","null"],"description":"До 100 отображаемых кодов купонов. Чужие коды никогда не возвращаются.","items":{"type":"string","example":"000000000272"},"maxItems":100,"minItems":1,"uniqueItems":true},"start_date":{"type":["integer","null"],"format":"int64","description":"Начало диапазона по времени создания, включительно; Unix миллисекунды.","example":1753000000000},"end_date":{"type":["integer","null"],"format":"int64","description":"Конец диапазона по времени создания, включительно; Unix миллисекунды.","example":1753086400000}}},"ClientCouponResultsResponse":{"type":"object","description":"Результат безопасной выборки собственных купонов.","properties":{"query_type":{"type":"string","description":"Фактически использованный режим: `ids` или `time`.","example":"ids"},"coupons":{"type":"array","description":"Только купоны авторизованного клиента.","items":{"$ref":"#/components/schemas/PartnerCouponResponse"}}},"required":["coupons","query_type"]},"PartnerCouponBetResponse":{"type":"object","description":"Одна ставка купона и связанное событие/саб-событие.","properties":{"id":{"type":["integer","null"],"format":"int64","description":"Внутренний ID ставки.","example":912},"selection_id":{"type":["string","null"],"description":"ID исхода, переданный в synthetic-запросе; для обычного купона null.","example":"selection-01"},"game_id":{"type":"integer","format":"int64","description":"ID события, на которое сделана ставка.","example":737779544},"main_game_id":{"type":["integer","null"],"format":"int64","description":"ID основной игры по данным провайдера.","example":737779544},"sub_game":{"type":"boolean","description":"Является ли событие саб-игрой/периодом.","example":false},"parent_game_id":{"type":["integer","null"],"format":"int64","description":"ID родительского события для саб-игры.","example":737779544},"sub_game_key":{"type":["string","null"],"description":"Стабильный ключ саб-игры внутри BetCore.","example":"737779544:period:1"},"raw_pointer":{"type":"string","description":"Исходный указатель ставки без изменений.","example":"line#737779544#1#1#0#1.85"},"line_type":{"type":"string","description":"`line` или `live`.","example":"line"},"live":{"type":"boolean","description":"Была ли ставка создана из live-линии.","example":false},"bet_group_id":{"type":"integer","format":"int32","description":"ID группы ставок.","example":1},"bet_group_name":{"type":["string","null"],"description":"Полное длинное название группы из клиентского словаря.","example":"Исход матча"},"bet_id":{"type":"integer","format":"int32","description":"ID исхода в группе.","example":1},"bet_name":{"type":["string","null"],"description":"Полное длинное название исхода из клиентского словаря.","example":"Победа Эйюпспора"},"sport_id":{"type":["integer","null"],"format":"int32","description":"ID вида спорта.","example":1},"sport_name":{"type":["string","null"],"description":"Полное название вида спорта из клиентского словаря.","example":"Футбол"},"tournament_id":{"type":["integer","null"],"format":"int64","description":"ID турнира.","example":10001},"tournament":{"type":["string","null"],"description":"Полное название турнира из клиентского словаря.","example":"Товарищеские матчи клубов"},"event_date":{"type":["integer","null"],"format":"int64","description":"Запланированное начало события, Unix timestamp в секундах.","example":1753010800},"status":{"type":"integer","format":"int32","description":"Статус ставки: 0 — не рассчитана, 1 — выигрыш, 2 — проигрыш, 3 — возврат, 4 — перерасчет, 21 — полувыигрыш, 22 — полупроигрыш, 23 — push.","example":0},"opp1":{"type":["string","null"],"description":"Полное название первой команды/участника из клиентского словаря.","example":"Эйюпспор"},"opp2":{"type":["string","null"],"description":"Полное название второй команды/участника из клиентского словаря.","example":"Мардин 1969 Спор"},"coef":{"type":"number","format":"decimal","description":"Зафиксированный коэффициент ставки.","example":1.85},"calc_coef":{"type":["number","null"],"format":"decimal","description":"Расчетный коэффициент после завершения.","example":1.85},"bet_score":{"type":"string","description":"Совместимое поле старого API; содержит исходный указатель ставки.","example":"line#737779544#1#1#0#1.85"},"calculate_date":{"type":["integer","null"],"format":"int64","description":"Время расчета ставки, Unix timestamp в миллисекундах. До расчета всегда null; 0 не используется.","example":1753003600000},"calculate_score":{"type":["string","null"],"description":"Финальный счет, использованный для расчета; при наличии содержит разбивку по таймам, сетам или периодам в скобках.","example":"2:1 (1:0, 1:1)"},"placement_score_full":{"type":["string","null"],"description":"Полный счет на момент создания ставки.","example":"0:0"},"placement_score_periods":{"type":["string","null"],"description":"Счет по периодам на момент создания ставки.","example":"0:0"},"calculation_score_full":{"type":["string","null"],"description":"Финальный полный счет.","example":"2:1"},"calculation_score_periods":{"type":["string","null"],"description":"Расчетный счет рынка; для некоторых рынков может быть агрегированным. Для отображения используйте calculate_score.","example":"2:1"},"settlement_reason_code":{"type":["string","null"],"description":"Стабильный код источника и причины: например `MATCH_CANCELLED`, `MATCH_POSTPONED`, `MARKET_PUSH`, `REMOTE_RETURN`, `MANUAL_RECALCULATION` или `AUTOMATIC_MARKET_RETURN`.","example":"MATCH_CANCELLED"},"settlement_reason":{"type":["string","null"],"description":"Текст причины. Для удаленного расчета сохраняется текст, присланный расчеткой.","example":"Match canceled"},"timer":{"type":["integer","null"],"format":"int64","description":"Таймер события; сейчас может быть `null`.","example":90},"dop_name":{"type":["string","null"],"description":"Название периода или саб-игры.","example":"1-й тайм"},"rate":{"type":"string","description":"Параметр исхода: тотал, фора либо `0`.","example":"0"},"sgame_id":{"type":["string","null"],"description":"ID саб-игры у поставщика линии.","example":"12345"},"game_num":{"type":["integer","null"],"format":"int64","description":"Дополнительный номер игры у поставщика.","example":12345},"stat_id":{"type":["string","null"],"description":"ID статистики у поставщика.","example":"stat-123"},"team1_id":{"type":["integer","null"],"format":"int64","description":"ID первой команды.","example":101},"team2_id":{"type":["integer","null"],"format":"int64","description":"ID второй команды.","example":102},"opp_icon1":{"type":["integer","null"],"format":"int64","description":"Совместимый ID иконки первого участника; совпадает с team1_id.","example":3080},"opp_icon2":{"type":["integer","null"],"format":"int64","description":"Совместимый ID иконки второго участника; совпадает с team2_id.","example":363075}},"required":["bet_group_id","bet_group_name","bet_id","bet_name","bet_score","calc_coef","calculate_date","calculate_score","calculation_score_full","calculation_score_periods","coef","dop_name","event_date","game_id","game_num","id","line_type","live","main_game_id","opp1","opp2","opp_icon1","opp_icon2","parent_game_id","placement_score_full","placement_score_periods","rate","raw_pointer","selection_id","settlement_reason","settlement_reason_code","sgame_id","sport_id","sport_name","stat_id","status","sub_game","sub_game_key","team1_id","team2_id","timer","tournament","tournament_id"]},"PartnerCouponResponse":{"type":"object","description":"Купон партнера с рассчитанными суммами и полным списком ставок.","properties":{"coupon_code":{"type":["string","null"],"description":"Отображаемый уникальный код купона, обычно 12 цифр.","example":"000000000272"},"amount":{"type":"number","format":"decimal","description":"Сумма ставки.","example":1.0},"win":{"type":"number","format":"decimal","description":"Сумма к выплате: до расчета равна потенциальному выигрышу, после расчета содержит фактическую выплату с учетом возвратов.","example":1.85},"potential_win":{"type":"number","format":"decimal","description":"Исходный потенциальный выигрыш при создании: amount × original_coef.","example":1.85},"real_win":{"type":["number","null"],"format":"decimal","description":"Фактическая выплата после расчета и учета возвратов; совместимый явный алиас поля win.","example":1.85},"coef":{"type":"number","format":"decimal","description":"Рабочий коэффициент: до расчета исходный, после расчета пересчитанный с учетом возвратов.","example":1.85},"original_coef":{"type":"number","format":"decimal","description":"Исходный коэффициент купона, зафиксированный при создании.","example":1.85},"calculate_coef":{"type":["number","null"],"format":"decimal","description":"Коэффициент после расчета и исключения возвратных исходов.","example":1.85},"has_return":{"type":"boolean","description":"Есть ли в купоне возвратный исход.","example":false},"date":{"type":"integer","format":"int64","description":"Время создания купона, Unix timestamp в миллисекундах.","example":1753000000000},"status":{"type":"integer","format":"int32","description":"Статус купона: 0 — новый, 2 — выигрыш, 4 — проигрыш, 8 — возврат, 15 — перерасчет/обновление.","example":0},"asian":{"type":"boolean","description":"Содержит ли купон азиатский рынок.","example":false},"calculate_date":{"type":["integer","null"],"format":"int64","description":"Время последнего расчета ставки купона, Unix timestamp в миллисекундах. До расчета всегда null; 0 не используется.","example":1753003600000},"coupon_type":{"type":"integer","format":"int32","description":"Тип: 1 — одиночный, 2 — экспресс.","example":1},"events_count":{"type":"integer","format":"int32","description":"Количество ставок в купоне.","example":1},"events_data":{"type":"array","description":"Ставки купона.","items":{"$ref":"#/components/schemas/PartnerCouponBetResponse"}}},"required":["amount","asian","calculate_coef","calculate_date","coef","coupon_code","coupon_type","date","events_count","events_data","has_return","original_coef","potential_win","real_win","status","win"]},"CoefficientChange":{"type":"object","description":"Причина, по которой конкретная ставка не прошла проверку актуальной линии.","properties":{"game_id":{"type":"integer","format":"int64","description":"ID события из указателя ставки.","example":737779544},"bet_coefficient":{"type":"number","format":"decimal","description":"Коэффициент, переданный партнером.","example":1.85},"actual_coefficient":{"type":["number","null"],"format":"decimal","description":"Актуальный коэффициент; `null`, если данных нет.","example":1.92},"change_type":{"type":["integer","null"],"format":"int32","description":"Числовой код старого API: 1 — коэффициент вырос, 2 — снизился, `null` — блокировка или отсутствие исхода. Строковые значения не возвращаются.","example":1},"status":{"type":"string","description":"`rejected` — изменение коэффициента; `block` — исход заблокирован; `no_data` — исход не найден.","example":"rejected"}},"required":["actual_coefficient","bet_coefficient","change_type","game_id","status"]},"PartnerCouponPlacementBody":{"type":"object","description":"Тело успешного размещения или детали отказа при изменении линии.","properties":{"coupons":{"type":["array","null"],"description":"Созданные купоны.","items":{"$ref":"#/components/schemas/PartnerCouponResponse"}},"changes":{"type":["array","null"],"description":"Изменения коэффициента, блокировки или отсутствие данных.","items":{"$ref":"#/components/schemas/CoefficientChange"}}},"required":["changes","coupons"]},"LegacyClientLoginResponse":{"type":"object","description":"Ответ старого маршрута авторизации.","properties":{"token":{"type":"string","description":"Подписанный JWT роли CLIENT.","example":"eyJhbGciOiJIUzI1NiJ9..."}},"required":["token"]},"LegacyCouponResponse":{"type":"object","description":"Купон в формате старой версии API.","properties":{"coupon_code":{"type":"string","description":"Публичный 12-значный код купона.","example":"000000000272"},"amount":{"type":"number","format":"decimal","description":"Сумма ставки.","example":1.0},"win":{"type":"number","format":"decimal","description":"Потенциальная или фактическая выплата после расчета.","example":1.85},"coef":{"type":"number","format":"decimal","description":"Исходный или фактический коэффициент после расчета.","example":1.85},"date":{"type":"integer","format":"int64","description":"Время создания, Unix-миллисекунды.","example":1753000000000},"status":{"type":"integer","format":"int32","description":"Статус купона: 0, 2, 4, 8 или 15.","example":0},"asian":{"type":"boolean","description":"Содержит ли купон азиатский рынок.","example":false},"live":{"type":"boolean","description":"Создан ли купон из live-линии.","example":false},"calculate_date":{"type":["integer","null"],"format":"int64","description":"Время окончательного расчета. До расчета всегда null; 0 не используется.","example":1753003600000},"coupon_type":{"type":"integer","format":"int32","description":"1 — ординар, 2 — экспресс.","example":1},"events_count":{"type":"integer","format":"int32","description":"Количество ставок в купоне.","example":1},"events_data":{"type":"array","description":"Ставки купона в формате старого API.","items":{"$ref":"#/components/schemas/LegacyCouponBetResponse"}}},"required":["amount","asian","calculate_date","coef","coupon_code","coupon_type","date","events_count","events_data","live","status","win"]},"LegacyCouponBetResponse":{"type":"object","description":"Ставка купона в формате старой версии с полными клиентскими словарями.","properties":{"game_id":{"type":"integer","format":"int64","description":"ID события или саб-игры.","example":737779544},"selection_id":{"type":["string","null"],"description":"ID исхода, переданный в synthetic-запросе; для обычного купона null.","example":"selection-01"},"bet_group_id":{"type":"integer","format":"int32","description":"ID группы ставок.","example":1},"bet_group_name":{"type":"string","description":"Полное название группы.","example":"Исход матча"},"bet_id":{"type":"integer","format":"int32","description":"ID исхода в группе.","example":1},"bet_name":{"type":"string","description":"Полное название исхода.","example":"Победа Эйюпспора"},"uuid":{"type":"string","description":"Стабильный идентификатор ставки.","example":"912"},"sport_id":{"type":"integer","format":"int32","description":"ID вида спорта.","example":1},"tournament":{"type":"string","description":"Полное название турнира.","example":"Товарищеские матчи клубов"},"event_date":{"type":"integer","format":"int64","description":"Время начала события, Unix timestamp в секундах.","example":1753010800},"status":{"type":"integer","format":"int32","description":"Статус расчета ставки.","example":0},"opp1":{"type":"string","description":"Полное имя первого участника.","example":"Эйюпспор"},"opp2":{"type":"string","description":"Полное имя второго участника.","example":"Мардин 1969 Спор"},"coef":{"type":"number","format":"decimal","description":"Коэффициент ставки.","example":1.85},"calc_coef":{"type":["number","null"],"format":"decimal","description":"Расчетный коэффициент.","example":1.85},"bet_score":{"type":"string","description":"Исходный указатель ставки.","example":"line#737779544#1#1#0#1.85"},"calculate_date":{"type":["integer","null"],"format":"int64","description":"Время расчета ставки. До расчета всегда null; 0 не используется.","example":1753003600000},"calculate_score":{"type":"string","description":"Финальный счет; при наличии разбивка по таймам, сетам или периодам указана в скобках.","example":"2:1 (1:0, 1:1)"},"settlement_reason_code":{"type":["string","null"],"description":"Стабильный код причины расчета или возврата.","example":"MATCH_POSTPONED"},"settlement_reason":{"type":["string","null"],"description":"Исходный текст причины от расчетки либо описание ручного/автоматического расчета.","example":"Match postponed (did not take place or wasn't finished)"},"timer":{"type":"integer","format":"int32","description":"Совместимое поле таймера старого API.","example":0},"dop_name":{"type":"string","description":"Название саб-игры или периода.","example":"1-й тайм"},"rate":{"type":"string","description":"Параметр исхода: тотал, фора либо `0`.","example":"0"},"sport_name":{"type":"string","description":"Полное название спорта.","example":"Футбол"},"tournament_id":{"type":"integer","format":"int64","description":"ID турнира.","example":10001},"tournament_name":{"type":"string","description":"Полное название турнира.","example":"Товарищеские матчи клубов"},"main_game_id":{"type":["integer","null"],"format":"int64","description":"ID основной игры для саба.","example":737779544},"start_game":{"type":"integer","format":"int64","description":"Совместимый алиас `event_date`: время начала события, Unix timestamp в секундах.","example":1753010800},"player_id":{"type":["integer","null"],"format":"int64","description":"ID игрока для персонального рынка.","example":123},"opp_icon1":{"type":["integer","null"],"format":"int64","description":"Совместимый ID иконки первого участника; совпадает с team1_id.","example":3080},"opp_icon2":{"type":["integer","null"],"format":"int64","description":"Совместимый ID иконки второго участника; совпадает с team2_id.","example":363075}},"required":["bet_group_id","bet_group_name","bet_id","bet_name","bet_score","calc_coef","calculate_date","calculate_score","coef","dop_name","event_date","game_id","main_game_id","opp1","opp2","opp_icon1","opp_icon2","player_id","rate","selection_id","settlement_reason","settlement_reason_code","sport_id","sport_name","start_game","status","timer","tournament","tournament_id","tournament_name","uuid"]},"LegacyCouponCashoutResponse":{"type":"object","description":"Пересчитанная стоимость активного купона в старом формате.","properties":{"amount":{"type":"number","format":"decimal","description":"Сумма купона.","example":10.0},"old_coef":{"type":"number","format":"decimal","description":"Зафиксированный коэффициент.","example":2.0},"old_win":{"type":"number","format":"decimal","description":"Исходная потенциальная выплата.","example":20.0},"new_coef":{"type":"number","format":"decimal","description":"Актуальный коэффициент.","example":2.1},"new_win":{"type":"number","format":"decimal","description":"Актуальная потенциальная выплата.","example":21.0},"events_data":{"type":"array","description":"Актуальные коэффициенты ставок купона.","items":{"$ref":"#/components/schemas/LegacyCouponCashoutBetResponse"}}},"required":["amount","events_data","new_coef","new_win","old_coef","old_win"]},"LegacyCouponCashoutBetResponse":{"type":"object","properties":{"uuid":{"type":"string","description":"Строковый ID ставки.","example":"912"},"old_coef":{"type":"number","format":"decimal","description":"Старый коэффициент ставки.","example":2.0},"new_coef":{"type":"number","format":"decimal","description":"Новый коэффициент ставки.","example":2.1},"has_change":{"type":"boolean","description":"Изменился ли коэффициент относительно зарегистрированного.","example":true}},"required":["has_change","new_coef","old_coef","uuid"]},"ClientCouponSettlementCallback":{"type":"object","description":"Пакет обновлений расчета купонов одного клиента и одного callback URL.","properties":{"event":{"type":"string","description":"Всегда `coupons.settled`.","example":"coupons.settled"},"batchId":{"type":"string","description":"Стабильный идентификатор состава пакета.","example":"d407e986f3a64d9d36a77bf532322ef8"},"clientId":{"type":"integer","format":"int64","description":"ID партнера в BetCore.","example":1},"couponCount":{"type":"integer","format":"int32","description":"Количество купонов в пакете: от 1 до 100.","example":2},"coupons":{"type":"array","description":"Снимки расчета купонов; максимум 100 элементов.","items":{"$ref":"#/components/schemas/ClientCouponSettlementResult"}}},"required":["batchId","clientId","couponCount","coupons","event"]},"ClientCouponSettlementResult":{"type":"object","description":"Один промежуточный или окончательный снимок расчета купона.","properties":{"coupon_code":{"type":["string","null"],"description":"Код рассчитанного купона в совместимом формате старого API.","example":"000000000272"},"coupon_version":{"type":"integer","format":"int64","description":"Монотонная версия состояния этого купона. Применяйте callback только если версия больше уже обработанной.","example":17},"realWin":{"type":"number","format":"decimal","description":"Фактическая выплата; для промежуточного экспресса равна 0.","example":1.85},"calculate_coefficient":{"type":"number","format":"decimal","description":"Итоговый коэффициент; для промежуточного экспресса равен 0.","example":1.85},"status":{"type":"integer","format":"int32","description":"Статус купона: 0 — расчет продолжается, 2 — выигрыш, 4 — проигрыш, 8 — возврат, 15 — возвращен на перерасчет.","example":2},"calculate_date":{"type":["integer","null"],"format":"int64","description":"Время последнего расчета ставки купона, Unix timestamp в миллисекундах. До расчета всегда null; 0 не используется.","example":1753003600000},"events_data":{"type":"array","description":"Результаты отдельных ставок купона в совместимом формате.","items":{"$ref":"#/components/schemas/ClientCouponSettlementBet"}}},"required":["calculate_coefficient","calculate_date","coupon_code","coupon_version","events_data","realWin","status"]},"ClientCouponSettlementBet":{"type":"object","description":"Результат одной ставки в callback-событии.","properties":{"uuid":{"type":"string","description":"Внутренний ID ставки в строковом формате.","example":"912"},"selection_id":{"type":["string","null"],"description":"ID исхода из synthetic-запроса; для обычного купона null. Не полагайтесь на позицию в массиве.","example":"selection-01"},"status":{"type":"integer","format":"int32","description":"Статус ставки: 0 — не рассчитана, 1 — выигрыш, 2 — проигрыш, 3 — возврат, 4 — ожидает ручного перерасчета, 21 — полувыигрыш, 22 — полупроигрыш, 23 — push.","example":1},"calculate_coefficient":{"type":["number","null"],"format":"decimal","description":"Коэффициент ставки после расчета.","example":1.85},"calculate_date":{"type":["integer","null"],"format":"int64","description":"Время расчета ставки, Unix timestamp в миллисекундах. До расчета всегда null; 0 не используется.","example":1753003600000},"calculate_score":{"type":"string","description":"Финальный счет; при наличии разбивка по таймам, сетам или периодам указана в скобках.","example":"2:1 (1:0, 1:1)"},"settlement_reason_code":{"type":["string","null"],"description":"Стабильный код причины расчета или возврата.","example":"MATCH_POSTPONED"},"settlement_reason":{"type":["string","null"],"description":"Текст причины; для удаленного расчета передается исходное значение расчетки.","example":"Match postponed (did not take place or wasn't finished)"},"timer":{"type":"integer","format":"int32","description":"Совместимое поле старого callback API.","example":0}},"required":["calculate_coefficient","calculate_date","calculate_score","selection_id","settlement_reason","settlement_reason_code","status","timer","uuid"]}},"securitySchemes":{"clientBearerAuth":{"type":"http","description":"JWT клиента из `POST /api/partner/login`. В Swagger нажмите «Authorize» и вставьте только токен; префикс `Bearer` интерфейс добавит сам.","scheme":"bearer","bearerFormat":"JWT"}}}}