How do I withdraw my balance through the API?
Send POST /withdrawal with amount, the net amount you receive. Your balance is charged amount plus the withdrawal fee (Rp 3,000 to a bank account, Rp 1,000 to a DANA e-wallet) and the funds go to the destination verified in the dashboard. Amounts from Rp 10,000 to Rp 10,000,000. Account details cannot be sent through the API.
This page was checked against the API code as of October 16, 2026.
Where do I send the request?#
/api/v1/gateway/withdrawal- Limit per minute:
- 2 requests per minute per API key
- Signature:
- Required in both modes
What are the requirements?#
- A payout account that is complete and verified under Payout account in the dashboard.
- No other withdrawal in progress.
- An available balance that covers
amountplus the fee.
What do I send?#
amountintegerRequired- The net amount you receive, from Rp 10,000 to Rp 10,000,000. Anything outside that range returns a
422validation error.
BODY='{"amount":100000}'
SIGNATURE=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$SEKALIPAY_SECRET_KEY" | sed 's/^.* //')
curl -X POST https://sekalipay.com/api/v1/gateway/withdrawal \
-H "X-API-Key: $SEKALIPAY_API_KEY" \
-H "X-Signature: $SIGNATURE" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
--data-raw "$BODY"What does a successful response contain?#
{
"status": true,
"message": "Withdrawal request accepted and is waiting for manual payout",
"data": {
"settlement_id": 1287,
"settlement_number": "WD20261008001",
"net_amount": 100000,
"withdrawal_fee": 3000,
"gross_amount": 103000,
"total_deducted": 103000,
"status": "approved",
"processing_status": "manual_payout_pending",
"requested_at": "2026-10-08 15:10:00",
"estimated_processed_at": "2026-10-08 15:15:00",
"bank_account": {
"bank_name": "BCA",
"account_number": "1234****7890",
"account_holder": "Budi Santoso",
"verified_at": "2026-10-01T03:12:00.000000Z"
},
"balance": {
"available": 397000,
"pending": 103000
},
"info": "You will receive Rp 100.000 (withdrawal fee Rp 3.000 has been deducted)"
}
}net_amountnumber- What you receive in your account.
withdrawal_feenumber- The withdrawal fee.
total_deductednumber- What is taken from your balance:
net_amount+withdrawal_fee. statusstringapproved: the withdrawal is accepted and the balance is reserved.processing_statusstringqueued(paid out automatically) ormanual_payout_pending(waiting for a transfer by our team).estimated_processed_atstring- Estimated processing time,
Y-m-d H:i:sWIB. bank_accountobject- Destination account with a masked number.
balanceobject- Available and held balance after the withdrawal.
Every withdrawal, including those made through the API, is announced to your account email. A withdrawal you do not recognise means your API key and secret key must be replaced right away under API Settings.
Which errors are specific to this endpoint?#
| HTTP | Code | Meaning |
|---|---|---|
| 400 | BANK_NOT_VERIFIED | The payout account has not been verified in the dashboard. |
| 400 | BANK_DETAILS_INCOMPLETE | The payout account details are incomplete. |
| 400 | INSUFFICIENT_BALANCE | The available balance is less than amount plus the fee; data.shortage is the difference. |
| 400 | PENDING_SETTLEMENT_EXISTS | Another withdrawal is still in progress. Wait for it to finish. |
| 400 | WITHDRAWAL_REJECTED | The withdrawal was refused because the account changed while it was being processed. Check your balance and payout account, then try again. |
| 503 | PAYOUT_UNAVAILABLE | The transfer service cannot process withdrawals right now (on our side, not your balance). Try again in a few minutes. |
| 500 | INTERNAL_SERVER_ERROR | An error on our side; details are not sent. Retry, or contact support with the time and merchant_ref_id. |
{
"status": false,
"message": "INSUFFICIENT_BALANCE",
"data": {
"available_balance": 50000,
"requested_amount": 100000,
"withdrawal_fee": 3000,
"gross_amount": 103000,
"total_required": 103000,
"shortage": 53000,
"info": "You need Rp 103.000 (amount + fee) but only have Rp 50.000"
}
}Do not retry automatically
This endpoint moves money and has no idempotency key. A second request while the first is still running is refused with PENDING_SETTLEMENT_EXISTS, but once the first withdrawal finishes, a repeated request creates a NEW withdrawal. After a timeout or a 5xx error, check your withdrawal history in the dashboard or your balance through account info before sending again.
Ready to use your own keys?
Sign in to the merchant dashboard to copy your API key and secret key, set the access mode and webhook URL, and download a Postman collection with your account's keys.
Sign in to the dashboard
