> ## 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 — Payin

> Detailed view of every field in the payload received on an inbound payment. Real example and field-by-field explanation.

On an inbound payment, 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.

## Full example

```json theme={null}
{
  "date": "2026-05-09 07:20:23+00",
  "wiki": "https://client.ligdicash.com/wiki/confirmInvoice",
  "token": "",
  "amount": 4200,
  "status": "completed",
  "montant": 4200,
  "customer": "22676275726",
  "oreference": "",
  "request_id": "P2777636082026",
  "custom_data": [
    {
      "keyof_customdata": "transaction_id",
      "valueof_customdata": "ART5A7044E5",
      "datecreation_customdata": "2026-05-09 07:20:23.362788"
    },
    {
      "keyof_customdata": "hash",
      "valueof_customdata": "f918c54d54cdc334ade09f8c228a224b1d3df646250c84dcdd99af528ddcd450",
      "datecreation_customdata": "2026-05-09 07:20:23.362788"
    },
    {
      "keyof_customdata": "logfile",
      "valueof_customdata": "2026050907202369fee03756652",
      "datecreation_customdata": "2026-05-09 07:20:23.362788"
    }
  ],
  "description": "",
  "external_id": "ART5A7044E5",
  "operator_id": "11",
  "operator_name": "ORANGE BURKINA",
  "response_code": "00",
  "response_text": "",
  "customer_details": {
    "email": "firstname.lastname@example.com",
    "phone": "22676275726",
    "details": "",
    "lastname": "LASTNAME",
    "firstname": "Firstname"
  }
}
```

## Main fields

<ResponseField name="date" type="string">
  Event timestamp in the format `YYYY-MM-DD HH:MM:SS+TZ`.
</ResponseField>

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

<ResponseField name="status" type="string">
  Transaction status: `"completed"`, `"pending"`, or `"notcompleted"`. Base your business logic on this field.
</ResponseField>

<ResponseField name="amount" type="integer">
  Transaction amount in XOF.
</ResponseField>

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

<ResponseField name="customer" type="string">
  Payer's phone number, with country code, no `+` or spaces.
</ResponseField>

<ResponseField name="request_id" type="string">
  Unique request identifier generated by LigdiCash. Use it for deduplication when `custom_data` is empty or unavailable.
</ResponseField>

<ResponseField name="external_id" type="string">
  Concatenation of the values of all `custom_data` fields whose key contains `"id"`. Can be reliable if you only have one field with `"id"` in the name — but parse `custom_data` directly for a guaranteed result.
</ResponseField>

<ResponseField name="token" type="string">
  Always empty (`""`). This field cannot be used for verification — use the token stored at transaction creation.
</ResponseField>

<ResponseField name="operator_id" type="string">
  Identifier of the operator that processed the payment (e.g. `"11"` for Orange Burkina).
</ResponseField>

<ResponseField name="operator_name" type="string">
  Operator name (e.g. `"ORANGE BURKINA"`).
</ResponseField>

<ResponseField name="description" type="string">
  Transaction description. Can be empty.
</ResponseField>

<ResponseField name="oreference" type="string">
  Operator reference. Can be empty.
</ResponseField>

<ResponseField name="response_text" type="string">
  Textual label of the result. Can be empty.
</ResponseField>

<ResponseField name="wiki" type="string">
  URL to the documentation of error codes for this endpoint. Consult when `response_code !== "00"`.
</ResponseField>

## The custom\_data array

<ResponseField name="custom_data" type="array">
  Array of custom data associated with the transaction. Contains your merchant fields **plus** the fields automatically added by LigdiCash.

  <Expandable title="Structure of an element">
    <ResponseField name="keyof_customdata" type="string">
      Key of the entry.
    </ResponseField>

    <ResponseField name="valueof_customdata" type="string">
      Value of the entry.
    </ResponseField>

    <ResponseField name="datecreation_customdata" type="string">
      Creation timestamp of the entry.
    </ResponseField>
  </Expandable>
</ResponseField>

LigdiCash systematically adds two entries to your `custom_data`:

| `keyof_customdata` | Origin    | Description                             |
| ------------------ | --------- | --------------------------------------- |
| `hash`             | LigdiCash | Transaction hash generated by LigdiCash |
| `logfile`          | LigdiCash | Internal LigdiCash log reference        |

Always filter on `keyof_customdata` to extract your own fields. See [Parse custom\_data](/en/payment-api/callback/parse-custom-data).

## Customer information

<ResponseField name="customer_details" type="object">
  Payer information when available.

  <Expandable title="Fields">
    <ResponseField name="firstname" type="string">First name.</ResponseField>
    <ResponseField name="lastname" type="string">Last name.</ResponseField>
    <ResponseField name="email" type="string">Email address.</ResponseField>
    <ResponseField name="phone" type="string">Phone number.</ResponseField>
    <ResponseField name="details" type="string">Additional information. Usually empty.</ResponseField>
  </Expandable>
</ResponseField>

## Related pages

* [Securing the callback](/en/payment-api/callback/security)
* [Parse custom\_data](/en/payment-api/callback/parse-custom-data)
* [Idempotency and deduplication](/en/payment-api/callback/idempotency)
