Błędy

Każda odpowiedź o błędzie z /api/v1/* zawiera stabilne, czytelne dla maszyn pole code. Partnerzy filtrują według pola code, a nie statusu HTTP (statusy są współdzielone przez wiele kodów) ani pola message (które jest lokalizowane). Przestrzeń kodów działa wyłącznie w trybie dopisywania: raz wdrożony kod nigdy nie zostanie zmieniony, przenumerowany ani usunięty.

Struktura odpowiedzi

Typowa odpowiedź 400:

json
{
"code": "VALIDATION_FAILED",
"message": "Name is required.",
"errors": { "name": ["Name is required."] }
}
  • code: jedna z wartości w poniższym katalogu. Należy filtrować na jej podstawie.
  • message: czytelny dla człowieka opis, zlokalizowany zgodnie z nagłówkiem Accept-Language klienta (domyślnie hr). Nie należy przetwarzać tej wartości programistycznie.
  • errors: występuje w odpowiedziach VALIDATION_FAILED. Słownik, w którym kluczami są nazwy pól, a wartościami tablice zlokalizowanych komunikatów dla każdego pola.

Błędy serwera (HTTP 500) pomijają słownik errors i zawierają ogólny komunikat. Należy ponowić próbę z opóźnieniem (back-off). Jeśli błąd będzie się powtarzał, należy skontaktować się ze wsparciem technicznym, podając identyfikator żądania (widoczny w nagłówku odpowiedzi X-Request-Id, jeśli jest obecny).

Katalog

KodHTTPKiedy występujeReakcja partnera
VALIDATION_FAILED400Walidacja treści żądania nie powiodła się lub brakuje wymaganego nagłówka.Sprawdź słownik errors. Wyświetl użytkownikowi końcowemu komunikaty na poziomie poszczególnych pól.
EXCHANGE_RATE_UNAVAILABLE400Dostawca kursów walut organizacji nie publikuje kursu dla danej waluty w żądanym dniu i nie istnieje żaden kurs historyczny, którego można by użyć jako awaryjnego.Błąd z rodziny walidacji z obiektem errors mapowanym na pola. Poproś użytkownika o ręczne wprowadzenie kursu lub wybierz walutę obsługiwaną przez dostawcę.
UNAUTHORIZED401Brak klucza API, jest on nieprawidłowo sformatowany lub został unieważniony.Sprawdź nagłówek Authorization. Wygeneruj klucz ponownie, jeśli został unieważniony.
API_ACCESS_NOT_ENABLED402Docelowa firma nie posiada funkcji subskrypcji ApiAccess.Zmień plan firmy na Enterprise lub dodaj dodatek ApiAccess w ustawieniach rozliczeń.
FORBIDDEN403Uwierzytelniono pomyślnie, ale użytkownik, który wygenerował klucz, nie ma uprawnień do wykonania tej operacji w tym zakresie.Sprawdź rolę aktywnego użytkownika w docelowej firmie. Wygeneruj klucz ponownie jako administrator.
NOT_FOUND404Docelowy zasób nie istnieje lub został usunięty.Zweryfikuj identyfikator. Zasób mógł zostać usunięty przez innego użytkownika.
CONFLICT409Zduplikowany zasób, nieaktualny warunek wstępny lub ponowne przesłanie klucza idempotencji z inną treścią żądania.Uzgodnij stan danych. Ponowna próba może się powieść z innym payloadem lub może nie wymagać żadnego działania.
RATE_LIMIT_EXCEEDED429Przekroczono limit zapytań dla klucza (sekundowy, godzinowy lub dzienny).Wstrzymaj wysyłanie żądań zgodnie z nagłówkiem Retry-After. Zobacz Limity zapytań.
KEY_REVOKED401Zarezerowane dla przyszłej niestandardowej obsługi wyzwań (challenge handler). Obecnie nie jest zwracane.Przygotuj wcześniej swój kod obsługi. Obecnie proces unieważnionego klucza zwraca czysty kod HTTP 401.
INTERNAL_ERROR500Nieobsługiwany błąd serwera.Ponów próbę z wykładniczym opóźnieniem (exponential back-off). Jeśli błąd będzie się powtarzał, skontaktuj się ze wsparciem technicznym.

Gwarancja wyłącznie dopisywania

Raz wdrożony kod pozostaje w katalogu na zawsze, nawet jeśli generujący go element zostanie usunięty. Partnerzy mogą mieć pewność, że ich instrukcje warunkowe switch oparte na polu code nigdy nagle nie przestaną działać z powodu zmiany nazwy wartości przez locco. Jeśli zachowanie powiązane z danym kodem ulegnie zmianie (inny status HTTP, nowe ograniczenie), zostanie to opisane w dzienniku zmian (changelog); sam ciąg znaków kodu pozostaje stabilny.

Zachęca się partnerów do defensywnej obsługi nieznanych kodów: jeśli nowy kod zostanie wdrożony przed aktualizacją Twojego klienta, należy potraktować go jako ogólny błąd (prawdopodobnie o strukturze zbliżonej do INTERNAL_ERROR) i zapisać surową odpowiedź w logach do późniejszej analizy, zamiast doprowadzać do awarii aplikacji.