Payouts
Send money from your Zeny balance to a bank account or e-wallet you have saved.
How a payout works
- Save a beneficiary in the dashboard. A beneficiary is the bank account or e-wallet you pay. Beneficiaries are created in the dashboard, not through this API. Zeny checks that the account holder's name matches, and a payout to a beneficiary without a passing name check is refused (
409 name_check_requiredor409 name_check_failed). Copy the beneficiary's id (ben_…). - Request the payout with
POST /api/merchant/v1/payoutsand an Idempotency-Key.
The money is reserved from your available balance at once (curl https://api.usezeny.com/api/merchant/v1/payouts \ -H "Authorization: Bearer $ZENY_SECRET_KEY" \ -H "Idempotency-Key: payout-2026-11-supplier-17" \ -H "Content-Type: application/json" \ -d '{ "reference": "supplier-17", "beneficiary": "ben_…", "amount": { "value": "2500000.00", "currency": "IDR" }, "description": "November invoice" }'debit) and the payout ispending_approval. - A second person approves it. Someone else on your team, not the person who requested it, must approve the payout in the dashboard. Zeny's risk review can also hold or refuse it.
- Zeny sends it. The payout is
processing, thenpaidwhen the provider reports the money sent. If it fails, the debit returns to your balance.
Learn the outcome from the payout.paid, payout.failed, payout.rejected and payout.canceled webhooks, or read the payout with GET /api/merchant/v1/payouts/{id}.
Reading the amounts
debit is what leaves your balance and net is what the beneficiary receives. They always add up: debit = net + the sum of fees. A fee you bear is added on top of the amount (net equals amount). A fee the beneficiary bears comes off what is sent (debit equals amount).
Cancel a payout
POST /api/merchant/v1/payouts/{id}/cancel withdraws a payout that is still pending_approval and returns its debit to your balance. Once a payout is approved it cannot be canceled (409 invalid_state_transition).
Errors you should expect
| Code | Meaning |
|---|---|
insufficient_balance (409) | Your available balance does not cover the debit. |
duplicate_reference (409) | You already used this reference. The existing payout's id is in error.details[0].id. |
beneficiary_not_found (404), beneficiary_deleted (409) | The beneficiary does not exist or was removed. |
amount_below_fee (400) | The beneficiary bears the fee and the amount is smaller than it. |
merchant_not_live (403) | Your business cannot send money yet. See the go-live checklist. |
outstanding_debt (409) | Your business owes Zeny money and must settle it first. |
A payout that fails has a failure.code: declined means every provider refused it, so check the beneficiary's account; processing_error means it failed after a provider took it.