Skip to main content
Payouts return their own error code set. The prefixes look like the payment ones and several codes overlap, but the meanings are not the same — read this table rather than the payment error codes when you are handling a payout response. For what to put in each request field, see the Payout Request Field Guide.

What do the prefixes mean?

The full payout code table

A — merchant and request

There is no A0014 on payouts. A duplicate create whose amount, currency and payee account all match the original returns the ordinary success code with the original order’s data, not a distinct idempotency code. Detect it by comparing the returned payoutOrderId with the one you already hold, not by looking for a special code.

B — the payee

“User” here means the payee, not your platform’s user and not you. This is the most commonly misread part of the payout code set. A B0001 or B0003 is a message about the receiving account you addressed — a closed wallet, a wrong account number, an account that has never existed — and the fix is with the payee’s details or the payee themselves, never with your merchant configuration. B0004 is where a name or account mismatch surfaces; the matching rules are in the Payout Request Field Guide.

C — Waffo and the payout route

C0002 looks like a system error because of the C prefix and the 500, but it is a configuration problem: no payout agreement matched your request, or no fee is defined for the matched arrangement. Nothing you change in the request body will fix it — check Service → Payout in the Portal for an active agreement covering that country, currency pair and method, and raise it with Waffo if one is there but the payout still fails.

D and E

Which codes can I retry as-is, and which need the request changed?

Exactly four codes are classified as retryable on submission: Everything else means the payout will not succeed unchanged. Retry those four with the same payoutRequestId — that is what idempotency is for, and it is the only way to avoid creating a second payout. Retry with backoff, and inquire between attempts. For the rest, the split is:

A0003 told me validation failed. Can I find out which field?

Yes, and A0003 is the only payout code that carries detail. Its message is returned as the generic text followed by the specifics in parentheses:
The detail is keyed by field path — payeeInfo.payeeBirthDay, payoutInfo.payoutMethodName, payoutAmount and so on — and more than one field can appear. Every other code returns only its standard message, so do not build parsing that expects detail from anything but A0003.

I got A0008. Is it one payout that is too big, or have I used up my quota?

A0008 on a payout is about the single payout amount falling outside the permitted range for that corridor — either below the minimum or above the maximum. Both bounds come from your payout agreement and are shown as Minimum Amount and Maximum Amount, in the funding currency, on the Service → Payout page in the Portal. Check the amount against the row for the country, currency pair and method you are using. The other two are different codes, which is how you tell them apart: Running out of balance is A0012, not A0008 — see Payout Wallet & coverage for which account is debited.

What does A0010 “Operation not allowed in merchant contract” mean in practice?

That the payout you asked for is not covered by an active payout arrangement of yours. The usual causes, in the order worth checking:
  1. No agreement for that combination. Country, currency pair, method type and method all have to match one row on Service → Payout.
  2. The agreement is not Active. Only Active transacts; Initial, Suspended and Terminated do not.
  3. The agreement has lapsed. Its Validity Period has an end date; past it the agreement stops transacting.
  4. The payeeType is not one the arrangement accepts. An arrangement can be for individuals, for companies, or for both.
  5. The productName is not one you have. An unrecognised product is rejected on the field with A0003; a product you have but are not contracted for on that corridor lands here.
Nothing in the request body fixes any of these. Compare your request against the Service → Payout row first, then raise it with Waffo.

Do payout agreements expire? Where do I see the expiry?

Yes — each row on Service → Payout carries a Validity Period with a start and an end, plus a Status. A payout in a corridor whose agreement has passed its end date is rejected in the A0010 / C0002 family rather than with a dedicated expiry code, so Validity Period is the field to check when a corridor that used to work stops. Review it before it lapses; renewal is a contracting conversation, not a Portal action.

A0006 “Merchant status abnormal” — have I been suspended?

A0006 means your merchant account could not be resolved as usable for this payout — either the account was not found for the id you sent, or its status is not one that permits transacting. It is not specific to payouts and it is not informative about why. Check merchantInfo.merchantId in the request first — a wrong or mistyped id produces the same code — then contact Waffo, because the response deliberately does not carry the reason.

The create call timed out and I do not know if it worked. Retry or inquire?

Inquire. A create you did not get a response to may have succeeded. Call /api/v1/payout/inquiry with your payoutRequestId: Re-sending the create is also safe, because payoutRequestId is idempotent: an identical resend returns the original order rather than creating a second payout. What is not safe is sending the same payout under a new payoutRequestId after a timeout — that is how duplicate payouts happen.

Is a payout rejected on risk grounds appealable?

D0001 is returned without a reason and the response carries nothing to act on, so there is nothing to correct in the request. Raise it with Waffo with the payoutRequestId and the payee details; whether an individual decision can be revisited is a Waffo-side judgement, not a request parameter.
A code you cannot place, or one whose behaviour does not match this page? Contact support with the payoutRequestId, the payoutOrderId if you have one, and the exact code and message.