Documentation API Recharge Externe B-MO (Collections)
Spécifications d'intégration, calcul de frais et guide d'exécution pour la recharge directe de comptes ou portefeuilles clients B-MO (Cash-in / Collections).
Présentation
L'API Recharge Externe B-MO (Collections / Cash-in) permet à une application partenaire ou un système marchand d'alimenter directement un compte ou portefeuille B-MO client.
Le cycle complet s'articule en 3 étapes clés :
- Calcul du coût de la recharge (
GET /thirdparty/collection/cost) : Estimation préalable des frais applicables avant le déclenchement financier. - Exécution de la recharge (
POST /thirdparty/collection/operation) : Initiation du crédit sur le portefeuille client avec génération d'une référence transactionnelle unique. - Suivi du statut de l'opération (
GET /thirdparty/operation) : Consultation de l'état final de la transaction via votre référence externe partenaire ou la référence B-MO.
URL de Base (selon l'environnement sélectionné) :
- TEST (Défaut) :
https://svc.test.bestcash.me/external- PAP :
https://svc.pap.bestcash.me/external- LIVE (Production) :
https://svc.bmo.bestcash.me/externalVous pouvez basculer d'un environnement à un autre à tout moment depuis le menu déroulant en haut des consoles d'essai
<ApiPlayground />ci-dessous.En-têtes obligatoires :
X-Auth-ApiKey: Votre clé d'API partenaireX-Auth-ApiSecret: Votre secret d'API partenaireContent-Type:application/jsonAccept:application/json
Règles d'intégration importantes
[!WARNING]
1. Aucun champ superflu dans le corps JSON de l'opération
Lors de l'appel à l'étape 2 (
/operation), n'incluez aucun champ additionnel (tel quecountryoucurrency) dans le corps JSON. Le compilateur et validateur Symfony de l'API rejette immédiatement toute requête contenant des champs non définis dans le schéma avec une erreur400 VALIDATION FAILED (extra fields).
[!NOTE]
2. Formats des numéros de téléphone
- Étape 1 (
/cost) : Le paramètremsisdnest transmis sans le signe+(ex:2290196123456).- Étape 2 (
/operation) : Le champtargetMsisdndoit être fourni au format international avec le signe+(ex:+2290196123456).
1. Calculer le coût de la recharge (GET /thirdparty/collection/cost)
Estime les frais de transaction applicables avant de déclencher l'opération de rechargement.
- Méthode :
GET - URL :
/external/thirdparty/collection/cost - Paramètres de requête (Query params) :
amount(obligatoire) : Montant de la recharge en XOF (ex:1000).msisdn(obligatoire) : Numéro du destinataire sans le signe+(ex:2290196123456).country(obligatoire) : Code pays ISO 3166-1 alpha-2 du destinataire (ex:BJ). (Obligatoire sur le validateur API).
Tester l'estimation des frais de recharge
Calculez les frais applicables avant d'initier le rechargement client.
Exemple de requête cURL
curl -X GET "https://svc.test.bestcash.me/external/thirdparty/collection/cost?amount=1000&msisdn=2290196123456&country=BJ" \
-H "X-Auth-ApiKey: <VOTRE_API_KEY>" \
-H "X-Auth-ApiSecret: <VOTRE_API_SECRET>" \
-H "Accept: application/json"
Exemple de réponse HTTP 200
{
"cost": 0.0,
"currencyCode": "XOF"
}
2. Effectuer la recharge (POST /thirdparty/collection/operation)
Initie le crédit sur le portefeuille client B-MO et génère la référence transactionnelle du système.
- Méthode :
POST - URL :
/external/thirdparty/collection/operation - Corps de la requête (JSON Body) :
amount(number, obligatoire) : Montant total de la recharge (ex:1000).externalReference(string, obligatoire) : Référence unique générée par votre plateforme pour identifier la transaction (ex:"RECH-PAP-2026-001").targetFirstname(string, obligatoire) : Prénom du titulaire destinataire.targetLastname(string, obligatoire) : Nom de famille du titulaire destinataire.targetMsisdn(string, obligatoire) : Numéro de téléphone au format international avec+(ex:"+2290196123456").
Tester la création de recharge (Collections)
Initiez une opération de recharge externe sur un portefeuille client.
Aucun paramètre d'URL configuré.
Exemple de requête cURL
curl -X POST "https://svc.test.bestcash.me/external/thirdparty/collection/operation" \
-H "X-Auth-ApiKey: <VOTRE_API_KEY>" \
-H "X-Auth-ApiSecret: <VOTRE_API_SECRET>" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"amount": 1000,
"externalReference": "RECH-PAP-2026-001",
"targetFirstname": "Jean",
"targetLastname": "Dupont",
"targetMsisdn": "+2290196123456"
}'
Exemple de réponse HTTP 200
{
"prefixedAmount": "1 000 F CFA",
"prefixedOperationCost": "0 F CFA",
"operationCode": "",
"status": "ONGOING",
"operationCost": 0.0,
"amount": 1000.0,
"operationType": "COLLECTIONS",
"reference": "BMO20260930110220474",
"creationDate": "2026-09-30T11:02:20+00:00"
}
[!NOTE] Conservez la valeur du champ
reference(ex:"BMO20260930110220474") ainsi que votreexternalReferenceafin d'effectuer les rapprochements et le suivi du statut.
3. Vérifier le statut de l'opération (GET /thirdparty/operation)
Consulte l'avancement d'un rechargement à l'aide de votre référence partenaire unique (externalReference) ou de la référence système B-MO (reference).
- Méthode :
GET - URL :
/external/thirdparty/operation - Paramètres de requête (Query params) :
externalReference(string, optionnel) : La référence unique transmise lors de l'initiation (ex:"RECH-PAP-2026-001").reference(string, optionnel) : La référence interne B-MO attribuée lors de l'opération (ex:"BMO20260930110220474").
Règle : Au moins un des deux identifiants (
externalReferenceoureference) doit être renseigné.
Tester la vérification de statut de recharge
Consultez l'état final ou intermédiaire d'un rechargement client.
Exemple de requête cURL
curl -X GET "https://svc.test.bestcash.me/external/thirdparty/operation?externalReference=RECH-PAP-2026-001" \
-H "X-Auth-ApiKey: <VOTRE_API_KEY>" \
-H "X-Auth-ApiSecret: <VOTRE_API_SECRET>" \
-H "Accept: application/json"
Exemple de réponse HTTP 200
{
"status": "ONGOING",
"operationCost": 0.0,
"amount": 1000.0,
"operationType": "COLLECTIONS",
"reference": "BMO20260930110220474",
"creationDate": "2026-09-30T11:02:20+00:00",
"externalReference": "RECH-PAP-2026-001"
}
Dictionnaire des paramètres
| Paramètre | Type | Étape | Présence | Description |
|---|---|---|---|---|
amount | number | /cost & /operation | Obligatoire | Montant de la recharge en francs CFA (XOF). |
msisdn | string | /cost | Obligatoire | Numéro de téléphone du destinataire sans signe + (ex: 2290196123456). |
country | string | /cost | Obligatoire | Code ISO 3166-1 alpha-2 du pays destinataire (ex: BJ). |
externalReference | string | /operation & /operation (GET) | Obligatoire (étape 2) | Référence unique générée par votre système pour identifier l'opération. |
targetFirstname | string | /operation | Obligatoire | Prénom du client bénéficiaire. |
targetLastname | string | /operation | Obligatoire | Nom de famille du client bénéficiaire. |
targetMsisdn | string | /operation | Obligatoire | Numéro de téléphone destinataire au format international avec + (ex: +2290196123456). |
reference | string | /operation (GET) | Optionnel | Référence unique générée par la plateforme B-MO (ex: BMO20260930110220474). |
Codes d'erreurs et Dépannage
| Code HTTP | Message d'erreur | Cause probable & Résolution |
|---|---|---|
401 Unauthorized | Full authentication is required | En-têtes X-Auth-ApiKey ou X-Auth-ApiSecret manquants ou invalides. |
400 Bad Request | VALIDATION FAILED (extra fields) | Présence de champs non autorisés dans le corps JSON de /operation (ex: country). Retirez tout champ superflu. |
400 Bad Request | CUSTOMER NOT FOUND / INVALID MSISDN | Le numéro de téléphone destinataire n'est associé à aucun compte B-MO valide. |
400 Bad Request | INSUFFICIENT BALANCE | Le solde du compte partenaire est insuffisant pour approvisionner le portefeuille client. |
400 Bad Request | DUPLICATE_EXTERNAL_REFERENCE | La référence partenaire (externalReference) a déjà été utilisée pour une transaction antérieure. |
404 Not Found | RESSOURCE_NOT_FOUND | La référence spécifiée lors du suivi de statut n'existe pas en base. |
Exemples d'intégration de bout en bout
const axios = require('axios');
const BASE_URL = 'https://svc.test.bestcash.me/external';
const HEADERS = {
'X-Auth-ApiKey': 'VOTRE_API_KEY',
'X-Auth-ApiSecret': 'VOTRE_API_SECRET',
'Content-Type': 'application/json',
'Accept': 'application/json'
};
async function executeCollection() {
try {
// 1. Calcul du coût de la recharge
console.log('--- 1. Estimation des frais de recharge ---');
const costRes = await axios.get(`${BASE_URL}/thirdparty/collection/cost`, {
params: {
amount: 1000,
msisdn: '2290196123456',
country: 'BJ'
},
headers: HEADERS
});
console.log('Coût estimé :', costRes.data);
// 2. Exécution de la recharge
const externalReference = `RECH-DEV-${Date.now()}`;
console.log(`--- 2. Exécution de la recharge (${externalReference}) ---`);
const opRes = await axios.post(`${BASE_URL}/thirdparty/collection/operation`, {
amount: 1000,
externalReference: externalReference,
targetFirstname: 'Jean',
targetLastname: 'Dupont',
targetMsisdn: '+2290196123456'
}, { headers: HEADERS });
console.log('Réponse opération :', opRes.data);
const bmoReference = opRes.data.reference;
// 3. Suivi du statut de l'opération
console.log('--- 3. Vérification du statut ---');
const statusRes = await axios.get(`${BASE_URL}/thirdparty/operation`, {
params: { externalReference: externalReference },
headers: HEADERS
});
console.log('Statut final :', statusRes.data);
} catch (error) {
console.error('Erreur :', error.response ? error.response.data : error.message);
}
}
executeCollection();