API MbotePay
Encaisse (PayIn) et verse (PayOut) par mobile money en Afrique, directement depuis ton système, via une API REST simple et robuste. Une seule intégration pour Vodacom M-Pesa, Airtel Money, Orange Money, MTN MoMo, Moov et plus — 12 pays.
Introduction
Toutes les requêtes se font en HTTPS et renvoient du JSON. L'URL de base est :
Deux opérations principales :
| Opération | Effet |
|---|---|
| PayIn | Débite le mobile money d'un client → crédite ton solde MbotePay. |
| PayOut | Débite ton solde MbotePay → crédite le mobile money d'un bénéficiaire. |
Authentification
Génère une clé API dans l'app (Développeur → Nouvelle clé). Passe-la en en-tête Authorization sur chaque requête :
Authorization: Bearer mp_live_xxxxxxxxxxxxxxxxxxxxIdempotence
Pour éviter les doublons (retry réseau), envoie un en-tête Idempotency-Key unique par opération. Deux requêtes avec la même clé ne créent qu'une seule transaction.
Idempotency-Key: commande_12345Montants & devises
Les montants (amount) sont exprimés dans l'unité principale de la devise (ex. 5000 = 5 000 CDF), jamais en centimes. La devise (currency) est le code ISO : CDF, USD, XAF, XOF, KES, RWF, UGX, ZMW, SLE.
Opérateurs & pays
Chaque requête précise le pays (country), l'opérateur (operator), la devise (currency) et le numéro (phone, format international sans +, ex. 243812345678). Voici la couverture complète — 12 pays, 22 opérateurs :
| Pays | country | Indicatif | Devise(s) | Opérateurs — operator |
|---|---|---|---|---|
| RD Congo | COD | +243 | CDF, USD | Vodacom M-Pesa VODACOM_MPESA_CODAirtel MoneyAIRTEL_CODOrange MoneyORANGE_COD |
| Bénin | BEN | +229 | XOF | MTN MoMo MTN_MOMO_BENMoov MoneyMOOV_BEN |
| Côte d’Ivoire | CIV | +225 | XOF | MTN MoMo MTN_MOMO_CIVOrange MoneyORANGE_CIV |
| Cameroun | CMR | +237 | XAF | MTN MoMo MTN_MOMO_CMR |
| Congo-Brazzaville | COG | +242 | XAF | Airtel Money AIRTEL_COGMTN MoMoMTN_MOMO_COG |
| Gabon | GAB | +241 | XAF | Airtel Money AIRTEL_GAB |
| Sénégal | SEN | +221 | XOF | Orange Money ORANGE_SENFree MoneyFREE_SEN |
| Kenya | KEN | +254 | KES | M-Pesa (Safaricom) MPESA_KEN |
| Rwanda | RWA | +250 | RWF | Airtel Money AIRTEL_RWAMTN MoMoMTN_MOMO_RWA |
| Ouganda | UGA | +256 | UGX | Airtel Money AIRTEL_OAPI_UGAMTN MoMoMTN_MOMO_UGA |
| Zambie | ZMB | +260 | ZMW | Airtel Money AIRTEL_OAPI_ZMBMTN MoMoMTN_MOMO_ZMBZamtel KwachaZAMTEL_ZMB |
| Sierra Leone | SLE | +232 | SLE | Orange Money ORANGE_SLE |
Frais
Les frais sont identiques à ceux de l'app MbotePay. Le PayIn répercute le coût réel de l'opérateur (sans marge) — ton solde est crédité net de frais. Le PayOut ajoute 1 % de frais MbotePay au coût de l'opérateur — ton solde est débité du montant + frais. Le montant exact figure dans le champ fee de la transaction.
| Pays | Opérateur | PayIn | PayOut |
|---|---|---|---|
| RD Congo | Vodacom M-Pesa | 2,5 % | 3 % |
| RD Congo | Airtel Money | 3 % | 3 % |
| RD Congo | Orange Money | 3 % | 2 % |
| Bénin | MTN MoMo | 2,2 % | 2,5 % |
| Bénin | Moov Money | 2,2 % | 2 % |
| Côte d’Ivoire | MTN MoMo | 1,8 % | 2,3 % |
| Côte d’Ivoire | Orange Money | 2,5 % | 3 % |
| Cameroun | MTN MoMo | 1,75 % | 2,3 % |
| Congo-Brazzaville | Airtel Money | 4 % | 2 % |
| Congo-Brazzaville | MTN MoMo | 4 % | 2 % |
| Sénégal | Orange Money | 2 % | 2,8 % |
| Sénégal | Free Money | 2 % | 2,5 % |
| Kenya | M-Pesa (Safaricom) | 1,5 % | 2 % |
| Rwanda | Airtel Money | 2,5 % | 2 % |
| Rwanda | MTN MoMo | 3,1 % | 2 % + 60 RWF |
| Ouganda | Airtel Money | 2,5 % | 2 % + 1 000 UGX |
| Ouganda | MTN MoMo | 3 % | 2 % + 1 000 UGX |
| Zambie | Airtel Money | 1 % + 3 ZMW | 2 % |
| Zambie | MTN MoMo | 1 % + 2,5 ZMW | 3 % |
| Zambie | Zamtel Kwacha | 2 % | 3 % |
| Sierra Leone | Orange Money | 3,3 % | 3,15 % |
PayIn — encaisser
| Champ | Type | Description |
|---|---|---|
amount | number | Montant à encaisser (unité principale). |
currency | string | Devise ISO (ex. CDF). |
country | string | Code pays (ex. COD). |
operator | string | Code opérateur mobile money. |
phone | string | Numéro du client (international, sans +). |
reference | string? | Ta référence libre (renvoyée dans le webhook). |
callback_url | string? | URL HTTPS à notifier à la conclusion. |
curl https://app.mbotepay.com/api/v1/payin \
-H "Authorization: Bearer mp_live_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: cmd_12345" \
-d '{
"amount": 5000,
"currency": "CDF",
"country": "COD",
"operator": "VODACOM_MPESA_COD",
"phone": "243812345678",
"reference": "cmd_12345",
"callback_url": "https://ton-site.com/webhooks/mbotepay"
}'Réponse
{
"id": "6f2a…-tx",
"object": "payin",
"status": "PROCESSING",
"amount": 5000,
"currency": "CDF",
"operator": "VODACOM_MPESA_COD",
"phone": "243812345678",
"reference": "cmd_12345"
}Le client reçoit une invite mobile money pour valider. Le statut final (COMPLETED ou FAILED) est notifié par webhook.
PayOut — verser
Mêmes champs que PayIn. Débite ton solde MbotePay vers le phone du bénéficiaire. Des frais s'appliquent (voir Frais), renvoyés dans fee.
curl https://app.mbotepay.com/api/v1/payout \
-H "Authorization: Bearer mp_live_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: paie_98765" \
-d '{
"amount": 20000,
"currency": "CDF",
"country": "COD",
"operator": "AIRTEL_COD",
"phone": "243991234567",
"reference": "paie_98765",
"callback_url": "https://ton-site.com/webhooks/mbotepay"
}'Réponse
{
"id": "9a1b…-tx",
"object": "payout",
"status": "PROCESSING",
"amount": 20000,
"fee": 400,
"currency": "CDF",
"operator": "AIRTEL_COD",
"phone": "243991234567",
"reference": "paie_98765"
}Statut d'une transaction
curl https://app.mbotepay.com/api/v1/transactions/6f2a…-tx \
-H "Authorization: Bearer mp_live_..."{
"id": "6f2a…-tx",
"object": "payin",
"status": "COMPLETED",
"amount": 5000,
"fee": 0,
"currency": "CDF",
"reference": "cmd_12345",
"created": "2026-07-08T09:00:00Z",
"updated": "2026-07-08T09:00:22Z"
}Statuts
| Statut | Signification |
|---|---|
PROCESSING | En cours de traitement par l'opérateur. |
ENQUEUED | Mis en file par l'opérateur, sera traité. |
COMPLETED | Réussi (terminal). |
FAILED | Échoué (terminal). Un PayOut échoué est recrédité sur ton solde. |
NEEDS_ATTENTION | À vérifier manuellement (rare). |
Webhooks
Si tu fournis callback_url, MbotePay envoie une requête POST à cette URL dès que la transaction atteint un statut terminal. Le corps :
{
"id": "6f2a…-tx",
"object": "payin",
"event": "payin.completed",
"status": "completed",
"amount": 5000,
"fee": 0,
"currency": "CDF",
"reference": "cmd_12345"
}Vérifier la signature
Chaque webhook porte un en-tête X-MbotePay-Signature: t=<timestamp>,v1=<hmac>. Recalcule le HMAC-SHA256 de `${t}.${corpsBrut}` avec ton secret de webhook (fourni à la création de la clé) et compare :
import crypto from "crypto";
function verify(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(",").map(p => p.split("=")));
const expected = crypto.createHmac("sha256", secret)
.update(parts.t + "." + rawBody).digest("hex");
return crypto.timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected));
}200 rapidement. En l'absence de webhook, tu peux toujours interroger GET /transactions/{id}.Erreurs
Les erreurs renvoient un code HTTP adapté et un corps JSON :
{ "error": { "message": "Clé API invalide ou révoquée.", "code": "unauthorized" } }| Code | Cas |
|---|---|
400 | Paramètres invalides. |
401 | Clé API manquante, invalide ou révoquée. |
404 | Transaction introuvable. |
422 | Erreur métier (solde insuffisant, opérateur indisponible…). |
429 | Trop de requêtes. |
Une question ? support@mbotepay.com · MbotePay — LEGETEC SARL, Kinshasa (RDC).