MTN Mobile Money (MoMo) operates in 16 African countries: Ghana, Ivory Coast, Cameroon, Uganda, Rwanda, Benin, Congo, etc. 70M+ active users. To sell in these countries, MoMo is essential. MTN launched MoMo Open API 2019 for developer integration. Here's a complete 2026 guide.
TL;DR
- MTN MoMo Open API: standardized multi-country public API.
- Collection: receive customer payments (equivalent M-Pesa C2B).
- Disbursement: send payouts (B2C).
- Fees: 1-3% per transaction per country + volume.
MTN MoMo coverage 2026
| Country | Users | Mobile money market share |
|---|---|---|
| Ghana | 25M | 90% |
| Ivory Coast | 12M | 60% (vs Orange Money) |
| Cameroon | 8M | 75% |
| Uganda | 18M | 80% |
| Rwanda | 4M | 90% |
| Benin | 3M | 70% |
| Congo (DRC + Brazzaville) | 6M | 65% |
| Zambia | 5M | 50% |
| Nigeria (MTN MoMo PSB) | 15M | 25% (Opay competition) |
MTN MoMo Developer Portal registration
- Go to momodeveloper.mtn.com
- Create developer account
- Subscribe to a product:
- Collections (receive payments)
- Disbursements (payouts)
- Remittance (transfers)
- Get Subscription Key
- Create API User + API Key (programmatic)
- Sandbox first, then production after KYC
Collections integration (Node.js)
Step 1 — create API user (one-time)
`typescript
import axios from 'axios';
import { v4 as uuid } from 'uuid';
async function createApiUser() {
const referenceId = uuid();
await axios.post(
'https://sandbox.momodeveloper.mtn.com/v1_0/apiuser',
{ providerCallbackHost: 'kolonell.com' },
{
headers: {
'X-Reference-Id': referenceId,
'Ocp-Apim-Subscription-Key': process.env.MOMO_SUBSCRIPTION_KEY,
},
}
);
// Create API Key for this user
const apiKey = await axios.post(
https://sandbox.momodeveloper.mtn.com/v1_0/apiuser/${referenceId}/apikey,
null,
{
headers: {
'Ocp-Apim-Subscription-Key': process.env.MOMO_SUBSCRIPTION_KEY,
},
}
);
return { userId: referenceId, apiKey: apiKey.data.apiKey };
}
`
Step 2 — get token
`typescript
async function getMomoToken() {
const auth = Buffer.from(
${process.env.MOMO_USER_ID}:${process.env.MOMO_API_KEY}
).toString('base64');
const res = await axios.post(
'https://sandbox.momodeveloper.mtn.com/collection/token/',
null,
{
headers: {
Authorization: Basic ${auth},
'Ocp-Apim-Subscription-Key': process.env.MOMO_SUBSCRIPTION_KEY,
},
}
);
return res.data.access_token;
}
`
Step 3 — initiate payment (request to pay)
`typescript
async function requestToPay({
phoneNumber, // E.164 MSISDN format without +
amount,
currency, // GHS, XOF, EUR, etc.
externalId,
payerMessage,
payeeNote,
}) {
const token = await getMomoToken();
const referenceId = uuid();
await axios.post(
'https://sandbox.momodeveloper.mtn.com/collection/v1_0/requesttopay',
{
amount: amount.toString(),
currency,
externalId,
payer: {
partyIdType: 'MSISDN',
partyId: phoneNumber,
},
payerMessage,
payeeNote,
},
{
headers: {
Authorization: Bearer ${token},
'X-Reference-Id': referenceId,
'X-Target-Environment': 'sandbox', // or 'mtnghana', 'mtncotedivoire', etc.
'Ocp-Apim-Subscription-Key': process.env.MOMO_SUBSCRIPTION_KEY,
'Content-Type': 'application/json',
},
}
Need a professional website?
Kolonell builds websites that attract clients, optimized for the Sénégalese market. Free quote in 2 minutes.
);
return referenceId; // Save for query
}
`
Step 4 — check status
`typescript
async function queryPayment(referenceId: string) {
const token = await getMomoToken();
const res = await axios.get(
https://sandbox.momodeveloper.mtn.com/collection/v1_0/requesttopay/${referenceId},
{
headers: {
Authorization: Bearer ${token},
'X-Target-Environment': 'sandbox',
'Ocp-Apim-Subscription-Key': process.env.MOMO_SUBSCRIPTION_KEY,
},
}
);
return res.data;
// { status: 'SUCCESSFUL' | 'PENDING' | 'FAILED', ... }
}
`
Standard e-commerce checkout workflow
`
- User: enters phone number + amount
- Frontend: POST /api/payment {phone, amount}
- Backend: call requestToPay → receives referenceId
- Backend: saves {referenceId, orderId, status: 'PENDING'} in DB
- Frontend: shows "Check your phone"
- User: receives MoMo USSD/popup prompt, validates PIN
- Backend: polls queryPayment(referenceId) every 5s for 60s
- Backend: SUCCESSFUL status → mark order paid
- Frontend: success redirect
`
Disbursements (B2C payouts)
For payouts (refunds, payroll, marketplace):
`typescript
async function transfer({
phoneNumber,
amount,
currency,
externalId,
}) {
const token = await getDisbursementToken(); // Disbursement endpoint
const referenceId = uuid();
await axios.post(
'https://sandbox.momodeveloper.mtn.com/disbursement/v1_0/transfer',
{
amount: amount.toString(),
currency,
externalId,
payee: {
partyIdType: 'MSISDN',
partyId: phoneNumber,
},
payerMessage: 'Payout',
payeeNote: 'Order refund',
},
{
headers: {
Authorization: Bearer ${token},
'X-Reference-Id': referenceId,
'X-Target-Environment': 'mtnghana',
'Ocp-Apim-Subscription-Key': process.env.MOMO_DISBURSEMENT_KEY,
},
}
);
return referenceId;
}
`
Country specifics
Ghana
- Currency: GHS
- Target environment:
mtnghana - Fees: 1.5% in Collections
- Open Banking: Direct GH (competitiveness)
Ivory Coast
- Currency: XOF
- Target environment:
mtncotedivoire - Fees: 2% Collections
- Competition: Orange Money (Wave more minor)
Cameroon
- Currency: XAF (CEMAC)
- Target environment:
mtncameroon - Fees: 2.5%
Uganda
- Currency: UGX
- Target environment:
mtnuganda - Fees: 1.5-2%
Common mistakes
- Wrong Target Environment — different sandbox vs prod per country.
- No unique X-Reference-Id — duplicates rejected.
- Incorrect MSISDN format — without + without 00.
- Wrong product Subscription Key — Collections vs Disbursements ≠.
- Not checking float account — Disbursements fail if empty balance.
2026 pricing
| Country | Collections | Disbursements |
|---|---|---|
| Ghana | 1.5% | 0.8% |
| Ivory Coast | 2% | 1% |
| Cameroon | 2.5% | 1.2% |
| Uganda | 1.5% | 0.8% |
Volumes negotiable >10M XOF/month.
Pan-African alternatives
- DPO Group: multi-country aggregator, MoMo + cards + crypto
- Flutterwave: Nigeria-leader aggregator, supports MoMo
- Paystack: Nigeria-first, expand MoMo Ghana CI
- PayDunya: Senegal/CI-first, MoMo + Wave + cards
For multi-country startup, aggregator simpler than direct MoMo.
FAQ
Q: MoMo Ivory Coast or Orange Money?
A: Both. Orange Money 50% CI, MoMo 35%. Aggregator (DPO/Flutterwave) covers both.
Q: MoMo business account vs personal?
A: Mandatory business account for API. Creation via local MTN agencies.
Q: KYC duration?
A: 5-15 days after complete deposit. Incorporation docs + KYC directors.
Conclusion
MTN MoMo API 2026 = essential for Ghana / IC / Cameroon. Standardized Open API but per-country setup. For multi-country Africa, aggregator (DPO/Flutterwave) often simpler. For single market scaling, direct MoMo integration wins on margins.
Mohamed Bah
Fondateur, Kolonell
Passionate about digital and entrepreneurship in Africa, Mohamed has been helping Sénégalese businesses with their digital transformation since 2020. Founder of Kolonell, he believes every SME deserves a professional and accessible online présence.
