Aitole API v2
РУС Қателер Мәртебе
Aitole API

Kaspi Pay қабылдау REST арқылы — мерчант аккаунтының үстінен.

QR мен нөмірге шот қою, мәртебені ұстау және оқиғалар журналын оқу үшін бір REST-API. Kaspi-ге қосылымды платформа сіз үшін ұстап тұрады; сіз HTTP-сұраныс жасайсыз.

Базалық мекенжай

base url
https://api.aitole.kz

Келісімдер

  • Ақша — бүтін теңге (integer). Бөлшек сомалар → 422 amount_not_whole.
  • Жасау кезіндегі провайдер ақаулығы — 5xx емес: операция мына мәртебеде қайтады: failed себеп коды және HTTP 200. Мына өрісті тексеріңіз: status, тек HTTP-кодын ғана емес.
  • Әр жауап мына тақырыпты алып жүреді: X-Request-Id — қолдауға жүгінгенде оны көрсетіңіз.
  • Барлық дене — JSON, жауаптағы өрістер — snake_case.
Аутентификация

Екі контур: төлемге кілт, кабинетке токен.

Төлем қабылдау мынау арқылы жүреді: API-кілт. Қосылымдар мен кілттерді басқару — мынау арқылы: кабинеттен алынған JWT. Кілт қосылымдарды басқармайды — бұл ол ағып кеткен жағдайға арналған қорғаныс.

API-кілт — мынаған: /v2/*

Кілтті мына тақырыпта жіберіңіз: X-API-Key. Пішімі: sk_live_… (нақты) немесе sk_test_… (сынақ, жиілік бойынша шектеусіз).

header
X-API-Key: sk_live_hLR0vCVY_…

Кілтте бар: scopes: рұқсат етілген құралдар тізімі (tools: "*" немесе мынадай массив: ["create_qr"]) және сома шегі (maxAmount: сан немесе null). Тізімнен тыс құрал → 403 tool_not_allowed; шектен жоғары сома → 422 amount_over_key_cap.

JWT — мынаған: /me/*

Логин токен береді; оны былай жіберіңіз: Authorization: Bearer. Кілт (X-API-Key) кабинетке мүлдем кіргізілмейді.

POST/auth/login
curl
curl -X POST https://api.aitole.kz/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]","password":"…"}'

← 200  { "token": "eyJhbGciOiJIUzI1NiJ9…" }
Қате пішімі

Бірыңғай қате конверті.

Кез келген қате — сол бір JSON. Мынау бойынша тармақтаңыз: error.code, мәтін бойынша емес. Кодтардың толық тізімі — төменде.

json
{
  "error": {
    "code": "amount_over_key_cap",
    "message": "Операция сомасы кілт шегінен асады",
    "category": "validation",
    "request_id": "req_79b6…"
  }
}
Қосылым

Kaspi онбордингі — кабинеттен, SMS арқылы.

Мерчант аккаунтын қосу — JWT астындағы үш auth-қадам (owner/admin). Сессия құпиясын платформа шифрланған күйде сақтайды және сыртқа бермейді. Барлық әдіс — Authorization: Bearer.

POST/me/connectionsjwt

Қосылым жобасын жасайды. Дене: { "driver": "http" } нақты Kaspi үшін немесе { "driver": "mock" } сынақ ортасы үшін. Жауап — сессия құпиясы жоқ қауіпсіз түрде.

json
{ "id": "7a3069ab-…", "driver": "http",
  "status": "onboarding", "is_default": false, "created_at": "2026-09-08T…" }

Содан кейін — мынау бойынша үш авторизация қадамы: :id

ҚадамДенеЖауап (stage)
POST /me/connections/:id/auth/initphone_required
POST /me/connections/:id/auth/phone{"phone":"+7701…"}otp_required
POST /me/connections/:id/auth/otp{"code":"1234"}active
Иесінің емес, кассирдің нөмірі керек. Kaspi Pay-де «Кассир» рөлі бар аккаунт нөмірін қосыңыз. Kaspi-де бір нөмірге бір белсенді сессия: нөмір платформаға байланып тұрғанда, онымен Kaspi Pay қосымшасына кіруге болмайды — платформа сессиясы ығысады да, төлем қабылдау тоқтайды. Нөмірді E.164 пішімінде жіберіңіз (+77001234567) — Kaspi пішіміне платформа өзі келтіреді.
Кейін otp → active қосылым дайын. Бірінші белсенді қосылым әдепкі болады — мынау көрсетілмесе, төлемдер сол арқылы жүреді: connectionId. Кейінгілері әдепкіні иеленбейді: мынау арқылы анық тағайындаңыз: POST /:id/default. Басқару: GET /me/connections, POST /:id/logout, DELETE /:id.
Қосылым

Kaspi сессиясы және ол неге өледі.

Қосылым кассир нөміріне байланған тірі Kaspi сессиясына сүйенеді. Kaspi-де бір нөмірге бір белсенді сессия — бұл сирек шеткі жағдай емес, тоқтап қалудың басты себебі.

Сессияны не өлтіреді

  • Сол нөмірмен Kaspi Pay қосымшасына кіру. Сіздің сессияңыз дереу ығысады — Kaspi мұны бөлек кодпен хабарлайды. Сондықтан платформаға берілген кассир нөмірі бөлек болуы керек: онымен қолмен кірмейді.
  • Kaspi жағында сессияның табиғи аяқталуы.

Платформа не істейді

Провайдер сессияны танымайтынын хабарлаған бойда, қосылым мынадан ауыстырылады: activesession_expired, ал журналға оқиға жазылады: connection.session_expired. Мұндай қосылым бойынша мәртебе сұрау тоқтайды — платформа Kaspi-ді өлі сессиямен әлектендірмейді.

Қосылым мәртебесіНені білдіреді
onboardingЖоба: auth-қадамдар әлі аяқталмаған.
activeЖұмыс күйі, төлемдер өтіп жатыр.
session_expiredKaspi сессиясы өлі. Қайта онбординг керек (auth/initphoneotp).
logged_outСіз мынау арқылы өшірдіңіз: POST /:id/logout.

Бұл сіздің жағыңыздан қалай көрінеді

  • Жаңа төлемдер мынамен қабылданбайды: 409 no_active_connection.
  • Мынада: /v2/events пайда болады connection.session_expired.
  • GET /me/connections қосылым мәртебесін көрсетеді.
Күйді кез келген сәтте қолмен тексеруге болады: GET /me/connections/:id/health. Қалпына келтіру — бар қосылымдағы сол үш auth-қадам.

Бірнеше Kaspi аккаунты

Платформаның бір аккаунтында бірнеше нақты қосылым болуы мүмкін — мысалы, әр заңды тұлғаға немесе нүктеге бір-бірден. Төлемге касса мына ретпен таңдалады:

  1. connection_id сұраныс денесінде — анық таңдау.
  2. Қосылым, оған кілт байланған. Байланыс кілт кабинетте шығарылғанда белгіленеді.
  3. «Негізгі» деп белгіленген қосылым.
  4. Өз контурындағы жалғыз белсенді қосылым.
Кілттің байланысы — шекара, әдепкі емес. A кассасына шығарылған кілт B кассасына шот қоймайды, тіпті оның мынасын жіберсеңіз де: connection_id: жауап мынадай болады: 403 forbidden. Осылайша мердігерге берілген немесе бөлек жобаға тігілген кілт аккаунттың қалған кассаларын ашпайды.

Егер контурдың белсенді қосылымы бірнешеу болса, ешқайсысы негізгі деп белгіленбесе және таңдау кілтпен де, сұраныспен де жасалмаса, төлем мынамен қабылданбайды: 409 connection_ambiguous. Ақшаны қай кассаға жіберу керегін платформа болжамайды.

Төлем кассасын қалай білуге болады

Әр төлем оқиғасы мынаны алып жүреді: connection_id — әрі журналда (GET /v2/events), әрі вебхук денесінде. Қосылым оқиғалары да соны алып жүреді. Жазылым мен тариф туралы оқиғаларда касса жоқ: олар тұтас аккаунт туралы.

Вебхукті нақты кассаға жазуға болады: эндпоинт жасағанда мынаны жіберіңіз: connection_id. Мұндай эндпоинт тек соның төлемдерін алады және аккаунт деңгейіндегі оқиғаларды алмайды. Мынасыз эндпоинт: connection_id бұрынғыдай бәрін алады.

Тірі эндпоинттің кассасы мынау арқылы ауыстырылады: PATCH /me/webhooks/:id мына өріспен: connection_id (немесе null, қайтадан бәрін алу үшін). Бұл үшін эндпоинтті қайта жасаудың қажеті жоқ әрі зиянды: жаңасының қолтаңба құпиясы басқа болады.

Идемпотенттік кілті аккаунт шегінде бірегей, жоба шегінде емес. Егер екі жоба тапсырыстарды тәуелсіз нөмірлесе, кілтке жоба префиксін қосыңыз: shop-a-1024 орнына 1024. Әйтпесе екінші жоба біріншінің жауабын алады.
Төлем қабылдау

QR жасау.

POST/v2/qrapi-keyIdempotency-Key

QR-төлем қояды. Мына құралды талап етеді: create_qr кілттің scopes ішінде және міндетті тақырып Idempotency-Key.

Дене параметрлері

ӨрісСипаттама
amountreqСома, бүтін теңге.
commentoptТөлемге түсініктеме.
itemsoptЧек жолдары: [{ "name", "amount" }].
metadataoptСіздің еркін JSON — операцияда және оқиғаларда қайтады.
curl
curl -X POST https://api.aitole.kz/v2/qr \
  -H "X-API-Key: sk_live_…" \
  -H "Idempotency-Key: order-42" \
  -H "Content-Type: application/json" \
  -d '{"amount": 5000, "comment": "Тапсырыс №42"}'
json · 200
{
  "id": "op_d7834b…",
  "type": "qr",
  "status": "pending",
  "amount": 5000,
  "qr_token": "https://pay.kaspi.kz/…",
  "expires_at": "2026-09-08T00:37:24Z",
  "comment": "Тапсырыс №42",
  "created_at": "2026-09-08T00:32:24Z"
}

qr_token — мынадай сілтеме: pay.kaspi.kz/…; оны QR-код етіп салыңыз немесе клиентке сілтеме ретінде беріңіз. Төлем автоматты түрде ұсталады — мәртебе мынаған ауысады: paid, қараңыз: оқиғалар журналы.

Төлем қабылдау

Телефон нөміріне шот.

POST/v2/invoicesapi-keyIdempotency-Key

Клиентке нөмір бойынша Kaspi-де шот жібереді. Мына құралды талап етеді: create_invoice.

ӨрісСипаттама
phonereqКлиенттің Kaspi-дегі нөмірі, мыс. +77011234567.
amountreqСома, бүтін теңге.
comment, metadataoptQR-дағыдай.
curl
curl -X POST https://api.aitole.kz/v2/invoices \
  -H "X-API-Key: sk_live_…" -H "Idempotency-Key: inv-42" \
  -d '{"phone":"+77011234567","amount":12000}'

← 200  { "id":"op_…", "type":"invoice", "status":"pending", "amount":12000 }
Сенімділік

Идемпотенттік.

Әр мутация (/v2/qr, /v2/invoices, бас тарту) мына тақырыпты талап етеді: Idempotency-Key — сұраныс мағынасына сәйкес кез келген бірегей жол (мысалы, тапсырыс нөмірі).

  • Тақырып жоқ → 422 idempotency_key_required.
  • Сол кілт және сол дене → қайтады сол жауап, екінші операция жасалмайды.
  • Сол кілт және басқа дене409 idempotency_key_conflict.
  • Біріншісі әлі орындалып жатқанда қайталау → 429 payment_in_progress.
Кілт сіздің аккаунтыңыз шегінде бірегей және мынадай уақыт тұрады: 24 сағат. Желілік таймаут кезінде сұранысты қайталау қауіпсіз — төлем қосарланбайды.
Сынақ ортасы

Сынақ ортасы: төлемнің бүкіл жолы ақшасыз.

Сынақ ортасы — бұл мынадай қосылым: driver: "mock". Нағыз Kaspi қатыспайды, ақша қозғалмайды, qr_token әдейі жалған қайтарылады (mock_qr_…, оны төлеу мүмкін емес).

Шекараға кілт кепілдік береді. Сынақ кілті (sk_test_…) жұмыс істейді тек сынақ қосылымдарымен, нақтысы (sk_live_…) — тек нақтыларымен. Араластыру әрекеті мынаны береді: 403 key_mode_mismatch. Бұл келісім емес, тексеру: сынақ кілтін алдыңыз — нағыз ақша есептен шыға алмайды.

Төлемді төленгенге дейін жеткізу

Басқару әдістері күйді өзгертеді провайдер жағында, ал операцияңыздың мәртебесін нақты режимдегі сол поллер қозғалтады — сол бірнеше секундтық кідіріспен. Осылайша сіз тірі ақшамен жұмыс істейтін дәл сол кодты тексересіз, оқиғаны өңдеуді қоса.

POST/v2/sandbox/operations/:id/paysk_test_

Операцияны төленді деп белгілейді. Бірнеше секундтан кейін ол мынадай болады: paid, журналда пайда болады: payment.paid.

POST/v2/sandbox/operations/:id/expiresk_test_

Операцияны мерзімі өтті деп белгілейді → expired және payment.expired.

POST/v2/sandbox/connections/:id/kill-sessionsk_test_

Қосылым сессиясын «ығыстырады» — осылайша мынаған өз реакцияңызды тексеруге болады: сессияның өлімі, нақты қосылымды бұзбай. Қосылым мынаған кетеді: session_expired мына оқиғамен: connection.session_expired.

curl
# сынақ ортасында шот қойдық
curl -X POST https://api.aitole.kz/v2/qr \
  -H "X-API-Key: sk_test_…" -H "Idempotency-Key: demo-1" \
  -d '{"amount": 5000}'

# оны «төледік»
curl -X POST https://api.aitole.kz/v2/sandbox/operations/op_…/pay \
  -H "X-API-Key: sk_test_…"

# бірер секундтан кейін мәртебе өзі ауысты
curl https://api.aitole.kz/v2/operations/op_… -H "X-API-Key: sk_test_…"
← { "status": "paid", "paid_at": "…" }
Бұл әдістерде нақты кілт мынаны алады: 403 sandbox_only: «төленді деп белгілеу» ақша нағыз жерде қолжетімді болмауы тиіс.
Оқу

id бойынша операция.

GET/v2/operations/:idapi-key

Операцияның жолдарымен қоса ағымдағы күйі. Бөгде операция немесе белгісіз id → 404 operation_not_found.

json · 200
{ "id":"op_…", "type":"qr", "status":"paid", "amount":5000,
  "provider_id":"qr:…", "paid_at":"2026-09-08T00:33:10Z",
  "comment":"Тапсырыс №42", "items":[], "created_at":"…" }

Мүмкін мәртебелер

createdpending → терминалдық paid, expired, cancelled, failed. Ауысуды платформа поллері автоматты түрде жасайды.

Оқу

Операциялар тізімі.

GET/v2/operationsapi-key

Курсорлы таспа, жаңалары алдымен. Жауап: { data, next_cursor, has_more }. Келесі бет үшін мынаны жіберіңіз: next_cursorcursor.

QueryСипаттама
limit1–100, әдепкі 20.
cursorАлдыңғы жауаптан алынған келесі беттің курсоры.
statusСүзгі: pending, paid, expired, cancelled, failed.
typeqr немесе invoice.
date_from, date_toYYYY-MM-DD, қоса алғанда, Астана уақыты бойынша (UTC+5).
curl
curl "https://api.aitole.kz/v2/operations?limit=2&status=paid" \
  -H "X-API-Key: sk_live_…"

← 200  { "data":[ … ], "next_cursor":"eyJ0Ijoi…", "has_more":true }
Оқу

Операциядан бас тарту.

POST/v2/operations/:id/cancelapi-keyIdempotency-Key

Әлі төленбеген операциядан бас тартады. Жарамсыз ауысу (мысалы, қазірдің өзінде paid) → 409 invalid_state_transition. Белсенді қосылымды талап етеді.

curl
curl -X POST https://api.aitole.kz/v2/operations/op_…/cancel \
  -H "X-API-Key: sk_live_…" -H "Idempotency-Key: cancel-42"

← 200  { "id":"op_…", "status":"cancelled" }
Төлем қабылдау

Қайтарым — толық және ішінара.

POST/v2/refundsapi-key

Операция мына мәртебеде қалады: paid. «Қайтарылды» деген бөлек мәртебе әдейі жоқ: ақша алынды, сосын қайтарылды — бұл екі факт, біреуінің екіншісін алмастыруы емес, және бухгалтерия екеуін де көруі тиіс.

json · сұраныс
{ "operation_id":"op_…",
  "amount":2500,          // өріссіз — ҚАЛДЫҚ қайтады
  "reason":"клиент тауарды қайтарды" }
Мынасыз: amount бастапқы сома емес, қалдық қайтарылады. Ішінара қайтарымнан кейін «бәрін қайтару» дегеніміз «әлі қайтарылмағанды қайтару» — әйтпесе қайталанған шақыру алынғаннан көбірек қайтаруға тырысар еді.
json · 200
{ "id":"…", "operation_id":"op_…",
  "amount":2500, "status":"done",
  "operation":{ "status":"paid", "amount":10000,
                "refunded_amount":2500 } }
Бас тарту мына кодпен келеді: 200, 4xx/5xx емес. Төлем жасаудағы сол ереже: провайдер бас тартты — бұл біздің сервистің ақаулығы емес, іскерлік жауап. Мына өрісті талдаңыз: status (done / failed), HTTP-код емес; себебі — мынада: failure_message Kaspi сөзімен.

Алдын ала нені білу керек

  • Бөлек құрал керек: refund кілттің скоупында. Кассаға шот қоюға берілген кілт ақша қайтармауы тиіс — бұл ақшаның кері бағыттағы қозғалысы.
  • Қайтарым тек мыналар үшін мүмкін: paid. Төленбеген QR қайтарылмайды: одан бас тартады немесе ол өзі ескіреді.
  • Қайтарым терезесі — 90 күн төлем сәтінен бастап, одан әрі refund_window_expired. Бұл — біздің шектеуіміз; Kaspi-дің өз мерзімдері болуы мүмкін, оның бас тартуы мынада келеді: failure_message.
  • Idempotency-Key барлық өзгертетін сұраныстардағыдай міндетті. Сол кілтпен қайталау екінші қайтарымды емес, сол нәтижені қайтарады.
Оқу

Оқиғалар журналы.

GET/v2/eventsapi-key

Аккаунт оқиғаларының курсорлы таспасы — payment.created, payment.paid, payment.expired, payment.cancelled, payment.refunded және connection.session_expired. Операциялардағы сол query (limit, cursor, type, date_from/to).

connection.session_expired — төлем туралы емес, қосылым туралы оқиға (operation_id онда бос). Kaspi сессиясы танылмай қалғанын және осы қосылым бойынша төлем қабылдау қайта онбордингке дейін тоқтағанын білдіреді. Бұл оқиғаны төлем оқиғаларымен бірдей қадағалаған жөн: қосылым қалпына келмейінше, жаңа төлемдер мынамен қабылданбайды: no_active_connection.
json · 200
{ "data": [
    { "id":"evt_…", "type":"payment.paid",
      "operation_id":"op_…",
      "payload":{ "id":"op_…", "status":"paid", "amount":5000 },
      "created_at":"2026-09-08T00:33:10Z" }
  ], "next_cursor":null, "has_more":false }
Сұрап отырғыңыз келмей ме? Сол оқиғалар сіздің URL-ге push арқылы келеді — қараңыз: Вебхуктер. Сұрау /v2/events ақиқат көзі болып қала береді: ол жеткізудегі кез келген ақаулықтан аман қалады.
Оқу

Вебхуктер: оқиғалар өзі келеді.

POST/me/webhooksjwt

Жазылым жасалады тек кабинеттен, иесінің токенімен. API-кілт мұнда мүлдем жіберілмейді: әйтпесе ағып кеткен интеграция кілті оқиғаларыңызды бөгде мекенжайға әкетуге мүмкіндік берер еді.

Қолжетімді оқиғалар: payment.created, payment.paid, payment.expired, payment.cancelled, payment.refunded, connection.session_expired, connection.restored, webhook.test. Не "*" — бәрі, кейін қосылған оқиғаларды қоса. Аттағы қате бірден қабылданбайды (unknown_event), үнсіз эндпоинтке айналмайды.

json · 201
{ "id":"…", "url":"https://shop.kz/aitole",
  "events":["payment.paid"], "enabled":true,
  "secret":"whsec_…" }
Құпия бір рет қана көрсетіледі. Ол тізімде де, басқа жерде де қайтарылмайды — оны бірден сақтаңыз. Жоғалтсаңыз: жазылымды өшіріп, қайта жасаңыз.

Не келеді

Конверт-денесі және мына тақырыптары бар POST: X-Webhook-Id, X-Webhook-Event, X-Webhook-Timestamp, X-Webhook-Signature.

json
{ "id":"evt_…", "type":"payment.paid",
  "created_at":"2026-09-09T10:00:00.000Z",
  "data":{ "id":"op_…", "status":"paid", "amount":5000 } }

Қолтаңбаны тексеру

Тақырып X-Webhook-Signature мынадай түрде sha256=<hex>; қолтаңба — мына жолдан алынған HMAC-SHA256: "{timestamp}.{шикі дене}". Оны есептеңіз сұраныстың шикі байттары бойынша: алдымен JSON-ды талдап, кері жинасаңыз, кілттер реті өзгереді де, қолтаңба сәйкес келмейді.

node
const raw = await readRawBody(req);           // дәл байттар, JSON.parse емес
const ts  = req.headers['x-webhook-timestamp'];
const got = req.headers['x-webhook-signature'];  // "sha256=abc…" түрінде

// sha256= префиксі қолтаңбаға кіреді — жолды тұтас есептейміз
const mine = 'sha256=' + crypto.createHmac('sha256', secret)
  .update(`${ts}.${raw}`).digest('hex');

// тұрақты уақытпен салыстыру — === емес
const a = Buffer.from(mine), b = Buffer.from(got);
const ok = a.length === b.length && crypto.timingSafeEqual(a, b);

// әрі міндетті түрде жаңалығы: әйтпесе ұсталған сұранысты қайталауға болады
if (!ok || Math.abs(Date.now()/1000 - ts) > 300) return res.status(400).end();
res.status(200).end();                          // жылдам жауап беріңіз

Қайталаулар және өшіру

Сәттілік — кез келген жауап 2xx. Қалғанының бәрі (10 секундтық таймаутты қоса) — сәтсіздік, біз қайталаймыз: мына аралықпен: 1 мин, 5 мин, 30 мин, 2 сағ, 6 сағ, 24 сағ. Әр әрекет кабинетте көрінеді: жауап коды, ұзақтығы, қате мәтіні.

Интеграцияны жиі бұзатын үш нәрсе:
· Жеткізу реті кепілдендірілмейді. Қайталау payment.created мынадан кейін келуі мүмкін: payment.paid. Мынаған сүйеніңіз: data.status конвертте, кезектілікке емес.
· Жеткізу екі рет болуы мүмкін. Егер жауабыңыз бізге жетпесе, қайталаймыз. Өңдеушіні мынау бойынша есептеңіз: id конвертін идемпотентті етіңіз.
· Бірден жауап беріңіз, жұмысты кейін істеңіз. Сұраныс ішіндегі ұзақ өңдеу біздің таймаутқа тіреледі де, сәтті жеткізуді қайталауға айналдырады.

Егер эндпоинт бас тартса үздіксіз екі тәулік, біз оны өшіріп, жіберуді тоқтатамыз — әйтпесе кезек өлі мекенжаймен бітеледі. Кабинетте қайта қосуға болады; тоқтап тұрған кездегі оқиғалар мынау арқылы қолжетімді: /v2/events.

Мекенжайға қойылатын талаптар

Тек https әрі тек ашық мекенжай. localhost, 127.0.0.1, ішкі диапазондар мен бұлттық метадеректер мекенжайы жасалу кезінде қабылданбайды — әрі жеткізу сәтінде қайта тексеріледі, сондықтан ішкі желіге шешілетін домен көмектеспейді. Жергілікті әзірлеу үшін туннель қолданыңыз.

Кабинеттегі «Тексеру» батырмасы мынаны жібереді: webhook.test — нағыз қолтаңбасы бар нағыз жеткізуді, дәл сол эндпоинтке, төлемді күтпей.

Анықтама

Жиілік шектеулері.

Нақты кілттер — минутына 200 сұраныс. Сынақ кілттері (sk_test_…) — шектеусіз. Асып кетсе — 429 rate_limit_exceeded мына тақырыппен: Retry-After.

Анықтама

Тариф шектеулері.

Шектеу екеу: күнтізбелік айда қанша төлем қабылдауға болады және бір мезгілде қанша операция төленбей тұра алады.

ТарифАйына төленген төлемдер
free20
start500
proшектеусіз

Нақты не саналады

  • Айлық квота — тек ТӨЛЕНГЕН төлемдер. 50 шот қойдыңыз, 12-сі төленді — 12 жұмсалды. Тасталған және мерзімі өткен шоттар квотаны жұмсамайды.
  • Ай күнтізбелік, Астана уақыты бойынша (UTC+5). Квота 1-ші күні жаңарады.
  • Сынақ ортасы шектеулерді жұмсамайды: сынақ кілттері бөлек саналады және айлық шектеуі жоқ (бір мезгілде белсендісі — 10).
  • Бұрыннан тұрған төленбеген шоттар квотадан тыс төленуі мүмкін — жолда келе жатқан ақшадан платформа бас тартпайды.
  • Бір мезгілде төленбеген шоттар шегі де бар — бұл тариф опциясы емес, адал пайдалануды қорғау: тұрған әр шотты платформа Kaspi-ден сұрайды, олардың тым көп болуы сіздің өз сессияңызға зиян. Шек жомарт, қалыпты жұмыста оны байқамайсыз; ағымдағы мәні кабинетте көрінеді.

Бас тартулар

КодHTTPҚашан
plan_limit_exceeded429Айлық квота таусылды.
too_many_active_operations429Бір мезгілде төленбеген шоттар тым көп.

Ағымдағы тариф пен жұмсалу мынада көрінеді: кабинетте және жауапта GET /me.

Анықтама

Қате кодтары.

КодHTTPҚашан
invalid_api_key401Кілт жіберілмеген немесе жарамсыз.
tool_not_allowed403Құрал кілттің scopes ішінде емес.
amount_over_key_cap422Сома кілт шегінен жоғары.
amount_not_whole422Сома бүтін оң сан емес.
validation_error422Сұраныстың денесі/параметрі дұрыс емес.
idempotency_key_required422Мутацияда тақырып жоқ.
idempotency_key_conflict409Сол кілт басқа денемен.
payment_in_progress429Бірінші сұраныс орындалып жатқанда қайталау.
no_active_connection409Белсенді Kaspi қосылымы жоқ.
connection_ambiguous409Белсенді қосылым бірнешеу, негізгісі белгіленбеген. Мынаны көрсетіңіз: connection_id немесе кілтті байлаңыз.
operation_not_found404Операция табылмады (немесе бөгде).
invalid_state_transition409Мәртебенің жарамсыз ауысуы (мыс. төленгеннен бас тарту).
connection_not_found404Қосылым табылмады.
too_many_otp_attempts429Онбординг кезінде OTP әрекеттері асып кетті.
session_expired440Kaspi сессиясының мерзімі бітті — қайта онбординг керек.
key_mode_mismatch403Кілт пен қосылым әртүрлі әлемнен: нақты қосылымға сынақ кілті немесе керісінше.
sandbox_only403Әдіс тек сынақ кілттеріне қолжетімді.
plan_limit_exceeded429Тарифтің айлық квотасы таусылды.
too_many_active_operations429Бір мезгілде төленбеген шоттар тым көп.
rate_limit_exceeded429Сұраныс жиілігі асып кетті.
service_unavailable503Коннектор қолжетімсіз немесе таймаут ішінде жауап бермеді.
Анықтама

Health.

GET/v2/statuspublic

Қолжетімділікті тексеру — кілтсіз. Аптайм-мониторингке жарайды.

json · 200
{ "status":"ok", "checks":{ "database":"ok", "redis":"ok" } }

Интеграция бойынша сұрақ — мынаны қоса беріңіз: X-Request-Id жауаптан.