Integration GuideAPI Reference
Integration Guide

🇰🇿 KZ: Bank Card - Disbursements

📓

Please use the following paymentMethodName value when creating the Intent and when completing the disbursement object.

"paymentMethodName": "BankCardKZ" or "BANK_CARD_KZ

Payment Method Features

FeautreDescription
CountryKazakhstan
Processing CurrenciesKZT - Kazakhstani Tenge
PaymentsNo
DisbursementsYes
-- Min per transaction amount1 000 KZT
-- Max per transaction amount1 200 000 KZT
RefundsNo
ChargebacksNo

Workflow: Disbursement

Download in high resolution


Possible Disbursement Scenarios:

📘

Account Verification (Optional)

Before creating a disbursement, you may verify whether disbursement to a specific card is allowed using a dedicated endpoint. This step is optional and can help reduce declined transactions.


Name

Steps

Standard Disbursement

  1. You send an Intent creation request via the API, including a Disbursement transaction.
  2. Our platform validates the incoming data and returns a synchronous acceptance response (accepted or rejected).
  3. Upon acceptance, our platform initiates the disbursement operation with the issuing bank / processor.
  4. Once the disbursement reaches a final status (PAID_OUT or DECLINED), our platform sends a webhook notification with that status.

List of used API Requests:

Request

Endpoint

Description

Disbursement Possibility Check

POST /processing/api/v1/disbursements/check

  • Verifies whether the recipient's card can receive a disbursement.
  • Returns isDisbursementAllowed (true / false).
  • Optional - can be used before creating an Intent.

Intent Creation

POST /processing/api/v1/intents

  • Creates a new Intent with one or more Disbursement transactions.
  • The platform validates the request, creates internal disbursement records, and forwards the request to the issuing bank / processor.

(Optional) Disbursement Possibility Check Request/Response

📓

Request specifics

  • Endpoint: POST /processing/api/v1/disbursements/check
  • Purpose: Verifies whether a disbursement to the recipient's card is allowed before creating an Intent.
  • Required headers: Authorization, settlement-account-id
  • For this method:
    • payeePaymentInstrument.paymentMethodName must be set to Bank_Card_KZ
    • payeePaymentInstrument.incomingDetails must include the recipient's card number (16 digits)

Check Request: Example

⚠️

submittedAmount and authAmount together have four fields (value + currency for each), but only three must be provided - the fourth is derived by our backend based on your business case (with or without FX).
The example below covers the most common case: disbursement without currency conversion (KZT → KZT).
For full guidance, see Amount Fields: submittedAmount and authAmount.

{
  "payeePaymentInstrument": {
    "paymentMethodName": "Bank_Card_KZ",
    "incomingDetails": {
      "number": "4111111111111111"
    }
  },
  "submittedAmount": {
    "value": 12300.00,
    "currency": "KZT"
  },
  "authAmount": {
    "currency": "KZT"
  }
}

Check Request: Fields Description

Top-Level Request Parameters

ParameterTypeRequiredDescription
payeePaymentInstrumentObjectRequiredPayment method and instrument details of the disbursement recipient.
submittedAmountObjectRequiredAmount and currency submitted for verification.
authAmountObjectRequiredAuthorisation amount and currency.
May differ from the submitted amount if FX conversion is applied.
If FX is not required, currency should match submittedAmount.currency.
additionalDataObjectOptionalAdditional details of the disbursement check.


payeePaymentInstrument

ParameterTypeRequiredDescription
paymentMethodNameStringRequiredPayment method name.
For this scenario, use Bank_Card_KZ.
incomingDetailsObjectRequiredPayment method-specific data required for verification.


incomingDetails

ParameterTypeRequiredDescription
numberStringRequiredThe recipient's bank card number.
Length: 16 characters.


submittedAmount

ParameterTypeRequiredDescription
valueNumberConditionalSubmitted amount.
Provide when the sender defines the amount to be debited.
Min: 1 000 / Max: 1 200 000 KZT.
Omit when only authAmount.value is provided.
currencyStringRequiredSubmitted currency in ISO 4217 alpha-3 format.
Must be KZT.


authAmount

ParameterTypeRequiredDescription
valueNumberConditionalAuthorisation amount.
Provide when the recipient must receive an exact amount.
Omit when submittedAmount.value is provided.
currencyStringRequiredAuthorisation currency in ISO 4217 alpha-3 format.
Must be KZT.

📘

Three of the four amount fields must be provided - the fourth is derived by our backend.
See Amount Fields: submittedAmount and authAmount for the full breakdown of cases.




Intent Creation Request/Response

📓

Request specifics

  • Endpoint: POST /processing/api/v1/intents
  • Purpose: Creates an Intent and a Disbursement for the selected payment method.
  • Structure: A unified request structure is used for all supported payment methods, but some fields are method-specific.
  • For this method:
    • paymentMethodName must be set to Bank_Card_KZ
    • incomingDetails must include the recipient's card number (16 digits)

Intent Request: Example

⚠️

submittedAmount and authAmount together have four fields (value + currency for each), but only three must be provided - the fourth is derived by our backend based on your business case (with or without FX).
The example below covers the most common case: disbursement without currency conversion (KZT → KZT).
For full guidance, see Amount Fields: submittedAmount and authAmount.

{
  "clientReferenceId": "202510202",
  "useCheckoutForm": false,
  "disbursements": [
    {
      "payeePaymentInstrument": {
        "paymentMethodName": "Bank_Card_KZ",
        "incomingDetails": {
          "number": "4111111111111111"
        }
      },
      "submittedAmount": {
        "value": 12300.00,
        "currency": "KZT"
      },
      "authAmount": {
        "currency": "KZT"
      },
      "webhookUrl": "https://merchant.example.com/webhooks/disbursements"
    }
  ]
}

Intent Request: Fields Description

Top-Level Request Parameters

ParameterTypeRequiredDescription
clientReferenceIdStringRequiredOrder number in the merchant system.
useCheckoutFormBooleanRequiredIndicates whether the Intent uses a hosted checkout form.
For Host-to-Host disbursements, set false.
disbursementsArray of ObjectsRequiredList of disbursement objects to be created within the Intent.
descriptionStringOptionalIntent description (arbitrary string).


disbursement

ParameterTypeRequiredDescription
payeePaymentInstrumentObjectRequiredPayment method and instrument details used to process the disbursement.
submittedAmountObjectRequiredAmount and currency submitted for the disbursement.
authAmountObjectRequiredAuthorisation amount and currency used for the disbursement.
May differ from the submitted amount if FX conversion is applied.
If FX conversion is not required, currency should match submittedAmount.currency.
descriptionStringOptionalDisbursement description (arbitrary string).
webhookUrlStringOptionalURL to which disbursement status change webhooks will be sent.


payeePaymentInstrument

ParameterTypeRequiredDescription
paymentMethodNameStringRequiredPayment method name.
For this scenario, use Bank_Card_KZ.
incomingDetailsObjectRequiredPayment method-specific data required to initiate the disbursement.


incomingDetails

ParameterTypeRequiredDescription
numberStringRequiredThe recipient's bank card number.
Length: 16 characters.


submittedAmount

ParameterTypeRequiredDescription
valueNumberConditionalSubmitted disbursement amount.
Provide when the sender defines the amount to be debited.
Min: 1 000 / Max: 1 200 000 KZT.
Omit when only authAmount.value is provided.
currencyStringRequiredSubmitted disbursement currency in ISO 4217 alpha-3 format.
Must be KZT.


authAmount

ParameterTypeRequiredDescription
valueNumberConditionalAuthorisation amount used for the disbursement.
Provide when the recipient must receive an exact amount.
Omit when submittedAmount.value is provided.
currencyStringRequiredAuthorisation currency in ISO 4217 alpha-3 format.
Must be KZT.

📘

Three of the four amount fields must be provided - the fourth is derived by our backend.
See Amount Fields: submittedAmount and authAmount for the full breakdown of cases.




Webhooks

🔗

This section summarises the webhook events triggered for Bank_Card_KZ disbursements.
For payload structure, examples, retry policy and delivery conditions, see the dedicated pages: Webhooks: Overview and Webhooks: Example.


When Webhooks Are Sent

A webhook is dispatched to your webhookUrl when the disbursement reaches a final status:

StatusTrigger
PAID_OUTThe disbursement has been successfully completed and funds have been delivered to the recipient.
DECLINEDThe disbursement was rejected by the issuing bank / processor (e.g. invalid card, blocked recipient, regulatory restriction).
ERRORA processing error prevented the disbursement from being completed.

Delivery & Retries

📘
  • Webhooks are delivered as HTTPS POST requests with a JSON payload to the webhookUrl provided in the original disbursement request.
  • A delivery is considered successful if your endpoint responds with HTTP 2xx.
  • If the delivery fails (non-2xx, network error, timeout), the platform retries up to 10 times following a fixed schedule (immediate → 1 min → 5 min → 15 min → 1 h → 3 h → 6 h → 12 h → 24 h → 48 h).
  • After the 10th attempt, delivery stops permanently.

Full details: Webhooks: Overview.


Payload Example

📓

The webhook payload structure is shared across all transaction types and may evolve over time.
For the up-to-date payload example, see the Webhooks: Example page.



Test Data

🧪

Our sandbox environment lets you simulate the full disbursement lifecycle and trigger every possible final status without involving a real issuing bank.
To force a specific outcome, set the intent.description field to one of the trigger values below.

Sandbox Trigger Reference

Here's the table code only:

Scenariointent.descriptionFinal Status
Successful disbursement(empty / any value not listed below)PAID_OUT
Disbursement declinedDisbursementDeclinedDECLINED
Processing errorDisbursementErrorERROR (returned in the synchronous response)

Test Card Numbers

💳

In the sandbox, any well-formed 16-digit card number (passing the Luhn check) is accepted as the payeePaymentInstrument.incomingDetails.number.
The final disbursement status is controlled by intent.description, not by the card number.


End-to-End Test Flow

Download in high resolution


Scenario

Steps

Successful disbursement

  1. Create an Intent via POST /processing/api/v1/intents without setting intent.description (or with any value not listed in the trigger table).
  2. Receive a synchronous response with disbursement.status = ACCEPTED and intent.intentStatus = CREATED.
  3. Receive a final webhook with status = PAID_OUT.

Disbursement declined

  1. Create an Intent via POST /processing/api/v1/intents with intent.description = "DisbursementDeclined".
  2. Receive a synchronous response with disbursement.status = ACCEPTED.
  3. Receive a final webhook with status = DECLINED.

Processing error

  1. Create an Intent via POST /processing/api/v1/intents with intent.description = "DisbursementError".
  2. Receive a synchronous response with disbursement.status = ERROR.

Tips for Testing

💡
  • Combine with the possibility check - run POST /processing/api/v1/disbursements/check first to validate the integration of both endpoints.
  • Verify webhook handling - point webhookUrl at a tool like webhook.site or RequestBin during early integration to inspect raw payloads.
  • Test FX scenarios - use the 3-of-4 amount field rule (see Amount Fields: submittedAmount and authAmount) to validate both "sender-defined" and "recipient-defined" flows.
  • Webhook delivery diagnostics - if you don't receive an expected webhook, check that your endpoint returns HTTP 2xx (see Webhooks: Overview for retry behaviour).