Envoi d'argent (e-commerce)
Pour les applications de vente en ligne : vos clients paient, l'argent est conservé sur le compte DarePay, puis votre application l'envoie aux vendeurs, livreurs ou clients de votre choix, quand vous le décidez.
Le principe
Avec une application classique, DarePay répartit automatiquement chaque paiement entre des bénéficiaires fixés à l'avance. Une boutique en ligne a d'autres besoins : on ne sait pas toujours, au moment du paiement, qui devra recevoir l'argent ni quand. Par exemple, le vendeur n'est payé qu'une fois la commande livrée, ou le client est remboursé si l'article manque.
Le mode e-commerce répond à ce besoin. L'argent payé par vos clients est d'abord conservé sur le compte DarePay. Vous décidez ensuite, avec un simple appel à l'API, à qui envoyer l'argent, combien et à quel moment.
POST /api/payments.
2. Conserver
L'argent reste sur le compte DarePay, rattaché au paiement.
3. Envoyer
Envoyez l'argent sur le mobile money de qui vous voulez, en une ou plusieurs
fois.
Exemples d'utilisationPayer le vendeur après la livraison, payer le livreur, rembourser un client en tout ou en partie, ou répartir une commande entre plusieurs vendeurs.
Activer le mode e-commerce
Le mode e-commerce ne s'active pas depuis l'API. C'est l'équipe DarePay qui le met en place pour votre application, après échange avec vous.
Indiquez le nom de votre application et décrivez brièvement votre activité (boutique, place de marché, livraison…).
Support DarePay : 074 76 97 98L'équipe vous confirme l'activation ainsi que le taux des frais de service DarePay qui s'appliquera à vos paiements.
Rien à changer dans votre code de paiement. Vous ajoutez seulement l'appel d'envoi décrit plus bas.
Ce qui change pour votre application
| Application classique | Application e-commerce | |
|---|---|---|
| Où va l'argent payé ? | Réparti automatiquement entre les bénéficiaires prévus | Conservé sur le compte DarePay, en attente de vos envois |
| Qui choisit les destinataires ? | Fixés à l'avance avec DarePay | Votre application, à chaque envoi |
| Quand l'argent est-il envoyé ? | Dès que le paiement réussit | Quand votre application le demande |
| Initier un paiement | POST /api/payments, avec les mêmes champs dans les
deux cas |
|
| Envoyer de l'argent | Non disponible | POST /api/payments/{reference}/releases |
Seuls les paiements faits après l'activation sont concernésLes paiements réalisés avant le passage en mode e-commerce ont déjà été répartis : ils ne peuvent pas servir à des envois.
Comment circule l'argent
Chaque paiement réussi devient une petite « réserve » d'argent, attachée à sa référence. Vos envois puisent dans cette réserve, jamais au-delà. Cliquez sur une étape pour la situer dans le schéma.
Le montant disponible
Quand un paiement réussit, DarePay prélève ses frais de service (selon le taux convenu avec vous à l'activation). Ce qui reste est le montant disponible : c'est le maximum que vous pouvez envoyer pour ce paiement, en une ou plusieurs fois.
| Exemple : paiement de 10 000 XAF avec des frais de 5 % | Montant |
|---|---|
| Montant payé par le client | 10 000 XAF |
| Frais de service DarePay (5 %) | − 500 XAF |
| Montant disponible pour vos envois | 9 500 XAF |
| 1er envoi : vendeur, 8 000 XAF | il reste 1 500 XAF |
| 2e envoi : livreur, 1 000 XAF | il reste 500 XAF |
| 3e envoi : remboursement partiel du client, 500 XAF | il reste 0 XAF |
Le destinataire reçoit le montant exactLes frais d'envoi sont pris en charge par DarePay : si vous envoyez 8 000 XAF, le vendeur reçoit 8 000 XAF, et votre montant disponible baisse de 8 000 XAF, pas plus.
Le montant restant est renvoyé dans chaque réponse d'envoi (champ
montant_restant). Un envoi qui échoue ne consomme rien : son montant redevient
disponible.
Les conditions à respecter
DarePay vérifie chaque demande avant d'envoyer le moindre franc. Si une seule condition n'est pas respectée, toute la demande est refusée et aucun envoi n'est fait.
- Le paiement
doit être réussi (
SUCCESS). Un paiementPENDINGouFAILEDne permet aucun envoi. - Le total demandé ne doit pas dépasser le montant disponible restant pour ce paiement.
- Les destinataires doivent utiliser le même opérateur que le paiement : un paiement Airtel Money ne peut être envoyé que vers des numéros Airtel Money, et un paiement Moov Money vers des numéros Moov Money.
- Le numéro doit
correspondre à l'opérateur : numéros Airtel Money en
07…, numéros Moov Money en06…(9 chiffres, par exemple074123456). - De 1 à 20 destinataires par demande.
- Un même numéro ne peut pas apparaître deux fois dans la même demande. Additionnez les montants si besoin.
- Les montants sont en XAF entiers, sans centimes. Un pourcentage accepte jusqu'à 2 décimales.
- Chaque demande
porte une référence d'envoi unique (
reference_lot), choisie par votre application. - Vous ne pouvez envoyer que l'argent des paiements de votre propre application.
Les pourcentages sont calculés sur le montant payéUn pourcentage s'applique au montant payé par le client, pas au montant disponible. Avec des frais de 5 %, vous pouvez donc envoyer au maximum 95 % au total : demander 100 % serait refusé. Les montants calculés sont arrondis au franc inférieur.
Envoyer de l'argent
/api/payments/{reference}/releases
Une seule requête peut envoyer de l'argent à plusieurs destinataires. Le paiement concerné est
désigné par sa référence dans l'URL, celle que vous avez utilisée lors de
POST /api/payments. Les en-têtes sont les mêmes que pour les autres routes (authentification).
Champs de la requête
| Champ | Obligatoire | Description |
|---|---|---|
reference_lot |
Oui | Votre référence unique pour cette demande d'envoi. Lettres, chiffres,
- et _, 100 caractères maximum. Exemple :
LIV-CMD2026001.
|
destinataires |
Oui | Liste de 1 à 20 destinataires. |
destinataires[].numero |
Oui | Numéro mobile money du destinataire, par exemple 074123456. Les
formats +241 74 12 34 56 ou 24174123456 sont aussi
acceptés. |
destinataires[].operateur |
Oui | AIRTEL_MONEY ou MOOV_MONEY, le même que celui du
paiement. |
destinataires[].montant |
Oui | Le montant à envoyer en XAF, ou un pourcentage si type_montant vaut
POURCENTAGE.
|
destinataires[].type_montant |
Facultatif | MONTANT (par défaut) : montant est une somme en
XAF.POURCENTAGE : montant est un pourcentage du
montant payé (par exemple 80 pour 80 %). |
destinataires[].type_destinataire |
Facultatif | VENDEUR, ACHETEUR ou AUTRE. Sert à votre
suivi : cela ne change pas l'envoi. |
Exemple de requête
Le paiement CMD2026001 de 10 000 XAF a réussi (9 500 XAF disponibles). La commande
est livrée : on paie le vendeur et le livreur.
{
"reference_lot": "LIV-CMD2026001",
"destinataires": [
{
"numero": "074123456",
"operateur": "AIRTEL_MONEY",
"montant": 8000,
"type_destinataire": "VENDEUR"
},
{
"numero": "077987654",
"operateur": "AIRTEL_MONEY",
"montant": 1000,
"type_destinataire": "AUTRE"
}
]
}
{
"reference_lot": "LIV-CMD2026001",
"destinataires": [
{
"numero": "074123456",
"operateur": "AIRTEL_MONEY",
"montant": 80,
"type_montant": "POURCENTAGE"
},
{
"numero": "077987654",
"operateur": "AIRTEL_MONEY",
"montant": 10,
"type_montant": "POURCENTAGE"
}
]
}
Lire la réponse
Les envois sont traités immédiatement : la réponse contient déjà le résultat de chaque destinataire. Il n'y a pas de callback pour les envois.
| HTTP | Signification |
|---|---|
| 201 | La demande a été prise en charge. Lisez data.statut pour connaître
le résultat. |
| 200 | Cette reference_lot a déjà été traitée : DarePay renvoie le
résultat existant, sans rien renvoyer (deja_traite vaut
true).
|
| 4xx / 500 | La demande a été refusée : aucun envoi n'a été fait. Voir les erreurs. |
{
"success": true,
"message": "Certaines sorties n’ont pas pu être effectuées. Consultez le détail par destinataire.",
"data": {
"reference_paiement": "CMD2026001",
"reference_lot": "LIV-CMD2026001",
"statut": "PARTIEL",
"deja_traite": false,
"montant_total": 9000,
"montant_restant": 1500,
"devise": "XAF",
"date_demande": "2026-10-02T10:15:04+01:00",
"date_traitement": "2026-10-02T10:15:07+01:00",
"destinataires": [
{
"position": 1,
"reference_sortie": "S7KQ2M9XA",
"numero": "074123456",
"operateur": "AIRTEL_MONEY",
"type_destinataire": "VENDEUR",
"montant": 8000,
"statut": "SUCCESS",
"code_erreur": null,
"message": "Sortie effectuée."
},
{
"position": 2,
"reference_sortie": "SP3TZ81BD",
"numero": "077987654",
"operateur": "AIRTEL_MONEY",
"type_destinataire": "AUTRE",
"montant": 1000,
"statut": "FAILED",
"code_erreur": "INVALID_RECIPIENT",
"message": "Ce numéro ne peut pas recevoir le transfert. Vérifiez-le puis réessayez avec une nouvelle reference_lot."
}
]
}
}
| Champ | Description |
|---|---|
reference_paiement |
Référence du paiement d'où vient l'argent. |
reference_lot |
Votre référence d'envoi. |
statut |
Résultat global de la demande. Voir les statuts. |
deja_traite |
true si cette reference_lot avait déjà été traitée.
|
montant_total |
Total demandé dans cette demande, en XAF. |
montant_restant |
Ce qui reste disponible pour de futurs envois sur ce paiement. |
destinataires[].reference_sortie |
Référence DarePay de cet envoi. Conservez-la : c'est elle que le support vous demandera en cas de problème. |
destinataires[].statut |
Résultat pour ce destinataire. |
destinataires[].code_erreur |
null si l'envoi a réussi, sinon un code expliqué plus bas. |
destinataires[].message |
Message lisible, que vous pouvez afficher dans votre back-office. |
Statuts d'un envoi
Statut global de la demande
Il se lit dans le champ data.statut.
| Statut | Signification | Que faire ? |
|---|---|---|
| SUCCESS | Tous les destinataires ont reçu leur argent. | Rien : c'est terminé. |
| PARTIEL | Une partie des envois a réussi, l'autre a échoué. | Corrigez les destinataires en échec et renvoyez-les seuls, avec une nouvelle
reference_lot.
|
| FAILED | Aucun envoi n'a réussi. Rien n'a été dépensé. | Réessayez avec une nouvelle reference_lot. Si le problème persiste,
contactez le support. |
| PROCESSING | Le résultat d'au moins un envoi n'est pas encore confirmé. | Ne renvoyez pas la demande. Consultez-la dans quelques minutes (voir plus bas). |
Statut de chaque destinataire
Il se lit dans le champ destinataires[].statut.
Envoi en cours de vérification. Le montant reste réservé.
Le destinataire a reçu l'argent. Le montant est définitivement dépensé.
L'envoi n'a pas eu lieu. Le montant redevient disponible.
PROCESSING n'est ni un succès ni un échecL'argent est peut-être déjà parti. DarePay vérifie le résultat de son côté. Ne renvoyez surtout pas la même somme avec une autre référence : le destinataire pourrait être payé deux fois.
Consulter un envoi
/api/payments/{reference}/releases/{reference_lot}
Cette route renvoie l'état actuel d'une demande d'envoi, au même format que la réponse ci-dessus.
Elle ne déclenche aucun envoi : vous pouvez l'appeler autant de fois que nécessaire, par exemple
pour suivre une demande PROCESSING.
Erreurs
Quand une demande est refusée, aucun envoi n'a été fait. La réponse contient un
code stable que votre application peut tester, et un message lisible.
{
"success": false,
"code": "INSUFFICIENT_BALANCE",
"message": "Le total demandé (12000 XAF) dépasse le montant disponible (9500 XAF).",
"details": {
"montant_demande": 12000,
"montant_disponible": 9500
}
}
Demande refusée
| HTTP | Code | Signification | Action recommandée |
|---|---|---|---|
| 401 | — | Clé API absente ou invalide | Vérifier l'en-tête X-API-Key. |
| 403 | APPLICATION_NOT_COMMERCE |
Le mode e-commerce n'est pas activé pour votre application | Contacter le support pour l'activer. |
| 403 | APPLICATION_INACTIVE |
Votre application est désactivée | Contacter le support. |
| 404 | PAYMENT_NOT_FOUND |
Aucun paiement de votre application avec cette référence | Vérifier la référence dans l'URL. |
| 404 | BATCH_NOT_FOUND |
Aucune demande avec cette reference_lot pour ce paiement
(consultation) |
Vérifier les deux références. |
| 409 | PAYMENT_NOT_SUCCESSFUL |
Le paiement n'est pas réussi (PENDING ou FAILED) |
Attendre le callback SUCCESS avant d'envoyer. |
| 409 | COMMISSION_NOT_FROZEN |
Ce paiement n'est pas éligible aux envois (fait avant l'activation du mode e-commerce) | Contacter le support si besoin. |
| 409 | IDEMPOTENCY_CONFLICT |
Cette reference_lot a déjà servi pour une demande différente |
Utiliser une nouvelle reference_lot. |
| 422 | VALIDATION_ERROR |
Champ manquant ou mal formé (numéro, nombre de destinataires…) | Corriger la requête. Le détail est dans erreurs ou
details.
|
| 422 | INSUFFICIENT_BALANCE |
Le total dépasse le montant disponible | Réduire les montants. Le disponible exact est dans
details.montant_disponible.
|
| 422 | OPERATOR_MISMATCH |
Opérateur différent de celui du paiement, ou numéro qui ne correspond pas à l'opérateur | Utiliser l'opérateur du paiement et un numéro de cet opérateur. |
| 422 | DUPLICATE_RECIPIENT |
Le même numéro apparaît deux fois | Regrouper les montants sur une seule ligne. |
| 422 | INVALID_AMOUNT |
Montant nul, négatif, avec centimes, ou pourcentage hors de 0 à 100 | Corriger le montant. |
| 422 | INVALID_AMOUNT_TYPE |
type_montant inconnu |
Utiliser MONTANT ou POURCENTAGE. |
| 500 | INTERNAL_ERROR |
Erreur interne | Consulter la demande avec la même reference_lot avant de réessayer.
|
Échec d'un destinataire
Quand la demande est acceptée mais qu'un envoi échoue, le motif est dans
destinataires[].code_erreur.
| Code | Signification | Action recommandée |
|---|---|---|
null |
Envoi réussi | — |
INVALID_RECIPIENT |
Ce numéro ne peut pas recevoir l'argent (numéro inexistant, compte mobile money inactif…) | Vérifier le numéro, puis renvoyer avec une nouvelle reference_lot.
|
RELEASE_FAILED |
L'envoi n'a pas pu être effectué | Réessayer avec une nouvelle reference_lot. Si le problème persiste,
contacter le support en donnant la reference_sortie. |
VERIFICATION_PENDING |
Résultat en cours de vérification (statut PROCESSING) |
Ne rien renvoyer. Consulter la demande dans quelques minutes. |
Que faire en cas de doute ?
La reference_lot vous protège des doublons : une même référence n'envoie
jamais l'argent deux fois. Renvoyer exactement la même requête est donc sans
risque.
Ne changez pas la reference_lot. Consultez la demande, ou renvoyez
exactement la même requête.
statut.
Attendez quelques minutes, puis consultez la demande avec GET
…/releases/{reference_lot}. Le statut finira en SUCCESS ou
FAILED pour chaque destinataire.
Créez une nouvelle demande avec une nouvelle
reference_lot, en n'y mettant que les destinataires en
échec. Ceux qui ont réussi sont déjà payés.
Ne générez pas une nouvelle reference_lot à chaque tentative automatiqueSi votre code crée une nouvelle référence à chaque essai après une coupure, une même somme risque de partir deux fois. Générez la référence une seule fois, enregistrez-la avec la commande, puis réutilisez-la pour toutes les tentatives.
Simuler une répartition
Saisissez un paiement et vos destinataires : le simulateur applique les mêmes règles de calcul que DarePay. Tout est calculé dans votre navigateur : rien n'est envoyé.
Checklist e-commerce
À valider en plus de la checklist de mise en production. Votre progression est enregistrée dans ce navigateur.