Error
Semua error memakai envelope yang sama. Selalu cabangkan berdasarkan code, bukan teks message.
{
"error": {
"code": "QUOTA_EXCEEDED",
"message": "quota exceeded",
"meta": { "limit": 200000, "used": 200000, "reserved": 0 }
}
} Kode umum
| HTTP | Code | Arti / tindakan |
|---|---|---|
| 400 | INVALID_REQUEST | Body/field tidak valid. Perbaiki request; jangan retry. |
| 401 | INVALID_CREDENTIALS | API key salah atau dicabut. |
| 402 | SUBSCRIPTION_EXPIRED | Perpanjang langganan. |
| 403 | PHONE_NOT_OWNED | phone_number_id bukan milik tenant. |
| 403 | ADDON_NOT_ENABLED | Broadcast lewat API belum aktif untuk tenant ini. |
| 403 | MESSAGING_LIMIT_EXCEEDED | Batas tier Meta 24 jam; kurangi penerima atau tunggu. |
| 409 | IDEMPOTENCY_CONFLICT | Idempotency key dipakai untuk request berbeda. |
| 429 | RATE_LIMITED | Backoff dan retry setelah Retry-After. |
| 502 | META_UNAVAILABLE | Gangguan di Meta; retry dengan backoff. |
Retry yang aman
- Retry
429,502, dan timeout dengan exponential backoff + jitter. - Jangan retry
400,401, atau403tanpa memperbaiki request. - Selalu kirim
Idempotency-Keyyang sama saat retry pengiriman yang sama. - Gunakan webhook atau polling status untuk hasil akhir.
meta hanya berisi konteks aman seperti hitungan, tier, atau URL upgrade. Tidak pernah berisi token, secret, atau nomor lengkap.
