Balances and withdrawals
Money a seller earns from your orders, and refunds a buyer gets from a dispute, land in that user's partner balance: a balance at RekberPay that holds only money from your platform. You can read it and pay it out to a bank account in the user's name.
| Scope | Lets you |
|---|---|
balance:read | Read the balance |
withdraw | List and add payout bank accounts, request and read withdrawals |
Both scopes need a workspace member with the finance role or higher to have made the key. Writes also need write.
1. Read the balance
curl "https://api.rekberpay.com/v1/enterprise/platform/users/seller-2001/balance" \
-H "Authorization: Bearer $REKBERPAY_WORKSPACE_KEY"{ "success": true, "data": { "partner_balance": 4500000 } }partner_balanceis in whole rupiah and counts only money from your orders. Money from other partners never mixes in.main_balance(the user's own RekberPay balance) is added only while the user allows you to manage their whole balance (balance_scope: "full_balance"). They tick it when they link, and can turn it off on RekberPay at any time. Thenmain_balancedisappears andfrom: "main"withdrawals answer404.
2. Add a payout bank account
curl -X POST "https://api.rekberpay.com/v1/enterprise/platform/users/seller-2001/bank-accounts" \
-H "Authorization: Bearer $REKBERPAY_WORKSPACE_KEY" \
-H "Idempotency-Key: $(uuidgen | tr 'A-Z' 'a-z')" \
-H "Content-Type: application/json" \
-d '{ "bank_code": "BCA", "account_number": "1234567890", "holder_name": "Budi Santoso" }'201 Created
{
"success": true,
"data": {
"id": "5a6b7c8d-9e0f-4a1b-8c2d-3e4f5a6b7c8d",
"bank_code": "BCA",
"account_number_masked": "•••• 7890",
"holder_name": "Budi Santoso",
"usable_after": "2026-10-22T08:00:00.000Z",
"usable": false,
"is_test": true,
"created_at": "2026-10-21T08:00:00.000Z"
}
}- Name check.
holder_namemust match the user's name on RekberPay: the KTP name once their KYC is approved, otherwise the account name. Case, punctuation and legal forms such as PT or CV are ignored. A mismatch answers422 NAME_MISMATCHand nothing is stored. - Cooling-off. A new account can receive withdrawals only after
usable_after, 24 hours by default. This stops a stolen key from adding an account and emptying the balance at once. - The full number never comes back. Lists show
account_number_maskedonly. - At most 10 accounts per user with you (
409 BANK_ACCOUNT_LIMIT). The same bank and number twice answers409 BANK_ACCOUNT_EXISTSwith the existing id. - You get a
bank_account.addedevent in your feed, and a user who controls their own account (linked or claimed) gets an email.
List the accounts with GET /v1/enterprise/platform/users/:ref/bank-accounts.
The name lock
The payout name is what protects the money. Once a user has a partner balance or a paid marketplace order with any partner, a payout bank account with you, or an approved KYC, you can no longer rename them (409 NAME_LOCKED), and a KYC you submit must carry the same name (422 NAME_MISMATCH). RekberPay checks the name again when a withdrawal is created and before staff send it. Ask RekberPay support to fix a wrong locked name.
3. Request a withdrawal
curl -X POST "https://api.rekberpay.com/v1/enterprise/platform/users/seller-2001/withdrawals" \
-H "Authorization: Bearer $REKBERPAY_WORKSPACE_KEY" \
-H "Idempotency-Key: $(uuidgen | tr 'A-Z' 'a-z')" \
-H "Content-Type: application/json" \
-d '{ "amount": 4500000, "bank_account_id": "5a6b7c8d-9e0f-4a1b-8c2d-3e4f5a6b7c8d" }'201 Created
{
"success": true,
"data": {
"id": "6b7c8d9e-0f1a-4b2c-9d3e-4f5a6b7c8d9e",
"partner_user_ref": "seller-2001",
"status": "pending",
"from": "partner",
"amount": 4500000,
"fee": 4000,
"fee_rail": "bifast",
"net_amount": 4496000,
"bank_account_id": "5a6b7c8d-9e0f-4a1b-8c2d-3e4f5a6b7c8d",
"is_test": false,
"created_at": "2026-10-22T09:00:00.000Z",
"updated_at": "2026-10-22T09:00:00.000Z",
"processed_at": null
}
}fromispartner(the default) ormain.mainworks only withfull_balanceconsent (else404) and never in the sandbox (422 SANDBOX_MAIN_BALANCE).- The withdrawal fee is taken from
amount; the bank receivesnet_amount. The fee is set by the bank rail, named infee_rail:bifast(Rp4.000 by default) when the account'sbank_codeis an accepted bank code, such asBCA,MANDIRI,CIMB_NIAGAor the Bank Indonesia code014, andonline_transfer(Rp8.000 by default) for any other code. The user's loyalty discount or fee voucher can lower it. A saved account cannot be edited: to move one to BI-FAST, add it again with an accepted code, and it waits out the cooling-off again. See Withdrawal fees. - The usual RekberPay withdrawal rules apply: the minimum, maximum and step (
422 INVALID_AMOUNTlists them), the balance (422 INSUFFICIENT_BALANCE), a fee that is not lower than the amount (422 FEE_EXCEEDS_AMOUNT) and fraud screening (403 RISK_BLOCKED). - A small balance is never stuck. When
amountis the whole partner balance, the step and the minimum do not apply, so a Rp20.000 refund can still leave. It must still be more than the fee. A part of a small balance is refused with422 INVALID_AMOUNT. - A bank account still in cooling-off answers
409 BANK_ACCOUNT_COOLING_OFFwithusable_after. 409 TRY_AGAINmeans another change to the same user was saved at the same moment and nothing was done. Retry with the sameIdempotency-Key.
Statuses and events
status | Meaning | Event |
|---|---|---|
pending | Waiting for RekberPay's payout team | withdrawal.requested |
pending_review | A large amount. A second RekberPay approver must approve it first | withdrawal.requested |
processing | The payout is being sent | |
completed | Paid out | withdrawal.settled |
rejected | Refused. The money is back in the partner balance | withdrawal.failed |
Read one with GET /v1/enterprise/platform/users/:ref/withdrawals/:id. While your platform is frozen, withdrawals you requested stay where they are and no new ones can be made (423 PLATFORM_FROZEN).
In the sandbox a withdrawal completes at once as test data, and you get withdrawal.requested and withdrawal.settled together. The cooling-off still applies; end it at once with simulate/skip-cooling-off.
When the user withdraws by themselves
The partner balance belongs to the user, so they never need you to get it out. On RekberPay, in Pengaturan > Partner Terhubung (Settings, Connected partners), a person sees their balance with you and a Cairkan saldo button. It calls RekberPay's own POST /api/platform/me/partners/:linkId/withdrawals, a call that works only with the person's own signed-in session. You cannot call it with a key.
- The same rules as yours. The payout bank account must be one of theirs with you, past its cooling-off, in their name. The usual minimum (Rp50.000 by default, waived when they take out the whole balance), maximum, step, fee and fraud screening apply. A person can add a bank account there too, with the same name check and cooling-off.
- After they remove you, the money stays theirs. They can still withdraw it to a bank account they added while linked, so a balance is never trapped. You no longer see it: reads about that user answer
404, and you stop gettingwithdrawal.*events for them. - If you link them again, send
POST /userswith the same email. The link reopens aspending_consentand the person confirms again (Unlink, and link again). The balance and the bank accounts are still there, and you read them again. - While you are frozen, their own withdrawal still goes through, but it always waits for two RekberPay approvers, whatever the amount.
- Live mode only. A sandbox balance cannot be withdrawn by the person.
- While you are linked, you get
withdrawal.requested, thenwithdrawal.settledorwithdrawal.failed, for their withdrawal too.partner_user_refisnullwhen the outcome lands after they removed you.
What RekberPay staff do with withdrawals
A live withdrawal at or above RekberPay's approval threshold starts as pending_review. A second approver must approve it before the payout team can send it. If fraud screening flagged it, staff decide that flag first. RekberPay can also freeze your platform. While you are frozen, withdrawals you requested stay where they are (423 PLATFORM_FROZEN) until you are unfrozen. Nothing for you to do: you get withdrawal.settled or withdrawal.failed when it ends. More: What RekberPay staff do.
Checklist
- Add the bank account early, for example when the seller signs up, so the cooling-off is over by the first payout.
- Use the exact name on the seller's KTP for both the user and the bank account.
- Treat
withdrawal.settledas the only proof the money left RekberPay. - Never store the full account number in your logs.