insufficient_credits adalah kode error HTTP 403 pada Se-Hari API. Operasi ini membutuhkan lebih banyak kredit daripada yang tersisa di akun Anda. Tidak ada yang dikerjakan dan tidak ada yang terpotong — pemeriksaan terjadi sebelum eksekusi.
#Bentuk responsnya
Semua error Se-Hari memakai amplop yang sama. Yang perlu dicabang di kode Anda adalah code, bukan message — teks pesan bisa kami perbaiki sewaktu-waktu, sedangkan code adalah kontrak publik yang hanya berubah lewat versi API baru.
{
"error": {
"code": "insufficient_credits",
"message": "Contoh pesan untuk insufficient_credits.",
"docs_url": "https://se-hari.com/docs/error/insufficient-credits",
"request_id": "req_a1b2c3d4e5f6",
"details": {
"required": 4,
"available": 2
}
}
}#Kapan ini muncul
Ini bukan kegagalan teknis, melainkan kondisi bisnis yang normal — dan workflow yang memperlakukannya sebagai bug akan berperilaku buruk. Retry otomatis tidak akan pernah menyelesaikannya, karena tidak ada yang berubah di antara dua percobaan kecuali kuota rate limit Anda yang menipis. Yang dibutuhkan adalah manusia yang melakukan top up.
#Kenapa ini terjadi
- Saldo memang habis
- Kredit hangus sebelum sempat dipakai; kredit punya masa berlaku dan dipotong dari yang paling cepat hangus lebih dulu
- Proses lain memakai kredit di antara estimasi dan eksekusi Anda
- Meeting dengan rekaman membutuhkan lebih banyak kredit daripada tanpa rekaman
#Cara memperbaikinya
Panggil POST /credits/estimate sebelum operasi yang memakai kredit, dan tangani kode ini sebagai kondisi normal dalam workflow — bukan sebagai kegagalan yang perlu di-retry. Retry tanpa top up akan menghasilkan error yang sama persis, berulang kali, sampai kuota rate limit Anda habis juga.
#Yang memicu error
# Langsung membuat tanpa memeriksa
curl -X POST "https://se-hari.com/api/v1/meetings" \
-H "Authorization: Bearer $SEHARI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"Rapat","date":"2026-09-01","start_time":"09:00","pricing_tier_id":"..."}'#Yang seharusnya
# Periksa dulu
curl -X POST "https://se-hari.com/api/v1/credits/estimate" \
-H "Authorization: Bearer $SEHARI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"type":"meeting","pricing_tier_id":"...","with_recording":true}'
# {"credits_required":4,"credits_available":2,"sufficient":false,...}#Aman diulang?
Percuma sampai ada top up. Ini kondisi bisnis, bukan gangguan teknis. Retry otomatis akan gagal identik setiap kali sambil menghabiskan kuota rate limit Anda. Hentikan antrean dan beri tahu manusia.
#Jangan tertukar dengan
Jangan tertukar dengan credit_cap_exceeded. Kode ini berarti saldo akun Anda memang habis; kode itu berarti saldo masih ada tapi API key yang dipakai sudah menyentuh batas harian yang Anda pasang sendiri. Yang pertama butuh top up, yang kedua cukup menaikkan angka di dashboard.
#Mencegahnya terulang
Rancang workflow Anda supaya berhenti dengan anggun. Pola yang baik: periksa saldo di awal pekerjaan besar, kirim notifikasi ketika saldo di bawah ambang tertentu, dan pada saat menemui kode ini, hentikan sisa antrean alih-alih mencoba satu per satu sampai semuanya gagal. Event webhook credit.low ada justru untuk memberi tahu Anda sebelum titik ini tercapai.
#Menangani ini di kode
Cabangkan pada error.code, dan bedakan kegagalan yang layak diulang dari yang tidak. Mengulang kegagalan yang tidak akan pernah berhasil hanya menghabiskan kuota rate limit — dan menyembunyikan kegagalan yang sebenarnya butuh perhatian Anda.
const res = await fetch('https://se-hari.com/api/v1/me', {
headers: { Authorization: `Bearer ${process.env.SEHARI_API_KEY}` }
});
if (!res.ok) {
const { error } = await res.json();
if (error.code === 'insufficient_credits') {
// Panggil `POST /credits/estimate` sebelum operasi yang memakai kredit, dan tangani kode…
console.error(error.message, error.details);
}
// request_id adalah satu-satunya cara kami menemukan request ini di log.
console.error(`request_id: ${error.request_id}`);
}#Selanjutnya
- Semua kode error — daftar lengkap
- Autentikasi — scope dan siklus hidup API key
- Referensi API — error apa saja yang mungkin muncul di tiap endpoint