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:
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:
- No agreement for that combination. Country, currency pair, method type and method all have to match one row on Service → Payout.
- The agreement is not Active. Only Active transacts; Initial, Suspended and Terminated do not.
- The agreement has lapsed. Its Validity Period has an end date; past it the agreement stops transacting.
- The
payeeTypeis not one the arrangement accepts. An arrangement can be for individuals, for companies, or for both. - The
productNameis not one you have. An unrecognised product is rejected on the field withA0003; a product you have but are not contracted for on that corridor lands here.
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 theA0010 / 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.