requires_approval.
Initiate the disbursement
Call
POST /api/v1/send-money/initiation/ with your currency, provider, and a list of transactions. Kulmi Pay creates a payment file and returns a file_id and tracking_id.Review and approve
If
requires_approval is "YES" (the default), call POST /api/v1/send-money/approve/ with the file_id to release the payment. If requires_approval is "NO", Kulmi Pay approves and queues the payment automatically — no second call needed.Initiate a disbursement
M-Pesa B2C
Use providerMPESA-B2C to send money directly to an M-Pesa mobile wallet. The account field must be the recipient’s phone number in international format (e.g., 254712345678).
The minimum transaction amount for M-Pesa B2C is KES 10. For PesaLink bank transfers, the minimum is KES 100. Requests below these thresholds will be rejected.
PesaLink (bank transfer)
Use providerPESALINK to transfer to a Kenyan bank account. You must include bank_code for each transaction. Find valid codes in the bank codes reference.
M-Pesa B2B
Use providerMPESA-B2B to pay a PayBill or Till number. Set account_type to "PayBill" or "Till". When paying a PayBill, you must also include account_reference (the customer account number associated with the bill).
Request parameters
Top-level fields
| Field | Type | Required | Description |
|---|---|---|---|
currency | string | Yes | Must be "KES" |
provider | string | Yes | Payment provider. See supported providers. |
transactions | array | Yes | List of recipient transactions (see below) |
requires_approval | string | No | "YES" (default) or "NO". Set to "NO" to skip the manual approval step. |
wallet_id | string | No | ID of a specific wallet to debit. Defaults to your KES settlement wallet. |
batch_reference | string | No | Your own reference label for the batch |
callback_url | string | No | URL to receive webhook notifications when transactions complete |
Transaction fields
| Field | Type | Required | Description |
|---|---|---|---|
account | string | Yes | Recipient identifier — phone number, bank account, or paybill/till number |
amount | string | Yes | Amount to send in KES |
name | string | Yes | Recipient’s full name |
narrative | string | Yes | Payment description shown to the recipient |
account_type | string | Conditional | Required for M-Pesa B2B: "PayBill" or "Till" |
account_reference | string | Conditional | Required when account_type is "PayBill" |
bank_code | string | Conditional | Required for PesaLink transfers. See bank codes. |
id_number | string | No | Recipient’s national ID number |
idempotency_key | string | No | Unique key to prevent duplicate transactions. If a transaction with the same key already exists, the request is rejected. |
Idempotency
To protect against duplicate payments (for example, if a network timeout causes you to retry a request), include a uniqueidempotency_key per transaction. If Kulmi Pay receives a second request with the same key for your business, it will reject it with an error rather than processing the payment twice.
