Skip to content

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.

OperatorChannelsCountriesCurrencies
MTN MoMoMTN MoMocm.mtn ci.mtn bj.mtn gh.mtn ug.mtn rw.mtn zm.mtn cg.mtn gn.mtn lr.mtnCM, CI, BJ, GH, UG, RW, ZM, CG, GN, LRXAF, XOF, GHS, UGX, RWF, ZMW, GNF, LRD
Orange MoneyOrange Moneycm.orange ci.orange sn.orange bf.orange ml.orange gn.orange cd.orange. Coming soon: sl.orangeCM, CI, SN, BF, ML, GN, SL, CDXAF, XOF, GNF, SLL, CDF
WaveWaveci.wave sn.waveCI, SNXOF
Airtel MoneyAirtel Moneyug.airtel rw.airtel tz.airtel ke.airtel zm.airtel mw.airtel cd.airtel cg.airtel ga.airtelUG, RW, TZ, KE, ZM, MW, CD, CG, GAUGX, RWF, TZS, KES, ZMW, MWK, CDF, XAF
Moov MoneyMoov Moneyci.moov bj.moov bf.moov tg.moov ml.moov ga.moovCI, BJ, BF, TG, ML, GAXOF, XAF
M-PesaM-Pesake.mpesa tz.mpesa mz.mpesaKE, TZ, MZKES, 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.

NetworkDetected asNotes
VisaVisavisa3-D Secure 2 when requested
MastercardMastercardmastercard3-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.

TypeChannelCountries
Domestic transferDomestic transferbankCM, 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 PayApple Payapple_paySafari, iOS
Google PayGoogle Paygoogle_payChrome, Android

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:

AssetChannel
BitcoinBitcoincrypto.btc
EthereumEthereumcrypto.eth
TetherTethercrypto.usdt
USD CoinUSD Coincrypto.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.

CountryCurrencyMobile MoneyCards
CameroonCameroonXAFMTN, Orange, Express UnionYes
Côte d'IvoireCôte d'IvoireXOFMTN, Orange, Wave, MoovYes
SenegalSenegalXOFOrange, Wave, FreeYes
BeninBeninXOFMTN, MoovYes
Burkina FasoBurkina FasoXOFOrange, MoovYes
TogoTogoXOFT-Money, MoovYes
MaliMaliXOFOrange, MoovYes
GhanaGhanaGHSMTN, Vodafone, AirtelTigoYes
NigeriaNigeriaNGNNone. Bank transfer, USSD, OPay and PalmPay insteadYes
KenyaKenyaKESM-Pesa, AirtelYes
UgandaUgandaUGXMTN, AirtelYes
RwandaRwandaRWFMTN, AirtelYes
TanzaniaTanzaniaTZSM-Pesa, Airtel, Tigo, HalopesaYes
GabonGabonXAFAirtel, MoovYes
CongoCongoXAFMTN, AirtelYes
DR CongoDR CongoCDFOrange, Airtel, Vodacom, AfricellYes
GuineaGuineaGNFMTN, OrangeYes
LiberiaLiberiaLRDMTNYes
Sierra LeoneSierra LeoneSLLOrangeYes
ZambiaZambiaZMWMTN, Airtel, ZamtelYes
MalawiMalawiMWKAirtel, TNMYes
MozambiqueMozambiqueMZNM-PesaYes

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[]optional
Only channels of these countries, as ISO 3166-1 alpha-2 codes. Cards and crypto belong to no country, so this never removes them.
accept.channelsstring[]optional
Only these channels, such as cm.mtn. An aggregate like cm.mobile stands for every mobile operator of that country, and mobile for every mobile operator.
accept.typesstring[]optional
Only these kinds of channel, such as mobile_money or card.
accept.currenciesstringoptional
any (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.
A USD payment, Cameroonian mobile money only
{
"amount": 99.5,
"currency": "USD",
"email": "[email protected]",
"accept": {
"countries": [
"CM"
],
"types": [
"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.

Methods for 25 000 XAF in Cameroon
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.

What did you think of this content?