Errores
Todas las respuestas de error usan el mismo envelope. El request_id también viaja en la cabecera X-Request-Id — inclúyelo al reportar un problema.
{
"error": {
"code": "invalid_request",
"message": "text.body no puede estar vacío",
"request_id": "dev_..."
}
}Códigos
| Código | HTTP | Cuándo |
|---|---|---|
| missing_api_key | 401 | Falta la cabecera Authorization: Bearer. |
| invalid_api_key | 401 | API key inexistente o revocada. |
| invalid_request | 400 | Cuerpo/cabecera inválidos (JSON, Idempotency-Key, campos). |
| invalid_whatsapp_number | 400 | whatsappNumberId no existe en tu workspace. |
| forbidden | 403 | La API key no tiene permiso para la operación. |
| not_found | 404 | El recurso (mensaje/número) no existe en tu workspace. |
| idempotency_conflict | 409 | Misma Idempotency-Key con un payload distinto. |
| rate_limit_exceeded | 429 | Superaste el límite de tasa. Reintenta según Retry-After. |
| monthly_message_limit_exceeded | 429 | Cuota mensual de mensajes del plan agotada. |
| internal_error | 500 | Error interno. Reporta el request_id si persiste. |
Los mensajes (message) son legibles pero pueden cambiar; programa contra code y el status HTTP, nunca contra el texto.