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

# Payload anatomy — Payout

> Detailed view of the payload received on a payout callback: structure, fields, and differences with the payin payload.

On a payout (money going out to a customer wallet or a mobile money account), LigdiCash sends two POST requests to your `callback_url` — one in `application/json`, one in `application/x-www-form-urlencoded`. Both contain the same data. This page details the JSON structure and the differences with the [payin payload](/en/payment-api/callback/payin-payload).

## Full example

```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://myapp.com/api/callback/ligdicash",
  "url_method": "",
  "transaction_id": "502d36d2086249118198d06780b1c9fd",
  "external_id": "502d36d2086249118198d06780b1c9fd",
  "montant": "100",
  "amount": "100"
}
```

## Main fields

<ResponseField name="response_code" type="string">
  Result code. `"00"` = success. Any other value indicates an error.
</ResponseField>

<ResponseField name="status" type="string">
  Payout status: `"completed"`, `"pending"`, or `"notcompleted"`. Base your business logic on this field — see [Response codes and statuses](/en/concepts/response-codes-and-statuses).
</ResponseField>

<ResponseField name="token" type="string">
  JWT token linked to this payout callback. **Do not rely on it** to identify the transaction — use the token stored at payout creation to call [Verify the status](/en/payment-api/payout/verify-status).
</ResponseField>

<ResponseField name="amount" type="string">
  Payout amount in XOF, encoded as a **string** (e.g. `"100"`).
</ResponseField>

<ResponseField name="montant" type="string">
  Same as `amount`. Both fields coexist in all LigdiCash responses.
</ResponseField>

<ResponseField name="transaction_id" type="string">
  Root identifier of the payout. Equal to the `external_id` you provided at creation — use it to match the callback with your business transaction.
</ResponseField>

<ResponseField name="external_id" type="string">
  Identifier provided by the merchant when creating the payout. Reflects the value you passed in the body of the `/withdrawal/create` or `/straight/payout` request.
</ResponseField>

<ResponseField name="operator_id" type="integer">
  Numeric identifier of the recipient operator (e.g. `12` for Moov Africa Burkina).
</ResponseField>

<ResponseField name="operator_name" type="string">
  Recipient operator name (e.g. `"MOOV AFRICA BURKINA"`). For a payout to a LigdiCash wallet, this field is prefixed with `"LigdiCash "` (e.g. `"LigdiCash ORANGE BURKINA"`).
</ResponseField>

<ResponseField name="url" type="string">
  URL of your `callback_url` receiving this payload. LigdiCash writes the destination URL here — useful for diagnostics.
</ResponseField>

<ResponseField name="url_method" type="string">
  HTTP method used to deliver the callback. Usually empty.
</ResponseField>

<ResponseField name="response_text" type="string">
  Textual label of the result. Empty on success.
</ResponseField>

<ResponseField name="custom_data" type="array">
  Custom data for the payout. Often empty (`[]`) — see the next section. If populated, follows the same structure as in the payin: array of `{ keyof_customdata, valueof_customdata, datecreation_customdata }` objects.
</ResponseField>

## The custom\_data field in payout

Unlike payin, the `custom_data` of a payout is **often empty** (`[]`). You should therefore not rely on it to match the callback with your business transaction — use `transaction_id` or `external_id` at the root of the payload.

<Note>
  If you provided a `custom_data` when creating the payout, it will be returned as an array populated with `{ keyof_customdata, valueof_customdata, datecreation_customdata }` objects, exactly like in the payin. See [Parse custom\_data](/en/payment-api/callback/parse-custom-data).
</Note>

## Differences with the payin payload

| Field                                                     | Payin                                      | Payout                  |
| --------------------------------------------------------- | ------------------------------------------ | ----------------------- |
| `token`                                                   | Always empty (`""`)                        | **Filled** (payout JWT) |
| `amount` / `montant`                                      | Integer (`4200`)                           | **String** (`"100"`)    |
| `operator_id`                                             | String (`"11"`)                            | **Integer** (`12`)      |
| `customer`                                                | Payer's number                             | **Absent**              |
| `customer_details`                                        | Filled (firstname, lastname, email, phone) | **Absent**              |
| `custom_data`                                             | Populated array (your fields + LigdiCash)  | Often empty (`[]`)      |
| Root `transaction_id`                                     | Concatenation of `valueof_customdata`      | Equal to `external_id`  |
| `date`, `wiki`, `request_id`, `oreference`, `description` | Present                                    | **Absent**              |
| `url`, `url_method`                                       | Absent                                     | **Present**             |

<Warning>
  The format of the `amount`, `montant`, and `operator_id` fields differs between payin and payout. If you parse the payload with a typed schema, plan for these differences or cast the values server-side.
</Warning>

## Possible statuses

| `status`       | Meaning                       | Recommended action                                               |
| -------------- | ----------------------------- | ---------------------------------------------------------------- |
| `completed`    | Payout finalized successfully | Confirm on the business side, notify the user                    |
| `pending`      | Processing in progress        | Wait, expect a new callback, or query `confirm`                  |
| `notcompleted` | Payout failed                 | Consult the `confirm` response for details, notify the requester |

## Related pages

* [Payin payload](/en/payment-api/callback/payin-payload) — full anatomy of the payin payload
* [Parse custom\_data](/en/payment-api/callback/parse-custom-data) — handle the array when it is populated
* [Securing the callback](/en/payment-api/callback/security) — re-verification with `confirm`
* [Verify the payout status](/en/payment-api/payout/verify-status) — re-verification endpoint
