Przejdź do głównej treści
← Dokumentacja API

Błędy

Rozgałęziaj po kodzie błędu, nigdy po komunikacie. Tabela powstaje z dokumentu OpenAPI.

Błędy

StatusKodZnaczenie
400invalid_requestBłąd schematu. details.path wskazuje pole, które go wywołało.
401unauthorizedBrakujący lub nieznany klucz API.
402quota_exceededRetry-AfterWyczerpany miesięczny limit. Retry-After podaje liczbę sekund do początku nowego miesiąca.
403key_revokedKlucz istnieje, ale nie może być użyty: został unieważniony albo subskrypcja Engine API tego konta nie jest już aktywna. Pole message mówi, o który przypadek chodzi.
404not_foundNie ma takiej trasy — to samo otrzymasz, gdy ścieżka jest poprawna, ale metoda nie.
409idempotency_conflictRetry-AfterTylko z nagłówkiem Idempotency-Key: klucz użyto już dla innego żądania (idempotency_conflict — użyj nowego klucza) albo pierwsze żądanie z nim wciąż trwa (idempotency_in_progress — ponów po Retry-After, a otrzymasz jego odpowiedź). Nigdy nie jest naliczane.
409idempotency_in_progressRetry-AfterTylko z nagłówkiem Idempotency-Key: klucz użyto już dla innego żądania (idempotency_conflict — użyj nowego klucza) albo pierwsze żądanie z nim wciąż trwa (idempotency_in_progress — ponów po Retry-After, a otrzymasz jego odpowiedź). Nigdy nie jest naliczane.
413too_largeDane wejściowe przekraczają limit (patrz Limity).
429busyRetry-AfterChwilowy brak wolnych zasobów albo — na każdej ścieżce uwierzytelnianej kluczem — Twój adres wysłał w ciągu minuty zbyt wiele nieznanych kluczy API. Retry-After w sekundach; to nigdy nie obciąża Twojego limitu.
500internalNieoczekiwany błąd albo backend uwierzytelniania jest nieosiągalny (zapytania są wtedy odrzucane — fail closed).
503service_unavailableŻądany silnik nie może być teraz obsłużony — silnik nestingu albo asynchroniczny silnik max. Dla max są dwie przyczyny, a pole message mówi która: poziom nie jest wbudowany w to wdrożenie, albo jest wbudowany, ale worker rozwiązujący zadania nie odpowiada. Fail-closed przed zarezerwowaniem wywołania, więc nigdy nic nie kosztuje.
504solve_timeoutObliczenia przekroczyły swój twardy limit czasu. Na ścieżkach prostokątnych wymusza go proxy; przy /v1/optimize/nest silnik wymusza własny, krótszy budżet i odpowiada kodem solve_timeout w zwykłej kopercie. Wywołanie, z którego proxy zrezygnowało, nie jest naliczane.

Treść błędu

Każdy błąd generowany przez sam silnik korzysta z tej samej koperty. Rozgałęziaj logikę na polu error, które jest stabilnym kodem; nigdy na message, którego brzmienie może się zmienić między wydaniami. details występuje przy invalid_request, gdzie path wskazuje pole, które wywołało błąd, oraz przy too_large, gdzie max i got podają limit i to, co zostało przesłane.

Wyjątkiem jest treść żądania powyżej limitu rozmiaru: zawiera wtedy maxBytes. Nieznany engine dodaje available, czyli identyfikatory silników akceptowane przez to wdrożenie.

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" }
  • Zarówno 402, jak i 429 zwracają nagłówek Retry-After w sekundach. Przy 402 odlicza on czas do zerowania limitu o 00:00 UTC pierwszego dnia następnego miesiąca; przy 429 jest to krótkie wstrzymanie, a 429 nigdy nie zużywa limitu — zarezerwowane wywołanie jest oddawane.
  • Odmowy publicznego klucza demo używają tej samej koperty: poza jego zakresem (nesting, silnik max, usage, jobs, import, zadanie powyżej jego limitów rozmiaru) 403 key_revoked z details.reason "demo_scope"; przy jego limicie częstotliwości 429 busy z details.reason "demo_rate_limit" i details.limit. Obie niosą details.testKeyUrl, gdzie tworzy się darmowy klucz testowy, a każda odpowiedź demo ma nagłówek X-CutOptim-Demo: true.
  • Błąd routingu odpowiada kodem not_found, który celowo znajduje się poza powyższą listą, bo generuje go router, a nie kontrakt API. Otrzymasz 404, a nie 405, gdy ścieżka jest poprawna, ale metoda nie: wszystkie cztery endpointy optymalizacji przyjmują wyłącznie POST.
  • Na ścieżkach prostokątnych 504 pochodzi z reverse proxy, a nie z silnika, więc jego treść należy do proxy i nie jest tą kopertą JSON; pojedyncze zadanie w granicach poniższych limitów wejściowych mieści się w nim z dużym zapasem, ale kilka najcięższych zadań naraz może go przekroczyć w kolejce — a wywołanie, z którego proxy zrezygnowało, nie jest naliczane.

    Wyjątkiem jest /v1/optimize/nest: to obliczenie jest podprocesem z własnym budżetem, celowo utrzymanym poniżej limitu proxy — przekroczenie czasu używa tam tej koperty, z kodem solve_timeout.

Czy któryś silnik nie działa? Strona statusu pokazuje na żywo stan witryny, Engine API, silnika nestingu i asynchronicznego silnika max: Status usługi ↗