Ta strona zapisuje zachowania operacyjne ważne dla integracji produkcyjnych. Nie jest walkthrough wysyłki ani uwierzytelniania.
TransportConfig
TransportConfig jest używany tylko wtedy, gdy SDK tworzy wewnętrznego klienta
httpx. Jeśli przekażesz http_client, ten klient posiada timeouty HTTP, pool,
TLS, proxy, trust_env, HTTP/2, custom transport i event hooki.
TransportConfig(
timeouts=TimeoutConfig(),
pool=ConnectionPoolConfig(),
retry=RetryConfig(),
tls=TlsConfig(),
proxy_url=None,
trust_env=True,
http2=True,
auto_refresh_tokens=True,
error_format="problem-details",
)| Pole | Typ | Domyślnie | Przekazywane do |
|---|---|---|---|
timeouts | TimeoutConfig | TimeoutConfig() | httpx.Timeout |
pool | ConnectionPoolConfig | ConnectionPoolConfig() | httpx.Limits |
retry | RetryConfig | RetryConfig() | Middleware retry SDK |
tls | TlsConfig | TlsConfig() | Weryfikacja TLS w httpx |
proxy_url | `str | None` | None |
trust_env | bool | True | Obsługa zmiennych środowiskowych przez httpx |
http2 | bool | True | Flaga HTTP/2 w httpx |
auto_refresh_tokens | bool | True | Odświeżanie access tokenu przez klientów uwierzytelnionych, zobacz Odświeżanie access tokenu |
error_format | Literal["problem-details", "legacy"] | "problem-details" | Nagłówek X-Error-Format w żądaniach do API KSeF, zobacz Format błędów |
auto_refresh_tokens i error_format nie konfigurują httpx, więc działają
także wtedy, gdy przekażesz własny http_client.
TimeoutConfig
TimeoutConfig kontroluje pojedynczy request HTTP. Nie kontroluje tego, jak
długo SDK odpytuje stan workflow KSeF.
| Pole | Domyślnie | Znaczenie |
|---|---|---|
connect | 5.0 | Czas na zestawienie połączenia. |
read | 30.0 | Czas oczekiwania na bajty odpowiedzi. |
write | 30.0 | Czas wysyłania bajtów requestu. |
pool | 5.0 | Czas oczekiwania na połączenie z poola. |
ConnectionPoolConfig
| Pole | Domyślnie | Znaczenie |
|---|---|---|
max_connections | 100 | Maksymalna liczba otwartych połączeń. |
max_keepalive_connections | 20 | Maksymalna liczba bezczynnych połączeń keep-alive. |
keepalive_expiry | 30.0 | Wygaśnięcie bezczynnego keep-alive w sekundach. |
TlsConfig
| Pole | Domyślnie | Znaczenie |
|---|---|---|
verify | True | Przekazywane do httpx, chyba że ustawiono ca_bundle_path. |
ca_bundle_path | None | Ścieżka bundle CA używana jako wartość verify w httpx. |
RetryConfig
RetryConfig kontroluje middleware retry SDK. Obejmuje błędy transportu i
ponawialne odpowiedzi HTTP dla ponawialnych typów requestów.
| Pole | Domyślnie |
|---|---|
max_attempts | 3 |
initial_delay | 0.5 |
max_delay | 4.0 |
max_retry_after | 120.0 |
backoff_multiplier | 2.0 |
retryable_status_codes | (429, 502, 503, 504) |
Opóźnienie retry jest wykładnicze:
min(initial_delay * backoff_multiplier ** (attempt - 1), max_delay)max_delay ogranicza tylko eksponencjalne backoffy. Nagłówek Retry-After
(sekundy albo data HTTP) jest stosowany dokładnie, gdy mieści się w
max_retry_after. Gdy go przekracza, SDK nie śpi i nie ponawia: poddaje się
natychmiast i rzuca KSeFRateLimitError z prawdziwą wartością z nagłówka, żeby
aplikacja mogła przełożyć pracę. Sufit chroni proces przed wiecznym
oczekiwaniem na Retry-After rzędu wielu godzin.
Sufit ogranicza jedno zaśnięcie, nie cały request. Jeśli KSeF powtórzy ten sam
Retry-After przy każdej próbie, pojedynczy request czeka maksymalnie
(max_attempts - 1) * max_retry_after, zanim się podda. Przy domyślnych
wartościach to 240 sekund, bo SDK śpi 120 sekund dwa razy. Zmniejsz
max_attempts albo max_retry_after, gdy handler requestu nie może tyle
czekać.
Ponawialne requesty
SDK ponawia tylko kształty requestów, które są wystarczająco bezpieczne do powtórzenia na poziomie transportu.
| Typ requestu | Zachowanie retry |
|---|---|
GET | Ponawialny. |
DELETE | Ponawialny. |
Większość POST | Nie jest ponawiana automatycznie. |
Wybrane POST | Ponawiane automatycznie, gdy są na liście niżej. |
Ponawialne grupy POST:
| Obszar | Operacje |
|---|---|
| Uwierzytelnianie | challenge, refresh token |
| Faktury | query metadanych |
| Certyfikaty | query, retrieve |
| Uprawnienia | query personal, authorization, EU entity, person, subordinate entity i subunit |
Wysyłka faktury, nadawanie uprawnień, enrollment certyfikatu, generowanie tokenu, otwieranie sesji online i otwieranie sesji batch nie są ponawiane przez middleware retry SDK. Zapisz zwrócone referencje i wznawiaj przez status zamiast tworzyć te operacje ponownie w ciemno.
Redeem tokenu uwierzytelnienia także nigdy nie jest ponawiany, ponieważ KSeF
zwraca parę access/refresh tylko raz. Utrata odpowiedzi redeem rzuca
KSeFAuthTokenRedemptionError z outcome_ambiguous=True; nie powtarzaj tej
operacji automatycznie.
Odświeżanie access tokenu
Klienci uwierzytelnieni odświeżają access token samodzielnie, używając refresh
tokenu z uwierzytelnienia albo z AuthenticationResumeState, z którego zostali
wznowieni.
| Wyzwalacz | Zachowanie |
|---|---|
| Proaktywny | Request, który zastaje access token na mniej niż 60 sekund przed access_token_valid_until, najpierw go odświeża, a potem jest wysyłany z nowym tokenem. |
| Reaktywny | Odpowiedź 401 wywołuje jedno odświeżenie i jedną ponowną próbę tego samego requestu. Drugi 401 jest zgłaszany jako KSeFAuthError. |
| Współbieżność | Requesty współdzielą jedno odświeżenie: lock w Client, asyncio.Lock w AsyncClient. |
| Inne statusy | 403 i pozostałe błędy nie powodują odświeżenia. |
Jedno odświeżenie to nie pełne ponowne uwierzytelnienie: SDK powtarza
oryginalny request raz z odświeżonym tokenem. Jeżeli ten powtórzony request
dostanie znowu 401, KSeFAuthError trafia do aplikacji i to ona decyduje,
czy uwierzytelnić się ponownie, czy zgłosić błąd.
auth.auth_tokens, auth.access_token i auth.resume_state() zawsze zwracają
bieżące tokeny, więc po długo trwającej pracy zapisz resume_state() ponownie.
Gdy refresh token wygasł albo KSeF go odrzucił, request rzuca
KSeFAuthenticationExpiredError, podklasę KSeFAuthError. Jedynym wyjściem
jest ponowne uwierzytelnienie. Jeśli refresh token już wygasł, ale access token
ma jeszcze ważność, requesty nadal używają access tokenu, dopóki KSeF go nie
odrzuci. Błędy transportu i inne błędy wywołania odświeżenia są propagowane bez
zmian.
Odświeżanie nigdy nie dotyczy jednorazowego redeem uwierzytelnienia ani transferów presigned do zewnętrznego storage (upload części batch, pobieranie eksportów). Używają osobnych ścieżek i nie niosą tokenu bearer.
Aby zarządzać tokenami samodzielnie, wyłącz to zachowanie. Wygasłe tokeny
ujawnią się wtedy jako KSeFAuthError, a client.authentication.refresh()
pozostaje dostępne.
client = Client(Environment.PRODUCTION, transport_config=TransportConfig(auto_refresh_tokens=False))Timeouty pollingu workflow
Helpery pollingowe używają argumentów timeout i poll_interval. Są to
deadline'y workflow, nie timeouty requestu HTTP. Gdy zostanie rzucony timeout
pollingu, zdalny workflow KSeF może nadal zakończyć się później.
| Workflow | Wyjątek timeout | Identyfikator w wyjątku |
|---|---|---|
| Polling uwierzytelniania | KSeFAuthPollingTimeoutError | reference_number |
| Polling aktywacji/statusu tokenu | KSeFTokenStatusTimeoutError | reference_number |
| Polling widoczności metadanych | KSeFInvoiceQueryTimeoutError | tylko timeout |
| Gotowość pobrania faktury | KSeFInvoiceDownloadTimeoutError | ksef_number |
| Przetwarzanie faktury online | KSeFInvoiceProcessingTimeoutError | invoice_reference_number |
| Gotowość paczki eksportu | KSeFExportTimeoutError | reference_number |
| Nadanie albo cofnięcie uprawnienia | KSeFPermissionOperationTimeoutError | reference_number |
| Wydanie certyfikatu | KSeFCertificateEnrollmentTimeoutError | reference_number |
| Zakończenie sesji batch | KSeFBatchSessionTimeoutError | reference_number |
| Zakończenie sesji online | KSeFOnlineSessionTimeoutError | reference_number |
Po timeoutcie wznów polling zapisanymi identyfikatorami. Nie traktuj lokalnego deadline'u jako dowodu, że zdalna operacja się nie udała.
Rate limit
Odpowiedzi KSeF 429 są klasyfikowane jako KSeFRateLimitError. Wyjątek
udostępnia:
| Atrybut | Znaczenie |
|---|---|
retry_after | Liczba sekund z Retry-After (forma sekundowa albo data HTTP), jeśli KSeF zwrócił nagłówek; inaczej None. |
status_code | Zawsze 429. |
response | Sparsowany payload błędu KSeF, jeśli jest dostępny. |
Dla 429 middleware retry stosuje dokładnie wartość Retry-After, gdy mieści
się ona w max_retry_after, śpi i ponawia do max_attempts razy. Gdy nagłówek
przekracza sufit, middleware poddaje się natychmiast: bez spania, bez ponawiania,
a request kończy się KSeFRateLimitError z prawdziwą wartością nagłówka w
retry_after. Sufit ogranicza każde zaśnięcie z osobna, więc powtarzający się
nagłówek może trzymać request przez (max_attempts - 1) * max_retry_after,
czyli domyślnie 240 sekund.
Co nadal należy do aplikacji: KSeFRateLimitError oznacza, że SDK już się
poddał, więc zaplanuj pracę na później zamiast ponawiać na oślep. Używaj
retry_after do planowania pracy w tle. W request handlerach lepiej zwrócić
albo zakolejkować pracę do ponowienia niż usypiać request.
Granice sekretów i logowania
Nie loguj:
- access tokenów;
- refresh tokenów;
- wartości tokenów KSeF;
- kluczy prywatnych;
- haseł PEM albo PKCS#12;
- surowego XML faktury, chyba że polityka retencji na to pozwala;
- zserializowanego stanu sesji online albo batch.
Przydatne pola logów produkcyjnych:
| Pole | Znaczenie |
|---|---|
environment | test, demo albo production. |
workflow | Nazwa operacji na poziomie aplikacji. |
session_reference_number | Referencja sesji online albo batch. |
invoice_reference_number | Referencja faktury w sesji. |
ksef_number | Finalny numer KSeF po przyjęciu faktury. |
operation_reference_number | Referencja operacji tokenu, uprawnienia, certyfikatu, auth albo eksportu. |
sdk_error_code | KSeFException.context["code"], gdy istnieje. |
ksef_code | Surowy kod błędu KSeF z KSeFApiError.ksef_code, gdy istnieje. |
trace_id | Identyfikator śledzenia KSeF z KSeFApiError.trace_id; podaj go, kontaktując się z pomocą KSeF. |
Wznawialny stan workflow
Większość workflow KSeF zaczyna się referencją i kończy przez polling albo późniejsze pobranie. Zapisz referencję przed czekaniem.
| Workflow | Zapisz przed czekaniem |
|---|---|
| Uwierzytelnianie | referencję operacji auth i czas życia tymczasowego tokenu auth |
| Wysyłka faktury online | referencję sesji i numer referencyjny faktury |
| Upload batch | referencję sesji batch, referencje uploadu, metadane paczki i stan batch, dopóki jest potrzebny |
| Eksport faktur | numer referencyjny eksportu i chroniony materiał uchwytu eksportu |
| Generowanie tokenu | numer referencyjny tokenu i zwrócony sekret tokenu |
| Nadanie/cofnięcie uprawnień | numer referencyjny operacji uprawnień |
| Enrollment/revoke certyfikatu | referencję operacji certyfikatu albo numer seryjny certyfikatu |
Powiązana referencja
- Cykl życia klienta: Sprawdź konstruktory, własność gałęzi, zamykanie i błędy lifecycle.
- Obsługa błędów: Sprawdź klasy wyjątków SDK, błędy API KSeF i timeouty.
- Konfiguracja klienta: Zastosuj te ustawienia w przykładach setupu sync i async.
- Status i UPO: Zrozum statusy, dokumenty UPO, polling i lokalne deadline'y.
