> ## Documentation Index
> Fetch the complete documentation index at: https://docs.eat-now.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Erreurs et limites

> Diagnostiquer les réponses et reprendre sans créer de doublon.

## Format des erreurs

Les handlers métier retournent l’enveloppe suivante. Exemple de validation :

```json theme={null}
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Request validation failed",
    "request_id": "d68fef44-5121-4a97-9d61-a3b4631d465f",
    "details": {
      "issues": [{ "path": "party_size", "message": "Invalid value" }]
    }
  }
}
```

`details` dépend de l’erreur et peut être absent. Conservez `request_id`, la
route, le statut HTTP et l’heure pour le support, sans jeton ni données client
inutiles. Une erreur avant le handler, notamment `429`, peut avoir un autre
format et ne pas fournir de `request_id`. Vérifiez le statut HTTP avant de lire
le JSON.

| HTTP  | Code courant                                       | Action / sens                                                          |
| ----- | -------------------------------------------------- | ---------------------------------------------------------------------- |
| `400` | `VALIDATION_ERROR`                                 | JSON, type ou champ invalide ; consulter details.                      |
| `401` | `AUTHENTICATION_REQUIRED / INVALID_AUTHENTICATION` | Vérifier jeton complet, expiration, révocation et fonctionnalité API.  |
| `403` | `INSUFFICIENT_SCOPE / RESTAURANT_SUSPENDED`        | Scope manquant, ou création refusée pour un restaurant suspendu.       |
| `404` | `RESOURCE_NOT_FOUND`                               | Ressource absente ou hors du restaurant.                               |
| `409` | `RESOURCE_CONFLICT`                                | external\_id en doublon ou verrouillage de service POS.                |
| `422` | `VALIDATION_ERROR`                                 | Créneau indisponible ou autre règle métier non respectée.              |
| `429` | `—`                                                | Limite de débit ; espacer les tentatives.                              |
| `500` | `INTERNAL_ERROR`                                   | Erreur inattendue ; conserver request\_id pour le support.             |
| `502` | `INTERNAL_ERROR`                                   | Échec d’envoi après appel manqué ; lire la réponse avant de réessayer. |

Une vérification de créneau négative renvoie `200` avec `data.available: false`.
À la création, un créneau non réservable produit `422`, pas `409`. Un appel
manqué traité avec `201` et un résultat `SKIPPED_*` n’est pas une erreur.

## Débit et reprise

La règle des routes partenaires est configurée à **600 requêtes par minute par
IP cliente**, sans quota par clé. Lorsque présents, les en-têtes sont
`x-ratelimit-limit`, `x-ratelimit-remaining` et `x-ratelimit-reset` ; ce dernier
contient un instant Unix en **millisecondes**. Ils ne sont pas garantis sur
chaque réponse. En cas de `429`, réduisez la cadence et espacez les nouvelles
tentatives.

Ne répétez pas une écriture à l’aveugle après un timeout ou une erreur serveur :
elle peut avoir été enregistrée. Pour une réservation, utilisez la recherche par
`external_id` décrite dans le [parcours](/fr/api-reference/booking-flow). Pour
un appel manqué, réutilisez `external_call_id` et consultez les résultats de
l’endpoint. Les délais et reprises des webhooks ont un
[contrat distinct](/fr/api-reference/webhooks#livraison-et-reprises).

Pour un appel manqué en échec, une ligne déjà enregistrée peut faire retourner
`SKIPPED_DUPLICATE` à la reprise avec le même `external_call_id`, sans relancer
l’envoi WhatsApp. Contactez le support pour vérifier cet échec ; ne changez pas
l’identifiant pour forcer un nouvel envoi. `SENT` signifie que la tâche WhatsApp
a été programmée, pas que le client a reçu le message.
