Create Bank Disbursement
Transfer funds from your wallet to a bank account.
Endpoint
POST /v1/disbursements
Request
Body
| Field | Type | Required | Description |
|---|---|---|---|
idempotency_key | string | Yes | Unique key to prevent duplicates (e.g., disb-20260601-001) |
channel | string | Yes | Must be BANK |
bank_short_code | string | Yes | Bank code (e.g., BCA, MANDIRI, BNI) — see Bank Codes |
account_number | string | Yes | Destination account number |
account_name | string | Yes | Account holder's name |
amount_minor | integer | Yes | Transfer amount in minor units (not including fee) |
notify_url | string | No | Webhook URL for disbursement status updates |
Example
cURL
curl -X POST https://api.nusio-saka.com/v1/disbursements \
-H "X-API-Key: your-api-key" \
-H "Content-Type: application/json" \
-d '{
"idempotency_key": "disb-20260601-001",
"channel": "BANK",
"bank_short_code": "BCA",
"account_number": "1234567890",
"account_name": "Budi Santoso",
"amount_minor": 50000000,
"notify_url": "https://your-site.com/webhooks/disbursement"
}'
PHP
$payload = [
'idempotency_key' => 'disb-20260601-001',
'channel' => 'BANK',
'bank_short_code' => 'BCA',
'account_number' => '1234567890',
'account_name' => 'Budi Santoso',
'amount_minor' => 50000000,
];
$ch = curl_init('https://api.nusio-saka.com/v1/disbursements');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['X-API-Key: '.$apiKey, 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode($payload),
]);
$response = json_decode(curl_exec($ch), true);
Response
HTTP 201 Created
{
"success": true,
"data": {
"id": "uuid",
"ref_code": "DSB-260601110000-C3D4",
"idempotency_key": "disb-20260601-001",
"channel": "BANK",
"bank_id": "uuid",
"account_number": "1234567890",
"account_name": "Budi Santoso",
"ewallet_provider": null,
"ewallet_phone": null,
"request_amount_minor": 50000000,
"fee_minor": 500000,
"final_amount_minor": 50500000,
"vendor_disbursement_id": null,
"source": "API",
"status": "PENDING",
"requested_at": "2026-06-01T11:00:00Z",
"created_at": "2026-06-01T11:00:00Z"
}
}
Note: final_amount_minor = request_amount_minor + fee_minor. This full amount is debited from your wallet.
Error Codes
| Code | HTTP | Description |
|---|---|---|
NOT_WALLET_MERCHANT | 403 | Account is not WALLET settlement type |
BANK_NOT_FOUND | 400 | bank_short_code is not recognized |
BANK_DISABLED | 422 | Bank exists but is not available for disbursement |
MISSING_BANK_INFO | 400 | account_number or account_name is missing |
INSUFFICIENT_BALANCE | 422 | Wallet balance < amount_minor + fee |
AMOUNT_EXCEEDS_LIMIT | 422 | Exceeds per-transaction limit |
DAILY_LIMIT_EXCEEDED | 422 | Exceeds daily limit |
DUPLICATE_IDEMPOTENCY_KEY | 409 | A disbursement with this key already exists |
Bank Codes
Common bank short codes:
| Code | Bank |
|---|---|
BCA | Bank Central Asia |
MANDIRI | Bank Mandiri |
BNI | Bank Negara Indonesia |
BRI | Bank Rakyat Indonesia |
CIMB | CIMB Niaga |
PERMATA | Bank Permata |
BTN | Bank Tabungan Negara |
DANAMON | Bank Danamon |
PANIN | Bank Panin |
MAYBANK | Maybank Indonesia |
For a complete list, use GET /v1/banks from the dashboard API or contact your account manager.