> ## Documentation Index
> Fetch the complete documentation index at: https://developers.ligdicash.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Anatomie du payload — Payout

> Détail du payload reçu lors d'un callback payout : structure, champs et différences avec le payload payin.

Lors d'un payout (sortie d'argent vers un wallet client ou un compte mobile money), LigdiCash envoie deux requêtes POST à votre `callback_url` — une en `application/json`, une en `application/x-www-form-urlencoded`. Les deux contiennent les mêmes données. Cette page détaille la structure JSON et les différences avec le [payload payin](/api-paiement/callback/payload-payin).

## Exemple complet

```json theme={null}
{
  "response_code": "00",
  "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZF9maW5hbmNlIjoiMTIzNTU4NDgxIiwic3RhcnRfZGF0ZSI6IjIwMjYtMDUtMTEgMTY6Mjc6MzUrMDAiLCJleHBpcnlfZGF0ZSI6MTc3ODYwMzI1NX0.FTaklFJy5DmovqVuwQz6avjNpJuzoh-XehziELBrh84",
  "response_text": "",
  "status": "completed",
  "custom_data": [],
  "operator_id": 12,
  "operator_name": "MOOV AFRICA BURKINA",
  "url": "https://monapp.com/api/callback/ligdicash",
  "url_method": "",
  "transaction_id": "502d36d2086249118198d06780b1c9fd",
  "external_id": "502d36d2086249118198d06780b1c9fd",
  "montant": "100",
  "amount": "100"
}
```

## Champs principaux

<ResponseField name="response_code" type="string">
  Code de résultat. `"00"` = succès. Toute autre valeur indique une erreur.
</ResponseField>

<ResponseField name="status" type="string">
  Statut du payout : `"completed"`, `"pending"` ou `"notcompleted"`. Basez votre logique métier sur ce champ — voir [Codes de réponse et statuts](/concepts/codes-reponse-statuts).
</ResponseField>

<ResponseField name="token" type="string">
  Jeton JWT lié à ce callback payout. **Ne vous y fiez pas** pour identifier la transaction — utilisez le token stocké à la création du payout pour appeler [Vérifier le statut](/api-paiement/payout/verifier-statut).
</ResponseField>

<ResponseField name="amount" type="string">
  Montant du payout en XOF, encodé en **chaîne de caractères** (ex : `"100"`).
</ResponseField>

<ResponseField name="montant" type="string">
  Identique à `amount`. Les deux champs coexistent dans toutes les réponses LigdiCash.
</ResponseField>

<ResponseField name="transaction_id" type="string">
  Identifiant racine du payout. Égal à l'`external_id` que vous avez fourni à la création — utilisez-le pour rapprocher le callback de votre transaction métier.
</ResponseField>

<ResponseField name="external_id" type="string">
  Identifiant fourni par le marchand à la création du payout. Reflète la valeur que vous avez passée dans le corps de la requête `/withdrawal/create` ou `/straight/payout`.
</ResponseField>

<ResponseField name="operator_id" type="integer">
  Identifiant numérique de l'opérateur destinataire du payout (ex : `12` pour Moov Africa Burkina).
</ResponseField>

<ResponseField name="operator_name" type="string">
  Nom de l'opérateur destinataire (ex : `"MOOV AFRICA BURKINA"`). Pour un payout vers wallet LigdiCash, ce champ est préfixé par `"LigdiCash "` (ex : `"LigdiCash ORANGE BURKINA"`).
</ResponseField>

<ResponseField name="url" type="string">
  URL de votre `callback_url` qui reçoit ce payload. LigdiCash y inscrit l'URL de destination — utile pour les diagnostics.
</ResponseField>

<ResponseField name="url_method" type="string">
  Méthode HTTP utilisée pour la livraison du callback. Généralement vide.
</ResponseField>

<ResponseField name="response_text" type="string">
  Libellé textuel du résultat. Vide en cas de succès.
</ResponseField>

<ResponseField name="custom_data" type="array">
  Données personnalisées du payout. Souvent vide (`[]`) — voir la section suivante. Si peuplé, suit la même structure que dans le payin : tableau d'objets `{ keyof_customdata, valueof_customdata, datecreation_customdata }`.
</ResponseField>

## Le champ custom\_data en payout

Contrairement au payin, le `custom_data` du payout est **souvent vide** (`[]`). Vous ne devez donc pas vous appuyer dessus pour rapprocher le callback de votre transaction métier — utilisez `transaction_id` ou `external_id` à la racine du payload.

<Note>
  Si vous avez fourni un `custom_data` à la création du payout, il sera renvoyé sous la forme d'un tableau peuplé d'objets `{ keyof_customdata, valueof_customdata, datecreation_customdata }`, exactement comme pour le payin. Voir [Parser custom\_data](/api-paiement/callback/parser-custom-data).
</Note>

## Différences avec le payload payin

| Champ                                                     | Payin                                         | Payout                     |
| --------------------------------------------------------- | --------------------------------------------- | -------------------------- |
| `token`                                                   | Toujours vide (`""`)                          | **Rempli** (JWT du payout) |
| `amount` / `montant`                                      | Entier (`4200`)                               | **Chaîne** (`"100"`)       |
| `operator_id`                                             | Chaîne (`"11"`)                               | **Entier** (`12`)          |
| `customer`                                                | Numéro du payeur                              | **Absent**                 |
| `customer_details`                                        | Renseigné (firstname, lastname, email, phone) | **Absent**                 |
| `custom_data`                                             | Tableau peuplé (vos champs + LigdiCash)       | Souvent vide (`[]`)        |
| `transaction_id` à la racine                              | Concaténation des `valueof_customdata`        | Égal à `external_id`       |
| `date`, `wiki`, `request_id`, `oreference`, `description` | Présents                                      | **Absents**                |
| `url`, `url_method`                                       | Absents                                       | **Présents**               |

<Warning>
  Le format des champs `amount`, `montant` et `operator_id` diffère entre payin et payout. Si vous parsez le payload avec un schéma typé, prévoyez ces différences ou caster les valeurs côté serveur.
</Warning>

## Statuts possibles

| `status`       | Signification               | Action recommandée                                                   |
| -------------- | --------------------------- | -------------------------------------------------------------------- |
| `completed`    | Payout finalisé avec succès | Confirmer côté métier, notifier l'utilisateur                        |
| `pending`      | Traitement en cours         | Patienter, attendre un nouveau callback ou interroger `confirm`      |
| `notcompleted` | Payout échoué               | Consulter la réponse `confirm` pour le détail, notifier le demandeur |

## Pages associées

* [Payload Payin](/api-paiement/callback/payload-payin) — anatomie complète du payload payin
* [Parser custom\_data](/api-paiement/callback/parser-custom-data) — gérer le tableau quand il est peuplé
* [Sécurisation du callback](/api-paiement/callback/securisation) — re-vérification avec `confirm`
* [Vérifier le statut payout](/api-paiement/payout/verifier-statut) — endpoint de re-vérification
