Skip to main content
Withdrawals: exceptions & statuses covers a withdrawal that went wrong. Withdrawal & Balance API is the endpoint contract. This page covers the two things neither of those answers: automating withdrawals so you stop raising them by hand, and the integration details around a withdrawal — the notification, the identifiers, the export.

Can Waffo withdraw my settlement balance automatically?

Yes, through an automatic withdrawal contract. One contract is attached to one withdrawal agreement and one recipient bank account, and it raises withdrawals for you on a rule you agree with Waffo. The contract is set up by Waffo and goes through an internal approval before it becomes active. Once it exists, you see it and control it yourself in the Portal at Account → Withdraw → Auto Withdrawal. To request one, contact support and say which currency, which recipient account, and which rule you want.

How is an automatic withdrawal triggered?

Two trigger types exist: For AMOUNT_WITH_PERIOD the period is one of: Every contract also carries a trigger time, expressed in UTC+8. The automation re-checks through the day and acts on the first check at or after that time; a day-level guard means at most one automatic withdrawal per contract per day, however many times the check runs. The Portal shows the assembled rule as a readable sentence on the contract row, so you do not have to reconstruct it from the fields.

How much does an automatic withdrawal take out?

Your full withdrawable balance, not the threshold. The threshold is the condition, not the amount. If your threshold is met, the contract withdraws everything that is withdrawable at that moment — the settlement account’s available balance less any amount your reserve arrangement is holding back. It is the same figure the Portal shows you as your withdrawable amount and the same figure a manual full withdrawal would take. Why your withdrawable amount can be lower than your account balance is covered in Balance & Account History.

What happens on a day when my balance is below the threshold?

Nothing, and nothing fails. No withdrawal order is created, no error is raised against your account, and there is no failed row for you to clean up. The next scheduled check applies the same rule again. Two thresholds are applied, and being under either one is enough to skip the day: So a contract with a threshold below your agreement’s minimum will simply never fire below that minimum — the agreement floor wins.

My balance was well above the threshold and no withdrawal happened. Why?

In order of likelihood: The in-flight rule is per (merchant, withdrawal agreement) pair: a contract on one currency is not blocked by an open withdrawal on another.

What do the automatic withdrawal statuses mean?

REJECTED and TERMINATED are terminal: no further action of any kind is possible on that contract, and its fields are kept only as a record.

My contract was rejected. Can I fix it and resubmit?

No — a REJECTED contract cannot be edited or resubmitted. A rejected rule has to be replaced by a new contract, which goes through approval again. Contact support with what you want changed rather than trying to reuse the rejected one.

What is the difference between pausing and terminating?

Both are yours to do, from the contract row in the Portal. Pause is the safe default: if you are not certain the arrangement is finished, pause rather than terminate.

Can I have different automatic withdrawal settings per currency?

Yes. A contract is bound to one withdrawal agreement, and a withdrawal agreement is bound to one withdrawal currency pair, so per-currency rules are the normal shape: one contract per currency, each with its own threshold, period, trigger time and recipient account. Contracts are independent of each other, including the in-flight rule described above.

Is there a notification when a withdrawal finishes?

Yes. Withdrawals send a notification of type WITHDRAW_NOTIFICATION to the notifyUrl you supply, when the withdrawal succeeds or fails. Because notifyUrl is per request, there is no account-level withdrawal notification setting to configure: each withdrawal you create carries its own destination. Withdrawals raised in the Portal and by an automatic contract are not API calls of yours, so treat the notification as a confirmation channel for withdrawals you created through /api/v1/withdraw/create, and the Portal list as the record for the rest. Verify the signature and then re-read state from /api/v1/withdraw/inquiry before acting on it — the same rule that applies to payment notifications.

What is in the withdrawal notification and the withdrawal inquiry response?

One structure serves both: expectedReceiveAmount and actualReceiveAmount differing on a cross-currency withdrawal is normal and is explained in Withdrawals: exceptions & statuses.

Can I tell an API-initiated withdrawal from one raised in the Portal?

Not from a column — the Portal withdrawal list does not show how a withdrawal was started. What distinguishes them is the request identifier: In practice, if you need the origin as data, keep your own withdrawRequestId values and treat anything you do not recognise as raised outside your integration.

Can I export my withdrawal list?

Yes — Portal → Account → Withdraw has an Export action. The export date range cannot exceed 31 days, so a longer period has to be pulled in several exports. Like the other Portal exports it is a background task: the file appears in the export history rather than downloading straight away. See Export Center.

Is there a minimum and a maximum withdrawal amount?

Yes — both live on your withdrawal agreement, per withdrawal currency pair, and both are enforced when the withdrawal is created, whether you raise it in the Portal, through the API, or through an automatic contract. An amount outside the range is rejected at creation rather than failing later. The values that apply to you are the ones on your agreement; ask support if you do not have them to hand. The same minimum is the floor the automatic contract respects.

Which bank account does a withdrawal go to, and how do I add or change one?

Each withdrawal agreement has one or more recipient bank accounts bound to it. When you withdraw:
  • the Portal shows you the bound accounts and lets you pick one where more than one exists
  • /api/v1/withdraw/create takes bankAccountId; leave it out and the agreement’s default account is used
Adding or changing an account is not self-service. Portal → Settings → Bank Accounts is a read-only view of the accounts already bound to you — currency, account details, SWIFT code, bank address. There is no add or edit action, because a new payout destination is a compliance change on Waffo’s side, not a settings change on yours. To add or change one, contact support. Have ready the account currency, the account name and number, the bank name and SWIFT code, the bank address and branch, and the correspondent bank details where the account needs one — those are exactly the fields the account record holds.

What do openingRegion and fundsFrom mean on a withdrawal, and do they limit how much I can withdraw?

They describe which side sends the money, not how much you can take. fundsFrom is not something you set: it follows from your account’s openingRegion. In the Portal it is what drives the paying entity shown in the From block of the withdrawal drawer, so that the name on your bank statement matches what you were shown before you confirmed. Neither field caps your withdrawable amount. The amount is governed by your withdrawable balance and your agreement’s minimum and maximum — see the two questions above.
Something in your withdrawal does not match this page? Contact support with the withdrawal order id — it identifies the agreement, the recipient account and the contract behind it in one lookup.