Błędy — katalog i sposoby rozwiązania¶
Kody HTTP¶
| Kod | Kiedy | Co robić |
|---|---|---|
200 |
żądanie przetworzone; przy tworzeniu zleceń nie znaczy „wszystko przyjęte” | przejdź po elementach print_requests[] — tworzenie zlecenia |
201 |
zasób utworzony (konto, token, drukarka, connector) | — |
204 |
zasób usunięty (connector) | — |
401 ({"error":"login_required"}) |
brak nagłówka Authorization, nierozpoznany format albo niepoprawny JWT (zły podpis/fingerprint, wygasły exp, uszkodzona struktura); odpowiedź nie niesie przyczyny |
zweryfikuj format Bearer <jwt> i budowę JWT — uwierzytelnianie |
404 |
zasób nie istnieje (np. zlecenie o danym id, connector o danym code) |
sprawdź identyfikator i subdomenę konta (zasób innego konta = 404) |
422 |
błąd walidacji / operacja niedozwolona w tym stanie | komunikat w body — katalog niżej |
5xx / timeout |
awaria po stronie serwera | ponów później, wydłużając odstęp między próbami |
Body błędu ma zwykle kształt {"status":"error","message":"…","print_requests":[…]}
(tworzenie zleceń — kontrakt pozycyjny),
{"message":"…"} (pozostałe akcje zleceń) albo mapę pole → lista komunikatów
(walidacje drukarki).
Rejestracja konta¶
Walidacje rejestracji wracają jako 422
z mapą pole → lista komunikatów; błędy użytkownika są zagnieżdżone pod kluczem user.
| Odpowiedź | Przyczyna | Rozwiązanie |
|---|---|---|
{"user":{"login":["zostało już zajęte"]}} |
ten e-mail jest już zarejestrowany — login domyślnie równa się e-mailowi, więc kolizja wychodzi na polu, którego nie wysyłasz |
użyj innego e-maila albo utwórz token na istniejącym koncie |
Tworzenie zlecenia — błędy odrzuconych dokumentów¶
Odrzucony dokument wraca w odpowiedzi tworzenia jako element
{"external_id": …, "errors": [komunikaty]} na swojej pozycji
(kontrakt pozycyjny). Błąd całego żądania
(pusta/nieobecna tablica print_requests) wraca w top-level message.
Katalog komunikatów. Błędy pojedynczej pozycji (cena, stawka VAT, rabat, brak nazwy)
przychodzą jako komunikat wielolinijkowy: Error: Nieprawidłowe dane:, numer dokumentu
i numer pozycji, na końcu komunikat z katalogu — dopasowuj go po fragmencie.
| Komunikat | Przyczyna | Rozwiązanie |
|---|---|---|
Brak paragonów do wydruku |
pusta/nieobecna top-levelowa tablica print_requests — także wtedy, gdy payload ma inny kształt (np. dokumenty zagnieżdżone pod innym kluczem) |
wyślij dokumenty w top-levelowej tablicy print_requests (kształt) |
ID paragonu jest nieprawidłowe |
brak external_id dokumentu |
zawsze nadawaj external_id |
vendor: nie może być puste |
brak pola vendor albo pusta wartość (ani wspólnej dla żądania, ani per dokument) |
podaj niepusty vendor — opis vendora |
Nie znaleziono drukarki o id '…' / …o nazwie '…' |
printer_id/printer_name pozycji nie pasuje do żadnej drukarki konta |
pobierz listę GET /printers.json i użyj aktualnego id |
nieznany tryb wydruku '…' (dozwolone: print, e_receipt) |
literówka w mode |
użyj print lub e_receipt |
Brak pozycji na paragonie. |
puste positions |
dodaj pozycje |
Brakuje nazwy pozycji |
pozycja bez name |
uzupełnij nazwę pozycji |
ma inną walutę niż PLN. |
currency ≠ PLN |
fiskalizować można wyłącznie dokumenty w PLN |
Kwota brutto musi być dodatnia. |
price_gross dokumentu ≤ 0 |
popraw kwoty |
Niepoprawna ilość na pozycji N. … (ilość musi być dodatnia) |
quantity pozycji ≤ 0 |
ustaw quantity większe od zera |
Niepoprawna ilość na pozycji N. … (ilość może mieć maksymalnie 5 miejsc po przecinku) |
quantity ma więcej niż 5 miejsc po przecinku |
zaokrąglij quantity do maksymalnie 5 miejsc po przecinku |
Niepoprawna cena X (cena musi być dodatnia) |
total_price_gross pozycji ≤ 0 |
popraw pozycję |
Niepoprawna cena jednostkowa X (price_gross musi być dodatni) |
price_gross pozycji ≤ 0 |
popraw cenę jednostkową |
Niepoprawna wartość brutto na pozycji N. … |
total_price_gross ≠ price_gross × quantity (2 miejsca) |
wyrównaj wartości pozycji |
Niepoprawna wartość brutto na dokumencie |
suma pozycji (minus rabaty) ≠ price_gross dokumentu |
wyrównaj sumę dokumentu albo pomiń price_gross (zostanie wyliczona) |
Niepoprawna stawka VAT "…" |
tax spoza mapowania stawek |
użyj: 23, 8, 5, 0, zw, disabled |
Rabat na tej pozycji nie da się rozbić na … szt. z ceną jednostkową co do grosza na tym urządzeniu. Prześlij price_gross i total_price_gross już PO rabacie (bez pól discount/discount_percent). |
faktura (kind=vat) z rabatem na drukarce, która nie obsługuje osobnej linii rabatu, a rabatu nie da się wliczyć w cenę jednostkową co do grosza — błąd zwracany przy wydruku, nie przy tworzeniu zlecenia |
prześlij price_gross/total_price_gross już po rabacie, bez pól discount/discount_percent — rabat na fakturze |
Fiskalizacja dokumentów ze stawką disabled wymaga wcześniejszej konfiguracji Zera technicznego w Ustawieniach na stronie Paragony.pl |
pozycja ma tax="disabled", a konto nie ma skonfigurowanego Zera technicznego |
skonfiguruj Zero techniczne w Ustawieniach konta |
eParagon można wystawić tylko z Paragonu |
mode=e_receipt przy kind ≠ receipt |
e-paragon wymaga kind="receipt" |
Próba wydruku faktury bez numeru NIP nabywcy. |
dokument typu faktura bez buyer.tax_no (dotyczy części drukarek) |
uzupełnij NIP nabywcy |
Paragon jest już zafiskalizowany — nie drukujemy ponownie |
aktywne zlecenie o tym external_id jest już zafiskalizowane |
to ochrona przed podwójną fiskalizacją — szczegóły; jeśli to NOWY dokument, nadaj mu inny external_id |
Osobny przypadek: mode=e_receipt na drukarce, która nie obsługuje / nie ma
skonfigurowanych e-paragonów, nie odrzuca dokumentu — zlecenie jest przyjmowane
od razu ze statusem error (element odpowiedzi ma id i status: "error",
dokument nie zostanie zafiskalizowany). Skonfiguruj e-paragony na drukarce
(aplikacja Paragony.pl) albo użyj mode=print.
Rozliczenia e-paragonów¶
Wystawianie e-paragonów wymaga aktywnej subskrypcji z dostępnym limitem; ważnej subskrypcji
wymagają też paragony papierowe. Zlecenie (niezależnie od mode) może zostać odrzucone z:
| Komunikat | Przyczyna | Rozwiązanie |
|---|---|---|
Rozliczenia paragonów nie są skonfigurowane dla tego konta — zlecenie odrzucone |
konto nie ma skonfigurowanych rozliczeń paragonów — blokuje utworzenie każdego zlecenia, niezależnie od mode (papierowy paragon też) |
skonfiguruj/opłać rozliczenia w sekcji Płatności konta Paragony.pl (konta prowadzone przez Fakturownię — w panelu Fakturowni) |
Brak subskrypcji Paragony.pl — opłać abonament |
konto nie ma subskrypcji Paragony.pl | opłać abonament |
Subskrypcja Paragony.pl nieaktywna — opłać/odnów abonament |
subskrypcja wygasła | odnów abonament |
Brak dostępnych użyć e-paragonów (paczka wyczerpana) |
limit e-paragonów w okresie wyczerpany | dokup pakiet e-paragonów |
Gdzie opłacić: sekcja Płatności na koncie Paragony.pl; konta prowadzone przez Fakturownię opłacają pakiety w panelu Fakturowni. Rozliczany jest wystawiony e-paragon — zlecenia zakończone błędem i anulowane nie pomniejszają limitu.
Operacje na istniejącym zleceniu¶
| Żądanie | Komunikat / kod | Przyczyna |
|---|---|---|
DELETE …/:id |
422, Niedozwolone przejście statusu paragonu (<stary> → cancelled) |
zlecenie już zafiskalizowane — nie da się anulować (cykl życia) |
DELETE …/:id |
200, status bez zmian |
zlecenie już było cancelled/error — anulowanie jest idempotentne |
GET/DELETE …/:id |
404 |
zlecenie nie istnieje (albo żądanie poszło na złą subdomenę) |
Wysyłka e-paragonu mailem¶
Katalog odpowiedzi endpointu send_by_email:
| Komunikat / kod | Przyczyna | Rozwiązanie |
|---|---|---|
422, E-paragon nie został jeszcze wystawiony |
status zlecenia dochodzący (to_print/printing/er_pending/er_fail) |
poczekaj na webhook ze statusem er_printed i spróbuj ponownie |
422, To zlecenie nie ma i nie będzie mieć e-paragonu |
status końcowy bez e-paragonu (printed/er_fatal/error/cancelled) |
ponowienie bezcelowe — e-paragon dla tego zlecenia nigdy nie powstanie |
422, Nieprawidłowy adres e-mail |
buyer_email błędny składniowo |
popraw adres |
422, Brak adresu e-mail nabywcy — podaj go w żądaniu |
zlecenie nie ma adresu doręczenia, żądanie też go nie podało | podaj buyer_email w żądaniu |
422, Wyczerpano limit wysyłek e-paragonu dla tego zlecenia (5) |
zlecenie zużyło wszystkie 5 wysyłek (limit) | ponowienie bezcelowe — limit nie odnawia się; przekaż view_url innym kanałem |
429, Zbyt wiele prób wysyłki, spróbuj ponownie za chwilę |
anty-spam limit wywołań | odczekaj i ponów |
404 |
zlecenie nie istnieje | sprawdź id i subdomenę konta |
Drukarki¶
| Komunikat / kod | Przyczyna | Rozwiązanie |
|---|---|---|
422 z {"default_mode":[…]} |
default_mode spoza print/e_receipt |
popraw wartość |
Webhooki (Twój odbiornik)¶
| Objaw | Przyczyna | Rozwiązanie |
|---|---|---|
| podpis JWT się nie zgadza | weryfikujesz innym sekretem niż secret_token connectora |
sekretu nie da się odczytać — jeśli go nie masz, ustaw nowy (PATCH connectora) |
bh mismatch |
hash liczony z reserializowanego JSON-a zamiast surowych bajtów | licz bh z surowego body — weryfikacja podpisu |
| webhooki nie przychodzą w ogóle | connector nieaktywny, URL nieosiągalny z internetu, odbiornik nie odpowiada 2xx | sprawdź connector (GET /connect/connectors/paragony-<vendor>.json), logi swojego serwera; przetestuj lokalnie przez tunel |
zdarzenia printer:* przychodzą, statusy zleceń — nie |
sufiks code connectora ≠ vendor zleceń (statusy idą wyłącznie na connector paragony-<vendor>; zdarzenia drukarek na wszystkie) |
wyrównaj code z vendorem — routing zdarzeń |
status „stoi” w er_pending/er_fail |
dostarczanie e-paragonu w toku/ponawiane | to stany przejściowe — rozstrzygną się w er_printed/er_fatal; dla długo wiszących zleceń odpytaj GET …/:id.json |