# Feil

Alle endepunkter feiler på samme måte: en HTTP-status og én JSON-konvolutt.

```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"
  }
}
```

| Felt | Betydning |
|---|---|
| `type` | Overordnet feilklasse. Bruk denne til å avgjøre hva du skal gjøre. |
| `code` | Den nøyaktige årsaken, stabil og maskinlesbar. Hver kode har en seksjon nedenfor; `doc_url` lenker til den. |
| `message` | Menneskelesbar forklaring som trygt kan logges eller vises til en utvikler. |
| `param` | Inndataparameteren eller headeren som er problemet, når det finnes en. |
| `details` | For inndatafeil: alle problemene som ble funnet: `[{ "param", "message" }]`. |
| `request_id` | Forespørselen det gjelder, når det finnes en. |

Det belastes ingenting for et kall som returnerer en feil. En forespørsel som feiler *etter* at den er godtatt, beholder statusen
`failed`, har `error: { "type", "code", "message" }` på forespørselsobjektet og får automatisk tilbakebetaling.

## Typer

| Type | HTTP-status | Hva du skal gjøre |
|---|---|---|
| `invalid_request` | 400, 413 eller 422 | Rett forespørselen. Nytt forsøk med samme kall vil feile igjen. |
| `authentication_error` | 401 | Send en gyldig nøkkel i `Authorization: Bearer <key>`. |
| `permission_error` | 403 | Bruk en nøkkel med nødvendig scope. |
| `not_found` | 404 | Kontroller modell-ID-en eller forespørsels-ID-en. |
| `insufficient_credits` | 402 | Gjør et påfyll av API-saldoen (`top_up_url` i feilen). |
| `budget_exceeded` | 402 | Nøkkelens eget budsjett er brukt opp. Endelig løsning: be nøkkeleieren øke det. |
| `conflict` | 409 | Ressursen er ikke i en tilstand som tillater dette kallet. |
| `rate_limited` | 429 | Vent `Retry-After` sekunder, og prøv deretter på nytt. |
| `upstream_error` | 502 | Modellens backend feilet. Det er trygt å prøve på nytt med samme `Idempotency-Key`: det kjøres igjen, og du ble ikke belastet. |
| `service_unavailable` | 503 | API-et er satt på pause, eller en avhengighet er nede. Prøv igjen senere. |
| `internal_error` | 500 | En feil hos oss. Prøv igjen. Hvis problemet fortsetter, kontakter du kundestøtte med tidspunktet og `request_id`. |

## Koder

### `invalid_request`

Generisk ugyldig forespørsel (400).

### `invalid_json`

Brødteksten er ikke gyldig JSON (400).

### `invalid_body`

Brødteksten er gyldig JSON, men ikke et objekt; modellinndata må være et JSON-objekt (400).

### `body_too_large`

Brødteksten er større enn 16 MB (413). Last opp store filer og send URL-en deres i stedet (se [Filer](https://doitong.com/developers/docs/files)).

### `invalid_parameter`

En spørringsparameter har feil verdi, for eksempel `limit` utenfor 1 til 100, `wait` er ikke et tall, en ukjent
`status` eller `category`, eller `storage` annet enn `permanent` / `temporary` (400). `param` angir hvilken.

### `invalid_category`

`GET /openapi.json?category=` angir en kategori som ikke finnes (400). `GET https://api.doitong.com/v1/categories` viser dem.

### `invalid_cursor`

`cursor` for et listekall tilhører ikke denne listen (400). Start på nytt uten en cursor.

### `invalid_idempotency_key`

Headeren `Idempotency-Key` er tom eller lengre enn 255 tegn (400).

### `invalid_arguments`

Et MCP-verktøykall har et manglende eller ugyldig argument (kun MCP). `param` angir argumentet.

### `invalid_input`

Modellinndata består ikke valideringen (422): en ukjent parameter (meldingen foreslår det nærmeste gyldige navnet),
en manglende obligatorisk parameter, feil type, en verdi utenfor den tillatte listen eller det tillatte området, eller både det kanoniske og det
opprinnelige navnet angitt med forskjellige verdier. `param` er den første problematiske parameteren, og `details` viser alle.
Det belastes ingenting.

### `unsupported_file`

En fil har en type vi ikke godtar (422), for eksempel en opplasting med en filtype vi ikke støtter, eller en `content_type`
som ikke samsvarer med filtypen.

### `invalid_webhook_url`

`webhook_url` er ikke en offentlig `https://`-URL (422). Private, lokale og vanlige `http://`-adresser avvises.

### `missing_api_key`

Endepunktet trenger en API-nøkkel, og ingen ble sendt (401).

### `invalid_api_key`

Nøkkelen er ukjent, tilbakekalt eller utløpt (401).

### `insufficient_scope`

Nøkkelen mangler scopet dette kallet trenger (403), for eksempel `models:run` for en kjøring eller `models:read` for å lese
forespørsler og saldoen. Se [Autentisering](https://doitong.com/developers/docs/authentication#scopes).

### `account_disabled`

Kontoen er avsluttet eller suspendert (403). Nøklene dens fungerer ikke lenger.

### `not_found`

Stien finnes ikke (404).

### `model_not_found`

Ingen offentlig modell har denne ID-en (404). List modeller med `GET https://api.doitong.com/v1/models`.

### `request_not_found`

Det finnes ingen forespørsel med denne ID-en på kontoen din (404). Forespørsler fra andre kontoer er aldri synlige.

### `insufficient_credits`

Kontoens **API-saldo** (API-kreditter, 1 000 API-kreditter = 1 $ – ikke kredittene i Doitong-appene) dekker ikke
prisen for dette kallet (402). Svaret sendes før noe belastes. Feilen inneholder `top_up_url`; legg til penger
på [https://doitong.com/developers/dashboard#balance](https://doitong.com/developers/dashboard#balance) og prøv igjen.

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

Kallet ville overskride API-nøkkelens eget budsjett i API-kreditter (402). Budsjettet fastsettes av nøkkeleieren; det hjelper ikke å prøve på nytt før eieren øker det.

### `conflict`

Kallet er i konflikt med ressursens nåværende tilstand (409).

### `idempotency_mismatch`

`Idempotency-Key` er allerede brukt med en annen brødtekst (409). Bruk en ny nøkkel for en ny operasjon.

### `idempotency_in_progress`

En forespørsel med samme `Idempotency-Key` opprettes akkurat nå (409). Prøv igjen om et øyeblikk for å hente den.

### `request_active`

Forespørselen er fortsatt `queued` eller `running`, så den har ingen filer som kan slettes ennå (409). Slett dem når den er ferdig.

### `not_cancelable`

Forespørselen er allerede `succeeded` eller `failed` og kan ikke avbrytes (409).

### `rate_limited`

Nøkkelen sendte for mange forespørsler i det gjeldende tidsvinduet (429). Se headerne `X-RateLimit-*` og `Retry-After`.

### `too_many_inflight`

Kontoen har allerede 10 forespørsler som er `queued` eller `running` (429). Start den neste når en av dem er ferdig.

### `upstream_error`

Modellens backend avviste eller feilet forespørselen (502 ved kjøring, eller `failed` med denne koden på forespørselen). API-kredittene
betales tilbake. Hvis backenden selv avviste inndataene, returnerer kallet `422 invalid_input` med meldingen.

### `upstream_lost`

Modellens backend kjenner ikke lenger forespørselen, så det vil aldri komme noe resultat. Den avsluttes som `failed` med denne koden
(type `upstream_error`) og får tilbakebetaling. Kjør den på nytt.

### `timeout`

Forespørselen kjørte lenger enn grensen (15 minutter for bilder, 60 for video, 30 ellers) og ble stoppet. Den avsluttes som
`failed` med denne koden og får tilbakebetaling.

### `service_unavailable`

API-et er midlertidig satt på pause, eller en avhengighet som filopplastinger er nede (503). Prøv igjen senere.

### `internal_error`

Noe gikk galt hos oss (500). Prøv igjen. Hvis problemet fortsetter, kontakter du kundestøtte.

### `charge_failed`

Kontoen kunne ikke belastes på grunn av et internt problem (500). Forespørselen merkes som `failed`; ingenting ble trukket.
Prøv igjen.

### `pricing_unavailable`

Modellens pris er ikke konfigurert, så den kan ikke beregnes eller kjøres akkurat nå (500).
