Skip to main content

Create Bank Disbursement

Transfer funds from your wallet to a bank account.

Endpoint​

POST /api/disbursement/create

Authentication​

RSA-SHA256 X-SIGNATURE header. See Authentication.

Request​

Headers​

HeaderRequiredDescription
X-SIGNATUREYesBase64-encoded RSA-SHA256 signature
Content-TypeYesapplication/json

Body​

FieldTypeRequiredDescription
clientIdstringYesYour legacy_client_id
orderIdstringYesYour unique disbursement ID (idempotency key)
bankCodestringYesBank short code (e.g., BCA, MANDIRI)
accountNumberstringYesDestination account number
accountNamestringYesAccount holder name
requestAmountintegerYesTransfer amount in full IDR (NOT minor units)
notifyUrlstringNoCallback URL for disbursement status updates
Amount Units

requestAmount is in full IDR. IDR 500,000 = 500000. This is the opposite of the V1 API.

Example​

PHP
$body = json_encode([
'clientId' => 'TEST_CLIENT_001',
'orderId' => 'DISB-2026-001',
'bankCode' => 'BCA',
'accountNumber' => '1234567890',
'accountName' => 'Budi Santoso',
'requestAmount' => 500000,
'notifyUrl' => 'https://your-site.com/callbacks/disbursement',
]);

$bodyHash = hash('sha256', $body);
$stringToSign = "TEST_CLIENT_001|TEST_SECRET_001|$bodyHash";
openssl_sign($stringToSign, $rawSig, $privateKey, OPENSSL_ALGO_SHA256);
$xSignature = base64_encode($rawSig);

$ch = curl_init('https://api.flypay.asia/api/disbursement/create');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-SIGNATURE: ' . $xSignature,
],
CURLOPT_POSTFIELDS => $body,
]);
$response = json_decode(curl_exec($ch), true);

Response​

HTTP 200 OK

{
"code": 200,
"message": "Success",
"data": {
"refCode": "DSB-260601110000-C3D4",
"orderId": "DISB-2026-001",
"accountNumber": "1234567890",
"accountName": "Budi Santoso",
"bank": {
"name": "Bank Central Asia",
"code": "BCA"
},
"requestAmount": "500000.00",
"disbursementFee": "5000.00",
"disbursementAmount": "500000.00",
"status": "PENDING",
"requestAt": "2026-06-01 11:00:00"
}
}

Fields​

FieldDescription
requestAmountDecimal string of the amount you requested (IDR)
disbursementFeeFlat fee deducted from your wallet (IDR)
disbursementAmountAmount delivered to the beneficiary; the fee is never added to this value
statusInitial status: PENDING
requestAtWIB timestamp

Idempotency​

Submitting the same orderId again is rejected with code: 400 and message: "Disbursement with orderId … Already Exists.". Query the existing disbursement instead.

Error Responses​

MessageDescription
Invalid Client IDclientId not found
Invalid X-SIGNATURESignature verification failed
Public Key is not setNo RSA public key uploaded
Bank Cannot be used for DisbursementbankCode not found or disabled
Invalid request parametersMissing required field
Insufficient BalanceWallet balance < (requestAmount + fee)
Maximum Request Amount ExceededExceeds per-transaction limit
Disbursement with orderId … Already Exists.orderId already exists for this merchant