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.

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.

1
Contactez le service support DarePay sur WhatsApp

Indiquez le nom de votre application et décrivez brièvement votre activité (boutique, place de marché, livraison…).

2
DarePay valide votre demande et active le mode

L'équipe vous confirme l'activation ainsi que le taux des frais de service DarePay qui s'appliquera à vos paiements.

3
Vous gardez la même clé API

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.

Votre application Serveur · clé API
POST /api/payments
callback · SUCCESS
POST …/releases
résultat par destinataire
Compte DarePay L'argent est conservé ici
paiement du client
 
envoi mobile money
 
Mobile money Client · vendeurs · livreurs

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 paiement PENDING ou FAILED ne 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 en 06… (9 chiffres, par exemple 074123456).
  • 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

POST/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.

Corps de la requête (JSON)
{
  "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"
    }
  ]
}
Même demande en pourcentages
{
  "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"
    }
  ]
}
80 % et 10 % de 10 000 XAF donnent 8 000 et 1 000 XAF, soit 9 000 XAF sur les 9 500 disponibles.

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.
Réponse 201 : un envoi réussi, un échoué
{
  "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."
      }
    ]
  }
}
Ici, 8 000 XAF sont partis. Les 1 000 XAF de l'envoi échoué redeviennent disponibles : il reste 9 500 − 8 000 = 1 500 XAF.
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.

PROCESSING

Envoi en cours de vérification. Le montant reste réservé.

SUCCESSfinal

Le destinataire a reçu l'argent. Le montant est définitivement dépensé.

FAILEDfinal

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

GET/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.

Réponse 422 : montant trop élevé
{
  "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.

1
Pas de réponse : coupure réseau, délai dépassé ou HTTP 500

Ne changez pas la reference_lot. Consultez la demande, ou renvoyez exactement la même requête.

200 Demande trouvéeElle a bien été reçue. Appliquez le résultat indiqué dans statut.
404 BATCH_NOT_FOUNDRien n'a été reçu ni envoyé. Vous pouvez renvoyer la demande.
2
Statut PROCESSING

Attendez quelques minutes, puis consultez la demande avec GET …/releases/{reference_lot}. Le statut finira en SUCCESS ou FAILED pour chaque destinataire.

3
Statut PARTIEL ou FAILED

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é.

Montant disponible—
Total demandé—
Restera disponible—

Checklist e-commerce

À valider en plus de la checklist de mise en production. Votre progression est enregistrée dans ce navigateur.

Prêt à envoyer de l'argent 0/6
Tous les points sont validés : vous pouvez envoyer de l'argent.