GitHub

Referencja błędów

Hierarchia wyjątków SDK, atrybuty, kody błędów KSeF, wskazówki i klasy timeoutów pollingu.

Na tej stronie

ksef2 rzuca wyjątki SDK dla błędów, które potrafi sklasyfikować. Błędy transportu, które wystąpią zanim KSeF zwróci sparsowaną odpowiedź API, pozostają wyjątkami httpx.HTTPError. Transfery przez presigned URL-e do zewnętrznego storage używają opisanych niżej dedykowanych wyjątków zamiast klasyfikacji błędów API lub uwierzytelnienia KSeF.

Rozgałęziaj po klasie albo po ksef_code

Obsługuj błędy po klasie wyjątku, a dla błędów API KSeF po ksef_code. Nigdy nie rozgałęziaj po treści komunikatu: komunikaty są pisane dla ludzi, zawierają aktualne sformułowania KSeF i mogą zmienić się między wydaniami. To samo dotyczy hint: pokaż go albo zaloguj, ale nie parsuj.

Klasy bazowe

KlasaBazacodeGłówne atrybuty
KSeFExceptionExceptionSDK_ERRORcontext, hint
KSeFApiErrorKSeFExceptionAPI_ERRORstatus_code, ksef_code, exception_code, trace_id, details, response
KSeFNotReadyErrorKSeFApiErrorNOT_READYAtrybuty błędu API
KSeFAuthErrorKSeFApiErrorAUTH_ERRORAtrybuty błędu API
KSeFAuthenticationExpiredErrorKSeFAuthErrorAUTHENTICATION_EXPIREDAtrybuty błędu API
KSeFRateLimitErrorKSeFApiErrorRATE_LIMIT_ERRORretry_after oraz atrybuty błędu API
KSeFExternalTransferErrorKSeFExceptionEXTERNAL_TRANSFER_ERRORoperation, host, reference_number, part_ordinal, status_code, outcome_ambiguous
KSeFBatchUploadErrorKSeFExternalTransferErrorBATCH_UPLOAD_ERRORAtrybuty transferu zewnętrznego oraz recovery_state()
KSeFInvoiceRejectedErrorKSeFSessionErrorINVOICE_REJECTEDinvoice_reference_number, invoice_status_code, description, details, extensions, status

Łap węższe podklasy przed KSeFException, gdy workflow ma konkretną akcję odzyskiwania.

try:
    result = auth.invoices.query_metadata(filters=filters)
except KSeFRateLimitError as exc:
    retry_after = exc.retry_after
except KSeFNotReadyError:
    ...  # KSeF jeszcze nie skończył; poczekaj i zapytaj ponownie
except KSeFApiError as exc:
    if exc.ksef_code == 21405:
        details = exc.details
    trace_id = exc.trace_id  # podaj go, kontaktując się z pomocą KSeF
except KSeFException as exc:
    context = exc.context
except httpx.HTTPError as exc:
    transport_error = exc
python

Klasy wyjątków SDK

KlasacodeKiedy jest rzucana
KSeFClientClosedErrorCLIENT_CLOSEDKlient główny albo klient sesji użyty po zamknięciu.
KSeFUnsupportedEnvironmentErrorUNSUPPORTED_ENVIRONMENTGałąź albo przepływ tylko dla TEST użyty poza Environment.TEST.
KSeFValidationErrorVALIDATION_ERRORNiepoprawne dane wejściowe SDK, błędny payload odpowiedzi, błędny profil albo błędne argumenty sesji/batch.
KSeFArgumentErrorARGUMENT_ERRORWywołanie łączy argumenty niedozwolone przez SDK, na przykład oba albo żaden z form_code i state. Podklasa KSeFValidationError i TypeError.
KSeFInvoiceRenderingErrorINVOICE_RENDERING_ERRORBłędy opcjonalnego renderowania XSLT/PDF.
KSeFEncryptionErrorENCRYPTION_ERRORBłąd szyfrowania tokenu, klucza symetrycznego, faktury albo deszyfrowania.
KSeFSessionErrorSESSION_ERRORNaruszenie stanu sesji, na przykład użycie zamkniętej sesji. Klasa bazowa KSeFInvoiceRejectedError.
KSeFInvoiceRejectedErrorINVOICE_REJECTEDKSeF zakończył przetwarzanie faktury z sesji interaktywnej i ją odrzucił (InvoiceSubmission.wait()).
KSeFExportFailedErrorEXPORT_FAILEDKSeF zakończył eksport faktur bez paczki: eksport się nie powiódł, został anulowany przez system albo wygasł (ExportJob.wait()).
KSeFPermissionOperationFailedErrorPERMISSION_OPERATION_FAILEDKSeF zakończył nadanie albo cofnięcie uprawnienia bez jego zastosowania (PermissionOperation.wait()).
KSeFCertificateEnrollmentFailedErrorCERTIFICATE_ENROLLMENT_FAILEDKSeF odrzucił, anulował albo nie zrealizował rejestracji certyfikatu (CertificateEnrollment.wait()).
KSeFAuthTokenRedemptionErrorAUTH_TOKEN_REDEMPTION_ERRORJednorazowy redeem uwierzytelnienia utracił odpowiedź i mógł się powieść.
KSeFExternalTransferErrorEXTERNAL_TRANSFER_ERRORUpload lub download przez presigned URL został odrzucony albo utracił odpowiedź.
KSeFBatchUploadErrorBATCH_UPLOAD_ERRORUpload części batch nie powiódł się, ale chroniony stan odzyskiwania pozostaje dostępny.
NoCertificateAvailableErrorNO_CERTIFICATE_AVAILABLEBrak poprawnego certyfikatu dla podpisu albo szyfrowania.
KSeFMetadataPaginationErrorMETADATA_PAGINATION_ERRORPaginacja metadanych nie może bezpiecznie kontynuować.

KSeFAuthTokenRedemptionError.outcome_ambiguous ma zawsze wartość True. Nie ponawiaj redeem: KSeF mógł już zużyć tymczasowy token uwierzytelnienia, mimo że odpowiedź nie dotarła do wywołującego.

Atrybuty transferu zewnętrznego i odzyskiwanie batch

Odpowiedzi z presigned storage nie są odpowiedziami API KSeF. Na przykład błąd 403 storage zgłasza KSeFExternalTransferError, a nie KSeFAuthError. Komunikat i context zawierają wyłącznie oczyszczony host, operację, referencję workflow, numer części, status i flagę niejednoznaczności; nie zawierają podpisanego URL-a.

AtrybutTypZnaczenie
operationLiteral["upload", "download"]Zewnętrzny transfer, który się nie powiódł.
hoststrHost storage bez ścieżki, query i podpisu.
reference_numberstrReferencja eksportu lub workflow batch.
part_ordinalintJednobazowy numer części paczki.
status_code`intNone`
outcome_ambiguousboolTrue, gdy upload mógł dotrzeć do storage mimo utraty odpowiedzi.

KSeFBatchUploadError.recovery_state() celowo ujawnia wrażliwy BatchSessionResumeState potrzebny do odzyskania workflow. Stan nie trafia do komunikatu ani context, ponieważ zawiera materiał szyfrujący i presigned URL-e. Zapisuj go wyłącznie w chronionym magazynie danych uwierzytelniających i nie ponawiaj automatycznie uploadu, gdy outcome_ambiguous ma wartość True.

Oryginalny błąd httpx pozostaje dostępny przez __cause__. Nie loguj go bez kontroli, ponieważ surowa diagnostyka HTTP może zawierać podpisany URL.

Atrybuty błędu API

KSeFApiError jest rzucany dla sparsowanych odpowiedzi KSeF 4xx i 5xx. Specjalne podklasy są używane dla błędów auth/autoryzacji, rate limitu oraz zasobów, których KSeF jeszcze nie udostępnił.

AtrybutTypZnaczenie
status_codeintStatus HTTP zwrócony przez KSeF.
ksef_code`intNone`
exception_codeExceptionCodeTen sam kod jako enum, gdy SDK go zna; w przeciwnym razie UNKNOWN_ERROR. Zachowany dla zgodności.
trace_id`strNone`
detailslist[str]Komunikaty szczegółowe dołączone przez KSeF; pusta lista, gdy ich brak.
hint`strNone`
response`BaseModelNone`

Te same wartości są dostępne w context: status_code, ksef_code, trace_id, details oraz hint (jeśli jest).

Używaj response.model_dump() albo response.model_dump_json() do strukturalnych diagnostyk, gdy response nie jest None.

Format komunikatu

Każdy błąd API KSeF ma ten sam format, niezależnie od kształtu odpowiedzi (application/problem+json, starszy payload exception, inne JSON-y, tekst albo pusta odpowiedź). SDK wybiera parser po nagłówku Content-Type odpowiedzi: application/problem+json jest czytany jako Problem Details, application/json jako starszy payload (poza 401, który KSeF wysyła jako Problem Details oznaczony application/json), a wszystko inne staje się krótkim fragmentem:

KSeF rejected <METODA> <ścieżka> (HTTP <status>, KSeF code <kod>): <opis>
Details: <szczegół>; <szczegół>
Trace ID: <identyfikator śledzenia>
Hint: <wskazówka>
text

Fragment KSeF code jest pomijany, gdy odpowiedź nie ma kodu, a linie Details, Trace ID i Hint pojawiają się tylko wtedy, gdy jest co pokazać. Domyślnie SDK wysyła X-Error-Format: problem-details w każdym żądaniu do API KSeF (zobacz Format błędów), więc KSeF zwraca błędy 400 i 429 jako application/problem+json, a trace_id jest ustawiony w każdym błędzie API zwróconym w tym formacie. (401, 403 i 410 zawsze są Problem Details.) Nagłówek nie jest wysyłany do presigned URL-i storage. Treść odpowiedzi nie wchodzi do komunikatu; zostaje w response. Gdy treść nie jest rozpoznawalnym błędem, opisem jest krótki, skrócony fragment tej treści.

Format błędów

TransportConfig.error_format wybiera format, o który SDK prosi KSeF:

WartośćWysyłany nagłówekBłędy 400 i 429
"problem-details" (domyślnie)X-Error-Format: problem-detailsapplication/problem+json: trace_id jest ustawiony, a response to BadRequestProblemDetails / TooManyRequestsProblemDetails
"legacy"brakapplication/json: bez trace_id, a response to ExceptionResponse / TooManyRequestsResponse

401, 403 i 410 zawsze są Problem Details. SDK czyta oba formaty tak samo, więc ksef_code, details, klasa i wskazówka się nie zmieniają; zmienia się tylko trace_id i typ response. Używaj "legacy" tylko wtedy, gdy Twój kod czyta response i oczekuje starszych modeli:

client = Client(Environment.PRODUCTION, transport_config=TransportConfig(error_format="legacy"))
python

Treść Problem Details niezgodna ze swoim modelem w specyfikacji KSeF (albo ze statusem, dla którego specyfikacja nie ma modelu, na przykład 500) nie jest parsowana: opisem jest fragment treści, a response to None.

Przykład: pobranie UPO faktury, którego KSeF jeszcze nie wystawił:

KSeF rejected GET /sessions/online/S1/invoices/I1/upo (HTTP 400, KSeF code 21178): Nie znaleziono UPO dla podanych kryteriów.
Details: UPO o numerze referencyjnym I1 nie zostało znalezione.
Trace ID: 0b1f6a7c-4d2e-4a53-9a6e-3f2b9d1c8e11
Hint: KSeF has no UPO for this yet. Call `wait()` on the invoice submission or the session first, then call `download_upo()` again. If `wait()` raises `KSeFInvoiceRejectedError`, KSeF rejected the invoice and will never issue a UPO for it.
text

Opis i szczegóły pochodzą z KSeF, a Hint z SDK, które pisze wskazówki po angielsku. Linia Trace ID pojawia się, gdy KSeF zwrócił identyfikator śledzenia (odpowiedzi application/problem+json).

Wskazówki

KSeFException.hint mówi, co zrobić dalej. Jest pokazywany w osobnej linii Hint: w str(exc) i zapisany w exc.context["hint"]. Wskazówka jest ustawiana tylko wtedy, gdy SDK zna przyczynę, każda wymieniona w niej metoda jest aktualna, a dla jednego wystąpienia można ją zastąpić, przekazując hint=... do wyjątku.

Wskazówki do błędów API zależą najpierw od kodu KSeF, potem od statusu HTTP. Kod z własną wskazówką zachowuje ją także przy 401 albo 403, a klasa nadal wynika wtedy ze statusu (KSeFAuthError):

Status HTTPKod KSeFKlasaWskazówka
dowolny21155KSeFApiErrorThe session has reached its invoice limit. Close it with close() and send the remaining invoices in a new session from online_session().
dowolny21165KSeFNotReadyErrorKSeF has processed the invoice but has not made it available yet. Call download() with a timeout so the SDK keeps polling until it is.
dowolny21178KSeFNotReadyErrorKSeF has no UPO for this yet. Call wait() on the invoice submission or the session first, then call download_upo() again. If wait() raises KSeFInvoiceRejectedError, KSeF rejected the invoice and will never issue a UPO for it.
dowolny21180KSeFApiErrorThe session is already closed or KSeF is processing it, so it accepts no more invoices. Send further invoices in a new session from online_session() or batch_session().
dowolny21182KSeFApiErrorKSeF limits how many exports can run at once. Wait for a running export to finish with wait(), then call export() again.
dowolny21183KSeFApiErrorThe date range reaches outside the data KSeF keeps. Narrow the date range in the filters passed to search().
dowolny21184KSeFApiErrorKSeF cannot accept invoices in this session at the moment. Retry later, or send the invoice in a new session from online_session().
dowolny21208KSeFApiErrorKSeF cancelled the batch session because the parts were not uploaded or the session was not closed in time. Send the package again in a new session from batch_session().
dowolny21418KSeFApiErrorContinuation tokens come from KSeF and are only valid as returned. Iterate the pager the SDK returns, or use its pages(), instead of building or reusing a token yourself.
dowolny21470KSeFApiErrorKSeF does not know the public key the request was encrypted with, or has retired it. The SDK keeps KSeF certificates for 24 hours; create a new client so it loads the current ones.
dowolny25006KSeFApiErrorKSeF allows only a limited number of certificate enrollments. get_limits() shows how many are still allowed.
dowolny25007KSeFApiErrorYou hold the maximum number of KSeF certificates. Revoke one you no longer use with revoke(), and check get_limits() for the limit.
dowolny26001KSeFApiErrorA token can only get permissions the authenticated identity holds. Request fewer permissions in generate().
dowolny30001KSeFApiErrorThe subject or person already exists on KSeF TEST. Reuse it, or remove it first with delete_subject() or delete_person().
401innyKSeFAuthErrorKSeF rejected the credentials or the access token. Authenticate again with client.authentication.with_token() or client.authentication.with_xades(), and check that the token or certificate is valid for this context.
403innyKSeFAuthErrorThe authenticated identity is not allowed to do this in the current context. Check the reason in details, and grant the missing permission with the permissions client, for example grant_person().

KSeFRateLimitError buduje wskazówkę z retry_after, na przykład Wait 17 seconds before retrying.

Wskazówki do pozostałych błędów SDK:

KlasaWskazówka
KSeFArgumentErrorPass exactly one of the mutually exclusive arguments named in the message.
KSeFAuthPollingTimeoutErrorKSeF has not finished authenticating yet. Authenticate again with a larger timeout in client.authentication.with_xades() or client.authentication.with_token().
KSeFAuthenticationExpiredErrorAuthenticate again with client.authentication.with_token() or client.authentication.with_xades(), or restore tokens that are still valid with client.authentication.resume().
KSeFBatchSessionTimeoutErrorKSeF may still be processing the batch. Call wait() on the batch session again with a larger timeout. After a restart, rebuild the session from the state saved with resume_state() using batch_session(state=...).
KSeFCertificateEnrollmentFailedErrorRead description and details for the reason, then submit a corrected request with enroll(). get_limits() shows how many enrollments and certificates are still allowed.
KSeFCertificateEnrollmentTimeoutErrorKSeF may still issue the certificate. Call wait() on the enrollment again with a larger timeout, or check it with get_enrollment_status().
KSeFExportFailedErrorRead description and details for the reason, then start a new export with export().
KSeFExportTimeoutErrorThe export may still finish. Call wait() on the export again with a larger timeout. After a restart, get the job back with export(state=...) using the state saved from resume_state().
KSeFInvoiceDownloadTimeoutErrorKSeF has not made the invoice available yet. Call download() again with a larger timeout.
KSeFInvoiceProcessingTimeoutErrorKSeF may still accept the invoice. Keep waiting with submission(reference_number).wait() on the session, with a larger timeout. After a restart, rebuild the session from the state saved with resume_state() using online_session(state=...).
KSeFInvoiceQueryTimeoutErrorNo invoice matched before the deadline. Call wait() again with a larger timeout, or check the filters passed to search().
KSeFInvoiceRejectedErrorRead description and details for the reason, fix the invoice and send it again with send_invoice().
KSeFNotReadyErrorKSeF has not finished preparing this resource. Wait and request it again.
KSeFOnlineSessionTimeoutErrorKSeF may still be processing the session. Call wait() on the session again with a larger timeout. After a restart, rebuild the session from the state saved with resume_state() using online_session(state=...).
KSeFPermissionOperationFailedErrorRead description for the reason, fix the request and grant or revoke again. get_operation_status() shows the operation's final state.
KSeFPermissionOperationTimeoutErrorThe operation may still be applied. Call wait() on the operation again with a larger timeout, or check it with get_operation_status().
KSeFTokenStatusTimeoutErrorKSeF may still be activating the token. Call wait() on the token again with a larger timeout, or check it with get_status().

KSeFSessionError nie ma wskazówki na poziomie klasy. SDK ustawia ją tam, gdzie zna przyczynę: oczekiwanie na sesję, która jest nadal otwarta (najpierw ją zamknij), oraz sesja, którą KSeF zakończył błędem (sprawdź faktury z błędem). Odrzucony duplikat (440) dostaje własną wskazówkę w KSeFInvoiceRejectedError.

Kody błędów KSeF

ksef_code to liczba wysłana przez KSeF. SDK nigdy nie gubi nieznanego kodu. Tylko 21165 i 21178 mają dedykowaną klasę (KSeFNotReadyError); pozostałe to zwykły KSeFApiError z ustawionym ksef_code (KSeFAuthError przy 401 albo 403). Poniżej są wszystkie kody, które wymienia dokumentacja API KSeF (openapi.json), wszystkie w odpowiedziach HTTP 400, i każdy ma swój element ExceptionCode. Test jednostkowy nie przejdzie, gdy aktualizacja specyfikacji doda kod, którego tu nie ma.

21178 nie zawsze znaczy „jeszcze nie wystawione”: KSeF zwraca go na stałe także dla faktury, którą odrzucił (na przykład duplikatu, status 440). Najpierw wywołaj wait(); jeśli rzuci KSeFInvoiceRejectedError, UPO nie będzie.

Kod KSeFExceptionCodeZnaczenie
9101INVALID_DOCUMENTNieprawidłowy dokument.
9102MISSING_SIGNATUREBrak podpisu.
9103TOO_MANY_SIGNATURESPrzekroczona liczba dozwolonych podpisów.
9105INVALID_SIGNATURENieprawidłowy podpis.
21001UNREADABLE_CONTENTNieczytelna treść.
21111INVALID_AUTH_CHALLENGENieprawidłowe wyzwanie autoryzacyjne.
21115INVALID_CERTIFICATENieprawidłowy certyfikat.
21117INVALID_CONTEXT_IDENTIFIERNieprawidłowy identyfikator podmiotu dla wskazanego typu kontekstu.
21155SESSION_INVOICE_LIMIT_EXCEEDEDPrzekroczono dozwoloną liczbę faktur w sesji.
21157INVALID_PACKAGE_PART_SIZENieprawidłowy rozmiar części pakietu.
21161PACKAGE_PART_LIMIT_EXCEEDEDPrzekroczono dozwoloną liczbę części pakietu.
21164INVOICE_NOT_FOUNDFaktura o podanym identyfikatorze nie istnieje.
21165NOT_PROCESSED_YETFaktura o podanym numerze KSeF nie jest jeszcze dostępna. KSeFNotReadyError.
21166TECHNICAL_CORRECTION_UNAVAILABLEKorekta techniczna niedostępna.
21167TECHNICAL_CORRECTION_NOT_ALLOWEDStatus faktury nie pozwala na korektę techniczną.
21173SESSION_NOT_FOUNDBrak sesji o wskazanym numerze referencyjnym.
21175QUERY_RESULT_NOT_FOUNDWynik zapytania o podanym identyfikatorze nie istnieje.
21178UPO_NOT_FOUNDNie znaleziono UPO dla podanych kryteriów. KSeFNotReadyError.
21180SESSION_STATUS_FORBIDS_OPERATIONStatus sesji nie pozwala na wykonanie operacji.
21181INVALID_EXPORT_REQUESTNieprawidłowe żądanie eksportu faktur.
21182EXPORT_LIMIT_REACHEDOsiągnięto limit trwających eksportów.
21183FILTER_RANGE_OUT_OF_BOUNDSZakres filtrowania wykracza poza dostępny zakres danych.
21184SESSION_TEMPORARILY_UNAVAILABLESesja tymczasowo niedostępna.
21205EMPTY_PACKAGEPakiet nie może być pusty.
21208UPLOAD_WINDOW_EXCEEDEDCzas oczekiwania na requesty upload lub finish został przekroczony.
21217INVALID_CHARACTER_ENCODINGNieprawidłowe kodowanie znaków.
21301NO_AUTHORIZATIONBrak autoryzacji.
21304NO_AUTHENTICATIONBrak uwierzytelnienia.
21308DECEASED_PERSON_AUTHENTICATIONPróba wykorzystania metod autoryzacyjnych osoby zmarłej.
21401SCHEMA_VALIDATION_FAILEDDokument nie jest zgodny ze schemą (XSD).
21402INVALID_FILE_SIZENieprawidłowy rozmiar pliku.
21403INVALID_FILE_HASHNieprawidłowy skrót pliku.
21405VALIDATION_ERRORBłąd walidacji danych wejściowych.
21406SIGNATURE_AUTH_TYPE_CONFLICTKonflikt podpisu i typu uwierzytelnienia.
21418INVALID_CONTINUATION_TOKENPrzekazany token kontynuacji jest nieprawidłowy.
21470UNKNOWN_KEY_IDIdentyfikator klucza jest nieznany lub wskazuje na wycofany klucz.
25001CSR_DATA_UNAVAILABLEBrak możliwości pobrania danych do CSR dla wykorzystanego sposobu uwierzytelnienia.
25002ENROLLMENT_NOT_ALLOWEDBrak możliwości złożenia wniosku certyfikacyjnego dla wykorzystanego sposobu uwierzytelnienia.
25003CSR_DATA_MISMATCHDane w CSR nie zgadzają się z danymi w użytym wektorze uwierzytelniającym.
25004INVALID_CSRNiepoprawny format CSR lub niepoprawny podpis CSR.
25005ENROLLMENT_NOT_FOUNDWniosek certyfikacyjny o podanym numerze referencyjnym nie istnieje.
25006ENROLLMENT_LIMIT_REACHEDOsiągnięto limit możliwych do złożenia wniosków certyfikacyjnych.
25007CERTIFICATE_LIMIT_REACHEDOsiągnięto limit dopuszczalnej liczby posiadanych certyfikatów.
25008CERTIFICATE_NOT_FOUNDCertyfikat o podanym numerze seryjnym nie istnieje.
25009CERTIFICATE_NOT_REVOCABLENie można odwołać wskazanego certyfikatu, ponieważ jest już odwołany, zablokowany lub nieważny.
25010INVALID_KEYNieprawidłowy typ lub długość klucza.
25011INVALID_CSR_SIGNATURE_ALGORITHMNieprawidłowy algorytm podpisu CSR.
26001TOKEN_PERMISSIONS_NOT_HELDNie można nadać tokenowi uprawnień, których nie posiadasz.
26002TOKEN_CONTEXT_NOT_ALLOWEDNie można wygenerować tokena dla obecnego typu kontekstu.
30001OBJECT_ALREADY_EXISTSPodmiot lub uprawnienie już istnieje.
71001COLLECTIVE_INVOICE_NOT_FOUNDFaktura o podanym identyfikatorze nie istnieje.
71002COLLECTIVE_IDENTIFIER_LIMIT_REACHEDFaktura jest już przypisana do maksymalnej liczby identyfikatorów zbiorczych.
71004DIFFERENT_SELLERSFaktury mają różnych sprzedawców.
71005DUPLICATE_KSEF_NUMBERPowtórzony numer KSeF w żądaniu.

Wartości ExceptionCode

ExceptionCode to IntEnum: wartością każdego elementu jest jego kod KSeF, a nazwy są w tabeli powyżej. Jeden dodatkowy element nie jest kodem KSeF:

NazwaWartość
UNKNOWN_ERROR10000

Kody, których enum nie zna, mapują się do ExceptionCode.UNKNOWN_ERROR, ale surowa liczba zostaje w ksef_code. W nowym kodzie preferuj ksef_code.

Klasy timeoutów pollingu

Wyjątki timeoutów pollingu oznaczają przekroczenie lokalnego deadline'u czekania. Same w sobie nie dowodzą, że zdalny workflow KSeF się nie udał.

KlasacodeAtrybuty identyfikujące
KSeFAuthPollingTimeoutErrorAUTH_POLLING_TIMEOUTreference_number, timeout
KSeFTokenStatusTimeoutErrorTOKEN_STATUS_TIMEOUTreference_number, timeout
KSeFInvoiceQueryTimeoutErrorINVOICE_QUERY_TIMEOUTtimeout
KSeFInvoiceDownloadTimeoutErrorINVOICE_DOWNLOAD_TIMEOUTksef_number, timeout
KSeFInvoiceProcessingTimeoutErrorINVOICE_PROCESSING_TIMEOUTinvoice_reference_number, timeout
KSeFExportTimeoutErrorEXPORT_TIMEOUTreference_number, timeout
KSeFPermissionOperationTimeoutErrorPERMISSION_OPERATION_TIMEOUTreference_number, timeout
KSeFCertificateEnrollmentTimeoutErrorCERTIFICATE_ENROLLMENT_TIMEOUTreference_number, timeout
KSeFBatchSessionTimeoutErrorBATCH_SESSION_TIMEOUTreference_number, timeout
KSeFOnlineSessionTimeoutErrorONLINE_SESSION_TIMEOUTreference_number, timeout

Zapisz właściwą referencję przed pollingiem, aby inny proces mógł wznowić sprawdzanie statusu. Każdy błąd timeoutu niesie hint, który mówi, jak czekać dalej albo wznowić pracę.

download_upo() na handle faktury, sesji interaktywnej i sesji batch nigdy nie czeka i nie ma timeout. Najpierw wywołaj wait() na handle albo sesji. Wywołane za wcześnie rzuca KSeFNotReadyError ze wskazówką wskazującą wait(); sesja, która jest nadal otwarta, rzuca KSeFSessionError.

Atrybuty rate limitu

AtrybutTypZnaczenie
retry_after`intNone`
status_codeintZawsze 429.
response`BaseModelNone`
hintstrWait <retry_after> seconds before retrying.

Atrybuty odrzucenia faktury

KSeFInvoiceRejectedError dziedziczy po KSeFSessionError, więc istniejące handlery nadal go łapią. Łap KSeFInvoiceRejectedError przed KSeFSessionError, gdy tylko naruszenie stanu sesji wymaga otwarcia sesji od nowa albo ponownego uwierzytelnienia.

AtrybutTypZnaczenie
invoice_reference_numberstrNumer referencyjny odrzuconej faktury.
invoice_status_codeintKod statusu faktury KSeF, na przykład 440 albo 450. To nie jest status HTTP.
descriptionstrOpis statusu KSeF.
detailslist[str]Szczegóły statusu KSeF; pusta lista, gdy ich brak.
extensions`dict[str, strNone]`
statusSessionInvoiceStatusResponsePełna odpowiedź statusu.

W przeciwieństwie do KSeFApiError.status_code, które zawsze jest statusem HTTP, invoice_status_code pochodzi ze statusu faktury KSeF.

Dla duplikatu (440) extensions zawiera originalKsefNumber i originalSessionReferenceNumber. Wywołujący, który odzyskuje wysyłkę z utraconą odpowiedzią, może przekazać originalKsefNumber do download_invoice() i porównać pobraną fakturę z wysłaną. Jeśli to ta sama faktura, może uznać ją za już przyjętą.

Powiązana referencja