Providers & channels
Which channels a payout can use, and what decides whether one is available.
A channel names an operator in a country: cm.mtn is MTN Cameroon, sn.wave is Wave Senegal. It is
the one field that says where the money physically goes, and it belongs to the beneficiary rather
than to the payout, so it is fixed the day the destination is created.
Naming a channel is not the same as being able to pay out on it. The list below is what the API accepts; what actually executes depends on your account.
What has to line up
A payout runs through four separate checks before an operator ever sees it, and each answers with its own message.
| Check | Refused with |
|---|---|
| The slug is a payout channel Wajub knows | 422 The selected beneficiary.channel is invalid. |
| Some rail can technically disburse on it | 422 No payout provider is available for this channel and currency. |
| That rail is approved for live payouts | The same message |
| Your account has it configured, in that currency, with its circuit closed | The same message |
The last three collapse into one error on purpose: a merchant has no business knowing which of Wajub's rails is down. What it means in practice is that a channel can appear in the table below, be accepted at creation, and still have nowhere to go.
The channels the API accepts
Fifty Mobile Money channels across twenty-two countries. Any of them is a valid
beneficiary.channel.
| Country | Channels |
|---|---|
bj.mtn bj.moov | |
bf.orange bf.moov | |
cm.mtn cm.orange cm.eu | |
cg.mtn cg.airtel | |
ci.mtn ci.orange ci.moov ci.wave | |
cd.vodacom cd.airtel cd.orange cd.africell | |
eg.vodafone | |
ga.airtel ga.moov | |
gh.mtn gh.vodafone gh.airteltigo | |
gn.mtn gn.orange | |
ke.mpesa ke.airtel | |
lr.mtn | |
mw.airtel mw.tnm | |
ml.orange ml.moov | |
mz.mpesa | |
rw.mtn rw.airtel | |
sn.orange sn.free sn.wave | |
sl.orange | |
tz.mpesa tz.airtel tz.tigo tz.halopesa | |
tg.tmoney tg.moov | |
ug.mtn ug.airtel | |
zm.mtn zm.airtel zm.zamtel |
cd.vodacom and mz.mpesa are both M-Pesa, and cm.eu is Express Union. The slug follows the
operator Wajub routes through, not the brand printed on the customer's phone.
Three more channels are valid for a beneficiary without being Mobile Money: ci.djamo and
sn.djamo, Djamo wallets paid by phone number, and wajub, another Wajub account paid by its
account number, which never leaves Wajub and carries no fee.
The generic channel
A payout names its channel: the operator's own slug from that table, such as ke.mpesa or
eg.vodafone. There is one exception, Cameroon: cm.mobile works out from the number whether it
is cm.mtn or cm.orange. Beneficiaries covers how that resolution
behaves and how it fails.
No other country has a generic channel. ke.mobile, eg.mobile or any other {country}.mobile is
refused like an unknown channel, with 422 and The selected channel is invalid.. Even in
Cameroon, name the operator whenever you know it: a resolution that fails costs you a 422 where
an explicit slug would have gone straight through.
Coverage belongs to your account
Wajub's own rail pays out on cm.mtn, cm.orange and cm.eu. Every other channel in the table
above needs a payout provider connected to your account and approved by Wajub for live payouts,
and GET /providers lists what your account has. Collecting on a channel
never implies being able to disburse on it, and having a provider connected for collections does
not turn its payout side on.
Out of the box, three channels pay out
Until a payout provider is approved on your account, live payouts go out on cm.mtn, cm.orange
and cm.eu only. Ask before you build a corridor into your product, rather than discovering it
at the first live transfer.
What the currency does, and does not, decide
There is no rule tying a currency to a channel's country. A payout is checked against the bounds configured for its currency, against the list of active currencies, and against the currencies your providers support. Nothing compares the currency to the two letters in the slug.
In practice you will send XAF on cm.* and XOF on ci.*, because that is what the operator
settles in. But a mismatch does not produce a dedicated error: it produces the same
No payout provider is available for this channel and currency. as any other gap in coverage.
Channels that exist but are not payout channels
The Wajub catalogue marks a few more destinations as payout-capable, and the API refuses all of them for a beneficiary your integration creates.
| Channel | What it is |
|---|---|
ng.bank eg.instapay in.upi | Bank transfer, Nigeria, Egypt and India |
crypto.btc crypto.eth crypto.usdt crypto.usdc | Crypto wallets |
paypal | A PayPal wallet, addressed by contact detail |
Sending one of these as beneficiary.channel answers 422 The selected beneficiary.channel is invalid. Bank destinations do exist, as payout accounts
you create in the Dashboard on the wire channel.
Which provider handles it
You never choose. There is no provider field on a transfer and no per-call override: you name a
channel, and Wajub picks among the rails that can carry it.
The order is deterministic rather than balanced, because moving money favours predictability over spreading load. Candidates are sorted by the priority you set on each provider, the highest first, and a failure moves down the list. A rail whose recent failures tripped its circuit breaker is skipped until it recovers. Orchestration covers how to set that priority and what the fallback does.
The transfer tells you afterwards which one ran it, in provider, and the operator's own identifier
lands in provider_reference once the payout reaches it.