Skip to content

Phone number formats

How Wajub reads a Mobile Money number, country by country, and what it rejects.

Mobile Money is identified by phone number everywhere Wajub touches it: a customer paying in, a payout leaving your balance, a marketplace settling a seller. Get the format wrong and the payment fails before the customer ever sees a prompt, which makes this the most common integration error we see.

Send E.164

Wajub expects the international form: a +, the country dialling code, then the subscriber number. No spaces, no dashes, no parentheses, no leading zero from the national format.

The shape of an accepted number
+[country code][subscriber number]

+237670000000     Cameroon, MTN
+221770000000     Senegal, Orange
+254700000000     Kenya, Safaricom

A number that arrives without its country code is not automatically refused. When the call carries a country to anchor it on (a channel like cm.mtn is enough), a local number such as 670000000 is read as +237670000000. Without that anchor there is nothing to guess from, and the number comes back as a 422.

Send E.164 anyway

Relying on the fallback means relying on your own channel being right. Normalise on your side, at the point where the customer types the number, and you remove a whole class of failure from every call that follows.

Every country Wajub reaches

Twenty-three countries: each one where the catalogue announces a channel paid with a phone number, with its dialling code and those channels.

CountryDialling codeChannels
BeninBenin+229MTN MoMo, Moov Money
Burkina FasoBurkina Faso+226Orange Money, Moov Money
CameroonCameroon+237MTN MoMo, Orange Money, Express Union
CongoCongo+242MTN MoMo, Airtel Money
Côte d'IvoireCôte d'Ivoire+225MTN MoMo, Orange Money, Moov Money, Wave, Djamo
DR CongoDR Congo+243Airtel Money, Vodacom M-Pesa, Orange Money, Africell Money
EgyptEgypt+20Vodafone Cash
GabonGabon+241Airtel Money, Moov Money
GhanaGhana+233MTN MoMo, Vodafone Cash, AirtelTigo Money
GuineaGuinea+224MTN MoMo, Orange Money
KenyaKenya+254M-Pesa, Airtel Money
LiberiaLiberia+231MTN MoMo
MalawiMalawi+265Airtel Money, TNM Mpamba
MaliMali+223Orange Money, Moov Money
MozambiqueMozambique+258M-Pesa
RwandaRwanda+250MTN MoMo, Airtel Money
SenegalSenegal+221Orange Money, Free Money, Wave, Djamo
Sierra LeoneSierra Leone+232Orange Money
South AfricaSouth Africa+27Capitec Pay
TanzaniaTanzania+255M-Pesa, Tigo Pesa, Airtel Money, HaloPesa
TogoTogo+228T-Money, Moov Money
UgandaUganda+256MTN MoMo, Airtel Money
ZambiaZambia+260MTN MoMo, Airtel Money, Zamtel Kwacha

How the operator is identified

This is where production and sandbox genuinely differ, and the difference matters.

In production, Wajub identifies the operator that owns the number from current numbering data. A number it cannot attribute to a supported operator is treated as having none.

Some channels are named after a wallet instead of an operator, and the number is read accordingly. Wave (ci.wave, sn.wave), Express Union (cm.eu), Djamo (ci.djamo, sn.djamo), Capitec Pay (za.capitec), OPay (ng.opay) and PalmPay (ng.palmpay) are held whatever the payer's operator, so a number is never refused on them because of the network it belongs to. The other wallets belong to one operator, and a number of that operator pays on the wallet's channel: ke.mpesa takes Safaricom numbers, tz.mpesa and mz.mpesa take Vodacom numbers, and gh.vodafone takes the numbers of Telecel, formerly Vodafone Ghana.

Every other channel is named after its operator, such as zm.zamtel, mw.tnm or cd.africell. An aggregate resolves the same way: a Telecel number sent on mobile is charged on gh.vodafone.

In sandbox, no real number exists to look up, so Wajub matches the prefixes below instead. They are synthetic: they exist to make test outcomes deterministic, not to describe how real numbers are allocated. A wallet held whatever the operator, such as Capitec Pay, takes a test number of any operator, its own prefix (+2761…) or another's, but never a number that is no test number.

Country and operatorSandbox prefixChannel
Cameroon / MTN MoMoCameroon / MTN MoMo+23767…cm.mtn
Cameroon / Orange MoneyCameroon / Orange Money+23769…cm.orange
Cameroon / Express UnionCameroon / Express Union+23768…cm.eu
Côte d'Ivoire / MTN MoMoCôte d'Ivoire / MTN MoMo+22505…ci.mtn
Côte d'Ivoire / Orange MoneyCôte d'Ivoire / Orange Money+22507…ci.orange
Côte d'Ivoire / Moov MoneyCôte d'Ivoire / Moov Money+22501…ci.moov
Côte d'Ivoire / WaveCôte d'Ivoire / Wave+22503…ci.wave
Senegal / Orange MoneySenegal / Orange Money+22177…sn.orange
Senegal / Free MoneySenegal / Free Money+22176…sn.free
Senegal / WaveSenegal / Wave+22178…sn.wave
Benin / MTN MoMoBenin / MTN MoMo+22990…bj.mtn
Benin / Moov MoneyBenin / Moov Money+22991…bj.moov
Burkina Faso / Orange MoneyBurkina Faso / Orange Money+22670…bf.orange
Burkina Faso / Moov MoneyBurkina Faso / Moov Money+22671…bf.moov
Ghana / MTN MoMoGhana / MTN MoMo+23324…gh.mtn
Ghana / Vodafone CashGhana / Vodafone Cash+23320…gh.vodafone
Ghana / AirtelTigo MoneyGhana / AirtelTigo Money+23327…gh.airteltigo
Kenya / M-PesaKenya / M-Pesa+25470…ke.mpesa
Kenya / Airtel MoneyKenya / Airtel Money+25478…ke.airtel
Uganda / MTN MoMoUganda / MTN MoMo+25677…ug.mtn
Uganda / Airtel MoneyUganda / Airtel Money+25675…ug.airtel
Rwanda / MTN MoMoRwanda / MTN MoMo+25078…rw.mtn
Rwanda / Airtel MoneyRwanda / Airtel Money+25073…rw.airtel
Tanzania / Airtel MoneyTanzania / Airtel Money+25567…tz.airtel
Tanzania / Tigo PesaTanzania / Tigo Pesa+25565…tz.tigo
Tanzania / HaloPesaTanzania / HaloPesa+25562…tz.halopesa
Tanzania / M-PesaTanzania / M-Pesa+25576…tz.mpesa
DR Congo / Airtel MoneyDR Congo / Airtel Money+24399…cd.airtel
DR Congo / Orange MoneyDR Congo / Orange Money+24389…cd.orange
DR Congo / Vodacom M-PesaDR Congo / Vodacom M-Pesa+24381…cd.vodacom
DR Congo / Africell MoneyDR Congo / Africell Money+24390…cd.africell
Gabon / Airtel MoneyGabon / Airtel Money+2410…ga.airtel
Gabon / Moov MoneyGabon / Moov Money+2416…ga.moov
Congo / MTN MoMoCongo / MTN MoMo+24206…cg.mtn
Congo / Airtel MoneyCongo / Airtel Money+24204…cg.airtel
Zambia / MTN MoMoZambia / MTN MoMo+26096…zm.mtn
Zambia / Airtel MoneyZambia / Airtel Money+26097…zm.airtel
Zambia / Zamtel KwachaZambia / Zamtel Kwacha+26095…zm.zamtel
Malawi / Airtel MoneyMalawi / Airtel Money+26599…mw.airtel
Malawi / TNM MpambaMalawi / TNM Mpamba+26588…mw.tnm
Mali / Orange MoneyMali / Orange Money+22370…ml.orange
Mali / Moov MoneyMali / Moov Money+22366…ml.moov
Togo / Moov MoneyTogo / Moov Money+22899…tg.moov
Togo / T-MoneyTogo / T-Money+22890…tg.tmoney
Guinea / MTN MoMoGuinea / MTN MoMo+22466…gn.mtn
Guinea / Orange MoneyGuinea / Orange Money+22462…gn.orange
Liberia / MTN MoMoLiberia / MTN MoMo+23188…lr.mtn
Mozambique / M-PesaMozambique / M-Pesa+25884…mz.mpesa
Egypt / Vodafone CashEgypt / Vodafone Cash+2010…eg.vodafone
Sierra Leone / Orange MoneySierra Leone / Orange Money+23276…sl.orange
South Africa / Capitec PaySouth Africa / Capitec Pay+2761…za.capitec

Letting Wajub pick the channel

The hosted page and the components pick the operator with the customer, so this only concerns the charge call of a Direct API integration. There, channel is required. Send mobile, or cm.mobile for Cameroon, and Wajub resolves the operator from the number, then routes to the best available provider for it. This is the case to prefer. These are the only two aggregates: in another country, name the operator's channel, such as ci.orange.

The body of the charge call then names the aggregate and the number:

Operator resolved from the number
{
"channel": "cm.mobile",
"data": {
"phone": "+237670000000"
}
}

Name a precise channel such as cm.mtn only when you want to force one operator. If the number and the channel disagree, the call is refused rather than silently rerouted.

An aggregate also works on a payment restricted with accept. The restriction is checked on the operator the number resolves to, so cm.mobile with an MTN number is accepted wherever cm.mtn is, and refused where it is not.

What comes back when it is wrong

ResponseCauseFix
422 on phoneNo +, no country code, and nothing to anchor the number onNormalise to E.164 before you send
422 on channelThe channel names an operator that does not serve that countryCheck the country's operators above
422, number and channel disagreeThe number belongs to another operator than the one you namedSend cm.mobile and let Wajub resolve it
422 on phone, no operator foundNo supported operator owns the numberAsk the customer to confirm their number, or send the operator they picked in data.operator

All four are refused on the charge call, POST /payments/{id}, not when the payment is created. The payment stays pending and nothing reaches an operator, so the same payment can be charged again once the number is fixed. A number the operator refuses after the prompt went out is a different case: the payment fails, and the reason is in the failure reasons catalogue.

What did you think of this content?