> ## Documentation Index
> Fetch the complete documentation index at: https://www.krea.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Error dan debugging

> Error HTTP dan kode job yang gagal untuk Krea API: bentuk respons, kode status, 429 konkurensi, dan apa yang perlu dikirim ke support.

Sebuah panggilan dapat gagal di dua tempat. Permintaan dapat langsung ditolak dengan error HTTP, atau dapat diterima lalu kemudian berakhir dengan `status: "failed"`. Job yang gagal dan dibatalkan tidak ditagih. Anda hanya membayar untuk job yang selesai. Pada node app, job milik app itu sendiri tidak pernah ditagih. Setiap node generasi atau LLM dikenai biaya saat job miliknya sendiri selesai. Kegagalan tidak membatalkan node paralel atau cabang lain, sehingga node yang selesai setelah app sudah gagal tetap dikenai biaya, dan biaya tersebut tidak dikembalikan. Node yang gagal, dibatalkan, atau tidak pernah dimulai tidak dikenai biaya. Lihat [API Keys & Billing](https://www.krea.ai/docs/id/developers/api-keys-and-billing.md).

## Error saat permintaan dan job yang gagal

**Error saat permintaan** mengembalikan status `4xx` atau `5xx`. Tidak ada job yang dibuat. Baca body seperti yang dijelaskan di bawah.

**Job yang gagal** mengembalikan status sukses saat dikirim. Lakukan polling [GET `/jobs/{id}`](https://www.krea.ai/docs/id/developers/job-lifecycle) atau tunggu [webhook](https://www.krea.ai/docs/id/developers/webhooks.md). Saat job selesai, `status` bernilai `"failed"` dan kegagalannya ada di objek `error` tingkat atas. Jangan membaca `result` pada job yang gagal: field tersebut dihilangkan (atau `null`). Field ini hanya berisi output saat `status` bernilai `"completed"`. Job `cancelled` tidak memiliki `result` maupun `error`.

Buat percabangan berdasarkan `error.code`. `message` dapat dihilangkan, dan untuk `provider_error` serta `internal`, isinya adalah teks bebas dari provider. Jangan mem-parsing `message`.

```javascript theme={"theme":{"light":"github-light-default","dark":"vesper"}}
if (job.status === "failed") {
  switch (job.error?.code ?? "internal") {
    case "content_policy":
    case "model_unavailable":
      // Mengulang permintaan yang sama kemungkinan besar akan gagal lagi. Ubah input atau modelnya.
      break;
    case "insufficient_balance":
      // Isi ulang saldo API, lalu kirim lagi.
      break;
    default:
      // timeout, auto_cancelled, provider_error, internal, node_app_node_failed,
      // atau kode yang tidak dikenal: kirim lagi dengan backoff.
  }
}
```

## Body respons

Pada generate, jobs, assets, styles, dan node apps, baca `message ?? error` saat body berupa JSON. Salah satu dari kedua field tersebut membawa ringkasannya. Beberapa body `5xx` bukan JSON, termasuk `502` yang body-nya berupa teks biasa `error code: 502`. Lakukan parsing secara defensif: jika body bukan JSON, buat percabangan berdasarkan status HTTP.

Sebagian besar kegagalan menggunakan `{ "message": "..." }`, terkadang dengan field tambahan (`limit`, `jobType`, `modelAccessDenial`). JSON tidak valid dan beberapa handler di bawah menggunakan `{ "error": "..." }` sebagai gantinya.

Endpoint MCP seperti `/mcp` mengembalikan error JSON-RPC, `{ "jsonrpc", "id", "error": { "code", "message" } }`, bukan body HTTP di halaman ini.

### Kirim `Accept: application/json`

> [!WARNING]
>
> Tanpa `Accept: application/json`, beberapa error dikembalikan sebagai halaman HTML dan parser JSON akan gagal.

Error `{ "message" }`, termasuk `401` dan `404`, berupa JSON saat `Accept` bernilai `application/json` atau `*/*`. Saat `Accept` tidak ada, atau bernilai `text/html`, status tersebut berupa halaman HTML (`Content-Type: text/html`) dan parser JSON akan gagal.

Hal ini penting untuk klien yang tidak mengirim header `Accept`. `urllib` milik Python adalah salah satunya. curl mengirim `Accept: */*` secara default, begitu pula `fetch` milik Node, sehingga keduanya menerima JSON kecuali Anda menimpa `Accept`.

`POST /generate/...`, `GET /jobs/{id}`, `GET /styles`, dan `GET /assets` tanpa autentikasi mengembalikan `401` `{"message":"Unauthorized"}` untuk `*/*` dan `application/json`, serta halaman HTML untuk `Accept` yang tidak ada atau `text/html`. `GET /jobs/{id}` yang terautentikasi untuk id yang tidak dikenal berperilaku sama dengan statusnya: `404` JSON `{"message":"Job not found or unauthorized"}` saat `Accept` meminta JSON, dan `404` `text/html` saat `Accept` tidak ada.

JSON tidak valid (`400`) dan validasi (`422`) menggunakan `{ "error" }` dan tetap berupa JSON meskipun `Accept` tidak ada. Hal yang sama berlaku untuk `422` field yang dihapus, `410` sunset, `402` Zero Data Retention, respons `{ "error" }` node-app, dan error [Agent operation API](#agent-operation-api) yang dipetakan. `402` dan `429` saat menerima job `POST /generate/...` juga berupa JSON, termasuk untuk `Accept` dari browser.

`413` dan `500` menggunakan `{ "message" }` dan mengikuti `Accept`, seperti `401` dan `404`.

### Validasi (`422`)

```json theme={"theme":{"light":"github-light-default","dark":"vesper"}}
{
  "error": "Validation failed",
  "details": [
    {
      "field": "width",
      "message": "Too small: expected number to be >0",
      "code": "too_small"
    },
    {
      "field": "",
      "message": "Unrecognized key: \"foo\"",
      "code": "unrecognized_keys"
    },
    {
      "field": "prompt",
      "message": "Enter a prompt.",
      "code": "custom"
    }
  ]
}
```

`details` mencantumkan setiap masalah. `field` adalah path yang digabungkan dengan `.` (`"image_style_references.0.url"`). Error tingkat objek menggunakan string kosong, seperti pada key tidak dikenal di atas. Beberapa key tidak dikenal menghasilkan `Unrecognized keys: ...` dengan `field` kosong yang sama. `expected` hanya ditambahkan saat `code` bernilai `"invalid_type"`.

Header `X-Webhook-URL` yang tidak valid menggunakan `422` yang sama.

`GET /jobs` dengan parameter query yang tidak valid juga mengembalikan `422` ini. Bukan `400`.

Pemeriksaan input Zero Data Retention yang gagal di dalam tool mengembalikan `422` dengan penjelasan di `message` (bentuk `{ "message" }`, sehingga `Accept` berpengaruh). Lihat [Zero Data Retention](https://www.krea.ai/docs/id/developers/zdr.md).

### Field yang dihapus dan deprecated (`422`)

Field `batchSize` / `batch_size` yang telah dihapus menggunakan `422` yang berbeda. Tidak ada array `details`:

```json theme={"theme":{"light":"github-light-default","dark":"vesper"}}
{
  "error": "invalid_request",
  "reason": "removed_field",
  "field": "batchSize",
  "message": "Generation batch size is no longer supported. Submit one request per output.",
  "value": 2
}
```

`batch_size` dihapus dengan cara yang sama. `field` berisi nama mana pun yang Anda kirim.

Alias field yang deprecated menggunakan `reason` `"deprecated_field"` atau `"conflicting_fields"`, ditambah `replacement`, `sunset_date`, dan `migration_url` jika relevan. Buat percabangan berdasarkan `error` dan `reason`. Kalimat yang ditampilkan kepada pengguna adalah `message`.

### Model sunset (`410`)

Model yang telah melewati tanggal sunset-nya mengembalikan `410` dengan `Deprecation: true` dan header `Sunset` (tanggal RFC 1123):

```json theme={"theme":{"light":"github-light-default","dark":"vesper"}}
{
  "error": "model_unavailable",
  "reason": "deprecated",
  "message": "The model '<path>' was deprecated on <sunsetDate>. <reason> Use '<replacement>' instead.",
  "sunset_date": "YYYY-MM-DD",
  "replacement": "<optional>",
  "migration_url": "<optional>"
}
```

`error` adalah nilai stabil `"model_unavailable"`. `replacement` dan `migration_url` dihilangkan saat tidak ada pengganti yang direkomendasikan. Mengulang model yang sama akan terus mengembalikan `410`. Beralihlah ke `replacement` jika tersedia, dan lihat [Deprecations](https://www.krea.ai/docs/id/developers/deprecations.md).

Model yang deprecated tetapi masih aktif mengirim `Deprecation` dan `Sunset` di setiap respons, termasuk error. Menggunakan alias field yang deprecated juga demikian, termasuk pada `422` miliknya sendiri. Saat panduan migrasi tersedia, header `Link: <migration_url>; rel="deprecation"` juga dikirim.

## Kode status

| Status | Arti |
| - | - |
| `400` | Body generate bukan JSON yang valid, URL input node-app tidak dapat digunakan, atau parameter asset atau node-app tidak valid. JSON tidak valid pada node-app execute menghasilkan `500`. |
| `401` | Kredensial tidak ada atau tidak valid. |
| `402` | Permintaan ditolak sebelum job dimulai. Lihat [402](#402-payment-required). |
| `403` | Pemanggil sudah terautentikasi tetapi tidak diizinkan menggunakan resource ini. |
| `404` | Tidak ada route yang cocok, path model tidak dikenal atau tidak tersedia untuk Anda, atau job, asset, style, atau node app tidak ditemukan. |
| `405` | Metode HTTP tidak diizinkan untuk path ini. |
| `410` | Model sudah sunset. Lihat [Model sunset](#sunset-models-410). |
| `413` | Body permintaan terlalu besar. Lihat [413](#413-payload-too-large). |
| `422` | Validasi gagal, field yang dihapus atau deprecated dikirim, atau input ditolak secara permanen. |
| `429` | Melebihi batas konkurensi dan job tidak dapat di-backlog. Batas ini bersifat perkiraan. |
| `500` | Error server yang tidak tertangani. `{ "message": "Internal Error" }`. Tanpa teks exception. Mengikuti `Accept`. |
| `502`, `504` | Dapat di-retry. `502` datang sebagai teks biasa Cloudflare `error code: 502`, bukan JSON, jadi buat percabangan berdasarkan kode status. `504` mungkin juga berupa teks biasa. Lihat [Unduhan input](#input-downloads). |

### `400`

JSON tidak valid pada generate selalu berupa JSON, tanpa memerlukan header `Accept`:

```json theme={"theme":{"light":"github-light-default","dark":"vesper"}}
{
  "error": "Invalid JSON: Expected property name or '}' in JSON at position 1 (line 1 column 2)"
}
```

Node-app execute menggunakan `{ "error" }` untuk URL input yang tidak dapat digunakannya: `Invalid URL for input "<key>"`, atau `Failed to download URL for <key>: …`. Pesan unduhan ini juga mencakup kegagalan sementara, sehingga tidak seperti generate (lihat [Unduhan input](#input-downloads)), kegagalan unduhan node-app selalu `400`. Lakukan retry sekali jika URL-nya valid.

JSON tidak valid pada `POST /node-apps/{id}/execute` bukan `400` generate di atas. Hasilnya menjadi `500` `{ "message": "Internal Error" }`, tanpa teks exception, dan mengikuti `Accept`.

Respons `400` lainnya pada assets dan node apps berupa `{ "message": "..." }` dengan penjelasan singkat, misalnya `No file provided` pada presigned upload atau `Invalid pagination parameters` pada versi node-app. Upload asset yang gagal meneruskan status dari layanan upload (`400`, `401`, `404`, atau `500`) dan dapat menempatkan teks responsnya di `message`. Teks tersebut terkadang berupa string JSON. Parameter query yang tidak valid pada `GET /jobs` menghasilkan [`422`](#validation-422), bukan `400`.

### `401`

Generate, jobs, assets, styles, dan node apps:

```json theme={"theme":{"light":"github-light-default","dark":"vesper"}}
{ "message": "Unauthorized" }
```

Presigned upload mengembalikan `{ "message": "Presigned upload URL expired" }` atau `{ "message": "Invalid presigned upload URL" }`.

### `402` Pembayaran diperlukan

Untuk klien yang ditagih melalui API (API key, atau MCP yang menggunakan API key) yang saldo API-nya tidak mencukupi untuk job tersebut:

```json theme={"theme":{"light":"github-light-default","dark":"vesper"}}
{
  "message": "Your API balance is separate from your workspace compute balance. Please top up your API balance to continue using the API."
}
```

Isi ulang di [krea.ai/app/api/ ↗](https://krea.ai/app/api/). Job yang sedang berjalan tetap diselesaikan. Lihat [API Keys & Billing](https://www.krea.ai/docs/id/developers/api-keys-and-billing.md).

Nilai `message` `402` lainnya pada API publik:

| `message` | Kapan |
| - | - |
| `This tool is not available on your current plan.` | Plan atau workspace Anda tidak mengizinkan job konkuren untuk model ini. |
| `MEMBER_USAGE_LIMIT_REACHED` | Plan menerapkan batas penggunaan anggota dan anggaran anggota ini akan terlampaui. |
| `WORKSPACE_USAGE_LIMIT_REACHED` | Plan menerapkan batas penggunaan anggota dan anggaran workspace akan terlampaui. |
| `MEMBER_LIMIT_VIOLATION` | Workspace memiliki lebih banyak anggota daripada yang diizinkan plan-nya. |
| `K3_ULTRA_ACCESS_REQUIRED` | Krea 3 dengan `thinking_mode` `"ultra"` (atau `"max"` versi lama) dan referensi gambar, pada plan tanpa Krea 3 Ultra. Tanpa referensi gambar, Ultra berjalan sebagai `"fast"`. |
| `ENHANCER_RESOLUTION_LIMIT_REACHED` | Upscale lebih besar daripada yang diizinkan plan gratis. |

Panggilan generate dengan Zero Data Retention pada workspace yang belum mengaktifkannya mengembalikan body ini, selalu berupa JSON:

```json theme={"theme":{"light":"github-light-default","dark":"vesper"}}
{ "error": "Zero data retention is not enabled for this workspace." }
```

[Agent operation API](#agent-operation-api) menggunakan body `402` sendiri. Body tersebut terkait saldo compute unit workspace, bukan saldo API.

### `403`

| `message` atau `error` | Kapan |
| - | - |
| `Use an API key or a plugin session` | Realtime, dipanggil tanpa API key atau sesi OAuth atau plugin. `{ "message" }`. |
| `This endpoint needs a workspace service API key` | Usage API, kredensial bukan service API key workspace. `{ "message" }`. |
| `Your plan is not entitled to the usage API` | Usage API, plan tidak memiliki hak akses. `{ "message" }`. |
| `FEATURE_RESTRICTED` | Penolakan kebijakan model. Body juga menyertakan `modelAccessDenial`. `{ "message" }`. |
| `MODEL_ACCESS_REQUIRED` | Model hanya untuk internal. `{ "message" }`. |
| `This node app cannot be used via the API.` | Node-app execute. `{ "error" }`, selalu JSON. |
| `Free users cannot run node apps` | Node-app execute pada workspace plan gratis. `{ "message" }`. |
| `You do not own this style` | Mengubah atau membagikan style yang bukan milik Anda. `{ "message" }`. |

### `404`

Setiap `404` berupa `{ "message" }`, misalnya untuk id job yang tidak dikenal:

```json theme={"theme":{"light":"github-light-default","dark":"vesper"}}
{ "message": "Job not found or unauthorized" }
```

Header `Accept` yang tidak ada membuat respons ini berupa HTML, kecuali `Endpoint not found` untuk model yang tidak dapat digunakan oleh key atau plan Anda, yang selalu berupa JSON. `GET /jobs/{id}` yang terautentikasi untuk id yang tidak dikenal tanpa `Accept` menghasilkan `404` `text/html`.

| `message` | Kapan |
| - | - |
| `Not Found` | Tidak ada route yang cocok dengan path. |
| `Endpoint not found` | Path model di bawah `/generate` yang tidak dikenal, atau yang tidak dapat digunakan oleh API key atau plan ini. |
| `Job not found or unauthorized` | Id job tidak ada atau tidak valid, termasuk `DELETE /jobs/{id}`. |
| `Asset not found` | Asset tidak ditemukan. |
| `Style not found` | Style tidak ditemukan. Mengubah atau membagikan style yang bukan milik Anda menghasilkan `Style not found or you are not the owner`. |
| `Node app not found` | Node app tidak ditemukan. |
| `Workspace not found` | Usage API, workspace tidak ditemukan. |

Operasi Agent yang tidak dikenal juga menghasilkan `404` `{ "message": "Endpoint not found" }`, bukan bentuk Agent `{ "error", "code" }`.

### `405`

Body berupa teks biasa tanpa header `Content-Type`, bukan JSON, termasuk saat `Accept` bernilai `application/json`. Teksnya adalah metode ditambah ` method not allowed`, misalnya `GET method not allowed`. Header `Allow` mencantumkan metode yang diterima oleh path tersebut.

### `413` Payload terlalu besar

Body permintaan yang terlalu besar ditolak dengan `413`. Dari API itu sendiri, body mengikuti `Accept`:

```json theme={"theme":{"light":"github-light-default","dark":"vesper"}}
{ "message": "Payload Too Large" }
```

Body yang sangat besar dapat ditolak sebelum mencapai API, dengan halaman HTML `413`. Jangan mengirim file secara inline. Upload file dengan `POST /assets` dan teruskan URL yang dikembalikan dalam permintaan generate.

### Unduhan input

Host yang mengembalikan `404` atau `410` menghasilkan `422` permanen. Body berupa JSON, dan `Accept` berpengaruh:

```json theme={"theme":{"light":"github-light-default","dark":"vesper"}}
{ "message": "Input file rejected: fetching <url> returned HTTP 404" }
```

Host `410` menggunakan kalimat yang sama dengan `410`. Penolakan permanen lainnya menggunakan `Input file rejected: …`.

Kegagalan unduhan yang dapat di-retry berupa `502` atau `504`. Buat percabangan berdasarkan kode status, bukan body, lalu lakukan retry.

| Status | Yang Anda terima | Retry? |
| - | - | - |
| `422` | JSON `{ "message": "Input file rejected: fetching <url> returned HTTP 404" }` saat host mengembalikan `404`. Host `410` menggunakan kalimat yang sama dengan `410`. | Tidak. Kegagalannya permanen. |
| `502` | Teks biasa Cloudflare `error code: 502`, dengan `Content-Type: text/plain; charset=UTF-8`. Terkonfirmasi saat host file mengembalikan `503`, `500`, atau `429`, dan saat domain tidak dapat di-resolve. | Ya. Buat percabangan berdasarkan kode status. |
| `504` | Belum diuji secara langsung. Mungkin juga datang sebagai teks biasa Cloudflare. | Ya. Buat percabangan berdasarkan kode status. |

`502` yang terus berulang untuk URL yang sama kemungkinan berarti URL tersebut diblokir atau rusak. Ganti URL-nya.

Kegagalan konversi ekspor 3D juga berupa `502`. Jalur tersebut belum diuji secara langsung, sehingga body mungkin juga datang sebagai teks biasa Cloudflare `error code: 502`. Buat percabangan berdasarkan kode status dan lakukan retry. `502` yang terus berulang untuk URL model yang sama kemungkinan berarti URL tersebut diblokir atau rusak.

### `429` konkurensi

Saat job tidak dapat di-backlog, permintaan yang melebihi batas konkurensi dapat ditolak dengan `429` dan `Content-Type: application/json`:

```json theme={"theme":{"light":"github-light-default","dark":"vesper"}}
{
  "message": "CONCURRENCY_LIMIT_REACHED",
  "limit": 4,
  "jobType": "k2"
}
```

`limit` adalah batas konkurensi Anda untuk jenis job ini. Batas ini dihitung per pengguna, bukan per workspace. Nilainya bersifat perkiraan: lonjakan singkat dapat diterima melebihinya, jadi jangan mengandalkan permintaan ke-`limit + 1` sebagai yang gagal. `jobType` adalah kategori job internal, bukan path model publik. Jangan membuat percabangan berdasarkan field ini.

Krea 2 juga dapat hanya mengembalikan `{ "message": "CONCURRENCY_LIMIT_REACHED" }`, tanpa `limit` atau `jobType`, saat antrean bersamanya penuh. Itu bukan batas Anda. Tunggu sejenak lalu lakukan retry.

Backlog hanya aktif jika plan menyertakannya (Pro ke atas), model mendukungnya, dan permintaan bukan [Zero Data Retention](https://www.krea.ai/docs/id/developers/zdr.md). Permintaan Krea 2 saat ini tidak di-backlog pada plan apa pun, sehingga mengembalikan `429` saat melebihi batas. Saat backlog aktif, job tambahan diterima dengan `status: "backlogged"` dan dimulai begitu slot tersedia. Tidak ada batas backlog terpisah. Lihat [Rate Limits](https://www.krea.ai/docs/id/developers/rate-limits.md).

API tidak mengirim `Retry-After` atau `X-RateLimit-*`. Respons memang menyertakan `cf-ray`. Saat menerima `429`, lakukan retry dengan exponential backoff setelah job yang sedang berjalan selesai (lakukan polling `GET /jobs/{id}`, atau gunakan webhook).

Jika penyelesaian job berikutnya menghabiskan saldo, job yang masih berada di backlog akan gagal dengan `error.code` `"insufficient_balance"`. Itu adalah job yang gagal, bukan HTTP `402`. Job tersebut tidak mengirim webhook, jadi lakukan polling `GET /jobs/{id}` untuk job yang di-backlog.

## Agent operation API

`POST /agent/{operation}` dan `GET /agent/session/{sessionId}` mengembalikan `{ "error", "code"?, "allowedModels"? }`. Hanya `error` yang wajib. `allowedModels` menggunakan camelCase. Giliran yang gagal setelah diterima muncul sebagai `status: "failed"` pada sesi, bukan sebagai salah satu error HTTP ini. Lihat [Agent](https://www.krea.ai/docs/id/developers/agent.md).

| Status | Body |
| - | - |
| `400` | `{ "error": "Invalid JSON body" }` |
| `401` | `{ "error": "Unauthorized" }` |
| `402` | `{ "error": "Insufficient compute balance for an Agent turn", "code": "compute_limit" }`, atau `{ "error": "Free plan Agent message limit reached. Upgrade to keep using the Agent", "code": "free_message_limit" }`. |
| `403` | `{ "error": "Model is not included in the workspace plan", "code": "model_not_entitled", "allowedModels": ["..."] }`. |
| `404` | Operasi tidak dikenal: `{ "message": "Endpoint not found" }`. Selain itu `{ "error": "Session not found or not accessible", "code": "not_found" }`, atau `{ "error": "<file reference error>", "code": "attachment_not_found" }`. |
| `409` | `{ "error": "...", "code": "conflict" }`. |
| `422` | Input tidak valid: `{ "error": "Validation failed", "details": [...] }` seperti pada [Validasi](#validation-422). Error terpetakan lainnya berupa `{ "error": "<message>" }` ditambah `code` jika ada. Aplikasi desktop yang terputus tidak memiliki `code`; pesannya diawali dengan `That desktop app is not connected`. |

Kode error Agent yang tidak dikenali tetap berupa `422` dengan `{ "error", "code" }`. `404` operasi tidak dikenal dan `500` yang tidak tertangani menggunakan `{ "message" }` dan mengikuti `Accept`.

## `error.code` job yang gagal

`GET /jobs` dan `GET /jobs/{id}` hanya mengisi `error` saat `status` bernilai `"failed"`. Tidak ada `result` yang dapat digunakan:

```json theme={"theme":{"light":"github-light-default","dark":"vesper"}}
{
  "status": "failed",
  "error": {
    "code": "content_policy",
    "message": "An external provider's moderation systems rejected the generation."
  }
}
```

> [!WARNING]
>
> Buat percabangan berdasarkan `error.code`. Jangan pernah mem-parsing `message`.
>
> `message` dapat dihilangkan. Pesan `provider_error` dan `internal` berupa teks bebas, dan pesan `internal` dapat berupa teks mentah dari provider seperti `failed to download media from the provided URL`. Perlakukan setiap `code` yang tidak Anda kenali sebagai `internal`.

| `code` | `message` | Yang perlu dilakukan |
| - | - | - |
| `content_policy` | `Krea's moderation systems rejected the generation.` atau `An external provider's moderation systems rejected the generation.` | Ubah prompt atau input. Permintaan yang sama kemungkinan besar akan ditolak lagi. |
| `timeout` | `An external provider did not complete the generation in sufficient time.` | Lakukan retry job. |
| `insufficient_balance` | Dihilangkan. Node app dapat mengembalikan `You are out of compute units. Add more compute units to continue running this node app.` sebagai gantinya. | Isi ulang saldo, lalu kirim lagi. Job ini sebelumnya sudah diterima; panggilan HTTP tidak mengembalikan `402`. |
| `auto_cancelled` | `Job repeatedly failed healthchecks and was automatically cancelled.` | Kirim job lagi. |
| `model_unavailable` | Biasanya teks dari provider itu sendiri. `The provider retired this model. It no longer accepts new generations.` jika tidak ada. | Berhenti memanggil model ini. Gunakan pengganti yang tercantum di [Deprecations](https://www.krea.ai/docs/id/developers/deprecations.md) jika ada. |
| `provider_error` | Biasanya teks dari provider itu sendiri. | Lakukan retry dengan backoff. |
| `internal` | Teks bebas, atau dihilangkan. | Coba lagi nanti. Sertakan `job_id` jika Anda menghubungi support. |
| `node_app_node_failed` | `Node "<type>" failed: <detail>` atau `Node "<type>" failed.` | Baca `message`. Jika node mengalami masalah sementara, seperti timeout, jalankan app lagi. Jika tidak, perbaiki node tersebut terlebih dahulu. Job milik app itu sendiri tidak pernah ditagih. Setiap node generasi atau LLM dikenai biaya saat job miliknya sendiri selesai. Kegagalan tidak membatalkan node paralel atau cabang lain, sehingga node yang selesai setelah app sudah gagal tetap dikenai biaya, dan biaya tersebut tidak dikembalikan. Node yang gagal, dibatalkan, atau tidak pernah dimulai tidak dikenai biaya. Id node dan jenis node tidak tercantum pada job publik. |

Pengiriman webhook untuk job yang gagal menggunakan objek job yang sama, termasuk `error`. Pengiriman untuk job yang dibatalkan tidak memiliki `error`. Payload yang lebih besar dari 256 KiB tidak dikirim, dan tidak ada pengiriman lebih lanjut untuk job tersebut, jadi lakukan polling `GET /jobs/{id}` sebagai gantinya. Verifikasi signature sebelum Anda memercayai body. Lihat [Webhooks](https://www.krea.ai/docs/id/developers/webhooks.md).

## Debugging

Tidak ada header request-id Krea. Setiap respons menyertakan header `cf-ray` milik Cloudflare. Tidak ada header `Retry-After` atau `X-RateLimit-*` yang dikirim.

Saat Anda menulis ke [support@krea.ai](mailto:support@krea.ai), sertakan:

* `job_id`, jika panggilan membuat atau merujuk ke sebuah job
* Waktu dan endpoint
* Untuk error saat permintaan, nilai `cf-ray`

`Access-Control-Allow-Origin` bernilai `*`. Pada generate, jobs, assets, styles, dan node apps, `Access-Control-Expose-Headers` tidak diatur, sehingga `fetch` di browser tidak dapat membaca `cf-ray`, `Deprecation`, atau `Sunset`. Salin `cf-ray` dari log jaringan, atau dari klien sisi server.

Pada setiap respons, periksa `Deprecation` dan `Sunset` sebelum model berhenti menerima panggilan. Lihat [Deprecations](https://www.krea.ai/docs/id/developers/deprecations.md).

## Langkah berikutnya

> **[Job Lifecycle](https://www.krea.ai/docs/id/developers/job-lifecycle.md)**
>
> Lakukan polling status hingga job selesai, gagal, atau dibatalkan

> **[Webhooks](https://www.krea.ai/docs/id/developers/webhooks.md)**
>
> Verifikasi signature pada pengiriman job yang gagal

> **[Rate Limits](https://www.krea.ai/docs/id/developers/rate-limits.md)**
>
> Kapan job tambahan di-backlog dan kapan mengembalikan 429

> **[API Keys & Billing](https://www.krea.ai/docs/id/developers/api-keys-and-billing.md)**
>
> Isi ulang saldo API setelah menerima 402


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.