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/404→ jangan 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;
}
}