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 :

POSThttps://app.mbotepay.com/api/v1

Deux opérations principales :

OpérationEffet
PayInDébite le mobile money d'un client → crédite ton solde MbotePay.
PayOutDébite ton solde MbotePay → crédite le mobile money d'un bénéficiaire.
Un PayOut débite ton solde MbotePay : approvisionne-le au préalable (recharge dans l'app ou via des PayIn).

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_xxxxxxxxxxxxxxxxxxxx
Ta clé donne accès à des mouvements d'argent. Garde-la côté serveur, ne l'expose jamais côté client. Révoque-la immédiatement en cas de fuite.

Idempotence

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_12345

Montants & 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 :

PayscountryIndicatifDevise(s)Opérateurs — operator
RD CongoCOD+243CDF, USD
Vodacom M-PesaVODACOM_MPESA_CODAirtel MoneyAIRTEL_CODOrange MoneyORANGE_COD
BéninBEN+229XOF
MTN MoMoMTN_MOMO_BENMoov MoneyMOOV_BEN
Côte d’IvoireCIV+225XOF
MTN MoMoMTN_MOMO_CIVOrange MoneyORANGE_CIV
CamerounCMR+237XAF
MTN MoMoMTN_MOMO_CMR
Congo-BrazzavilleCOG+242XAF
Airtel MoneyAIRTEL_COGMTN MoMoMTN_MOMO_COG
GabonGAB+241XAF
Airtel MoneyAIRTEL_GAB
SénégalSEN+221XOF
Orange MoneyORANGE_SENFree MoneyFREE_SEN
KenyaKEN+254KES
M-Pesa (Safaricom)MPESA_KEN
RwandaRWA+250RWF
Airtel MoneyAIRTEL_RWAMTN MoMoMTN_MOMO_RWA
OugandaUGA+256UGX
Airtel MoneyAIRTEL_OAPI_UGAMTN MoMoMTN_MOMO_UGA
ZambieZMB+260ZMW
Airtel MoneyAIRTEL_OAPI_ZMBMTN MoMoMTN_MOMO_ZMBZamtel KwachaZAMTEL_ZMB
Sierra LeoneSLE+232SLE
Orange MoneyORANGE_SLE
La couverture s'élargit régulièrement. Un pays ou un opérateur te manque ? Écris à support@mbotepay.com.

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.

PaysOpérateurPayInPayOut
RD CongoVodacom M-Pesa2,5 %3 %
RD CongoAirtel Money3 %3 %
RD CongoOrange Money3 %2 %
BéninMTN MoMo2,2 %2,5 %
BéninMoov Money2,2 %2 %
Côte d’IvoireMTN MoMo1,8 %2,3 %
Côte d’IvoireOrange Money2,5 %3 %
CamerounMTN MoMo1,75 %2,3 %
Congo-BrazzavilleAirtel Money4 %2 %
Congo-BrazzavilleMTN MoMo4 %2 %
SénégalOrange Money2 %2,8 %
SénégalFree Money2 %2,5 %
KenyaM-Pesa (Safaricom)1,5 %2 %
RwandaAirtel Money2,5 %2 %
RwandaMTN MoMo3,1 %2 % + 60 RWF
OugandaAirtel Money2,5 %2 % + 1 000 UGX
OugandaMTN MoMo3 %2 % + 1 000 UGX
ZambieAirtel Money1 % + 3 ZMW2 %
ZambieMTN MoMo1 % + 2,5 ZMW3 %
ZambieZamtel Kwacha2 %3 %
Sierra LeoneOrange Money3,3 %3,15 %
Taux effectifs (marge MbotePay déjà incluse pour le PayOut). Les frais fixes éventuels sont exprimés dans la devise locale. Barème indicatif, susceptible d'évoluer.

PayIn — encaisser

POST/api/v1/payin
ChampTypeDescription
amountnumberMontant à encaisser (unité principale).
currencystringDevise ISO (ex. CDF).
countrystringCode pays (ex. COD).
operatorstringCode opérateur mobile money.
phonestringNuméro du client (international, sans +).
referencestring?Ta référence libre (renvoyée dans le webhook).
callback_urlstring?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

POST/api/v1/payout

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

GET/api/v1/transactions/{id}
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

StatutSignification
PROCESSINGEn cours de traitement par l'opérateur.
ENQUEUEDMis en file par l'opérateur, sera traité.
COMPLETEDRé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));
}
Réponds 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" } }
CodeCas
400Paramètres invalides.
401Clé API manquante, invalide ou révoquée.
404Transaction introuvable.
422Erreur métier (solde insuffisant, opérateur indisponible…).
429Trop de requêtes.

Une question ? support@mbotepay.com · MbotePay — LEGETEC SARL, Kinshasa (RDC).