Lewati ke konten
kenari.

Error

kenari mengembalikan error dalam format yang sama dengan API yang kamu panggil. Tentukan penanganan error berdasarkan status HTTP dan code, atau error.type di Messages, bukan teks message. Sebagian besar pesan berbahasa Inggris dan beberapa berbahasa Indonesia, dan redaksinya bisa berubah.

Semua endpoint kecuali Messages mengembalikan body ini: Chat completions, Responses, Embeddings, Rerank, Moderasi, Gambar, audio, musik, video, OCR, pencarian web dan X, daftar model, dan kuota akun.

{
"error": {
"message": "free-model rate limit reached; slow down and retry",
"type": "rate_limit_exceeded",
"param": null,
"code": "free_quota_rpm"
}
}

Gunakan field code untuk menentukan penanganannya. type mengulang code pada sebagian besar error. Pengecualiannya adalah batas model gratis (type berisi rate_limit_exceeded), penolakan provider (type berisi invalid_request_error), shared_key_not_allowed, restricted_key_not_allowed, dan cli_login_key_required (type berisi permission_error), dan kegagalan internal pada GET /v1/account/balance, GET /v1/account/quota serta endpoint Pemakaian (type berisi api_error, code berisi internal_error). param selalu null, kecuali pada 400 dari endpoint Pemakaian, yang menyebut nama parameternya. API workspace mengisi type dari status HTTP, misalnya conflict_error untuk setiap 409.

Messages, termasuk count_tokens, mengembalikan error bergaya Anthropic. Tidak ada field code, jadi tentukan penanganan berdasarkan status HTTP dan error.type.

{
"type": "error",
"error": {
"type": "rate_limit_error",
"message": "free-model rate limit reached; slow down and retry"
}
}
error.typeStatus HTTP
invalid_request_error400, atau status milik provider untuk penolakan provider
not_found_error400, atau status milik provider untuk penolakan provider
payment_required402
permission_error403
rate_limit_error429
api_error400, 500, dan 503

Status HTTP-nya sama dengan format OpenAI untuk kegagalan yang sama. Penolakan provider mempertahankan status milik provider, jadi kedua tipe ini tidak selalu 400. Lihat Penolakan provider. api_error datang dengan status 400 kalau provider menjawab dengan error klien yang tidak diklasifikasikan kenari.

Passthrough Claude Managed Agents juga memakai amplop ini, dengan code pada error yang dibuat kenari sendiri, seperti auth_failed. Error dari Anthropic diteruskan tanpa perubahan dan tidak punya code. Tentukan penanganan berdasarkan code kalau ada, dan berdasarkan error.type kalau tidak ada.

Setelah stream dimulai, status HTTP sudah 200, jadi kegagalan datang sebagai event di dalam stream. Periksa setiap stream untuk event ini. Lihat Streaming.

Format APICara error datang
Chat completionsChunk data: berisi objek error yang type-nya upstream_error
MessagesEvent event: error dengan body Anthropic di atas
ResponsesEvent response.failed, dengan error di response.error

Di Chat completions dan Responses, code bernilai stream_interrupted kalau provider berhenti sebelum jawaban selesai. Event Messages punya error.type dan tidak punya code. Kirim ulang sebagai request baru. Penolakan provider di dalam stream memakai kode di bagian Penolakan provider.

Beberapa response berupa teks biasa, bukan JSON, karena request ditolak sebelum sampai ke API.

StatusBodyPenyebab
400Failed to parse the request body as JSON...Pada /v1/web/search dan /v1/ocr, body bukan JSON yang valid
401missing authorizationTidak ada header key
401invalid keyKey tidak diawali kn-, tidak ada, sudah dicabut, sudah kedaluwarsa, atau milik akun yang ditangguhkan atau sedang dihapus
408request body timed outBody berhenti datang selama 30 detik, atau butuh lebih dari 5 menit untuk datang. Kirim ulang
413request body too largeBody request lebih dari 32 MiB
415Expected request with Content-Type: application/jsonPada /v1/web/search dan /v1/ocr, header Content-Type: application/json tidak ada
422Failed to deserialize the JSON body...Pada /v1/web/search dan /v1/ocr, field wajib tidak ada atau bertipe salah
429too many requests, try again shortlySatu IP klien mengirim terlalu banyak request pada API key dibagikan. Lihat Batas laju.
500db errorkenari tidak bisa mencari key. Coba lagi.
503server busy, try again shortlykenari sedang menerima terlalu banyak body request besar sekaligus. Coba lagi sebentar lagi

Passthrough Claude Managed Agents menjawab dengan cara lain. Di sana, 401, 429 pada API key dibagikan, dan db error datang sebagai JSON dalam format Anthropic dengan kode auth_failed. Kegagalan lain di dalam kenari menghasilkan 500 dengan teks biasa internal error.

Untuk soal key, lihat Autentikasi & API key.

KodeKapanYang perlu dilakukan
bad_requestBody atau parameter tidak valid, atau pembatasan key menolak request (model tidak diizinkan, kemampuan tidak diberikan, rute pada key yang dibatasi). Dokumen terlampir dengan tipe tidak didukung, ukuran atau jumlah halaman di atas batas, atau panjang di atas konteks model juga ditolak di sini. Pada Embeddings, Rerank, Moderasi, dan System One, model yang tidak dikenal atau berjenis lain juga ditolak di sini, dan pesannya mendaftar id yang tersedia. Membuat key per tool ditolak di sini dengan key limit reached saat akunmu sudah mencapai batas keyBaca message, perbaiki request.
model_not_foundPada Chat completions, Responses, dan Messages, id model atau nama rute tidak ada, atau tidak bisa kamu pakai. Pada Embeddings, Rerank, Moderasi, dan System One, modelnya terdaftar tetapi saat ini tidak ada provider yang melayaninyaPilih id dari GET /v1/models, atau coba lagi nanti.
request_blockedkenari menolak request berdasarkan kebijakan konten sebelum sampai ke providerUbah isi request.
byok_malformed_model_idId model byok/ tidak berbentuk byok/<provider>/<model>Perbaiki id-nya. Lihat Provider.
byok_provider_not_foundKamu tidak punya key atau koneksi untuk provider ituTambahkan key atau hubungkan langganannya, atau perbaiki nama provider.
invalid_pathPath di passthrough Claude Managed Agents memuat .., garis miring yang di-encode, atau backslashKirim path yang normal.
upstream_errorProvider menjawab dengan error klien yang tidak diklasifikasikan kenariPeriksa model dan field request, atau coba model lain.
invalid_requestRequest API workspace punya body yang bukan JSON valid untuk route itu, nilai yang ditolak aturan workspace, id di path yang salah bentuk, atau header Idempotency-Key yang salah bentukBaca message, perbaiki request.
idempotency_key_requiredRoute API workspace yang membeli, mengubah, atau mengaktifkan lagi kursi, atau memindahkan saldo Pribadi, tidak membawa header Idempotency-KeyKirim Idempotency-Key yang unik. Lihat API workspace.
pay_from_personal_not_supportedRequest kursi di API workspace memakai pay_from selain workspacePindahkan dulu saldo Pribadi ke workspace, lalu beli kursinya. Lihat API workspace.

Kode-kode ini berarti provider model menolak request itu sendiri. Status HTTP-nya 400, atau 403, 404, 413, 415, 422, atau 429 milik provider, dan type berisi invalid_request_error.

KodeKapanYang perlu dilakukan
invalid_request_errorProvider menolak request karena cacat atau tidak didukungKirim request yang sama ke model lain. Kalau berhasil di sana, laporkan ke dukungan kenari.
context_length_exceededPrompt ditambah max_tokens melebihi context window modelPersingkat input, turunkan max_tokens, atau pakai model dengan konteks lebih panjang.
model_not_foundProvider sedang tidak melayani model ituCoba lagi nanti atau pakai model lain.
content_policy_violationProvider memblokir request berdasarkan kebijakan kontennyaUbah isi request.
prefill_unsupportedPesan terakhir berasal dari asisten, dan model tidak bisa melanjutkannyaAkhiri percakapan dengan pesan user atau tool.
reference_image_fetch_failedRequest video memuat gambar referensi yang tidak bisa diambil providerKirim setiap referensi sebagai URL https publik atau data URL.
upstream_rejectedProvider menolak request karena alasan yang tidak bisa diklasifikasikan kenariPeriksa id model dan field request.

kenari tidak mengulang request yang ditolak ke provider yang sama. Di dalam rute atau rantai BYOK, kenari bisa lanjut ke langkah berikutnya, karena penolakan satu provider belum membuktikan provider berikutnya akan menolak request yang sama, tetapi penolakan karena panjang konteks mengakhiri rantai. message ditulis oleh kenari dan tidak pernah memuat teks asli dari provider.

Body-nya teks biasa. Lihat Response teks biasa. Periksa key-nya, atau buat key baru di dashboard.

Passthrough Claude Managed Agents menjawab dengan JSON, dengan kode ini:

KodeKapanYang perlu dilakukan
auth_failedKey kn- tidak ada, salah, kedaluwarsa, atau dicabutPeriksa key-nya, atau buat key baru di dashboard.
KodeKapanYang perlu dilakukan
insufficient_balanceSaldomu tidak cukup untuk request atau untuk biaya pencarian web, pengambilan halaman, atau pencarian X, atau pemilik API key dibagikan kehabisan danaTop up, atau kirim prompt yang lebih pendek atau max_tokens yang lebih rendah. Pesannya menunjukkan saldo tersedia dan biaya terbesar yang mungkin untuk request ini, yaitu estimasi input ditambah max_tokens dengan tarif output. Dokumen yang dibaca dengan engine ocr atau /v1/ocr punya pesan sendiri: pesannya menyebut bahwa pembacaan dokumen ditagih per halaman dari saldo dan tidak dicakup paket, serta menunjukkan saldo yang tersedia dan saldo maksimum yang dicadangkan untuk pembacaan dokumen itu. Top up, atau kirim berkas tanpa engine ocr agar dibaca sebagai token input biasa.
payg_limit_reachedKamu mencapai batas saldo PAYG yang kamu atur di pengaturan langganan. Cakupannya satu hari atau 30 hari berjalanNaikkan atau hapus batasnya, atau tunggu sampai pemakaian lama keluar dari periode perhitungan. Kuota paket dan model gratis tidak terpengaruh.
key_spend_cap_reachedBatas biaya atau batas token API key ini sudah terpakai. Masalahnya bukan di saldoPemilik key menaikkan batas biaya atau mereset pemakaiannya di halaman Kunci API (key yang tidak dibagikan dan punya batas biaya), atau memakai key lain. Batas token dan batas key yang dibagikan tidak bisa diubah, jadi pemilik membuat key baru. Pemilik juga mendapat notifikasi saat batasnya pertama kali habis.
member_spend_cap_reachedKamu anggota workspace tim dan sudah mencapai batas pengeluaran yang diatur Pemilik atau Admin untukmu. Batas ini menghitung pemakaianmu dari saldo workspace selama 30 hari berjalan: request PAYG, pemakaian di atas kuota kursimu, pencarian web, web fetch, pencarian X, gambar, dan video. Sebelum batas tercapai, kenari menurunkan max_tokens sampai sebesar yang masih bisa dibayar sisa batasmu, sama seperti saat saldo menipisMinta Pemilik atau Admin workspace menaikkan atau menghapus batasmu di halaman Tim, atau tunggu sampai jendela 30 hari bergulir. Kuota kursimu dan model gratis tidak terpengaruh. Kamu juga mendapat notifikasi saat pertama kali mencapai batas dalam satu jendela.

Lihat Cara penagihan.

API workspace punya kode 403 sendiri. Kodenya terdaftar di sini, dan halaman itu menjelaskan masing-masing.

KodeKapanYang perlu dilakukan
subscribers_onlyModel hanya untuk akun dengan langganan aktifBerlangganan, atau pilih model lain. Lihat Langganan.
subscription_requiredRequest byok/chatgpt/... atau byok/grok/..., atau request ke passthrough Claude Managed Agents, dari akun tanpa Langganan aktifBerlangganan. Lihat Provider.
byok_credential_unavailableKamu punya key atau koneksi untuk provider itu, tetapi tidak ada yang bisa melayani request saat ini karena dinonaktifkan, dijeda, atau keluar dari loginAktifkan key, tunggu key yang dijeda pulih, atau hubungkan ulang langganannya.
byok_spend_capped_keyKey dengan batas biaya memanggil model byok/Pakai key tanpa batas biaya. Batas token diperbolehkan.
shared_key_not_allowedAPI key dibagikan memanggil GET /v1/account/balance, GET /v1/account/quota, endpoint Pemakaian, endpoint Key per tool, route API workspace, atau passthrough Claude Managed AgentsPakai key dari akun itu sendiri.
restricted_key_not_allowedKey yang dibatasi memanggil GET /v1/account/balance, GET /v1/account/quota, endpoint Key per tool, route API workspace, atau passthrough Claude Managed Agents, atau mengirim user_id ke endpoint PemakaianPakai key tanpa pembatasan model, pembatasan kemampuan berbayar, batas biaya, atau batas token. Pemakaian key itu sendiri tetap bisa dibaca dari GET /v1/usage. Lihat Ringkasan akun.
cli_login_key_requiredKey selain key dari kenari login memanggil endpoint Key per toolPakai key dari kenari login. Jalankan kenari login lagi kalau keymu lebih lama dari key per tool.
workspace_access_requiredRoute API workspace membutuhkan tingkat akses workspace yang lebih tinggi dari milik key, atau key itu adalah key yang disimpan kenari login atau key per toolBuat key dengan tingkat yang dibutuhkan route itu. Lihat Autentikasi & API key.
teams_not_enabledRoute API workspace atau tool MCP kenari_workspace_* dipanggil sebelum workspace tim dibuka untuk akun ituJangan coba lagi. Request akan berhasil setelah workspace tim dibuka untuk akun itu.
not_a_team_workspaceRoute API workspace selain GET /v1/workspace dipanggil dengan key di workspace PribadiPakai key dari workspace tim.
permission_deniedRoute API workspace untuk Pemilik atau Admin dipanggil dengan key yang dipegang Anggota, aturan workspace menolak perubahannya (misalnya mengeluarkan Pemilik), atau key yang dipegang Anggota mengirim user_id orang lain ke endpoint PemakaianPakai key yang dipegang Pemilik atau Admin, atau ubah requestnya.
fund_cap_reachedPemindahan POST /v1/workspace/fund-from-personal akan melewati batas harian keyTunggu 24 jam berjalan berlalu, atau buat key dengan batas yang lebih tinggi. Pesannya menyebut sisa yang masih bisa dipindahkan.
KodeKapanYang perlu dilakukan
not_foundDELETE /v1/account/keys/{id} menerima id yang bukan key per tool aktif milik key yang memanggil, atau route API workspace menerima anggota, undangan, atau kursi yang tidak ada di workspaceLihat key kamu dengan GET /v1/account/keys dan pakai id dari sana. Lihat Key per tool. Untuk API workspace, lihat daftar anggota, undangan, atau kursi dan pakai id dari daftar itu.
credential_not_foundHeader x-kenari-credential di passthrough Claude Managed Agents bukan key Anthropic aktif milik akunmuPakai id key Anthropic yang aktif.
KodeKapanYang perlu dilakukan
child_key_capKey login sudah memegang key per tool sebanyak yang diizinkanCabut satu dengan DELETE /v1/account/keys/{id}, lalu buat key baru. Lihat Key per tool.
anthropic_credential_requiredPassthrough Claude Managed Agents tidak menemukan API key Anthropic aktif di akunmuTambahkan key Anthropic di tab Provider.
credit_limit_reachedKey Anthropic yang disebut di x-kenari-credential pada passthrough sudah menghabiskan kredit Claude-nya, dan berhenti otomatis menyalaNaikkan kredit, matikan berhenti otomatis, atau tunggu tanggal pembaruan. Lihat Provider.
credential_requiredPassthrough menemukan dua key Anthropic aktif atau lebih dan tidak ada header x-kenari-credentialSebut satu key di header, atau nonaktifkan yang lain.
conflictKeadaan workspace menolak perubahan lewat API workspace, misalnya mengundang orang yang sudah menjadi anggota, workspace yang sudah mencapai batas anggota, atau menghapus kursi terakhirBaca message, dan baca keadaannya dengan route GET.
idempotency_key_reusedIdempotency-Key di API workspace sudah dipakai untuk body atau route yang berbedaPakai Idempotency-Key baru untuk request baru.
request_in_progressRequest pertama di API workspace dengan Idempotency-Key ini masih berjalanBaca keadaannya dengan route GET sebelum mencoba lagi.

Body request di atas 32 MiB ditolak dengan response teks biasa, bukan JSON. Lihat Response teks biasa. 413 dari provider model berupa error JSON. Lihat Penolakan provider. Kode di bawah ini berlaku untuk passthrough Claude Managed Agents, yang menerima body sampai 100 MB.

KodeKapanYang perlu dilakukan
request_too_largeBody request di passthrough Claude Managed Agents lebih dari 100 MBKirim body yang lebih kecil.

Setiap kode 429 dijelaskan, beserta perilaku Retry-After, di Batas laju.

KodeKapan
rate_limit_exceededBatas per menit akun, batas pembacaan pemakaian, batas pembuatan key per tool, lonjakan request gratis, anggaran token model gratis, atau proses musik bersamaan
free_quota_rpmBatas per menit model gratis
free_quota_dailyKuota harian model gratis, yang direset pukul 00:00 UTC
plan_limit_reachedJendela kuota langganan habis, dan PAYG serta fallback gratis nonaktif
upstream_errorProvider membatasi laju request
passthrough_busyTerlalu banyak request passthrough Claude Managed Agents yang sedang berjalan. Coba lagi sebentar lagi
rate_limitedBatas per key untuk perubahan lewat API workspace
pending_limit_reachedWorkspace punya terlalu banyak undangan tertunda
daily_limit_reachedWorkspace sudah mencapai batas undangan harian
KodeKapanYang perlu dilakukan
internal_errorAda yang gagal secara tak terduga di kenariCoba sekali lagi. Kalau terus terjadi, laporkan header request-id ke dukungan kenari.
KodeKapanYang perlu dilakukan
upstream_errorProvider timeout, tidak terjangkau, atau gagalCoba lagi dengan backoff.
all_providers_failedSemua provider, atau semua langkah rute, gagal. Retry-After dikirim saat provider dijeda atau penuhCoba lagi setelah Retry-After detik, atau pakai rute dengan langkah fallback. Lihat Routing & rute.
no_wire_for_modalitySaat ini tidak ada provider yang melayani jenis request ini untuk model itu, misalnya chat, gambar, edit, atau embeddingCoba lagi nanti, atau pakai model lain.

Pesan error tidak pernah menyebut provider di balik sebuah model. kenari menulis setiap pesan sendiri.

Request non-stream yang berjalan sekitar dua menit tanpa response bisa diputus oleh jaringan edge sebelum jawabannya sampai ke kamu. Untuk prompt panjang, misalnya di atas 100.000 token, max_tokens besar, atau model penalaran yang lambat, set "stream": true. Stream menjaga koneksi tetap terbuka selama model bekerja. Lihat Streaming.

Saat request non-stream masih berjalan setelah menunggu lama, kenari bisa menjaga koneksi tetap terbuka dengan mengirim spasi sebelum body JSON. Parser JSON mengabaikan spasi itu. Pada saat itu baris status sudah 200, jadi periksa body untuk objek error sebelum membaca jawabannya.

  1. Di API berformat OpenAI, pakai status HTTP dan code. Di Messages, pakai status HTTP dan error.type. Anggap message sebagai teks untuk manusia.
  2. Coba ulang 429 dengan rate_limit_exceeded, free_quota_rpm, atau upstream_error, serta 500 dan 503. Tunggu Retry-After kalau ada, dan pakai exponential backoff dengan jitter kalau tidak ada.
  3. Jangan coba ulang error 4xx lain tanpa perubahan. Perbaiki dulu request, key, atau saldonya.
  4. Untuk 402, top up atau ubah batas yang tercapai, lalu kirim request lagi.
  5. Periksa stream untuk event error, dan jangan berasumsi setiap body error berupa JSON. Lihat Response teks biasa.
  6. Catat header response request-id, dan sertakan saat menghubungi dukungan kenari.