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

HTTPCodeArti / tindakan
400INVALID_REQUESTBody/field tidak valid. Perbaiki request; jangan retry.
401INVALID_CREDENTIALSAPI key salah atau dicabut.
402SUBSCRIPTION_EXPIREDPerpanjang langganan.
403PHONE_NOT_OWNEDphone_number_id bukan milik tenant.
403ADDON_NOT_ENABLEDBroadcast lewat API belum aktif untuk tenant ini.
403MESSAGING_LIMIT_EXCEEDEDBatas tier Meta 24 jam; kurangi penerima atau tunggu.
409IDEMPOTENCY_CONFLICTIdempotency key dipakai untuk request berbeda.
429RATE_LIMITEDBackoff dan retry setelah Retry-After.
502META_UNAVAILABLEGangguan di Meta; retry dengan backoff.

Retry yang aman

  • Retry 429, 502, dan timeout dengan exponential backoff + jitter.
  • Jangan retry 400, 401, atau 403 tanpa memperbaiki request.
  • Selalu kirim Idempotency-Key yang 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.