ksef-client-python to produkcyjne SDK do integracji z KSeF API, publikowane na PyPI jako ksef-client.
Projekt odwzorowuje oficjalne przepływy KSeF i zapewnia spójny model pracy w dwóch warstwach:
- SDK Python API do integracji aplikacyjnych,
- CLI do diagnostyki i operacji bez pisania kodu.
Aktualna kompatybilność: KSeF API v2.1.2 (api-changelog.md).
- Zakres funkcjonalny
- Instalacja
- Szybki start: CLI w 2-3 minuty
- Szybki start: SDK
- Najważniejsze scenariusze SDK
- Dokumentacja
- Testy i jakość
- Kontrybucja
- Klienci API:
KsefClient,AsyncKsefClient, mapujące endpointy KSeF. - Uwierzytelnianie: token KSeF i podpis XAdES, w tym
XadesKeyPairdla PKCS#12 lub PEM. - Workflows wysyłki: sesje online i batch z ZIP, partiami i pre-signed URL.
- Eksport/pobieranie: obsługa paczek i narzędzi do odszyfrowania/rozpakowania.
- Narzędzia pomocnicze: AES/ZIP/Base64Url, linki weryfikacyjne, QR.
- CLI
ksef: szybka ścieżka od konfiguracji do pierwszych operacji:init -> auth -> invoice/send/upo.
Wymagania: Python >= 3.10.
Podstawowe SDK:
pip install ksef-clientSDK + CLI:
pip install "ksef-client[cli]"Dodatki opcjonalne:
pip install "ksef-client[xml,qr,cli]"xml- podpis XAdES zlxmlixmlsecqr- generowanie PNG z kodami QR przezqrcodeipillowcli- interfejs wiersza poleceń oparty otyper,rich,keyring
CLI ksef zostało zaprojektowane tak, aby skrócić wejście w SDK do minimum.
- Utwórz i aktywuj profil:
ksef init --non-interactive --name demo --env DEMO --context-type nip --context-value <NIP> --set-active- Zaloguj się tokenem i sprawdź sesję:
ksef auth login-token --ksef-token <KSEF_TOKEN>
ksef auth status
ksef profile showAlternatywnie, logowanie certyfikatem XAdES:
ksef auth login-xades --pkcs12-path ./cert.p12 --pkcs12-password <HASLO_CERTYFIKATU>
ksef auth status- Wykonaj pierwsze operacje:
ksef invoice list --from 2026-01-01 --to 2026-01-31
ksef send online --invoice ./fa.xml --wait-upo --save-upo ./out/upo-online.xml
ksef invoice download --ksef-number <KSEF_NUMBER> --out ./out/Najważniejsze grupy komend:
- onboarding/profiles:
init,profile ... - auth:
auth login-token,auth login-xades,auth status,auth refresh,auth logout - operacje:
invoice ...,send ...,upo ...,export ... - diagnostyka:
health check
Pełna specyfikacja CLI: docs/cli/README.md
Minimalny przebieg integracji:
- uzyskanie
access_tokenprzez token KSeF lub XAdES, - wykonanie pierwszego wywołania API, np. listowania metadanych faktur.
from ksef_client import KsefClient, KsefClientOptions, KsefEnvironment
from ksef_client.services.workflows import AuthCoordinator
with KsefClient(KsefClientOptions(base_url=KsefEnvironment.DEMO.value)) as client:
token_cert_pem = ... # usage: KsefTokenEncryption, client.security.get_public_key_certificates
access_token = AuthCoordinator(client.auth).authenticate_with_ksef_token(
token=KSEF_TOKEN,
public_certificate=token_cert_pem,
context_identifier_type="nip",
context_identifier_value="5265877635",
).tokens.access_token.token
metadata = client.invoices.query_invoice_metadata(
{...},
access_token=access_token,
page_offset=0,
page_size=10,
sort_order="Desc",
)tokens = AuthCoordinator(client.auth).authenticate_with_ksef_token(
token=KSEF_TOKEN,
public_certificate=token_cert_pem,
context_identifier_type="nip",
context_identifier_value="5265877635",
).tokensWymaga dodatku xml: pip install "ksef-client[xml]".
from ksef_client.services import XadesKeyPair
key_pair = XadesKeyPair.from_pkcs12_file(pkcs12_path="cert.p12", pkcs12_password="***")
tokens = AuthCoordinator(client.auth).authenticate_with_xades_key_pair(
key_pair=key_pair,
context_identifier_type="nip",
context_identifier_value="5265877635",
subject_identifier_type="certificateSubject",
enforce_xades_compliance=False,
).tokensfrom ksef_client.services.workflows import OnlineSessionWorkflow
send_result = OnlineSessionWorkflow(client.sessions).send_invoice(
session_reference_number=session_reference_number,
invoice_xml=invoice_xml_fa3_bytes,
encryption_data=encryption_data,
access_token=access_token,
)from ksef_client.services.workflows import BatchSessionWorkflow
session_reference_number = BatchSessionWorkflow(client.sessions, client.http_client).open_upload_and_close(
form_code={"systemCode": "FA (3)", "schemaVersion": "1-0E", "value": "FA"},
zip_bytes=zip_bytes,
public_certificate=symmetric_cert_pem,
access_token=access_token,
parallelism=4,
)Dokumentacja SDK znajduje się w docs/:
- indeks:
docs/README.md - start:
docs/getting-started.md - konfiguracja:
docs/configuration.md - błędy i retry:
docs/errors.md - API:
docs/api/README.md - workflows:
docs/workflows/README.md - usługi:
docs/services/README.md - utils:
docs/utils/README.md - przykłady:
docs/examples/README.md
Instalacja zależności developerskich:
pip install -r requirements-dev.txtUruchomienie testów:
pytestUruchomienie testów z kontrolą pokrycia:
pytest --cov=ksef_client --cov-report=term-missing --cov-fail-under=100Testy E2E w tests/test_e2e_token_flows.py wymagają osobnej konfiguracji środowiska i danych dostępowych.
Wkład w rozwój projektu przyjmowany jest w formie pull requestów i zgłoszeń Issues.
Rekomendowany przebieg:
- opisz problem lub propozycję zmiany w Issue,
- pracuj w osobnej gałęzi,
- dołącz testy dla zmian zachowania,
- utrzymaj jakość:
pytest,pytest --cov=ksef_client --cov-fail-under=100, - opisz zakres i uzasadnienie zmian w PR.