REST API · актуально

Документация
API.

Справочник по REST API kaspipos. Все запросы идут на ваш сервер kaspipos, отвечают JSON. Платёжные эндпоинты авторизуются заголовком X-Api-Key. Базовый URL в разработке — http://localhost:3000.

a / 5 мин

Первый QR.

Один POST-запрос — и вы получаете ссылку оплаты Kaspi для клиента.

→ qr/create
b / webhook

Получить событие.

Финальный статус платежа приходит вебхуком с HMAC-подписью.

→ webhooks
c / cabinet

Получить ключ.

API-ключ и подключение Kaspi настраиваются в веб-кабинете.

→ cabinet

01 / Быстрый старт

Чтобы принять первый платёж, нужно: войти в кабинет через Google, подключить Kaspi Pay (телефон роли кассира + SMS-код) и создать API-ключ. Всё это делается один раз в веб-кабинете.

Шаг 1 — Подключить Kaspi и получить ключ

В кабинете подключите Kaspi Pay в разделе «Kaspi-касса», затем в разделе «API-ключи» нажмите «Создать ключ». Ключ показывается полностью один раз — сохраните его. Подробнее — в разделе «Кабинет и ключи».

Шаг 2 — Первый запрос

curl create-qr.sh copy
# Создать QR-платёж
curl -X POST http://localhost:3000/api/qr/create \
  -H "X-Api-Key: kpos_..." \
  -H "Content-Type: application/json" \
  -d '{ "amount": 500 }'

Шаг 3 — Получить вебхук

Когда клиент оплачивает QR, платёж отслеживается автоматически, и при финальном статусе на ваш endpoint приходит POST с событием payment.success и подписью в заголовке X-Webhook-Signature. Вебхуки настраиваются в кабинете.

02 / Авторизация

Платёжные эндпоинты (/api/qr, /api/invoice, /api/refund, /api/history, /api/session) принимают заголовок X-Api-Key с действующим ключом — либо cookie-сессию кабинета, если запрос идёт из браузера вошедшего мерчанта.

httpcopy
X-Api-Key:    kpos_7f2a8c... // ключ из кабинета
Content-Type: application/json
⌶ Kaspi-токен хранится на сервере Токен Kaspi (tokenSN, секрет vtoken) клиент никогда не передаёт и не видит — сервер сам подставляет его по арендатору. Вы работаете только со своим X-Api-Key.

Эндпоинты кабинета (/api/account, /api/auth, /api/keys, /api/payments, /api/webhooks) авторизуются только cookie-сессией и предназначены для веб-кабинета.

03 / Ошибки

При ошибке ответ — JSON с одним полем error и соответствующим HTTP-кодом.

jsonerror.json
{ "error": "amount required" }
HTTPЧто значит
400Отсутствуют обязательные параметры запроса.
401Не авторизован — нет cookie, либо X-Api-Key отсутствует, неверен или отозван.
409Kaspi Pay не подключён для этого аккаунта. Подключите его в кабинете.
500Внутренняя ошибка сервера или ошибка Kaspi API.

Ответ Kaspi может иметь HTTP 200, но содержать собственный StatusCode ≠ 0 и поле Message — проверяйте тело ответа, а не только HTTP-код.

04 / Создать QR-платёж

POST /api/qr/create auth · X-Api-Key

Создаёт QR-платёж и возвращает ссылку для оплаты. Платёж автоматически отслеживается; при финальном статусе уходит вебхук.

ПолеОбяз.Описание
amount
number · ₸
required
Сумма платежа в тенге.
latitude
number
optional
Широта точки. По умолчанию — координаты Алматы.
longitude
number
optional
Долгота точки. По умолчанию — координаты Алматы.

Пример запроса

curlcreate.shcopy
curl -X POST http://localhost:3000/api/qr/create \
  -H "X-Api-Key: kpos_..." \
  -H "Content-Type: application/json" \
  -d '{ "amount": 500 }'

Пример ответа

jsonresponse.json
{
  "StatusCode": 0,
  "Data": {
    "QrOperationId": 789012,
    "QrToken":      "https://pay.kaspi.kz/pay/...",
    "ExpireDate":   "2026-01-01T12:05:00",
    "Amount":       500
  }
}
QrToken Это ссылка для оплаты — её можно открыть напрямую или превратить в QR-код для клиента.

05 / Статус QR

GET /api/qr/status?qrOperationId=789012 auth · X-Api-Key

Возвращает текущий статус QR-платежа от Kaspi. Полезно для синхронной сверки — но в общем случае надёжнее доверять вебхуку.

Параметр queryОбяз.Описание
qrOperationId
number
required
QrOperationId из ответа на создание QR.

Промежуточные статусы QR: QrTokenCreated, Wait. Финальные: Processed (успех), Expired / QrTokenDiscarded (просрочка), прочие — отказ.

06 / Счёт на телефон

POST /api/invoice/create auth · X-Api-Key

Выставляет счёт на оплату прямо в приложение Kaspi клиента по номеру телефона. Как и QR, счёт отслеживается автоматически.

ПолеОбяз.Описание
phoneNumber
string
required
Телефон клиента. Формат 7XXXXXXXXXX.
amount
number · ₸
required
Сумма счёта в тенге.
comment
string
optional
Комментарий к счёту для клиента.
curlinvoice.shcopy
curl -X POST http://localhost:3000/api/invoice/create \
  -H "X-Api-Key: kpos_..." \
  -H "Content-Type: application/json" \
  -d '{
    "phoneNumber": "77001234567",
    "amount":      2500,
    "comment":     "Заказ ORDER-9821"
  }'

Ответ: { "StatusCode": 0, "Data": { "Id", "Status": "RemotePaymentCreated", "Amount", ... } }.

Детали счёта

GET /api/invoice/details?operationId=123456 auth · X-Api-Key

Текущее состояние ранее выставленного счёта.

Отменить счёт

POST /api/invoice/cancel auth · X-Api-Key

Отменяет неоплаченный счёт. Тело: { "operationId": "123456" }.

Клиент по номеру

GET /api/invoice/client-info?phoneNumber=77001234567 auth · X-Api-Key

Информация о клиенте Kaspi по номеру телефона.

История счетов

POST /api/invoice/history auth · X-Api-Key

Последние 20 счетов. Тело запроса — пустой объект {}.

07 / Возврат

POST /api/refund/create auth · X-Api-Key

Полный или частичный возврат проведённого QR-платежа. Деньги уходят обратно клиенту в Kaspi.

ПолеОбяз.Описание
qrOperationId
number
required
QrOperationId платежа, который возвращаете.
returnAmount
number · ₸
required
Сумма возврата в тенге.

08 / История операций

POST /api/history/operations auth · X-Api-Key

История операций напрямую из Kaspi.

ПолеОбяз.Описание
endDate
string
required
Дата конца периода. Формат YYYY-MM-DD.
lastTransactionDate
string
optional
Для постраничной выборки.
statementPeriodCode
number
optional
Код периода выписки. По умолчанию 0.

Детали операции

POST /api/history/details auth · X-Api-Key

Детали одной операции. Тело: id (number, обязательно) и operationMethod (number, опционально, по умолчанию 0).

09 / Проверка сессии

GET /api/session/check auth · X-Api-Key

Живая проверка Kaspi-сессии — делает реальный запрос к Kaspi и сообщает, принят ли токен.

jsonsession.json
// сессия активна
{ "active": true }

// сессия отклонена Kaspi
{ "active": false, "error": "...", "code": 401 }

10 / Webhooks

Вебхук — это HTTP POST от kaspipos в ваше приложение при финальном статусе платежа. Endpoint-адреса, события и секрет подписи настраиваются в кабинете, раздел «Webhooks».

Принцип Вебхук отправляется один раз для каждого платежа — при достижении финального статуса (успех, отказ или просрочка).

События

payment.successфинальное
Клиент успешно оплатил QR или счёт.
payment.failedфинальное
Платёж отклонён или отменён клиентом, либо Kaspi его не подтвердил.
payment.expiredфинальное
Истёк срок QR/счёта — оплаты не было.

Тело вебхука

jsonwebhook.json
{
  "event":      "payment.success",
  "paymentId":  "789012",
  "type":       "qr",
  "status":     "Processed",
  "statusDesc": "",
  "amount":     500,
  "qrToken":    "https://pay.kaspi.kz/pay/...",
  "receiptUrl": "https://...",
  "orderNumber": "...",
  "data":       { },
  "timestamp":  "2026-01-01T12:00:00.000Z"
}

Подпись HMAC

Если для вебхука задан секрет, тело подписывается HMAC-SHA256 и подпись передаётся в заголовке X-Webhook-Signature в формате sha256=<hex>.

nodeverify.jscopy
import crypto from 'crypto'

function verify(rawBody, signatureHeader, secret) {
  const expected = 'sha256=' + crypto
    .createHmac('sha256', secret)
    .update(rawBody)
    .digest('hex')

  return crypto.timingSafeEqual(
    Buffer.from(expected),
    Buffer.from(signatureHeader),
  )
}

Ретраи

Отвечайте быстро Сервер ждёт ответ не дольше 10 секунд. Тяжёлую обработку выполняйте асинхронно — сразу отвечайте 2xx, а бизнес-логику запускайте в фоне.

11 / Кабинет и ключи

Регистрация, подключение Kaspi, API-ключи и вебхуки настраиваются в веб-кабинете — программного API для этого нет (эти эндпоинты работают только по cookie-сессии).

Вход
Только через Google. Аккаунт мерчанта создаётся автоматически при первом входе.
Подключение Kaspi
Раздел «Kaspi-касса»: вход по номеру телефона роли кассира и SMS-коду.
API-ключи
Раздел «API-ключи»: ключ вида kpos_... показывается один раз при создании.
Webhooks
Раздел «Webhooks»: URL, список событий и секрет подписи.
◌ Открыть кабинет Перейдите в кабинет, чтобы подключить Kaspi и создать первый ключ.
← На главную kaspipos · API · обновлено 2026 ↑ Наверх