---
title: insufficient_credits — Kredit tidak cukup
source: https://se-hari.com/docs/error/insufficient-credits
updated: 2026-08-15T22:09:53.945007+00:00
---

> HTTP 403. Operasi ini membutuhkan lebih banyak kredit daripada yang tersisa di akun Anda. Tidak ada yang dikerjakan dan tidak ada yang terpotong —…

`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.

```json
{
  "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

```bash
# 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

```bash
# 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.

```javascript
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](/docs/error) — daftar lengkap
- [Autentikasi](/docs/autentikasi) — scope dan siklus hidup API key
- [Referensi API](/docs/api) — error apa saja yang mungkin muncul di tiap endpoint