Skip to content

Payment methods & channels

Every method Wajub collects with, its channel identifier, and where it works.

Every payment method is named by a channel: a family on its own, mobile, card, bank or crypto, or a precise operator in the country.operator form. The hosted page offers every channel your account can collect on; narrow it per payment with accept, and name a channel only in a Direct API charge.

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.

Each family has its own page:

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": "buyer@example.com",
"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. logo_png, on a channel and on each operator, is the same logo as a PNG, for an app that draws no SVG, or null when there is none. 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. A payment above that is refused with a 422 when you charge it.

What did you think of this content?