# Fel

Alla ändpunkter misslyckas på samma sätt: en HTTP-status och ett JSON-kuvert.

```json
{
  "error": {
    "type": "invalid_request",
    "code": "invalid_input",
    "message": "duration must be one of 5, 10.",
    "param": "duration",
    "details": [ { "param": "duration", "message": "duration must be one of 5, 10." } ],
    "request_id": null,
    "doc_url": "https://doitong.com/developers/docs/errors#invalid_input"
  }
}
```

| Fält | Betydelse |
|---|---|
| `type` | Övergripande felklass. Utgå från denna när du avgör vad som ska göras. |
| `code` | Exakt orsak, stabil och maskinläsbar. Varje kod har ett avsnitt nedan; `doc_url` länkar till det. |
| `message` | Läsbar förklaring som är säker att logga eller visa för en utvecklare. |
| `param` | Indataparametern eller headern som orsakar felet, när en sådan finns. |
| `details` | För indatafel: alla upptäckta problem: `[{ "param", "message" }]`. |
| `request_id` | Begäran som det gäller, när en sådan finns. |

Inget debiteras för ett anrop som returnerar ett fel. En begäran som misslyckas *efter* att den har accepterats behåller statusen
`failed`, innehåller `error: { "type", "code", "message" }` i begärandeobjektet och återbetalas automatiskt.

## Typer

| Typ | HTTP-status | Åtgärd |
|---|---|---|
| `invalid_request` | 400, 413 eller 422 | Korrigera begäran. Om samma anrop försöks igen misslyckas det på nytt. |
| `authentication_error` | 401 | Skicka en giltig nyckel i `Authorization: Bearer <key>`. |
| `permission_error` | 403 | Använd en nyckel med rätt scope. |
| `not_found` | 404 | Kontrollera modell-id:t eller begärande-id:t. |
| `insufficient_credits` | 402 | Gör en påfyllning av API-saldot (`top_up_url` i felet). |
| `budget_exceeded` | 402 | Nyckelns eget budget är förbrukat. Slutlig åtgärd: be nyckelägaren höja det. |
| `conflict` | 409 | Resursen befinner sig inte i ett tillstånd som tillåter detta anrop. |
| `rate_limited` | 429 | Vänta `Retry-After` sekunder och försök sedan igen. |
| `upstream_error` | 502 | Modellens backend misslyckades. Det är säkert att försöka igen med samma `Idempotency-Key`: körningen görs om och du debiterades inte. |
| `service_unavailable` | 503 | API:t är pausat eller en beroendetjänst ligger nere. Försök igen senare. |
| `internal_error` | 500 | Ett fel hos oss. Försök igen; om det kvarstår kontaktar du supporten med tidpunkten och `request_id`. |

## Koder

### `invalid_request`

Allmänt felaktigt utformad begäran (400).

### `invalid_json`

Brödtexten är inte giltig JSON (400).

### `invalid_body`

Brödtexten är giltig JSON men inte ett objekt; modellindata måste vara ett JSON-objekt (400).

### `body_too_large`

Brödtexten är större än 16 MB (413). Ladda upp stora filer och skicka deras URL i stället (se [Filer](https://doitong.com/developers/docs/files)).

### `invalid_parameter`

En frågeparameter har ett felaktigt värde, till exempel `limit` utanför 1 till 100, `wait` som inte är ett tal, en okänd
`status` eller `category`, eller `storage` annat än `permanent` / `temporary` (400). `param` anger vilken.

### `invalid_category`

`GET /openapi.json?category=` anger en kategori som inte finns (400). `GET https://api.doitong.com/v1/categories` listar dem.

### `invalid_cursor`

`cursor` i ett listanrop hör inte till denna lista (400). Börja om utan en cursor.

### `invalid_idempotency_key`

Headern `Idempotency-Key` är tom eller längre än 255 tecken (400).

### `invalid_arguments`

Ett MCP-verktygsanrop saknar ett argument eller innehåller ett felaktigt argument (endast MCP). `param` anger argumentet.

### `invalid_input`

Modellindata klarar inte valideringen (422): en okänd parameter (meddelandet föreslår närmaste giltiga namn),
en obligatorisk parameter saknas, fel typ, ett värde utanför den tillåtna listan eller intervallet, eller både det kanoniska och det
inhemska namnet har angetts med olika värden. `param` är den första felaktiga parametern och `details` listar alla.
Inget debiteras.

### `unsupported_file`

En fil har en typ som vi inte accepterar (422), till exempel en uppladdning med ett tillägg som inte stöds eller en `content_type`
som inte stämmer överens med tillägget.

### `invalid_webhook_url`

`webhook_url` är inte en offentlig `https://`-URL (422). Privata, lokala och vanliga `http://`-adresser avvisas.

### `missing_api_key`

Ändpunkten behöver en API-nyckel men ingen skickades (401).

### `invalid_api_key`

Nyckeln är okänd, återkallad eller utgången (401).

### `insufficient_scope`

Nyckeln saknar det scope som anropet behöver (403), till exempel `models:run` för en körning eller `models:read` för att läsa
begäranden och saldot. Se [Autentisering](https://doitong.com/developers/docs/authentication#scopes).

### `account_disabled`

Kontot är stängt eller avstängt (403). Dess nycklar fungerar inte längre.

### `not_found`

Sökvägen finns inte (404).

### `model_not_found`

Ingen offentlig modell har detta id (404). Lista modeller med `GET https://api.doitong.com/v1/models`.

### `request_not_found`

Ingen begäran med detta id finns i ditt konto (404). Andra kontons begäranden är aldrig synliga.

### `insufficient_credits`

Kontots **API-saldo** (API-krediter, 1 000 API-krediter = 1 $ – inte krediterna i Doitong-apparna) täcker inte
priset för detta anrop (402). Svaret skickas innan något debiteras. Felet innehåller `top_up_url`; fyll på pengar
på [https://doitong.com/developers/dashboard#balance](https://doitong.com/developers/dashboard#balance) och försök igen.

```json
{ "error": { "type": "insufficient_credits", "code": "insufficient_credits",
             "message": "This request costs 560 API credits ($0.56); the API balance is 120 API credits ($0.12). Top up at https://doitong.com/developers/dashboard#balance",
             "top_up_url": "https://doitong.com/developers/dashboard#balance", "doc_url": "https://doitong.com/developers/docs/errors#insufficient_credits" } }
```

### `budget_exceeded`

Anropet skulle överskrida API-nyckelns eget budget i API-krediter (402). Budgeten ställs in av nyckelägaren; nya försök hjälper inte
förrän ägaren höjer den.

### `conflict`

Anropet står i konflikt med resursens aktuella tillstånd (409).

### `idempotency_mismatch`

`Idempotency-Key` har redan använts med en annan brödtext (409). Använd en ny nyckel för en ny åtgärd.

### `idempotency_in_progress`

En begäran med samma `Idempotency-Key` skapas just nu (409). Försök igen om ett ögonblick för att hämta den.

### `request_active`

Begäran är fortfarande `queued` eller `running`, så den har ännu inga filer att ta bort (409). Ta bort dem när den har slutförts.

### `not_cancelable`

Begäran är redan `succeeded` eller `failed` och kan inte avbrytas (409).

### `rate_limited`

Nyckeln skickade för många begäranden under det aktuella tidsfönstret (429). Se headerna `X-RateLimit-*` och `Retry-After`.

### `too_many_inflight`

Kontot har redan 10 begäranden som är `queued` eller `running` (429). Starta nästa när en av dem har slutförts.

### `upstream_error`

Modellens backend avvisade eller misslyckades med begäran (502 vid körning, eller `failed` med denna kod på begäran). API-krediterna
återbetalas. Om backend själv avvisade indata returnerar anropet i stället `422 invalid_input` med sitt meddelande.

### `upstream_lost`

Modellens backend känner inte längre till begäran, så inget resultat kommer någonsin. Den avslutas som `failed` med denna kod
(typen `upstream_error`) och återbetalas. Kör den igen.

### `timeout`

Begäran kördes längre än gränsen (15 minuter för bilder, 60 för video, annars 30) och stoppades. Den avslutas som
`failed` med denna kod och återbetalas.

### `service_unavailable`

API:t är tillfälligt pausat eller en beroendetjänst, till exempel filuppladdningar, ligger nere (503). Försök igen senare.

### `internal_error`

Något gick fel hos oss (500). Försök igen; om det kvarstår kontaktar du supporten.

### `charge_failed`

Kontot kunde inte debiteras på grund av ett internt problem (500). Begäran markeras som `failed`; inget togs. Försök igen.

### `pricing_unavailable`

Modellens pris är inte konfigurerat, så den kan inte prisberäknas eller köras just nu (500).
