Skip to content

Errors

Semua kesalahan API Volara memakai amplop error JSON yang konsisten, sehingga client bisa menanganinya secara seragam.

Amplop error

json
{
  "error": {
    "code": "validation_error",
    "message": "Field 'to' wajib diisi.",
    "details": [
      { "field": "to", "issue": "required" }
    ]
  }
}
  • code — kode mesin yang stabil (snake_case) untuk percabangan logika.
  • message — pesan yang dapat dibaca manusia (Bahasa Indonesia/Inggris).
  • details — opsional; konteks tambahan (mis. error validasi per-field).

Kode status HTTP

StatusArtiTindakan
400Bad Request — payload/parameter tidak validPerbaiki request; baca details.
401Unauthorized — API key salah/tidak ada/dicabutPeriksa Autentikasi.
403Forbidden — kunci tidak punya scope/aksesCek scope kunci atau grant agency.
404Not Found — resource tidak ada di tenant iniVerifikasi id milik tenant Anda.
409Conflict — bentrok state/idempotencyCek state resource atau ulangi dengan idempotency-key baru.
422Unprocessable — validasi gagalBaca details.
429Too Many Requests — rate limitBackoff; lihat Rate Limits.
5xxServer errorRetry dengan backoff; jika berlanjut, hubungi dukungan.

Pola penanganan

Percabangkan logika pada error.code (stabil), bukan pada error.message (bisa berubah). Tampilkan message ke pengguna seperlunya.

Kode referensi klien VLR-*

Sebagian respons error menyertakan kode referensi VLR-* (mis. VLR-7F3A2C). Kode ini ditampilkan ke pengguna akhir saat terjadi kegagalan dan dipakai sebagai tautan ke detail kejadian di admin. Saat melapor ke dukungan, sertakan kode VLR-* agar tim dapat melacak kejadian persisnya tanpa membuka data sensitif.

Contoh penanganan

ts
const res = await fetch('https://api.volara.chat/api/v1/messages', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.VOLARA_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ channelId, to, type: 'text', text: 'Halo!' }),
})

if (!res.ok) {
  const { error } = await res.json()
  switch (error?.code) {
    case 'rate_limited':
      // tunggu lalu retry — lihat header RateLimit-Reset
      break
    case 'validation_error':
      console.error('Validasi:', error.details)
      break
    default:
      console.error(`[${res.status}] ${error?.message}`)
  }
}

Langkah selanjutnya