Tole.
Регистрация
Разработчикам · REST API v1Контракт v1

Полная документация Tole REST API

Человеческий справочник по live-платежам, sandbox, ключам, webhooks, ответам и ошибкам. OpenAPI — дополнение, а не замена этой страницы.

Быстрый старт

Base URL: https://api.tolepay.kz/v1. Для первой интеграции используйте test-ключ и /sandbox, где запросы никогда не уходят в Kaspi.

1

Создайте sandbox-подключение

В кабинете создайте тестовое подключение. Оно изолировано от live и не вызывает Kaspi.

2

Создайте test API-ключ

Выдайте ключу grant на sandbox connection и нужные permissions. Секрет показывается один раз.

3

Создайте счёт или QR

Передайте Bearer-ключ, X-Tole-Connection-Id и уникальный Idempotency-Key.

4

Смоделируйте оплату

Вызовите simulate со статусом paid и проверьте свой webhook-обработчик.

5

Переключитесь на live

Замените test-ключ и /sandbox routes на live-ключ и live routes. Test ID не переносятся в live.

Как подготовить кассира Kaspi

Авторизация и общие заголовки

Платёжные 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-права не поддерживаются.

Read

120 / min

GET и provider reads

Lookup

60 / min

client-info

Mutation

30 / min

create, cancel, refund

Live payment API

Все маршруты ниже добавляются к https://api.tolepay.kz/v1. operationId и paymentIntentId — локальные UUID Tole; приватные идентификаторы Kaspi наружу не возвращаются.

POST/invoices/client-infoПроверить получателя счёта

Проверяет, может ли Kaspi выставить счёт указанному номеру. ФИО и полный телефон клиента наружу не возвращаются.

Авторизация: Bearer API keyPermission: invoice:readHTTP: 200 OK
ПолеГдеТипОбязательноОписание
X-Tole-Connection-IdheaderstringНетUUID live-подключения; можно не передавать при настроенном основном подключении.
phoneNumberbodystringДаКазахстанский номер: +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"}'
200 OK · Пример ответа
{
  "ok": true,
  "data": { "eligible": true }
}
POST/invoicesСоздать счёт по номеру

Создаёт live-счёт Kaspi. Возвращённый data.id — локальный UUID Tole для следующих запросов.

Авторизация: Bearer API keyPermission: invoice:createHTTP: 201 Created
ПолеГдеТипОбязательноОписание
X-Tole-Connection-IdheaderstringНетUUID live-подключения; можно не передавать при настроенном основном подключении.
Idempotency-KeyheaderstringДаУникальный ключ мутации. Повторяйте тот же запрос с тем же ключом.
phoneNumberbodystringДа+7 и 10 цифр.
amountbodyintegerДаСумма в KZT: 1–100 000 000.
commentbodystringНетНеобязательно, максимум 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"}'
201 Created · Пример ответа
{
  "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Получить историю счетов

Возвращает безопасную историю счетов выбранного подключения.

Авторизация: Bearer API keyPermission: invoice:readHTTP: 200 OK
ПолеГдеТипОбязательноОписание
X-Tole-Connection-IdheaderstringНетUUID live-подключения; можно не передавать при настроенном основном подключении.

Provider-поля фильтруются; приватные Kaspi ID заменяются локальными operationId.

Пример запроса
curl https://api.tolepay.kz/v1/invoices/history \
  -H "Authorization: Bearer $TOLE_API_KEY"
200 OK · Пример ответа
{
  "ok": true,
  "data": { "items": [{ "operationId": "uuid", "amount": 5000, "status": "Processed", "date": "…" }] }
}
GET/invoices/{operationId}Получить детали счёта

Читает актуальные детали у провайдера и обновляет наблюдаемый статус payment intent.

Авторизация: Bearer API keyPermission: invoice:readHTTP: 200 OK
ПолеГдеТипОбязательноОписание
X-Tole-Connection-IdheaderstringНетUUID live-подключения; можно не передавать при настроенном основном подключении.
operationIdpathuuidДаЛокальный owner-scoped UUID операции Tole.
Пример запроса
curl https://api.tolepay.kz/v1/invoices/$OPERATION_ID \
  -H "Authorization: Bearer $TOLE_API_KEY"
200 OK · Пример ответа
{
  "ok": true,
  "data": { "amount": 5000, "currency": "KZT", "status": "Processed" }
}
POST/invoices/{operationId}/cancelОтменить счёт

Отменяет ранее созданный счёт. Body — пустой JSON-объект.

Авторизация: Bearer API keyPermission: invoice:cancelHTTP: 200 OK
ПолеГдеТипОбязательноОписание
X-Tole-Connection-IdheaderstringНетUUID live-подключения; можно не передавать при настроенном основном подключении.
Idempotency-KeyheaderstringДаУникальный ключ мутации. Повторяйте тот же запрос с тем же ключом.
operationIdpathuuidДаЛокальный 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 '{}'
200 OK · Пример ответа
{
  "ok": true,
  "data": { "operationId": "uuid", "status": "cancelled" },
  "commandId": "uuid",
  "replayed": false
}
POST/qrСоздать динамический QR

Создаёт QR для оплаты и возвращает paymentUrl и исходный qrToken.

Авторизация: Bearer API keyPermission: qr:createHTTP: 201 Created
ПолеГдеТипОбязательноОписание
X-Tole-Connection-IdheaderstringНетUUID live-подключения; можно не передавать при настроенном основном подключении.
Idempotency-KeyheaderstringДаУникальный ключ мутации. Повторяйте тот же запрос с тем же ключом.
amountbodyintegerДаСумма KZT: 1–100 000 000.
latitudebodynumberНетНеобязательно, −90…90; только вместе с longitude.
longitudebodynumberНетНеобязательно, −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}'
201 Created · Пример ответа
{
  "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 у провайдера.

Авторизация: Bearer API keyPermission: qr:readHTTP: 200 OK
ПолеГдеТипОбязательноОписание
X-Tole-Connection-IdheaderstringНетUUID live-подключения; можно не передавать при настроенном основном подключении.
operationIdpathuuidДаЛокальный owner-scoped UUID операции Tole.
Пример запроса
curl https://api.tolepay.kz/v1/qr/$OPERATION_ID \
  -H "Authorization: Bearer $TOLE_API_KEY"
200 OK · Пример ответа
{
  "ok": true,
  "data": { "amount": 5000, "currency": "KZT", "status": "Processed" }
}
GET/history/operationsПолучить историю операций

История до указанной календарной даты UTC с cursor следующей страницы.

Авторизация: Bearer API keyPermission: history:readHTTP: 200 OK
ПолеГдеТипОбязательноОписание
X-Tole-Connection-IdheaderstringНетUUID live-подключения; можно не передавать при настроенном основном подключении.
endDatequerydateДаОбязательно: YYYY-MM-DD, включительно, UTC.
lastTransactionDatequerystringНетCursor из предыдущего ответа.
statementPeriodCodequeryintegerНетНеотрицательный код периода.
Пример запроса
curl "https://api.tolepay.kz/v1/history/operations?endDate=2026-08-23" \
  -H "Authorization: Bearer $TOLE_API_KEY"
200 OK · Пример ответа
{
  "ok": true,
  "data": {
    "items": [{ "operationId": "uuid", "amount": 5000, "type": "Payment", "status": "Processed" }],
    "lastTransactionDate": "…", "hasMore": false
  }
}
GET/history/operations/{operationId}Получить операцию из истории

Безопасные детали операции по локальному UUID.

Авторизация: Bearer API keyPermission: history:readHTTP: 200 OK
ПолеГдеТипОбязательноОписание
X-Tole-Connection-IdheaderstringНетUUID live-подключения; можно не передавать при настроенном основном подключении.
operationIdpathuuidДаЛокальный owner-scoped UUID операции Tole.
operationMethodqueryintegerНетНеобязательный неотрицательный код метода.
Пример запроса
curl "https://api.tolepay.kz/v1/history/operations/$OPERATION_ID?operationMethod=0" \
  -H "Authorization: Bearer $TOLE_API_KEY"
200 OK · Пример ответа
{
  "ok": true,
  "data": { "operationId": "uuid", "amount": 5000, "status": "Processed" }
}
POST/refundsСоздать возврат

Полный или частичный возврат оплаченного QR текущего подключения.

Авторизация: Bearer API keyPermission: refund:createHTTP: 200 OK
ПолеГдеТипОбязательноОписание
X-Tole-Connection-IdheaderstringНетUUID live-подключения; можно не передавать при настроенном основном подключении.
Idempotency-KeyheaderstringДаУникальный ключ мутации. Повторяйте тот же запрос с тем же ключом.
operationIdbodyuuidДаЛокальный UUID QR/payment intent.
returnAmountbodyintegerДа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}'
200 OK · Пример ответа
{
  "ok": true,
  "data": { "operationId": "uuid", "status": "refund_accepted", "returnAmount": 1500 },
  "commandId": "uuid", "replayed": false
}
GET/payment-intents/invoices/{paymentIntentId}Получить сохранённый статус счёта

Читает состояние из надёжного ledger Tole для reconciliation.

Авторизация: Bearer API keyPermission: invoice:readHTTP: 200 OK
ПолеГдеТипОбязательноОписание
X-Tole-Connection-IdheaderstringНетUUID live-подключения; можно не передавать при настроенном основном подключении.
paymentIntentIdpathuuidДаUUID платёжного намерения Tole.
Пример запроса
curl https://api.tolepay.kz/v1/payment-intents/invoices/$PAYMENT_INTENT_ID \
  -H "Authorization: Bearer $TOLE_API_KEY"
200 OK · Пример ответа
{
  "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.

Авторизация: Bearer API keyPermission: qr:readHTTP: 200 OK
ПолеГдеТипОбязательноОписание
X-Tole-Connection-IdheaderstringНетUUID live-подключения; можно не передавать при настроенном основном подключении.
paymentIntentIdpathuuidДаUUID платёжного намерения Tole.
Пример запроса
curl https://api.tolepay.kz/v1/payment-intents/qr/$PAYMENT_INTENT_ID \
  -H "Authorization: Bearer $TOLE_API_KEY"
200 OK · Пример ответа
{
  "ok": true,
  "data": { "id": "uuid", "kind": "qr", "status": "pending", "amount": 5000, "currency": "KZT", "revision": 1 }
}
GET/commands/{commandId}Проверить идемпотентную команду

Проверяет create/cancel/refund после 202, сетевого разрыва или повтора.

Авторизация: Bearer API keyHTTP: 200 OK
ПолеГдеТипОбязательноОписание
commandIdpathuuidДаUUID из commandId или Location.

Команда сама определяет connection и permission. Чужой commandId возвращает 404.

Пример запроса
curl https://api.tolepay.kz/v1/commands/$COMMAND_ID \
  -H "Authorization: Bearer $TOLE_API_KEY"
200 OK · Пример ответа
{
  "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 обязателен.

POST/sandbox/invoices/client-info

invoice:read

POST/sandbox/invoices

invoice:create

GET/sandbox/invoices/history

invoice:read

GET/sandbox/invoices/{operationId}

invoice:read

POST/sandbox/invoices/{operationId}/cancel

invoice:cancel

POST/sandbox/qr

qr:create

GET/sandbox/qr/{operationId}

qr:read

GET/sandbox/history/operations

history:read

GET/sandbox/history/operations/{operationId}

history:read

POST/sandbox/refunds

refund:create

GET/sandbox/commands/{commandId}

permission исходной команды

201 Created · sandbox invoice
{
  "ok": true,
  "data": {
    "id": "uuid", "kind": "invoice", "status": "created", "amount": 5000,
    "clientPhoneLast4": "4567", "orderNumber": "SBX-1234ABCD", "environment": "sandbox"
  },
  "commandId": "uuid", "replayed": false
}
201 Created · sandbox QR
{
  "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.

Авторизация: Bearer JWTHTTP: 201 Created
ПолеГдеТипОбязательноОписание
displayNamebodystringДаНазвание 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"}'
201 Created · Пример ответа
{
  "id": "uuid", "providerMode": "sandbox", "status": "active", "displayName": "Development"
}
GET/sandbox/payment-intents/{paymentIntentId}Получить sandbox payment intent

Durable test-состояние счёта или QR.

Авторизация: Bearer API keyPermission: history:readHTTP: 200 OK
ПолеГдеТипОбязательноОписание
X-Tole-Connection-IdheaderstringДаОбязательный UUID sandbox-подключения.
paymentIntentIdpathuuidДа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"
200 OK · Пример ответа
{
  "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-событие.

Авторизация: Bearer API keyPermission: sandbox:simulateHTTP: 200 OK
ПолеГдеТипОбязательноОписание
X-Tole-Connection-IdheaderstringДаОбязательный UUID sandbox-подключения.
paymentIntentIdpathuuidДаUUID платёжного намерения Tole.
statusbodyenumДа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"}'
200 OK · Пример ответа
{
  "ok": true,
  "data": { "id": "uuid", "kind": "invoice", "status": "paid", "environment": "sandbox" }
}

API-ключи и permissions

Ключ создаётся в кабинете или через management API с пользовательским JWT. Raw secret возвращается только при создании; дальше API показывает только безопасный prefix.

GET/api-keys

JWT · Список ключей; query cursor и limit 1–100

POST/api-keys

JWT · Создать: { name, grants: [{ connectionId, permissions }] }

PUT/api-keys/{apiKeyId}

JWT · Заменить name и grants; нужен expectedRevision

POST/api-keys/{apiKeyId}/revoke

JWT · Отозвать ключ; повторный revoke безопасен

PermissionРазрешает
invoice:createPOST /invoices
invoice:readclient-info, invoice history/details, invoice payment intent
invoice:cancelPOST /invoices/{id}/cancel
qr:createPOST /qr
qr:readQR details и QR payment intent
history:readhistory endpoints и sandbox payment intent
refund:createPOST /refunds
sandbox:simulatePOST /sandbox/payment-intents/{id}/simulate
POST /api-keys · request
{
  "name": "Production backend",
  "grants": [{
    "connectionId": "7a67d6bd-5daf-47af-b899-fdb8b7db4d63",
    "permissions": ["invoice:create", "invoice:read", "invoice:cancel"]
  }]
}
201 Created · secret returned once
{
  "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_* возвращается один раз.

GET/webhook-endpoints

JWT · Список endpoint-ов

POST/webhook-endpoints

JWT · Создать: { name, url }; secret возвращается один раз

POST/webhook-endpoints/{endpointId}/disable

JWT · Отключить; body {}

GET/webhook-deliveries?status=…

JWT · pending | processing | delivered | dead_letter

POST/webhook-deliveries/{deliveryId}/replay

JWT · Повторить dead-letter delivery; body {}

HTTP delivery

webhook-id

UUID события

webhook-timestamp

Unix timestamp

webhook-signature

v1=<hex HMAC-SHA256>

Payment webhook event
{
  "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 только после надёжной фиксации события.

Node.js · signature verification
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.

GET/billing/overview

JWT · Subscription, usage, invoices и текущий checkout

GET/billing/plans

JWT · Доступные публичные планы и entitlements

GET/billing/invoices/{invoiceId}

JWT · Получить owner-scoped billing invoice

POST/billing/checkout

JWT · Создать или продолжить checkout: { planCode }

GET/billing/checkout/{checkoutId}

JWT · Получить статус checkout

POST/billing/subscription/cancel

JWT · Отменить подписку в конце периода

POST/billing/webhooks/kaspi

provider callback · Служебный HMAC callback; не вызывается merchant-интеграцией

POST /billing/checkout · request
{
  "planCode": "business"
}
201 Created · checkout
{
  "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

200 / 201

Complete

Сохраните data.id/paymentIntentId и commandId. Повтор с тем же Idempotency-Key вернёт тот же результат и header Idempotent-Replayed: true.

202 in_progress

Wait

Читайте Retry-After: 2 и Location. Poll GET /commands/:commandId. Не создавайте новую mutation.

202 outcome_unknown

Do not retry

Kaspi мог выполнить операцию. Проверяйте command и payment intent; новый create может дать дубль.

202 Accepted · in progress
{
  "ok": false, "kind": "in_progress", "commandId": "uuid", "replayed": true
}
202 Accepted · outcome unknown
{
  "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 предназначен только для диагностики и может измениться.

Error response
{
  "statusCode": 409,
  "code": "PUBLIC_API_IDEMPOTENCY_CONFLICT",
  "message": "The Idempotency-Key was already used for a different request"
}
HTTPcodeЧто делать
400PUBLIC_API_VALIDATION_ERRORИсправить body, query, UUID или заголовок. Не повторять без изменения запроса.
401API_KEY_INVALID_CREDENTIALПроверить namespace и заменить неверный или отозванный ключ.
402BILLING_SUBSCRIPTION_UNAVAILABLE
BILLING_ENTITLEMENT_UNAVAILABLE
Активировать тариф или возможность.
403PUBLIC_API_FORBIDDENПроверить grant, permission и X-Tole-Connection-Id.
404PUBLIC_API_RESOURCE_NOT_FOUNDПроверить локальный UUID и environment; чужие ресурсы также выглядят как 404.
409PUBLIC_API_IDEMPOTENCY_CONFLICTНе менять body под старым ключом. Для новой операции создать новый key.
409PUBLIC_API_DEFAULT_CONNECTION_REQUIRED
PUBLIC_API_DEFAULT_CONNECTION_UNAVAILABLE
Передать connection header или исправить основное подключение.
409PAYMENT_INVALID_STATE
PAYMENT_REFUND_LIMIT_EXCEEDED
Перечитать payment intent и исправить переход или сумму.
429RATE_LIMIT_EXCEEDED
BILLING_LIMIT_EXCEEDED
Соблюдать Retry-After или лимит тарифа.
502PUBLIC_API_UPSTREAM_REJECTEDKaspi отклонил команду. Исправить бизнес-условия перед новой командой.
503PUBLIC_API_UNAVAILABLE
RATE_LIMIT_UNAVAILABLE
Для read — backoff. Для mutation сначала проверить commandId.
500PUBLIC_API_INTERNAL_ERRORСохранить безопасный context и обратиться в поддержку.
Написать в WhatsApp