Cashout
В разработке. Функция Cashout еще не прошла полное тестирование. Не используйте ее в production до отдельного подтверждения готовности от SportAPI.
Текущий маршрут и формат ответа могут измениться после завершения разработки и тестирования.
Текущее состояние
На данный момент:
- нового маршрута
/api/partner/**для Cashout нет; - доступен только экспериментальный маршрут старого API;
- метод рассчитывает возможное значение Cashout;
- метод не выполняет продажу купона;
- метод не меняет статус купона;
- метод не списывает и не начисляет деньги;
- завершенный контракт подтверждения Cashout пока не опубликован.
Поэтому текущий метод нельзя использовать как готовый финансовый сценарий.
Что делает текущий метод
Экспериментальный маршрут:
GET /coupons/cashout?coupon_code={coupon_code}
Он возвращает расчетную оценку для активного купона на момент запроса.
Это только получение расчетного предложения:
запрос оценки → ответ с расчетными значениями
Следующего шага, который подтверждает продажу купона через API, в текущем публичном контракте нет.
Условия экспериментального запроса
Для получения оценки:
- нужно передать Bearer JWT клиентского аккаунта;
- купон должен принадлежать владельцу JWT;
- купон должен быть активным;
coupon_codeдолжен состоять ровно из 12 цифр.
Код купона храните и передавайте как строку, чтобы не потерять ведущие нули.
Пример запроса
Следующий пример предназначен только для согласованного тестирования, а не для production.
GET /coupons/cashout?coupon_code=000000000272 HTTP/1.1
Host: coupon-api.example.com
Authorization: Bearer <token>
Accept: application/json
BASE_URL="https://coupon-api.example.com"
TOKEN="<jwt-token>"
COUPON_CODE="000000000272"
curl --request GET \
--url "$BASE_URL/coupons/cashout?coupon_code=$COUPON_CODE" \
--header "Accept: application/json" \
--header "Authorization: Bearer $TOKEN"
Фактический тестовый BASE_URL партнер получает у менеджера.
Текущий экспериментальный ответ
{
"code": 1,
"body": {
"amount": 1,
"old_coef": 2.5,
"old_win": 2.5,
"new_coef": 1.4,
"new_win": 1.4,
"events_data": [
{
"uuid": "912",
"old_coef": 2.5,
"new_coef": 1.4,
"has_change": true
}
]
},
"error_code": null,
"error_message": null,
"date": 1784970000000
}
Поля текущего ответа
Общий расчет
| Поле | Тип | Текущее назначение |
|---|---|---|
amount | number | Сумма исходной ставки. |
old_coef | number | Коэффициент купона до текущего пересчета Cashout. |
old_win | number | Значение выигрыша до текущего пересчета Cashout. |
new_coef | number | Новый расчетный коэффициент предложения. |
new_win | number | Новое расчетное значение предложения Cashout. |
events_data | array | Изменения коэффициентов отдельных ставок купона. |
Одна ставка в events_data
| Поле | Тип | Текущее назначение |
|---|---|---|
uuid | string | Внутренний ID ставки в строковом виде. |
old_coef | number | Предыдущее значение коэффициента ставки. |
new_coef | number | Новое значение коэффициента ставки. |
has_change | boolean | Изменился ли коэффициент этой ставки. |
Названия и назначение полей приведены по текущей экспериментальной реализации. До подтверждения стабильного контракта нельзя считать их неизменяемыми.
Ошибки текущего маршрута
error_code | Значение |
|---|---|
560 | Код купона отсутствует или имеет неверный формат. |
565 | Cashout недоступен: купон неактивен, не принадлежит клиентскому аккаунту или не соответствует условиям функции. |
Пример бизнес-ошибки:
{
"code": 0,
"body": null,
"error_code": 565,
"error_message": "<описание недоступности Cashout>",
"date": 1784970000000
}
Как и в других старых маршрутах, бизнес-ошибка может прийти с HTTP 200. Проверяйте поле code и error_code.
Что нельзя делать на основании ответа
Текущий успешный ответ не означает, что купон продан.
После получения new_win нельзя автоматически:
- считать Cashout подтвержденным;
- менять статус купона на финальный;
- начислять пользователю
new_win; - прекращать ожидание обычного расчета купона;
- считать, что Система расчета купонов SportAPI зафиксировала финансовую операцию.
Метод не изменяет купон и баланс. Он возвращает только расчетное значение на момент запроса.
Почему нельзя использовать в production
До завершения тестирования не подтверждены как стабильный публичный контракт:
- окончательная формула расчета;
- срок действия предложения;
- правила изменения значения между запросами;
- полный набор ограничений для разных типов купонов;
- сценарий подтверждения или продажи купона;
- финансовая идемпотентность операции;
- окончательные поля и коды ошибок;
- новый маршрут
/api/partner/**.
Документация будет обновлена после подтверждения этих правил.
Если партнер участвует в тестировании
Тестирование нужно предварительно согласовать с менеджером.
Рекомендуется:
- использовать только тестовое окружение;
- не связывать ответ с реальным балансом пользователя;
- журналировать запрос,
coupon_codeи полный ответ; - проверять результаты на разных типах купонов;
- не строить production-код на неизменности текущих полей;
- отдельно согласовать с менеджером все найденные расхождения.
Что появится после завершения разработки
После готовности функции документация должна отдельно подтвердить:
- рекомендуемый маршрут нового API;
- получение актуального предложения;
- срок действия предложения;
- подтверждение Cashout;
- изменение статуса купона;
- финансовое действие;
- защиту от повторного подтверждения;
- полный набор ошибок;
- поведение callback и polling после Cashout.
До публикации этих правил функцию следует считать недоступной для production-интеграции.
Контрольный список текущего статуса
- Cashout находится в разработке.
- Функция еще не протестирована полностью.
- Новый маршрут
/api/partner/**отсутствует. - Текущий
/coupons/cashoutявляется старым экспериментальным маршрутом. - Метод возвращает только расчетную оценку.
- Метод не продает купон и не изменяет баланс.
- Текущий контракт может измениться.
- Production-использование не рекомендуется.
Следующий раздел: «Интеграция ординара».