Transfert (Payout)

Transfert (Payout)

ÉlémentDescription
MéthodePOST
Endpoint/v1/payout
AuthAuthorization: Basic base64(api_key:api_client)
IdempotenceX-Idempotency-Key obligatoire pour éviter les doublons
Payload Typeapplication/json
Timeout recommandé30 secondes maximum

Headers

KeyDescriptionObligatoire
AuthorizationBasic base64(api_key:api_client)
X-Idempotency-KeyUUID garantissant l’unicité de la requête

Request Body

{
  "reference": "55a4e677-5700-4ed0-9a2a-9300db894ddb",
  "accountId": "merchant_qdadaklwldakld",
  "amount": 300,
  "msisdn": "+2250749929598",
  "country": "CI",
  "customerName": "Habib"
}

Description des paramètres

ChampTypeDescriptionObligatoire
referencestringIdentifiant unique du transfert (UUID côté marchand).
accountIdstringCompte ou sous-compte marchand à débiter.
amountnumberMontant à transférer.
msisdnstringNuméro de téléphone du bénéficiaire (format E.164).
countrystringCode ISO du pays (CI, SN, TG, etc.).
customerNamestringNom du bénéficiaire.

Exemple de Réponse

{
  "type": "payout",
  "fee": 6,
  "reference": "mtr_fhscgaywizujwjyymlge1hncaq",
  "phoneNumber": "+2250749929598",
  "customerName": "Habib",
  "amount": 300,
  "chargedAmount": 306,
  "status": "processed",
  "currency": "XOF",
  "customerReference": "55a4e677-5700-4ed0-9a2a-9300db894ddb",
  "confirmationRequired": false,
  "confirmationStatus": "none",
  "transaction": {
    "reference": "TFHL2A4D3QQC11NW9",
    "status": "completed",
    "processedAt": "2025-08-29T13:39:35.138Z",
    "phoneNumber": "+2250749929598",
    "amount": "300.00",
    "fees": "6.00",
    "chargedAmount": "306.00",
    "currency": "XOF"
  },
  "createdAt": "2025-08-22T02:00:16.026Z"
}

Interprétation de la Réponse

ChampDescription
typeType de transaction — ici payout (transfert sortant).
feeMontant des frais de service appliqués.
referenceRéférence système du transfert côté API.
phoneNumberNuméro du bénéficiaire du transfert.
customerNameNom du bénéficiaire.
amountMontant à transférer (hors frais).
chargedAmountMontant total débité du compte marchand (montant + frais).
statusStatut global du transfert (processing, processed, expired, etc.).
currencyDevise utilisée (XOF, USD, EUR, etc.).
customerReferenceRéférence d’origine fournie par le marchand pour corrélation.
confirmationRequiredIndique si le bénéficiaire doit confirmer avant réception. (Souvent false pour les transferts marchands classiques.)
confirmationStatusStatut de confirmation (utile si une validation bénéficiaire est exigée).
transactionDétails finaux du transfert exécuté dans le Core System.
createdAtHorodatage de création du transfert.

Clé transaction

Ce champ contient les informations de la transaction finale une fois que le transfert est traité par le processeur Mobile Money ou le Core interne.

ChampDescription
transaction.referenceRéférence technique générée par le système de traitement.
transaction.statusStatut final (completed, failed, pending).
transaction.processedAtTimestamp de finalisation du transfert.
transaction.phoneNumberNuméro du compte crédité.
transaction.amountMontant exact crédité.
transaction.feesFrais appliqués au niveau du processeur.
transaction.chargedAmountMontant total débité du compte marchand.
transaction.currencyDevise utilisée.

💡 Le champ transaction devient disponible une fois le transfert traité avec succès.

S’il est vide ({}), cela signifie que le transfert est encore en cours (status = processing).


Statut d’un Transfert

GET /v1/payout/{reference}
ÉlémentDescription
MéthodeGET
Endpoint/v1/payout/{reference}
AuthAuthorization requise
PayloadAucun
DescriptionRetourne le statut complet du transfert correspondant à la reference fournie.

Exemple de Réponse

{
  "type": "payout",
  "fee": 6,
  "reference": "mtr_fhscgaywizujwjyymlge1hncaq",
  "phoneNumber": "+2250749929598",
  "customerName": "Habib",
  "amount": 300,
  "chargedAmount": 306,
  "status": "processed",
  "currency": "XOF",
  "customerReference": "55a4e677-5700-4ed0-9a2a-9300db894ddb",
  "confirmationRequired": false,
  "confirmationStatus": "none",
  "createdAt": "2025-08-22T02:00:16.026Z",
  "transaction": {},
  "failure": null
}

Interprétation de la Réponse

ChampDescription
statusStatut global du transfert.
transactionObjet contenant les informations finales (vide si non encore traité).
failureDétails d’erreur en cas d’échec (null si succès).

Statuts Possibles

StatutDescription
pendingRequête reçue, en attente de traitement.
processingTransfert en cours d’exécution (contact opérateur Mobile Money).
processedTransfert traité côté API, résultat en attente du processeur.
completedTransfert confirmé et crédité sur le compte bénéficiaire.
failedErreur de traitement (numéro invalide, solde insuffisant, etc.).
reversedFonds reversés au marchand suite à un échec ou une annulation.
expiredDélai de traitement dépassé sans réponse.

Cycle de Vie d’un Transfert (Payout)


Bonnes Pratiques

  • Utiliser X-Idempotency-Key pour éviter les transferts en double.
  • Vérifier le status ou s’abonner au webhook payout.completed pour recevoir la confirmation finale.
  • En cas de failure, consulter le champ failure pour le détail de l’erreur (code, message, opérateur).
  • Ne pas tenter de relancer manuellement un transfert sans vérifier le statut failed ou expired.
  • Pour un suivi temps réel, utiliser le WebSocket ou les Webhooks (payout.updated, payout.completed).