Ressources
Codes d'erreur
Tous les codes d'erreur de l'API, leur signification, et s'il est utile de réessayer.
Mis à jour le 12 novembre 2026Voir en Markdown
Toute erreur a la forme { "error": { "code", "message", "details?", "requestId" } }. Basez votre code sur code, jamais sur le texte de message. Conservez le requestId : c'est ce qui permet de retrouver l'appel.
Table des codes#
| Code | HTTP | Signification | Réessayer ? |
|---|---|---|---|
validation_error | 400 | Un champ est invalide ou manquant ; details le liste. | Non, corrigez d'abord. |
unauthorized | 401 | Clé ou session absente, invalide, expirée ou révoquée. | Non, vérifiez le jeton. |
quota_exceeded | 402 | Le quota mensuel de votre plan est atteint (production). | Non, changez de plan ou attendez le mois suivant. |
plan_limit_reached | 402 | Le plan n'autorise pas plus d'entreprises connectées, ni plus de numéros pour cette entreprise. | Non : changez de plan. |
forbidden | 403 | La clé n'a pas la portée requise ; le message la nomme. | Non, créez une clé avec la bonne portée. |
sandbox_only | 403 | Action réservée aux clés de bac à sable. | Non. |
not_found | 404 | La ressource n'existe pas, ou appartient à un autre compte ou environnement. | Non. |
conflict | 409 | Doublon (nom, référence externe, compte WhatsApp déjà connecté…) ou action impossible dans l'état actuel (livraison en cours, destination désactivée). | Selon le cas. |
invalid_message | 422 | Message invalide : numéro mal formé, texte vide, média ambigu, lien non https… | Non. |
outside_service_window | 422 | Message libre hors de la fenêtre de 24 heures. | Non : envoyez un template, ou attendez que le client écrive. |
template_not_approved | 422 | Le template n'est pas approuvé par Meta. | Non, attendez l'approbation. |
idempotency_conflict | 422 | Même Idempotency-Key pour une requête différente. | Non : utilisez une autre clé. |
meta_error | 502 | Meta a refusé la requête ou ne répond pas ; le message reprend sa réponse. | Oui si c'est une panne, non si c'est un refus. |
internal_error | 500 | Erreur de notre côté. | Oui, puis contactez le support avec le requestId. |
Exemples réels#
400 — validation_error#
{
"error": {
"code": "validation_error",
"message": "Requête invalide : voir details",
"details": [
"accountName must be longer than or equal to 2 characters",
"email must be an email"
],
"requestId": "req_9333db71-3a23-4154-8cd4-3dfc99f1001a"
}
}details indique le champ et la règle enfreinte.
401 — unauthorized#
{
"error": {
"code": "unauthorized",
"message": "Clé API requise (Authorization: Bearer pk_…)",
"requestId": "req_1c1b9300-f2d4-4387-88b8-7d66222d7497"
}
}403 — forbidden#
{
"error": {
"code": "forbidden",
"message": "Portée manquante sur cette clé : connections:read",
"requestId": "req_5acc8bd1-f598-4030-8ccd-6eb02dcfadc8"
}
}404 — not_found#
{
"error": {
"code": "not_found",
"message": "Message introuvable",
"requestId": "req_9b02107e-cfba-4b78-81c0-a0fd32068164"
}
}409 — conflict#
{
"error": {
"code": "conflict",
"message": "Une application porte déjà ce nom",
"requestId": "req_f4a2e5dd-8d8c-4e03-881a-024492da7967"
}
}422 — outside_service_window#
{
"error": {
"code": "outside_service_window",
"message": "Ce correspondant ne vous a pas écrit depuis 24 h : seul un template approuvé peut lui être envoyé",
"requestId": "req_4fdba006-98d4-4164-893d-98389fb54c62"
}
}422 — invalid_message#
{
"error": {
"code": "invalid_message",
"message": "Numéro destinataire invalide : utilisez le format international avec « + », ex. +237600000000",
"requestId": "req_72871759-6841-4dcf-8065-3425c4a44633"
}
}422 — idempotency_conflict#
{
"error": {
"code": "idempotency_conflict",
"message": "Cette clé d'idempotence a déjà servi pour une requête différente",
"requestId": "req_af73c415-1365-41e6-801f-5fc18b1ee2ec"
}
}Erreurs de livraison d'un message#
Une fois le message accepté (202), les échecs ne se voient plus dans une réponse HTTP : le message passe en failed, avec un error qui reprend le code et le message de Meta, et un événement message.failed est envoyé à vos webhooks.
| Situation | Reprise automatique ? |
|---|---|
| Panne de Meta, délai dépassé, limite de débit | Oui, jusqu'à 6 tentatives avec attente croissante |
| Refus définitif (template introuvable, destinataire non joignable, contenu refusé) | Non : failed immédiatement |
Les codes numériques qui apparaissent dans error.code sont ceux de Meta : consultez sa documentation pour leur sens exact.