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#

CodeHTTPSignificationRéessayer ?
validation_error400Un champ est invalide ou manquant ; details le liste.Non, corrigez d'abord.
unauthorized401Clé ou session absente, invalide, expirée ou révoquée.Non, vérifiez le jeton.
quota_exceeded402Le quota mensuel de votre plan est atteint (production).Non, changez de plan ou attendez le mois suivant.
plan_limit_reached402Le plan n'autorise pas plus d'entreprises connectées, ni plus de numéros pour cette entreprise.Non : changez de plan.
forbidden403La clé n'a pas la portée requise ; le message la nomme.Non, créez une clé avec la bonne portée.
sandbox_only403Action réservée aux clés de bac à sable.Non.
not_found404La ressource n'existe pas, ou appartient à un autre compte ou environnement.Non.
conflict409Doublon (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_message422Message invalide : numéro mal formé, texte vide, média ambigu, lien non https…Non.
outside_service_window422Message libre hors de la fenêtre de 24 heures.Non : envoyez un template, ou attendez que le client écrive.
template_not_approved422Le template n'est pas approuvé par Meta.Non, attendez l'approbation.
idempotency_conflict422Même Idempotency-Key pour une requête différente.Non : utilisez une autre clé.
meta_error502Meta 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_error500Erreur de notre côté.Oui, puis contactez le support avec le requestId.

Exemples réels#

400 — validation_error#

Erreur réelle · HTTP 400
{
  "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#

Erreur réelle · HTTP 401
{
  "error": {
    "code": "unauthorized",
    "message": "Clé API requise (Authorization: Bearer pk_…)",
    "requestId": "req_1c1b9300-f2d4-4387-88b8-7d66222d7497"
  }
}

403 — forbidden#

Erreur réelle · HTTP 403
{
  "error": {
    "code": "forbidden",
    "message": "Portée manquante sur cette clé : connections:read",
    "requestId": "req_5acc8bd1-f598-4030-8ccd-6eb02dcfadc8"
  }
}

404 — not_found#

Erreur réelle · HTTP 404
{
  "error": {
    "code": "not_found",
    "message": "Message introuvable",
    "requestId": "req_9b02107e-cfba-4b78-81c0-a0fd32068164"
  }
}

409 — conflict#

Erreur réelle · HTTP 409
{
  "error": {
    "code": "conflict",
    "message": "Une application porte déjà ce nom",
    "requestId": "req_f4a2e5dd-8d8c-4e03-881a-024492da7967"
  }
}

422 — outside_service_window#

Erreur réelle · HTTP 422
{
  "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#

Erreur réelle · HTTP 422
{
  "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#

Erreur réelle · HTTP 422
{
  "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.

SituationReprise automatique ?
Panne de Meta, délai dépassé, limite de débitOui, 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.