Erreurs et limites
Forme d'une erreur
{
"success": false,
"request_id": "req_e097717d1d433831",
"error": {
"code": "recipient_not_opted_in",
"message": "Le destinataire n'a pas encore accepté de recevoir vos messages.",
"type": "invalid_request",
"param": "to",
"upstream": { "provider": "meta", "code": 131047 },
"doc_url": "https://www.fiitsa.com/api-docs/erreurs"
}
}
Branche ton code sur code, jamais sur message. Le code est stable et documenté ; le message peut être reformulé ou traduit.
Quand WhatsApp refuse, upstream.code porte le code d'erreur de Meta, que tu peux consulter dans leur documentation.
Codes
| Code | HTTP | Signification |
|---|---|---|
missing_api_key | 401 | Aucune clé fournie |
invalid_api_key | 401 | Clé inconnue ou révoquée |
insufficient_scope | 403 | La clé n'a pas la portée requise |
plan_required | 403 | La formule n'inclut pas l'accès API |
whatsapp_not_connected | 403 | Aucun numéro relié à la boutique |
unsupported_field | 400 | Champ non reconnu ou interdit |
missing_parameter | 400 | Paramètre requis absent |
unknown_route | 404 | Route inexistante |
method_not_allowed | 405 | Route connue, verbe incorrect |
meta_rejected | 422 | WhatsApp a refusé |
rate_limited | 429 | Débit dépassé |
upstream_unavailable | 503 | Indisponibilité passagère |
gateway_timeout | 504 | Pas de réponse dans le délai |
Limitation de débit
60 requêtes par tranche de 10 secondes en rafale, 600 par minute en soutenu.
Chaque réponse porte X-RateLimit-Limit, X-RateLimit-Remaining et X-RateLimit-Reset. Sur un 429, respecte l'en-tête Retry-After.
Ces limites protègent d'une boucle accidentelle. Le nombre de messages, lui, n'est pas plafonné.
Support
Chaque réponse porte X-Fiitsa-Request-Id, également présent dans le corps sous request_id. Communique-le : c'est ce qui permet de retrouver l'appel exact, avec son contexte interne.