Быстрый старт
Base URL: https://api.tolepay.kz/v1. Для первой интеграции используйте test-ключ и /sandbox, где запросы никогда не уходят в Kaspi.
Создайте sandbox-подключение
В кабинете создайте тестовое подключение. Оно изолировано от live и не вызывает Kaspi.
Создайте test API-ключ
Выдайте ключу grant на sandbox connection и нужные permissions. Секрет показывается один раз.
Создайте счёт или QR
Передайте Bearer-ключ, X-Tole-Connection-Id и уникальный Idempotency-Key.
Смоделируйте оплату
Вызовите simulate со статусом paid и проверьте свой webhook-обработчик.
Переключитесь на live
Замените test-ключ и /sandbox routes на live-ключ и live routes. Test ID не переносятся в live.
Авторизация и общие заголовки
Платёжные endpoints вызываются только с вашего backend. Никогда не передавайте tole_sk_* в браузер, мобильное приложение, публичный репозиторий или frontend-логи.
Authorization
Обязательный. Bearer tole_sk_live_v1… для live или Bearer tole_sk_test_v1… для sandbox.
Content-Type
application/json для запросов с body.
X-Tole-Connection-Id
UUID подключения. В live необязателен при наличии основного подключения; в sandbox обязателен всегда.
Idempotency-Key
Обязателен для create/cancel/refund. 1–100 символов: A–Z, a–z, 0–9, точка, _, :, -. Один бизнес-запрос — один ключ.
Права ключа проверяются для выбранного подключения. Grant на другое подключение не даёт доступа. Wildcard-права не поддерживаются.
120 / min
GET и provider reads
60 / min
client-info
30 / min
create, cancel, refund
Live payment API
Все маршруты ниже добавляются к https://api.tolepay.kz/v1. operationId и paymentIntentId — локальные UUID Tole; приватные идентификаторы Kaspi наружу не возвращаются.
POST/invoices/client-infoПроверить получателя счёта
Проверяет, может ли Kaspi выставить счёт указанному номеру. ФИО и полный телефон клиента наружу не возвращаются.
| Поле | Где | Тип | Обязательно | Описание |
|---|---|---|---|---|
X-Tole-Connection-Id | header | string | Нет | UUID live-подключения; можно не передавать при настроенном основном подключении. |
phoneNumber | body | string | Да | Казахстанский номер: +7 и 10 цифр. |
Набор safe-полей зависит от ответа Kaspi: available, canCreateInvoice, eligible, exists, isAvailable, status.
curl https://api.tolepay.kz/v1/invoices/client-info \
-H "Authorization: Bearer $TOLE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"phoneNumber":"+77001234567"}'{
"ok": true,
"data": { "eligible": true }
}POST/invoicesСоздать счёт по номеру
Создаёт live-счёт Kaspi. Возвращённый data.id — локальный UUID Tole для следующих запросов.
| Поле | Где | Тип | Обязательно | Описание |
|---|---|---|---|---|
X-Tole-Connection-Id | header | string | Нет | UUID live-подключения; можно не передавать при настроенном основном подключении. |
Idempotency-Key | header | string | Да | Уникальный ключ мутации. Повторяйте тот же запрос с тем же ключом. |
phoneNumber | body | string | Да | +7 и 10 цифр. |
amount | body | integer | Да | Сумма в KZT: 1–100 000 000. |
comment | body | string | Нет | Необязательно, максимум 200 символов. |
receiptUrl и orderNumber необязательны и присутствуют только при валидном ответе Kaspi.
curl https://api.tolepay.kz/v1/invoices \
-X POST \
-H "Authorization: Bearer $TOLE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1024-invoice-v1" \
-d '{"phoneNumber":"+77001234567","amount":5000,"comment":"Order 1024"}'{
"ok": true,
"data": {
"id": "d7dfb407-0e4c-4cc2-9d31-26d9f696cb27",
"kind": "invoice",
"status": "created",
"amount": 5000,
"clientPhoneLast4": "4567",
"receiptUrl": "https://…",
"orderNumber": "…"
},
"commandId": "d7dfb407-0e4c-4cc2-9d31-26d9f696cb27",
"replayed": false
}GET/invoices/historyПолучить историю счетов
Возвращает безопасную историю счетов выбранного подключения.
| Поле | Где | Тип | Обязательно | Описание |
|---|---|---|---|---|
X-Tole-Connection-Id | header | string | Нет | UUID live-подключения; можно не передавать при настроенном основном подключении. |
Provider-поля фильтруются; приватные Kaspi ID заменяются локальными operationId.
curl https://api.tolepay.kz/v1/invoices/history \
-H "Authorization: Bearer $TOLE_API_KEY"{
"ok": true,
"data": { "items": [{ "operationId": "uuid", "amount": 5000, "status": "Processed", "date": "…" }] }
}GET/invoices/{operationId}Получить детали счёта
Читает актуальные детали у провайдера и обновляет наблюдаемый статус payment intent.
| Поле | Где | Тип | Обязательно | Описание |
|---|---|---|---|---|
X-Tole-Connection-Id | header | string | Нет | UUID live-подключения; можно не передавать при настроенном основном подключении. |
operationId | path | uuid | Да | Локальный owner-scoped UUID операции Tole. |
curl https://api.tolepay.kz/v1/invoices/$OPERATION_ID \
-H "Authorization: Bearer $TOLE_API_KEY"{
"ok": true,
"data": { "amount": 5000, "currency": "KZT", "status": "Processed" }
}POST/invoices/{operationId}/cancelОтменить счёт
Отменяет ранее созданный счёт. Body — пустой JSON-объект.
| Поле | Где | Тип | Обязательно | Описание |
|---|---|---|---|---|
X-Tole-Connection-Id | header | string | Нет | UUID live-подключения; можно не передавать при настроенном основном подключении. |
Idempotency-Key | header | string | Да | Уникальный ключ мутации. Повторяйте тот же запрос с тем же ключом. |
operationId | path | uuid | Да | Локальный owner-scoped UUID операции Tole. |
curl https://api.tolepay.kz/v1/invoices/$OPERATION_ID/cancel \
-X POST \
-H "Authorization: Bearer $TOLE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1024-cancel-v1" \
-d '{}'{
"ok": true,
"data": { "operationId": "uuid", "status": "cancelled" },
"commandId": "uuid",
"replayed": false
}POST/qrСоздать динамический QR
Создаёт QR для оплаты и возвращает paymentUrl и исходный qrToken.
| Поле | Где | Тип | Обязательно | Описание |
|---|---|---|---|---|
X-Tole-Connection-Id | header | string | Нет | UUID live-подключения; можно не передавать при настроенном основном подключении. |
Idempotency-Key | header | string | Да | Уникальный ключ мутации. Повторяйте тот же запрос с тем же ключом. |
amount | body | integer | Да | Сумма KZT: 1–100 000 000. |
latitude | body | number | Нет | Необязательно, −90…90; только вместе с longitude. |
longitude | body | number | Нет | Необязательно, −180…180; только вместе с latitude. |
expiresAt и receiptUrl необязательны. paymentUrl и qrToken всегда HTTPS.
curl https://api.tolepay.kz/v1/qr \
-X POST \
-H "Authorization: Bearer $TOLE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1024-qr-v1" \
-d '{"amount":5000}'{
"ok": true,
"data": {
"id": "uuid", "kind": "qr", "status": "created", "amount": 5000,
"paymentUrl": "https://…", "qrToken": "https://qr.kaspi.kz/…",
"expiresAt": "…", "receiptUrl": "https://…"
},
"commandId": "uuid",
"replayed": false
}GET/qr/{operationId}Получить детали QR
Читает текущий статус QR у провайдера.
| Поле | Где | Тип | Обязательно | Описание |
|---|---|---|---|---|
X-Tole-Connection-Id | header | string | Нет | UUID live-подключения; можно не передавать при настроенном основном подключении. |
operationId | path | uuid | Да | Локальный owner-scoped UUID операции Tole. |
curl https://api.tolepay.kz/v1/qr/$OPERATION_ID \
-H "Authorization: Bearer $TOLE_API_KEY"{
"ok": true,
"data": { "amount": 5000, "currency": "KZT", "status": "Processed" }
}GET/history/operationsПолучить историю операций
История до указанной календарной даты UTC с cursor следующей страницы.
| Поле | Где | Тип | Обязательно | Описание |
|---|---|---|---|---|
X-Tole-Connection-Id | header | string | Нет | UUID live-подключения; можно не передавать при настроенном основном подключении. |
endDate | query | date | Да | Обязательно: YYYY-MM-DD, включительно, UTC. |
lastTransactionDate | query | string | Нет | Cursor из предыдущего ответа. |
statementPeriodCode | query | integer | Нет | Неотрицательный код периода. |
curl "https://api.tolepay.kz/v1/history/operations?endDate=2026-08-23" \
-H "Authorization: Bearer $TOLE_API_KEY"{
"ok": true,
"data": {
"items": [{ "operationId": "uuid", "amount": 5000, "type": "Payment", "status": "Processed" }],
"lastTransactionDate": "…", "hasMore": false
}
}GET/history/operations/{operationId}Получить операцию из истории
Безопасные детали операции по локальному UUID.
| Поле | Где | Тип | Обязательно | Описание |
|---|---|---|---|---|
X-Tole-Connection-Id | header | string | Нет | UUID live-подключения; можно не передавать при настроенном основном подключении. |
operationId | path | uuid | Да | Локальный owner-scoped UUID операции Tole. |
operationMethod | query | integer | Нет | Необязательный неотрицательный код метода. |
curl "https://api.tolepay.kz/v1/history/operations/$OPERATION_ID?operationMethod=0" \
-H "Authorization: Bearer $TOLE_API_KEY"{
"ok": true,
"data": { "operationId": "uuid", "amount": 5000, "status": "Processed" }
}POST/refundsСоздать возврат
Полный или частичный возврат оплаченного QR текущего подключения.
| Поле | Где | Тип | Обязательно | Описание |
|---|---|---|---|---|
X-Tole-Connection-Id | header | string | Нет | UUID live-подключения; можно не передавать при настроенном основном подключении. |
Idempotency-Key | header | string | Да | Уникальный ключ мутации. Повторяйте тот же запрос с тем же ключом. |
operationId | body | uuid | Да | Локальный UUID QR/payment intent. |
returnAmount | body | integer | Да | KZT: 1–100 000 000, не больше доступного остатка. |
curl https://api.tolepay.kz/v1/refunds \
-X POST \
-H "Authorization: Bearer $TOLE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: refund-order-1024-v1" \
-d '{"operationId":"uuid","returnAmount":1500}'{
"ok": true,
"data": { "operationId": "uuid", "status": "refund_accepted", "returnAmount": 1500 },
"commandId": "uuid", "replayed": false
}GET/payment-intents/invoices/{paymentIntentId}Получить сохранённый статус счёта
Читает состояние из надёжного ledger Tole для reconciliation.
| Поле | Где | Тип | Обязательно | Описание |
|---|---|---|---|---|
X-Tole-Connection-Id | header | string | Нет | UUID live-подключения; можно не передавать при настроенном основном подключении. |
paymentIntentId | path | uuid | Да | UUID платёжного намерения Tole. |
curl https://api.tolepay.kz/v1/payment-intents/invoices/$PAYMENT_INTENT_ID \
-H "Authorization: Bearer $TOLE_API_KEY"{
"ok": true,
"data": {
"id": "uuid", "kind": "invoice", "status": "paid", "amount": 5000,
"refundedAmount": 0, "currency": "KZT", "revision": 3,
"createdAt": "2026-08-23T10:00:00.000Z", "updatedAt": "2026-08-23T10:01:00.000Z",
"paidAt": "2026-08-23T10:01:00.000Z", "terminalAt": null, "lastReconciledAt": "…"
}
}GET/payment-intents/qr/{paymentIntentId}Получить сохранённый статус QR
Durable payment-intent контракт для QR.
| Поле | Где | Тип | Обязательно | Описание |
|---|---|---|---|---|
X-Tole-Connection-Id | header | string | Нет | UUID live-подключения; можно не передавать при настроенном основном подключении. |
paymentIntentId | path | uuid | Да | UUID платёжного намерения Tole. |
curl https://api.tolepay.kz/v1/payment-intents/qr/$PAYMENT_INTENT_ID \
-H "Authorization: Bearer $TOLE_API_KEY"{
"ok": true,
"data": { "id": "uuid", "kind": "qr", "status": "pending", "amount": 5000, "currency": "KZT", "revision": 1 }
}GET/commands/{commandId}Проверить идемпотентную команду
Проверяет create/cancel/refund после 202, сетевого разрыва или повтора.
| Поле | Где | Тип | Обязательно | Описание |
|---|---|---|---|---|
commandId | path | uuid | Да | UUID из commandId или Location. |
Команда сама определяет connection и permission. Чужой commandId возвращает 404.
curl https://api.tolepay.kz/v1/commands/$COMMAND_ID \
-H "Authorization: Bearer $TOLE_API_KEY"{
"ok": true,
"data": {
"commandId": "uuid", "status": "succeeded", "responseStatus": 201,
"result": { "ok": true, "data": { "id": "uuid" }, "commandId": "uuid" },
"updatedAt": "2026-08-23T10:00:01.000Z"
}
}Sandbox API
Sandbox повторяет основной контракт, хранит команды и payment intents в базе, создаёт события и webhooks, но никогда не обращается в Kaspi.
Зеркальные sandbox-маршруты
Для всех строк ниже добавьте /sandbox перед live path. Схемы запросов и control-ответы мутаций совпадают с live; data содержит синтетические sandbox-значения. X-Tole-Connection-Id обязателен.
/sandbox/invoices/client-infoinvoice:read
/sandbox/invoicesinvoice:create
/sandbox/invoices/historyinvoice:read
/sandbox/invoices/{operationId}invoice:read
/sandbox/invoices/{operationId}/cancelinvoice:cancel
/sandbox/qrqr:create
/sandbox/qr/{operationId}qr:read
/sandbox/history/operationshistory:read
/sandbox/history/operations/{operationId}history:read
/sandbox/refundsrefund:create
/sandbox/commands/{commandId}permission исходной команды
{
"ok": true,
"data": {
"id": "uuid", "kind": "invoice", "status": "created", "amount": 5000,
"clientPhoneLast4": "4567", "orderNumber": "SBX-1234ABCD", "environment": "sandbox"
},
"commandId": "uuid", "replayed": false
}{
"ok": true,
"data": {
"id": "uuid", "kind": "qr", "status": "created", "amount": 5000,
"paymentUrl": "https://sandbox.tole.test/pay/uuid",
"qrToken": "https://sandbox.tole.test/qr/uuid", "environment": "sandbox"
},
"commandId": "uuid", "replayed": false
}POST/sandbox/connectionsСоздать sandbox-подключение
Management endpoint с пользовательским JWT, а не API key.
| Поле | Где | Тип | Обязательно | Описание |
|---|---|---|---|---|
displayName | body | string | Да | Название 1–100 символов. |
curl https://api.tolepay.kz/v1/sandbox/connections \
-X POST -H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"displayName":"Development"}'{
"id": "uuid", "providerMode": "sandbox", "status": "active", "displayName": "Development"
}GET/sandbox/payment-intents/{paymentIntentId}Получить sandbox payment intent
Durable test-состояние счёта или QR.
| Поле | Где | Тип | Обязательно | Описание |
|---|---|---|---|---|
X-Tole-Connection-Id | header | string | Да | Обязательный UUID sandbox-подключения. |
paymentIntentId | path | uuid | Да | UUID платёжного намерения Tole. |
curl https://api.tolepay.kz/v1/sandbox/payment-intents/$PAYMENT_INTENT_ID \
-H "Authorization: Bearer $TOLE_TEST_API_KEY" \
-H "X-Tole-Connection-Id: $SANDBOX_CONNECTION_ID"{
"ok": true,
"data": { "id": "uuid", "kind": "invoice", "status": "pending", "amount": 5000, "currency": "KZT", "environment": "sandbox" }
}POST/sandbox/payment-intents/{paymentIntentId}/simulateСмоделировать результат оплаты
Переводит sandbox intent в terminal status и создаёт webhook-событие.
| Поле | Где | Тип | Обязательно | Описание |
|---|---|---|---|---|
X-Tole-Connection-Id | header | string | Да | Обязательный UUID sandbox-подключения. |
paymentIntentId | path | uuid | Да | UUID платёжного намерения Tole. |
status | body | enum | Да | paid | cancelled | expired | failed |
curl https://api.tolepay.kz/v1/sandbox/payment-intents/$PAYMENT_INTENT_ID/simulate \
-X POST \
-H "Authorization: Bearer $TOLE_TEST_API_KEY" \
-H "X-Tole-Connection-Id: $SANDBOX_CONNECTION_ID" \
-H "Content-Type: application/json" \
-d '{"status":"paid"}'{
"ok": true,
"data": { "id": "uuid", "kind": "invoice", "status": "paid", "environment": "sandbox" }
}API-ключи и permissions
Ключ создаётся в кабинете или через management API с пользовательским JWT. Raw secret возвращается только при создании; дальше API показывает только безопасный prefix.
/api-keysJWT · Список ключей; query cursor и limit 1–100
/api-keysJWT · Создать: { name, grants: [{ connectionId, permissions }] }
/api-keys/{apiKeyId}JWT · Заменить name и grants; нужен expectedRevision
/api-keys/{apiKeyId}/revokeJWT · Отозвать ключ; повторный revoke безопасен
| Permission | Разрешает |
|---|---|
invoice:create | POST /invoices |
invoice:read | client-info, invoice history/details, invoice payment intent |
invoice:cancel | POST /invoices/{id}/cancel |
qr:create | POST /qr |
qr:read | QR details и QR payment intent |
history:read | history endpoints и sandbox payment intent |
refund:create | POST /refunds |
sandbox:simulate | POST /sandbox/payment-intents/{id}/simulate |
{
"name": "Production backend",
"grants": [{
"connectionId": "7a67d6bd-5daf-47af-b899-fdb8b7db4d63",
"permissions": ["invoice:create", "invoice:read", "invoice:cancel"]
}]
}{
"apiKey": {
"id": "uuid", "name": "Production backend", "keyPrefix": "tole_sk_live_v1.…", "status": "active",
"revision": 1,
"grants": [{
"connectionId": "uuid", "connectionName": "main", "environment": "live",
"permissions": ["invoice:create", "invoice:read", "invoice:cancel"]
}]
},
"secret": "tole_sk_live_v1.<uuid>.<secret>"
}Webhooks
Webhook endpoint создаётся с пользовательским JWT. URL должен быть HTTPS. Signing secret whsec_* возвращается один раз.
/webhook-endpointsJWT · Список endpoint-ов
/webhook-endpointsJWT · Создать: { name, url }; secret возвращается один раз
/webhook-endpoints/{endpointId}/disableJWT · Отключить; body {}
/webhook-deliveries?status=…JWT · pending | processing | delivered | dead_letter
/webhook-deliveries/{deliveryId}/replayJWT · Повторить dead-letter delivery; body {}
HTTP delivery
webhook-id
UUID события
webhook-timestamp
Unix timestamp
webhook-signature
v1=<hex HMAC-SHA256>
{
"id": "c2e94dd8-9802-44e7-a52b-14f45d5b9cdb",
"type": "payment.paid",
"createdAt": "2026-08-23T10:01:00.000Z",
"data": { "providerStatus": "SandboxProcessed", "environment": "sandbox" }
}Event types: payment.created, payment.paid, payment.cancelled, payment.expired, payment.failed, payment.partially_refunded, payment.refunded, refund.reserved, refund.succeeded, refund.rejected, refund.outcome_unknown, operation.succeeded, operation.rejected, operation.outcome_unknown.
В контракте v1 состав data зависит от типа события и не гарантирует paymentIntentId. Не придумывайте это поле в интеграции: webhook используйте как сигнал, а итоговое состояние сверяйте по сохранённым UUID через payment-intent endpoints.
Проверяйте подпись по exact raw body до JSON.parse. Сохраняйте event id и обрабатывайте событие идемпотентно. Возвращайте 2xx только после надёжной фиксации события.
import { createHmac, timingSafeEqual } from "node:crypto";
const signed = `${webhookId}.${timestamp}.${rawBody}`;
const expected = "v1=" + createHmac("sha256", secret)
.update(signed, "utf8")
.digest("hex");
const actualBytes = Buffer.from(signature, "utf8");
const expectedBytes = Buffer.from(expected, "utf8");
if (actualBytes.length !== expectedBytes.length ||
!timingSafeEqual(actualBytes, expectedBytes)) {
throw new Error("Invalid Tole webhook signature");
}Billing management API
Эти endpoints обслуживают тариф, usage и оплату подписки в кабинете. Они используют пользовательский JWT, а не публичный API key.
/billing/overviewJWT · Subscription, usage, invoices и текущий checkout
/billing/plansJWT · Доступные публичные планы и entitlements
/billing/invoices/{invoiceId}JWT · Получить owner-scoped billing invoice
/billing/checkoutJWT · Создать или продолжить checkout: { planCode }
/billing/checkout/{checkoutId}JWT · Получить статус checkout
/billing/subscription/cancelJWT · Отменить подписку в конце периода
/billing/webhooks/kaspiprovider callback · Служебный HMAC callback; не вызывается merchant-интеграцией
{
"planCode": "business"
}{
"id": "uuid",
"status": "pending",
"planCode": "business",
"planName": "Business",
"amountKzt": 22500,
"currency": "KZT",
"paymentUrl": "https://…",
"receiptUrl": null,
"expiresAt": "2026-08-23T11:00:00.000Z",
"paidAt": null,
"createdAt": "2026-08-23T10:00:00.000Z"
}Форматы ответов, идемпотентность и polling
Complete
Сохраните data.id/paymentIntentId и commandId. Повтор с тем же Idempotency-Key вернёт тот же результат и header Idempotent-Replayed: true.
Wait
Читайте Retry-After: 2 и Location. Poll GET /commands/:commandId. Не создавайте новую mutation.
Do not retry
Kaspi мог выполнить операцию. Проверяйте command и payment intent; новый create может дать дубль.
{
"ok": false, "kind": "in_progress", "commandId": "uuid", "replayed": true
}{
"ok": false, "kind": "outcome_unknown", "commandId": "uuid", "replayed": false
}Payment intent statuses: pending, paid, cancelled, expired, failed, partially_refunded, refunded.
Ошибки REST API
В коде интеграции ветвитесь по HTTP status и code. message предназначен только для диагностики и может измениться.
{
"statusCode": 409,
"code": "PUBLIC_API_IDEMPOTENCY_CONFLICT",
"message": "The Idempotency-Key was already used for a different request"
}| HTTP | code | Что делать |
|---|---|---|
| 400 | PUBLIC_API_VALIDATION_ERROR | Исправить body, query, UUID или заголовок. Не повторять без изменения запроса. |
| 401 | API_KEY_INVALID_CREDENTIAL | Проверить namespace и заменить неверный или отозванный ключ. |
| 402 | BILLING_SUBSCRIPTION_UNAVAILABLEBILLING_ENTITLEMENT_UNAVAILABLE | Активировать тариф или возможность. |
| 403 | PUBLIC_API_FORBIDDEN | Проверить grant, permission и X-Tole-Connection-Id. |
| 404 | PUBLIC_API_RESOURCE_NOT_FOUND | Проверить локальный UUID и environment; чужие ресурсы также выглядят как 404. |
| 409 | PUBLIC_API_IDEMPOTENCY_CONFLICT | Не менять body под старым ключом. Для новой операции создать новый key. |
| 409 | PUBLIC_API_DEFAULT_CONNECTION_REQUIREDPUBLIC_API_DEFAULT_CONNECTION_UNAVAILABLE | Передать connection header или исправить основное подключение. |
| 409 | PAYMENT_INVALID_STATEPAYMENT_REFUND_LIMIT_EXCEEDED | Перечитать payment intent и исправить переход или сумму. |
| 429 | RATE_LIMIT_EXCEEDEDBILLING_LIMIT_EXCEEDED | Соблюдать Retry-After или лимит тарифа. |
| 502 | PUBLIC_API_UPSTREAM_REJECTED | Kaspi отклонил команду. Исправить бизнес-условия перед новой командой. |
| 503 | PUBLIC_API_UNAVAILABLERATE_LIMIT_UNAVAILABLE | Для read — backoff. Для mutation сначала проверить commandId. |
| 500 | PUBLIC_API_INTERNAL_ERROR | Сохранить безопасный context и обратиться в поддержку. |