Disburse funds from a client wallet to a bank account. All endpoints require the standard x-api-key + x-timestamp headers — see Authentication.
Typical flow: list banks → quote → create → poll get.
1. List available banks
GET /api/v3/wallets/{wallet_id}/banks
Call this first to obtain valid bank_code values for the wallet’s payout vendor.
{
"banks": [
{ "code": "BCA", "name": "Bank Central Asia", "swift": "CENAIDJA" }
],
"total_count": 1
}
| Field | Type |
|---|
banks[].code | string |
banks[].name | string |
banks[].swift | string |
total_count | integer |
2. Quote a disbursement (non-binding fee preview)
POST /api/v3/disbursements/quote
Request
| Field | Type | Required | Notes |
|---|
client_wallet_id | string (UUID) | Yes | |
amount | string (decimal) | Yes | |
bank_code | string | Yes | From List available banks. |
account_no | string | Yes | |
transfer_type | string | No | BIFAST or RTOL. Defaults to BIFAST. |
Response
{
"amount": "100000",
"platform_fee": "2500",
"net_amount": "97500",
"currency": "IDR",
"bank_code": "BCA",
"bank_name": "Bank Central Asia",
"account_no": "1234567890",
"account_holder_name": "JOHN DOE"
}
Quote has no side effects (no funds locked, nothing persisted).
3. Create a disbursement
POST /api/v3/disbursements
Required header: Idempotency-Key (max 64 chars). Missing → 400. Reusing the same key returns the original result rather than creating a duplicate.
Request
| Field | Type | Required | Notes |
|---|
client_wallet_id | string (UUID) | Yes | |
amount | string (decimal) | Yes | |
bank_code | string | Yes | |
account_no | string | Yes | |
transfer_type | string | No | BIFAST or RTOL. Defaults to BIFAST. |
memo | string | No | Max 255 chars. |
curl -X POST https://live.launcx.com/api/v3/disbursements \
-H "Content-Type: application/json" \
-H "x-api-key: {{your-v3-api-key}}" \
-H "x-timestamp: {{unix_timestamp_in_milliseconds}}" \
-H "Idempotency-Key: {{unique-key-per-request}}" \
-d '{
"client_wallet_id": "....",
"amount": "100000",
"bank_code": "BCA",
"account_no": "1234567890",
"transfer_type": "BIFAST",
"memo": "payout #123"
}'
Response
| Field | Type | Notes |
|---|
id | string (UUID) | |
client_id | string (UUID) | |
wallet_id | string (UUID) | |
status | string | See Status values. |
amount | string (decimal) | |
platform_fee | string (decimal) | |
net_amount | string (decimal) | |
currency | string | IDR. |
bank_code | string | |
bank_name | string | |
account_no | string | |
account_holder_name | string | |
memo | string | null | |
idempotency_key | string | Echoes the header. |
failed_reason | string | null | |
Status codes:
201 Created — fresh disbursement created.
200 OK with header Idempotent-Replayed: true — the Idempotency-Key was already used; the original result is returned.
4. Get a disbursement
GET /api/v3/disbursements/{id}
Returns the disbursement if it belongs to your client; otherwise 404.
| Field | Type | Notes |
|---|
id | string (UUID) | |
client_id | string (UUID) | |
wallet_id | string (UUID) | |
amount | string (decimal) | |
currency | string | IDR. |
platform_fee | string (decimal) | |
net_amount | string (decimal) | |
status | string | See Status values. |
failed_reason | string | null | |
memo | string | null | |
bank_code | string | |
bank_name | string | |
account_no | string | |
account_holder_name | string | |
verified_at | string | null | ISO 8601 UTC. |
requested_at | string | null | ISO 8601 UTC. |
completed_at | string | null | ISO 8601 UTC. |
created_at | string | ISO 8601 UTC. |
updated_at | string | ISO 8601 UTC. |
5. Disbursement status values
PENDING_VERIFICATION → VERIFIED → REQUESTED → SUCCESS, with terminal failure states FAILED, EXPIRED, and CANCELLED.