Salta al contenuto principale
← Riferimento API

Errori

Ramifica sul codice di errore, mai sul messaggio. La tabella è generata dal documento OpenAPI.

Errori

StatoCodiceSignificato
400invalid_requestErrore di schema. details.path indica il campo che ha causato il problema.
401unauthorizedChiave API mancante o sconosciuta.
402quota_exceededRetry-AfterQuota mensile raggiunta. Retry-After indica i secondi che mancano al rinnovo del mese.
403key_revokedLa chiave esiste ma non può essere usata: è stata revocata, oppure l’abbonamento Engine API dell’account non è più attivo. Il campo message dice quale dei due.
404not_foundRoute inesistente — è anche ciò che ottieni per un path corretto con il metodo sbagliato.
409idempotency_conflictRetry-AfterSolo con l'intestazione Idempotency-Key: la chiave è già stata usata per un'altra richiesta (idempotency_conflict — usare una chiave nuova), oppure la prima richiesta con essa è ancora in corso (idempotency_in_progress — riprovare dopo Retry-After per riceverne la risposta). Mai addebitato.
409idempotency_in_progressRetry-AfterSolo con l'intestazione Idempotency-Key: la chiave è già stata usata per un'altra richiesta (idempotency_conflict — usare una chiave nuova), oppure la prima richiesta con essa è ancora in corso (idempotency_in_progress — riprovare dopo Retry-After per riceverne la risposta). Mai addebitato.
413too_largeInput oltre un limite (vedi Limiti).
429busyRetry-AfterCapacità momentaneamente esaurita oppure — su qualsiasi percorso autenticato con chiave — il tuo indirizzo ha inviato troppe chiavi API sconosciute in un minuto. Retry-After in secondi; non viene mai conteggiato nella tua quota.
500internalErrore inatteso, oppure il backend di autenticazione non è raggiungibile (in tal caso le richieste vengono rifiutate — fail closed).
503service_unavailableUn motore richiesto non può essere servito ora — il motore di nesting o il motore max asincrono. Per max le cause sono due, e il campo message dice quale: il livello non è incluso in questo deployment, oppure è incluso ma il worker che risolve i lavori non risponde. Fail-closed prima che una chiamata sia riservata, quindi non costa mai nulla.
504solve_timeoutLa risoluzione ha superato il proprio limite rigido di tempo. Sui percorsi rettangolari lo impone il proxy; su /v1/optimize/nest è il motore a imporre il proprio budget, più breve, e risponde con solve_timeout nella busta normale. Una chiamata abbandonata dal proxy non viene addebitata.

Corpo dell’errore

Ogni errore prodotto dal motore stesso usa la stessa struttura. Basa la logica condizionale su error, che è un codice stabile; mai su message, la cui formulazione può cambiare da una release all’altra. details è presente su invalid_request, dove path indica il campo che ha causato il problema, e su too_large, dove max e got riportano il limite e ciò che hai inviato.

Fa eccezione un corpo della richiesta oltre il limite di dimensione: riporta invece maxBytes. Un engine sconosciuto aggiunge available, gli id di engine che questo deployment accetta.

HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8

{
  "error": "invalid_request",
  "message": "parts[0].h: must be greater than 0",
  "details": { "path": "parts[0].h" }
}
HTTP/1.1 402 Payment Required
Retry-After: 41400
Content-Type: application/json; charset=utf-8

{ "error": "quota_exceeded", "message": "monthly quota exhausted" }
  • Sia 402 sia 429 riportano un header Retry-After in secondi. Su 402 conta alla rovescia fino all’azzeramento della quota alle 00:00 UTC del 1° del mese successivo; su 429 è una breve attesa prima di riprovare, e un 429 non consuma mai quota — la chiamata riservata viene restituita.
  • I rifiuti della chiave demo pubblica usano la stessa busta: fuori dal suo ambito (nesting, il motore max, usage, jobs, import, un lavoro oltre i suoi limiti di dimensione) un 403 key_revoked con details.reason "demo_scope"; al suo limite di frequenza un 429 busy con details.reason "demo_rate_limit" e details.limit. Entrambi portano details.testKeyUrl, dove si crea una chiave di test gratuita, e ogni risposta demo ha l'header X-CutOptim-Demo: true.
  • Un errore di routing risponde con not_found, un codice volutamente fuori dall’elenco qui sopra perché lo produce il router e non il contratto dell’API. Ottieni 404 e non 405 quando il path è corretto ma il metodo è sbagliato: tutti e quattro gli endpoint di ottimizzazione accettano solo POST.
  • Sui percorsi rettangolari il 504 arriva dal reverse proxy, non dal motore, quindi il suo corpo è quello del proxy e non questa struttura JSON; un singolo lavoro entro i limiti di input indicati sotto resta ben al di sotto, ma più lavori tra i più pesanti arrivati insieme possono superarlo in coda — e una chiamata abbandonata dal proxy non viene addebitata. /v1/optimize/nest è l’eccezione: quella risoluzione è un sottoprocesso con un proprio budget, tenuto deliberatamente sotto il limite del proxy, quindi lì un timeout usa questa struttura, con il codice solve_timeout.

Un motore è fermo? La pagina di stato mostra in tempo reale lo stato del sito, della Engine API, del motore di nesting e del motore asincrono max: Stato del servizio ↗