Kaspi Pay is the merchant payment feature of Kaspi.kz in Kazakhstan. ApiPay provides a REST API on top of it, so a business can issue invoices to a customer's phone number, accept QR payments and receive webhooks from its own code.
ApiPay is an independent service that automates your own Kaspi Pay through its built-in Cashier role. Money from customers goes straight to your Kaspi account.
Kaspi Pay is the payment-acceptance feature that Kaspi.kz offers to businesses in Kazakhstan. To use it — and therefore to use ApiPay — you need a business registered in Kazakhstan (a sole proprietorship or an LLP) with an active Kaspi Pay merchant account, plus a separate employee phone number holding the Cashier role in that account. What Kaspi Pay itself does and what it requires is described in the Kaspi help centre. Which documents your particular business needs is a question for your own lawyer, not for us.
One warning worth reading twice: while a phone number is linked to ApiPay, you cannot sign in to the Kaspi Pay app with that number. Doing so breaks the linked session. Use a dedicated SIM card for the cashier.
ApiPay turns those same Kaspi Pay functions into HTTP calls. Base URL https://api.apipay.kz/api/v1, authentication through the X-API-Key header, 200 requests per minute per key.
| Method | Endpoint | What it does |
|---|---|---|
| POST | /invoices | Invoice to a phone number. Processed asynchronously: the 201 comes back with status: "processing", and the final status arrives by webhook. |
| POST | /invoices/qr | Dynamic QR invoice, no phone number needed. Synchronous 201 with status: "pending". The scan window is minutes, not hours — read qr_expires_at from the response instead of hard-coding a duration. |
| POST | /static-qr | Printed QR tied to a deal: the sheet is printed once, the invoice materialises when the customer scans it. |
| GET | /invoices/{id} | Read one invoice. Raised limit of 1000 requests per minute, for systems that cannot receive HTTP callbacks. |
| POST | /invoices/{id}/cancel | Cancel an invoice issued to a phone number. A QR invoice cannot be cancelled — it expires on its own. |
| POST | /invoices/{id}/refund | Refund, full or partial. The refund leaves your Kaspi account at the full amount of the payment, while Kaspi withheld its acquiring fee at the moment of payment — keep enough balance on the Kaspi account to cover the difference. |
| POST | /qr-refunds/links | Issue a single-use refund link for a customer who is not standing at the till. Once the customer taps it, the confirmation window is no more than 90 seconds — the value in force comes back in scan_wait_timeout_seconds. |
| POST | /subscriptions | Recurring subscriptions: ApiPay re-issues the invoice on schedule by itself. |
| GET | /catalog | Product catalogue, for invoices assembled from line items (cart_items). |
Outgoing webhooks cover the same ground: invoice.status_changed, invoice.qr_scanned, invoice.refunded, the subscription.* family and more. They are described on the webhooks page.
Four steps, and the order matters: the sandbox is available right after sign-up, live mode only after the business profile form is approved.
1. Sign up. A sandbox organisation is created for you at sign-up: it never calls Kaspi, so you can build and test the whole integration before anything is approved.
2. Submit the business profile form. For live mode, fill in the «Tell us about your business» form in the dashboard and wait for approval — usually a few hours. A cashier cannot be connected before that: the API answers 403 kyc_required.
3. Connect a cashier. Once the form is approved, the wizard at apipay.kz/connect-cashier asks for the phone number of an employee with the Cashier role in your Kaspi Pay, then for the SMS code. It takes about a minute and needs nothing new on Kaspi's side.
4. Get an API key and issue a live invoice. The dashboard issues the key, and the same screen holds the webhook URL and the webhook secret.
curl -X POST https://api.apipay.kz/api/v1/invoices \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"phone_number": "87001234567",
"amount": 5000,
"description": "Order 123",
"external_order_id_idempotency": "order-123"
}'
# 201 with status "processing" is normal: the invoice is created asynchronously.
# The outcome (pending, then paid) arrives as an invoice.status_changed webhook.
# amount is in whole tenge; description is what the customer sees in Kaspi.
# external_order_id_idempotency makes a retried call safe — a duplicate key is
# answered with 409 instead of a second invoice.
| Plan | Per month | Invoices per day |
|---|---|---|
| Start | 10 000 ₸ | up to 30 |
| Business | 25 000 ₸ | up to 100 |
| Pro | 60 000 ₸ | up to 300 |
| Pro Max | 90 000 ₸ | up to 600 |
| More than 600 per day | custom quote — write to us | |
Prices are valid from 9 August 2026. ApiPay charges a fixed monthly subscription only, no percentage of payments. The acquiring fee for each payment is withheld by Kaspi under the merchant's own Kaspi Pay terms and is unrelated to ApiPay. The technical ceiling is 200 requests per minute per API key; the sandbox is free and has no time limit.
The service is operated by ApiPay LLP (ApiPay Limited Liability Partnership, ТОО «ApiPay»), BIN 260740019652, Almaty, Kazakhstan. The service has been operating since 2 February 2026. The documentation is public on GitHub, and there is a community node for n8n on npm. ApiPay is an independent service and is not affiliated with or endorsed by Kaspi Bank. Kaspi and Kaspi Pay are trademarks of their owner. Customers pay into your own Kaspi account; ApiPay never touches the money.
ApiPay does not serve casinos, betting, lotteries or other gambling businesses, nor crypto and forex, weapons or adult content. The merchant confirms this in the business profile form, and live mode is not opened without its approval. Applications from such companies are declined.
Kaspi Pay has no public payment API for merchants; a direct integration is possible under a contract with Kaspi. The Kaspi marketplace (Kaspi Shop) has its own Shop API, but that is a different product and it does not issue Kaspi Pay invoices. ApiPay is an independent REST API on top of your own Kaspi Pay: it works through the built-in Cashier role, so nothing has to be built on Kaspi's side.
Yes, through ApiPay. Your website, CRM or bot calls POST /api/v1/invoices with the amount and the customer's phone number; the invoice appears in the customer's Kaspi app, and your system learns about the payment from the invoice.status_changed webhook. Money goes straight to your own Kaspi account — ApiPay never holds it.
Kaspi Pay itself does not send webhooks to the merchant — in the app a payment is only visible on screen. ApiPay sends them: invoice.status_changed on every notifiable status change, plus invoice.qr_scanned, invoice.refunded, subscription.* and others. Each request carries X-Webhook-Signature: sha256=<HMAC-SHA256 of the raw body> when a webhook secret is set. Details are on the webhooks page.
ApiPay charges a fixed monthly subscription only, no percentage of payments: Start 10 000 ₸ (up to 30 invoices per day), Business 25 000 ₸ (up to 100), Pro 60 000 ₸ (up to 300), Pro Max 90 000 ₸ (up to 600). Prices are valid from 9 August 2026. More than 600 invoices a day — custom quote. The acquiring fee for each payment is withheld by Kaspi under the merchant's own Kaspi Pay terms and is unrelated to ApiPay.
Yes. You need a business registered in Kazakhstan (sole proprietorship or LLP) with an active Kaspi Pay merchant account, and a separate employee phone number with the Cashier role in that Kaspi Pay. The order is: sign up, use the sandbox right away, then submit the business profile form in the dashboard for live mode and wait for approval — usually a few hours. A cashier cannot be connected before the form is approved: the API answers 403 kyc_required. After approval the wizard at apipay.kz/connect-cashier links the number by SMS code in about a minute, and live invoices become available. While the number is linked to ApiPay you cannot sign in to the Kaspi Pay app with it — the session breaks, so use a dedicated SIM card.
The full API reference at apipay.kz/docs is in Russian. The machine-readable OpenAPI 3.0 specification at apipay.kz/openapi.json is language-neutral and can be imported into Postman, Insomnia or a code generator. This page and apipay.kz/en/webhooks are the English summaries.
Sign-up takes a couple of minutes and the sandbox is free: you can build the whole integration while the business profile form is being reviewed.
Create an account