Error Handling

Semua error API menggunakan format JSON konsisten:

{ "detail": "Suara yang dipilih tidak ditemukan." }

detail selalu berupa pesan ramah-user dalam Bahasa Indonesia / English (mengikuti locale). Tidak ada stack trace atau jargon teknis yang ditampilkan ke client.

Status code

Code Arti Contoh pesan
400 Permintaan tidak valid "Audio rekaman kosong, coba rekam ulang."
401 Tidak/invalid auth "API key tidak valid."
404 Resource tidak ditemukan "Suara yang dipilih tidak ditemukan."
429 Rate limit terlampaui "Permintaan terlalu sering, coba lagi sebentar."
502 Provider AI gagal "Terjadi kendala sementara, coba lagi nanti."
500 Bug di sisi Vonip "Terjadi kendala sementara, coba lagi nanti."

Retry guidance

  • 429 → backoff exponential (1s, 2s, 4s…).
  • 502 / 503 → retry hingga 3x, jeda 2 detik.
  • 400 / 404jangan retry — perbaiki request.

Pola yang direkomendasikan

async function ttsWithRetry(text: string, voice: string, attempt = 0): Promise<string> {
  try {
    const r = await Vonip.tts(text, voice);
    return r.audioUrl;
  } catch (e: any) {
    if (attempt < 3 && /coba lagi|kendala sementara/i.test(e.message)) {
      await new Promise(r => setTimeout(r, 2 ** attempt * 1000));
      return ttsWithRetry(text, voice, attempt + 1);
    }
    throw e;
  }
}