status: "failed". Fehlgeschlagene und abgebrochene Jobs werden nicht abgerechnet. Du zahlst nur für abgeschlossene Jobs. Bei einer Node-App wird der eigene Job der App nie abgerechnet. Jeder Generierungs- oder LLM-Node wird berechnet, wenn sein eigener Job abgeschlossen ist. Ein Fehler bricht parallele Nodes oder andere Zweige nicht ab, daher wird auch ein Node berechnet, der abgeschlossen wird, nachdem die App bereits fehlgeschlagen ist, und diese Kosten werden nicht erstattet. Ein Node, der fehlschlägt, abgebrochen wird oder nie startet, wird nicht berechnet. Siehe API-Keys & Abrechnung.
Fehler zum Anfragezeitpunkt und fehlgeschlagene Jobs
Fehler zum Anfragezeitpunkt geben einen4xx- oder 5xx-Status zurück. Es wird kein Job erstellt. Lies den Body wie unten beschrieben.
Fehlgeschlagene Jobs geben beim Einreichen einen Erfolgsstatus zurück. Frage GET /jobs/{id} ab oder warte auf einen Webhook. Wenn der Job beendet ist, lautet status "failed" und der Fehler steht im error-Objekt auf oberster Ebene. Lies result bei einem fehlgeschlagenen Job nicht: Es fehlt (oder ist null). Es enthält die Ausgabe nur, wenn status "completed" ist. Ein cancelled-Job hat weder result noch error.
Verzweige anhand von error.code. message kann fehlen, und bei provider_error und internal ist es freier Text des Anbieters. Parse message nicht.
Antwort-Bodies
Bei Generate, Jobs, Assets, Styles und Node-Apps liest dumessage ?? error, wenn der Body JSON ist. Eines dieser beiden Felder enthält die Zusammenfassung. Manche 5xx-Bodies sind kein JSON, darunter ein 502, dessen Body der reine Text error code: 502 ist. Parse defensiv: Wenn der Body kein JSON ist, verzweige anhand des HTTP-Status.
Die meisten Fehler verwenden { "message": "..." }, manchmal mit zusätzlichen Feldern (limit, jobType, modelAccessDenial). Ungültiges JSON und einige der unten genannten Handler verwenden stattdessen { "error": "..." }.
MCP-Endpoints wie /mcp geben JSON-RPC-Fehler zurück, { "jsonrpc", "id", "error": { "code", "message" } }, nicht die HTTP-Bodies auf dieser Seite.
Accept: application/json senden
{ "message" }-Fehler, einschließlich 401 und 404, sind JSON, wenn Accept application/json oder */* ist. Fehlt Accept oder ist es text/html, sind diese Status eine HTML-Seite (Content-Type: text/html), und ein JSON-Parser schlägt fehl.
Das betrifft Clients, die keinen Accept-Header senden. Pythons urllib ist einer davon. curl sendet standardmäßig Accept: */*, ebenso Nodes fetch, daher erhalten beide JSON, sofern du Accept nicht überschreibst.
Nicht authentifizierte Aufrufe von POST /generate/..., GET /jobs/{id}, GET /styles und GET /assets geben bei */* und application/json 401 {"message":"Unauthorized"} zurück, bei fehlendem Accept oder text/html eine HTML-Seite. Ein authentifiziertes GET /jobs/{id} mit unbekannter ID verhält sich beim Status genauso: 404 JSON {"message":"Job not found or unauthorized"}, wenn Accept JSON anfordert, und 404 text/html, wenn Accept fehlt.
Ungültiges JSON (400) und Validierung (422) verwenden { "error" } und bleiben JSON, auch wenn Accept fehlt. Dasselbe gilt für 422 bei entfernten Feldern, 410 bei Sunset, den 402 für Zero Data Retention, { "error" }-Antworten von Node-Apps und die gemappten Fehler der Agent-Operation-API. 402 und 429 bei der Annahme eines POST /generate/...-Jobs sind ebenfalls JSON, auch bei einem Browser-Accept.
413 und 500 verwenden { "message" } und richten sich wie 401 und 404 nach Accept.
Validierung (422)
details listet jedes Problem auf. field ist der mit . verbundene Pfad ("image_style_references.0.url"). Fehler auf Objektebene verwenden einen leeren String, wie beim unbekannten Schlüssel oben. Mehrere unbekannte Schlüssel erzeugen Unrecognized keys: ... und dasselbe leere field. expected wird nur hinzugefügt, wenn code "invalid_type" ist.
Ein ungültiger X-Webhook-URL-Header verwendet denselben 422.
GET /jobs mit ungültigen Query-Parametern gibt ebenfalls diesen 422 zurück. Es ist kein 400.
Eine Zero-Data-Retention-Eingabeprüfung, die innerhalb des Tools fehlschlägt, gibt 422 mit der Erklärung in message zurück (das { "message" }-Format, daher spielt Accept eine Rolle). Siehe Zero Data Retention.
Entfernte und veraltete Felder (422)
Das entfernte Feld batchSize / batch_size verwendet einen anderen 422. Es gibt kein details-Array:
batch_size ist auf dieselbe Weise entfernt. field ist der Name, den du gesendet hast.
Ein veralteter Feld-Alias verwendet reason "deprecated_field" oder "conflicting_fields", zusätzlich replacement, sunset_date und migration_url, sofern zutreffend. Verzweige anhand von error und reason. Der Satz, den du einer Person anzeigen kannst, ist message.
Sunset-Modelle (410)
Ein Modell nach seinem Sunset-Datum gibt 410 mit Deprecation: true und einem Sunset-Header (ein Datum nach RFC 1123) zurück:
error ist der stabile Wert "model_unavailable". replacement und migration_url fehlen, wenn es keinen empfohlenen Ersatz gibt. Ein Retry mit demselben Modell gibt weiterhin 410 zurück. Wechsle zu replacement, wenn es gesetzt ist, und siehe Deprecations.
Ein Modell, das veraltet, aber noch aktiv ist, sendet Deprecation und Sunset bei jeder Antwort, auch bei Fehlern. Die Verwendung eines veralteten Feld-Alias bewirkt dasselbe, auch bei seinem eigenen 422. Wenn ein Migrationsleitfaden existiert, wird zusätzlich ein Link: <migration_url>; rel="deprecation"-Header gesendet.
Statuscodes
400
Ungültiges JSON bei Generate ist immer JSON, ohne dass ein Accept-Header nötig ist:
{ "error" } für eine Eingabe-URL, die nicht verwendet werden kann: Invalid URL for input "<key>" oder Failed to download URL for <key>: …. Die Download-Meldung umfasst auch vorübergehende Fehler, daher ist ein Download-Fehler bei Node-Apps, anders als bei Generate (siehe Eingabe-Downloads), immer 400. Wiederhole ihn einmal, wenn die URL gültig ist.
Ungültiges JSON bei POST /node-apps/{id}/execute ist nicht der oben beschriebene Generate-400. Es wird zu einem 500 { "message": "Internal Error" } ohne Exception-Text und richtet sich nach Accept.
Andere 400-Antworten bei Assets und Node-Apps sind { "message": "..." } mit einer kurzen Erklärung, zum Beispiel No file provided bei einem Presigned Upload oder Invalid pagination parameters bei Node-App-Versionen. Ein fehlgeschlagener Asset-Upload reicht den Status des Upload-Dienstes durch (400, 401, 404 oder 500) und kann dessen Antworttext in message einfügen. Dieser Text ist manchmal ein JSON-String. Ungültige Query-Parameter bei GET /jobs ergeben 422, nicht 400.
401
Generate, Jobs, Assets, Styles und Node-Apps:
{ "message": "Presigned upload URL expired" } oder { "message": "Invalid presigned upload URL" } zurück.
402 Zahlung erforderlich
Für einen über die API abgerechneten Client (ein API-Key oder MCP mit API-Key), dessen API-Guthaben den Job nicht deckt:
402-Werte für message in der öffentlichen API:
Ein Generate-Aufruf mit Zero Data Retention in einem Workspace, für den es nicht aktiviert ist, gibt diesen Body zurück, immer als JSON:
402-Bodies. Diese beziehen sich auf das Compute-Guthaben des Workspaces, nicht auf das API-Guthaben.
403
404
Jeder 404 ist { "message" }, zum Beispiel bei einer unbekannten Job-ID:
Accept-Header macht diese Antworten zu HTML, außer Endpoint not found für ein Modell, das dein Key oder Plan nicht verwenden kann – das ist immer JSON. Ein authentifiziertes GET /jobs/{id} mit unbekannter ID ohne Accept ergibt 404 text/html.
Eine unbekannte Agent-Operation ergibt ebenfalls
404 { "message": "Endpoint not found" }, nicht das Agent-Format { "error", "code" }.
405
Der Body ist Klartext ohne Content-Type-Header, kein JSON, auch wenn Accept application/json ist. Der Text ist die Methode plus method not allowed, zum Beispiel GET method not allowed. Ein Allow-Header listet die Methoden auf, die der Pfad akzeptiert.
413 Payload zu groß
Ein zu großer Request-Body wird mit 413 abgelehnt. Von der API selbst richtet sich der Body nach Accept:
413. Sende Dateien nicht inline. Lade die Datei mit POST /assets hoch und übergib die zurückgegebene URL in der Generate-Anfrage.
Eingabe-Downloads
Ein Host, der404 oder 410 zurückgibt, führt zu einem dauerhaften 422. Der Body ist JSON, und Accept spielt eine Rolle:
410 des Hosts verwendet denselben Satz mit 410. Andere dauerhafte Ablehnungen verwenden Input file rejected: ….
Ein wiederholbarer Download-Fehler ist 502 oder 504. Verzweige anhand des Statuscodes, nicht des Bodys, und wiederhole die Anfrage.
Ein
502, der sich für dieselbe URL ständig wiederholt, bedeutet wahrscheinlich, dass die URL blockiert oder defekt ist. Ändere die URL.
Fehler bei der Konvertierung im 3D-Export sind ebenfalls 502. Dieser Pfad wurde nicht live getestet, daher kann der Body auch als Cloudflare-Klartext error code: 502 ankommen. Verzweige anhand des Statuscodes und wiederhole die Anfrage. Ein 502, der sich für dieselbe Modell-URL ständig wiederholt, bedeutet wahrscheinlich, dass die URL blockiert oder defekt ist.
429 Concurrency
Wenn der Job nicht in den Backlog gestellt werden kann, kann eine Anfrage über dem Concurrency-Limit mit 429 und Content-Type: application/json abgelehnt werden:
limit ist dein Concurrency-Limit für diese Art von Job. Es wird pro Nutzer gezählt, nicht pro Workspace. Es ist ungefähr: Ein kurzer Burst kann darüber hinaus angenommen werden, verlass dich also nicht darauf, dass genau die Anfrage limit + 1 fehlschlägt. jobType ist eine interne Job-Kategorie, nicht der öffentliche Modellpfad. Verzweige nicht anhand davon.
Krea 2 kann auch nur { "message": "CONCURRENCY_LIMIT_REACHED" } ohne limit oder jobType zurückgeben, wenn seine gemeinsame Warteschlange voll ist. Das ist nicht dein Limit. Warte mit Backoff und versuche es erneut.
Backlogging ist nur aktiv, wenn der Plan es enthält (Pro und höher), das Modell es unterstützt und die Anfrage nicht Zero Data Retention verwendet. Krea-2-Anfragen werden derzeit in keinem Plan in den Backlog gestellt und geben daher über dem Limit 429 zurück. Wenn es aktiv ist, wird der zusätzliche Job mit status: "backlogged" angenommen und startet, sobald ein Slot frei ist. Es gibt keine separate Obergrenze für den Backlog. Siehe Rate Limits.
Die API sendet weder Retry-After noch X-RateLimit-*. Die Antwort enthält jedoch cf-ray. Wiederhole die Anfrage bei 429 mit exponentiellem Backoff, nachdem laufende Jobs abgeschlossen sind (frage GET /jobs/{id} ab oder verwende einen Webhook).
Wenn ein später abgeschlossener Job das Guthaben aufbraucht, schlagen Jobs, die noch im Backlog stehen, mit error.code "insufficient_balance" fehl. Das ist ein fehlgeschlagener Job, kein HTTP-402. Diese Jobs senden keinen Webhook, frage also GET /jobs/{id} für Jobs im Backlog ab.
Agent-Operation-API
POST /agent/{operation} und GET /agent/session/{sessionId} geben { "error", "code"?, "allowedModels"? } zurück. Nur error ist erforderlich. allowedModels ist in camelCase. Ein Zug, der nach seiner Annahme fehlschlägt, erscheint als status: "failed" in der Session, nicht als einer dieser HTTP-Fehler. Siehe Agent.
Ein unbekannter Agent-Fehlercode ist trotzdem
422 mit { "error", "code" }. Der 404 für unbekannte Operationen und ein unbehandelter 500 verwenden { "message" } und richten sich nach Accept.
error.code fehlgeschlagener Jobs
GET /jobs und GET /jobs/{id} setzen error nur, wenn status "failed" ist. Es gibt kein verwendbares result:
Webhook-Zustellungen für einen fehlgeschlagenen Job verwenden dasselbe Job-Objekt, einschließlich
error. Eine Zustellung für einen abgebrochenen Job hat kein error. Ein Payload größer als 256 KiB wird nicht gesendet, und für diesen Job erfolgen keine weiteren Zustellungen, frage also stattdessen GET /jobs/{id} ab. Verifiziere die Signatur, bevor du dem Body vertraust. Siehe Webhooks.
Debugging
Es gibt keinen Krea-Request-ID-Header. Jede Antwort enthält jedoch dencf-ray-Header von Cloudflare. Es werden keine Retry-After- oder X-RateLimit-*-Header gesendet.
Wenn du an support@krea.ai schreibst, gib Folgendes an:
job_id, wenn der Aufruf einen Job erstellt oder angesprochen hat- Zeitpunkt und Endpoint
- Bei einem Fehler zum Anfragezeitpunkt den
cf-ray-Wert
Access-Control-Allow-Origin ist *. Bei Generate, Jobs, Assets, Styles und Node-Apps ist Access-Control-Expose-Headers nicht gesetzt, daher kann Browser-fetch cf-ray, Deprecation oder Sunset nicht lesen. Kopiere cf-ray aus dem Netzwerk-Log oder aus einem serverseitigen Client.
Prüfe bei jeder Antwort Deprecation und Sunset, bevor das Modell keine Aufrufe mehr annimmt. Siehe Deprecations.
Nächste Schritte
Job-Lebenszyklus
Frage den Status ab, bis der Job abgeschlossen ist, fehlschlägt oder abgebrochen wird
Webhooks
Verifiziere die Signatur bei der Zustellung eines fehlgeschlagenen Jobs
Rate Limits
Wann zusätzliche Jobs in den Backlog kommen und wann sie 429 zurückgeben
API-Keys & Abrechnung
API-Guthaben nach einem 402 aufladen