Skip to content

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.

ScopeLets you
balance:readRead the balance
withdrawList 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 ​

bash
curl "https://api.rekberpay.com/v1/enterprise/platform/users/seller-2001/balance" \
  -H "Authorization: Bearer $REKBERPAY_WORKSPACE_KEY"
json
{ "success": true, "data": { "partner_balance": 4500000 } }
  • partner_balance is 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. Then main_balance disappears and from: "main" withdrawals answer 404.

2. Add a payout bank account ​

bash
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

json
{
    "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_name must 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 answers 422 NAME_MISMATCH and 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_masked only.
  • At most 10 accounts per user with you (409 BANK_ACCOUNT_LIMIT). The same bank and number twice answers 409 BANK_ACCOUNT_EXISTS with the existing id.
  • You get a bank_account.added event 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 ​

bash
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

json
{
    "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
    }
}
  • from is partner (the default) or main. main works only with full_balance consent (else 404) and never in the sandbox (422 SANDBOX_MAIN_BALANCE).
  • The withdrawal fee is taken from amount; the bank receives net_amount. The fee is set by the bank rail, named in fee_rail: bifast (Rp4.000 by default) when the account's bank_code is an accepted bank code, such as BCA, MANDIRI, CIMB_NIAGA or the Bank Indonesia code 014, and online_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_AMOUNT lists 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 amount is 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 with 422 INVALID_AMOUNT.
  • A bank account still in cooling-off answers 409 BANK_ACCOUNT_COOLING_OFF with usable_after.
  • 409 TRY_AGAIN means another change to the same user was saved at the same moment and nothing was done. Retry with the same Idempotency-Key.

Statuses and events ​

statusMeaningEvent
pendingWaiting for RekberPay's payout teamwithdrawal.requested
pending_reviewA large amount. A second RekberPay approver must approve it firstwithdrawal.requested
processingThe payout is being sent
completedPaid outwithdrawal.settled
rejectedRefused. The money is back in the partner balancewithdrawal.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 getting withdrawal.* events for them.
  • If you link them again, send POST /users with the same email. The link reopens as pending_consent and 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, then withdrawal.settled or withdrawal.failed, for their withdrawal too. partner_user_ref is null when 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.settled as the only proof the money left RekberPay.
  • Never store the full account number in your logs.

Next steps ​

Escrow, payment services and B2B deals for Indonesian businesses.