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

# Vérifier le statut

> Comment et quand appeler l'endpoint confirm après un payin sans redirection. Stratégies de polling selon le mode de validation.

L'endpoint `confirm` est identique à celui du payin avec redirection. La différence est dans **le moment où vous l'appelez** : sans redirection, il n'y a pas de `return_url` pour déclencher une vérification depuis le frontend. Vous devez attendre le callback — c'est lui qui signale la fin du traitement côté opérateur.

```
GET https://app.ligdicash.com/pay/v01/redirect/checkout-invoice/confirm?token={TOKEN}
```

Pour la référence complète (headers, champs de réponse, payloads réels), consultez [Vérifier le statut — payin avec redirection](/api-paiement/payin-redirect/verifier-statut).

## Quand appeler `confirm`

**Toujours à la réception du callback.** Quel que soit le mode de validation, la confirmation de l'opérateur peut prendre un temps variable — quelques secondes à plusieurs minutes, même quand le client a déjà saisi son OTP. Le callback est le seul signal fiable indiquant que l'opérateur a traité la transaction.

Appelez `confirm` depuis votre handler de callback, avec le token stocké à la création, avant d'honorer la commande.

<Warning>
  Appelez toujours `confirm` avec le **token stocké à la création**, pas celui reçu dans le callback. Les deux tokens permettent d'appeler l'endpoint, mais seul le token de création vous permet de faire la réconciliation avec votre commande.
</Warning>

## Exemple de requête

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET "https://app.ligdicash.com/pay/v01/redirect/checkout-invoice/confirm?token={TOKEN}" \
    -H "Apikey: {API_KEY}" \
    -H "Authorization: Bearer {API_TOKEN}" \
    -H "Accept: application/json"
  ```

  ```javascript Node.js theme={null}
  const response = await fetch(
    `https://app.ligdicash.com/pay/v01/redirect/checkout-invoice/confirm?token=${token}`,
    {
      method: "GET",
      headers: {
        Apikey: process.env.LIGDICASH_API_KEY,
        Authorization: `Bearer ${process.env.LIGDICASH_API_TOKEN}`,
        Accept: "application/json",
      },
    }
  );

  const data = await response.json();
  ```

  ```php PHP theme={null}
  $ch = curl_init(
    "https://app.ligdicash.com/pay/v01/redirect/checkout-invoice/confirm?token=" . urlencode($token)
  );
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "Apikey: " . $_ENV["LIGDICASH_API_KEY"],
    "Authorization: Bearer " . $_ENV["LIGDICASH_API_TOKEN"],
    "Accept: application/json",
  ]);

  $data = json_decode(curl_exec($ch), true);
  curl_close($ch);
  ```
</CodeGroup>

## Valeurs de `status`

| `status`       | Signification                          | Action recommandée                           |
| -------------- | -------------------------------------- | -------------------------------------------- |
| `completed`    | Paiement confirmé                      | Honorer la commande                          |
| `pending`      | En attente de validation par le client | Continuer le polling ou attendre le callback |
| `notcompleted` | Paiement non abouti                    | Proposer de réessayer                        |

## Polling — filet de sécurité uniquement

Si le callback tarde ou n'est pas disponible dans votre environnement, vous pouvez interroger `confirm` à intervalles réguliers. Le statut sera `pending` tant que l'opérateur n'a pas finalisé la transaction :

```javascript JavaScript theme={null}
async function attendreConfirmation(token, { intervalle = 4000, maxTentatives = 15 } = {}) {
  for (let i = 0; i < maxTentatives; i++) {
    const res = await fetch(
      `https://app.ligdicash.com/pay/v01/redirect/checkout-invoice/confirm?token=${token}`,
      {
        headers: {
          Apikey: process.env.LIGDICASH_API_KEY,
          Authorization: `Bearer ${process.env.LIGDICASH_API_TOKEN}`,
          Accept: "application/json",
        },
      }
    );
    const data = await res.json();

    if (data.status === "completed") return { success: true, data };
    if (data.status === "notcompleted") return { success: false, data };

    await new Promise((r) => setTimeout(r, intervalle));
  }
  return { success: false, reason: "timeout" };
}
```

<Note>
  Le polling est un filet de sécurité, pas un remplacement du callback. Basez toujours votre logique métier sur le callback. Consultez [Polling vs callback](/api-paiement/verification-statut/polling-vs-callback) pour les arbitrages.
</Note>

## Pages associées

* [Vérifier le statut — référence complète](/api-paiement/payin-redirect/verifier-statut) — champs de réponse détaillés et payloads réels
* [Modes de validation](/api-paiement/payin-sans-redirect/modes-validation) — quand le statut devient `pending`
* [Callback — sécurisation](/api-paiement/callback/securisation) — pourquoi toujours re-vérifier avec `confirm`
* [Polling vs callback](/api-paiement/verification-statut/polling-vs-callback) — choisir la bonne stratégie
