Payment methods & channels
Every method Wajub collects with, its channel identifier, and where it works.
Wajub collects through five families of payment methods behind one API. Each is named by a
channel, and a channel is either a family on its own, mobile, card, bank or crypto, or a
precise operator in the country.operator form.
You rarely need to name one. By default the hosted page offers every channel your account can
collect on, whatever the currency, and picks nothing on the customer's behalf. You can narrow that
list per payment with accept. Naming a channel is what Direct API does,
when you have already collected the number yourself.
How to read a channel
cm.mtn is MTN Mobile Money in Cameroon, sn.wave is Wave in Senegal. The prefix is the ISO
3166-1 alpha-2 country code and the suffix the operator. A bare family name such as mobile lets
Wajub resolve the operator from the phone number instead.
Mobile Money
The backbone of collection across the continent. The customer approves on their own handset, from a USSD prompt or the operator's app, and nothing is captured until they do.
| Operator | Channels | Countries | Currencies |
|---|---|---|---|
cm.mtn ci.mtn bj.mtn gh.mtn ug.mtn rw.mtn zm.mtn cg.mtn gn.mtn lr.mtn | CM, CI, BJ, GH, UG, RW, ZM, CG, GN, LR | XAF, XOF, GHS, UGX, RWF, ZMW, GNF, LRD | |
cm.orange ci.orange sn.orange bf.orange ml.orange gn.orange cd.orange. Coming soon: sl.orange | CM, CI, SN, BF, ML, GN, SL, CD | XAF, XOF, GNF, SLL, CDF | |
ci.wave sn.wave | CI, SN | XOF | |
ug.airtel rw.airtel tz.airtel ke.airtel zm.airtel mw.airtel cd.airtel cg.airtel ga.airtel | UG, RW, TZ, KE, ZM, MW, CD, CG, GA | UGX, RWF, TZS, KES, ZMW, MWK, CDF, XAF | |
ci.moov bj.moov bf.moov tg.moov ml.moov ga.moov | CI, BJ, BF, TG, ML, GA | XOF, XAF | |
ke.mpesa tz.mpesa mz.mpesa | KE, TZ, MZ | KES, TZS, MZN |
Other operators complete the catalogue: Express Union in Cameroon (cm.eu), Free in Senegal,
T-Money in Togo, Vodafone and AirtelTigo in Ghana, Tigo and Halopesa in Tanzania, Vodacom and
Africell in DR Congo, Zamtel in Zambia, TNM in Malawi, Vodafone Cash in Egypt and Capitec Pay in
South Africa.
mobile and cm.mobile, for Cameroon, are not channels of the catalogue. They are the two
shortcuts the charge call accepts, to let
Wajub resolve the operator from the number rather than naming it up front. No other country has an
aggregate: charge its operator's own channel.
`GET /providers` is the list for your account
Coverage moves. GET /channels is the global catalogue: every channel Wajub
supports, the same answer for every key, filtered by country if you pass one. What your own
account can take depends on the providers your team has active, and that is
GET /providers: each active connection with the channels it actually
offers, the ones the hosted checkout shows. Treat the table above as the shape of the offer. A new
channel is a backward-compatible change, so it never breaks an existing integration.
Bank cards
Visa and Mastercard, offered on the hosted page wherever the settlement currency allows it.
| Network | Detected as | Notes |
|---|---|---|
visa | 3-D Secure 2 when requested | |
mastercard | 3-D Secure 2 when requested |
The channel is card, for both networks. You never name the brand: Wajub reads it from the card
number to route the payment, which is also how American Express, Discover, Diners, JCB and Maestro
are recognised where a provider accepts them. The payment itself carries no card.brand field.
Wajub asks for 3-D Secure when Shield calls for it: Shield Advanced's Auto 3DS from your
review threshold, or a challenge_3ds rule. Otherwise the provider and the card issuer apply their
own policy.
Bank transfers
For large amounts, mostly business to business. The customer receives account details, and the
payment moves to succeeded once the funds land.
| Type | Channel | Countries |
|---|---|---|
bank | CM, CI, SN, NG, GH |
A transfer settles on the bank's clock, not on the customer's. Expect a delay between the moment they confirm and the moment the webhook fires, and never hold an order open in the browser waiting for it.
Wallets
Apple Pay and Google Pay tokenise the card on the device, so Wajub never sees the raw card or the device credentials.
| Wallet | `wallet_type` | Requires |
|---|---|---|
apple_pay | Safari, iOS | |
google_pay | Chrome, Android |
Wallets are live only
A wallet appears on the hosted page and in the embedded components when one of your providers offers it, in live. Sandbox hides every wallet, so you cannot test one there. See Wajub Components → JS for the component side.
Crypto
The payment settles once the transfer confirms on chain. Channels follow crypto.{asset}, and if
you supply no wallet_address the payer is shown a deposit address to send to.
Four assets are in the catalogue, the dollar stablecoins and the two largest chains:
| Asset | Channel |
|---|---|
crypto.btc | |
crypto.eth | |
crypto.usdt | |
crypto.usdc |
The API also accepts crypto.bnb, crypto.sol, crypto.xrp, crypto.ada, crypto.ltc,
crypto.matic, crypto.doge and crypto.trx as a channel, but no provider in the catalogue
carries them. Which of the four your customers actually see depends on the crypto provider enabled
on your account, so read GET /providers before you build a selector.
Crypto is coming soon
No provider that carries these four assets can be connected yet, so no account can charge them in live today. Coverage lists the other rails in the same position.
Where each country stands
The currency decides which channels exist, and the account's providers decide which of them are switched on.
| Country | Currency | Mobile Money | Cards |
|---|---|---|---|
| XAF | MTN, Orange, Express Union | Yes | |
| XOF | MTN, Orange, Wave, Moov | Yes | |
| XOF | Orange, Wave, Free | Yes | |
| XOF | MTN, Moov | Yes | |
| XOF | Orange, Moov | Yes | |
| XOF | T-Money, Moov | Yes | |
| XOF | Orange, Moov | Yes | |
| GHS | MTN, Vodafone, AirtelTigo | Yes | |
| NGN | None. Bank transfer, USSD, OPay and PalmPay instead | Yes | |
| KES | M-Pesa, Airtel | Yes | |
| UGX | MTN, Airtel | Yes | |
| RWF | MTN, Airtel | Yes | |
| TZS | M-Pesa, Airtel, Tigo, Halopesa | Yes | |
| XAF | Airtel, Moov | Yes | |
| XAF | MTN, Airtel | Yes | |
| CDF | Orange, Airtel, Vodacom, Africell | Yes | |
| GNF | MTN, Orange | Yes | |
| LRD | MTN | Yes | |
| SLL | Orange | Yes | |
| ZMW | MTN, Airtel, Zamtel | Yes | |
| MWK | Airtel, TNM | Yes | |
| MZN | M-Pesa | Yes |
Choosing what a payment accepts
Nothing is hidden by default: the payer sees every method your account can collect on, and a payment
in a currency a wallet does not use is converted, as described in
Limits. To narrow it, send accept when you create the payment, the link or the
invoice. Every key is optional, and a key you leave out narrows nothing.
accept.countriesstring[]optionalaccept.channelsstring[]optionalcm.mtn. An aggregate like cm.mobile stands for every mobile operator of that country, and mobile for every mobile operator.accept.typesstring[]optionalmobile_money or card.accept.currenciesstringoptionalany (the default) offers every channel, converting the amount when the currencies differ. payment keeps only the channels that settle in the currency of the payment, so a XAF payment no longer shows Kenyan mobile money.The restriction is kept on the payment and applies twice: the page offers only what it allows, and a
charge that names another channel is refused with a 422 and the code channel_not_accepted. If
accept leaves nothing to pay with, the create call itself answers 422 on accept, rather than
producing a page with no method on it.
A charge sent on mobile or on cm.mobile is checked on the operator
the number resolves to, not on the aggregate. With the restriction above, cm.mobile and an MTN
Cameroon number is charged on cm.mtn, and an Ivorian number is refused. A payment restricted to
"channels": ["mobile"] takes any Mobile Money operator, whichever the number resolves to, and no
card, bank or crypto channel.
A link or an invoice carries its own accept, and every payment opened from it inherits it. On a
link or an invoice, accept: {} clears the restriction. In the Dashboard the same fields sit under
Payment methods, in the link composer and on the invoice form.
Previewing the methods before you create a payment
GET /payments/options lists the channels a payer could use for a currency and an amount, before
any payment exists: the ones your account offers on the payment page, narrowed to the payer's
country and to each channel's minimum and maximum. It takes the same accept restriction as
POST /payments. Use it to draw your own method picker; the payment, once created, is what the
payer is actually offered.
curl "https://api.wajub.com/payments/options?currency=XAF&amount=25000&country=CM&locale=fr" \
-H "Authorization: sk_test.xxxxxxxxxxxxxxxx…"The answer carries code, status, message and channels: each with its slug, name,
name.fr, type, logo and countries, and operators for cm.mobile.
List payment options
Amounts and caps
Two different limits apply to the same payment, and they are easy to confuse.
The first is the payment itself. In XAF and XOF it must fall between 25 and 2 000 000; outside
that range the create call is refused with a 422 naming the bound in errors.amount.
The second is what a single Mobile Money debit can carry, capped at 500 000 XAF, and the same in
XOF. In live a payment above that is refused with a 422 when you charge it. Only sandbox collects
it in successive tranches, which is the one situation where a payment sits in partial. See the
payment lifecycle for what that state means.
Your own ceiling is lower until you are verified
The figures above are the platform's. What your account can actually collect is set by your verification level, and an unverified account has a live ceiling of zero. Check it in Settings → Compliance, covered in Account activation.
Related pages
- Phone number formatsWhat each operator accepts, before a payment can even start.
- Payment lifecycleIncluding the tranches a large Mobile Money payment is split into.
- Settlement currency & balanceWhich currency you are paid in, and when.
- Fees & pricingWhat each channel costs you.
- Send to these channelsMobile Money payouts with Transfers.