KSeF Client Python
KSeF Client Python to SDK i narzędzia CLI dla integracji z Krajowym Systemem e-Faktur.
Pakiet jest publikowany na PyPI jako ksef-client i obsługuje aktualny kontrakt
KSeF API v2.7.1 (changelog API).
Biblioteka pomaga integrować aplikacje napisane w Pythonie z KSeF bez ręcznego składania żądań HTTP, szyfrowania, podpisów, obsługi sesji i pobierania paczek faktur.
Najważniejsze cechy:
- typowane modele
ksef_client.modelszamiast surowych słowników dla publicznych żądań SDK, - klient synchroniczny i asynchroniczny:
KsefClientorazAsyncKsefClient, - CLI
ksefdo konfiguracji, diagnostyki, uwierzytelniania, wysyłki i pobierania faktur, - uwierzytelnianie tokenem KSeF i XAdES, w tym obsługa PKCS#12 oraz PEM,
- sesje online i wsadowe, eksport faktur, UPO, linki weryfikacyjne, QR i Latarnia KSeF,
- FA(3): budowanie XML faktur, walidacja XSD i przygotowanie paczek ZIP/TarGz,
- narzędzia pomocnicze do szyfrowania, ZIP/TarGz, Base64Url i obsługi adresów pre-signed URL.
🧭 Spis treści
- Kiedy użyć tej biblioteki
- Instalacja
- Szybki start: CLI
- Szybki start: SDK
- FA(3) SDK
- Najważniejsze możliwości
- Dokumentacja
- Jakość i rozwój
- Kontrybucja
✅ Kiedy użyć tej biblioteki
Użyj ksef-client, jeżeli potrzebujesz:
- zbudować integrację z KSeF API w aplikacji napisanej w Pythonie,
- szybko sprawdzić konfigurację środowiska KSeF z terminala,
- obsłużyć pełny przepływ uwierzytelnienia, wysyłki faktury i pobrania UPO,
- pracować na typowanych modelach zamiast utrzymywać własne słowniki i mapowania JSON,
- korzystać z gotowych scenariuszy dla sesji online, sesji wsadowych i eksportu faktur,
- przygotowywać XML FA(3) programistycznie i walidować go z oficjalnym XSD,
- testować integrację w środowiskach TEST/DEMO przed przejściem na PROD.
Publiczny kontrakt SDK jest typowany: do metod klientów przekazuj obiekty ksef_client.models.*,
a nie surowe dict. Jeżeli migrujesz starszą integrację, zacznij od
docs/migration-typed-model-api.md.
📦 Instalacja
Wymagany Python: >= 3.10.
Podstawowe SDK:
pip install ksef-client
SDK z interfejsem CLI:
pip install "ksef-client[cli]"
Pełniejszy zestaw z obsługą XAdES, FA(3), QR i CLI:
pip install "ksef-client[xml,fa3,qr,cli]"
Dodatki opcjonalne:
cli— komendakseforaz zależnoścityper,rich,keyring,xml— podpis XAdES przezlxmlixmlsec,fa3— walidacja XSD dla XML FA(3) przezlxml,qr— generowanie kodów QR w PNG przezqrcodeipillow.
Po instalacji samego ksef-client SDK jest gotowe do użycia w kodzie. Jeżeli uruchomisz wtedy
komendę ksef, otrzymasz czytelną instrukcję doinstalowania dodatku cli, zamiast tracebacka.
🚀 Szybki start: CLI
CLI jest najkrótszą ścieżką do sprawdzenia profilu, uwierzytelnienia i podstawowych operacji bez pisania kodu.
pip install "ksef-client[cli]"
- Utwórz profil i ustaw go jako aktywny:
ksef init --non-interactive --name demo --env DEMO --context-type nip --context-value <NIP> --set-active
- Zaloguj się tokenem KSeF i sprawdź stan sesji:
ksef auth login-token --ksef-token <KSEF_TOKEN>
ksef auth status
ksef profile show
Alternatywnie możesz zalogować się 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/
Najczęściej używane grupy komend:
- konfiguracja profili:
init,profile ..., - uwierzytelnianie:
auth login-token,auth login-xades,auth status,auth refresh,auth revoke-self-token,auth logout, - faktury i sesje:
invoice ...,send ...,upo ...,export ..., - diagnostyka:
health check, - Latarnia KSeF:
lighthouse status,lighthouse messages.
Komendy Latarni są publiczne i działają bez logowania. Jeżeli nie masz aktywnego profilu, CLI używa domyślnie środowiska testowego Latarni.
Pełna specyfikacja CLI: docs/cli/README.md.
🧩 Szybki start: SDK
Minimalny przepływ w kodzie zwykle wygląda tak:
- tworzysz klienta dla wybranego środowiska,
- pobierasz publiczny certyfikat KSeF do szyfrowania tokena,
- uzyskujesz
access_token, - wykonujesz wywołanie API na typowanych modelach.
from ksef_client import KsefClient, KsefClientOptions, KsefEnvironment
from ksef_client import models as m
from ksef_client.services import AuthCoordinator
KSEF_TOKEN = "<TOKEN_KSEF>"
CONTEXT_TYPE = "nip"
CONTEXT_VALUE = "5265877635"
with KsefClient(KsefClientOptions(base_url=KsefEnvironment.DEMO.value)) as client:
token_cert_pem = client.security.get_public_key_certificate_pem(
m.PublicKeyCertificateUsage.KSEFTOKENENCRYPTION,
)
access_token = AuthCoordinator(client.auth).authenticate_with_ksef_token(
token=KSEF_TOKEN,
public_certificate=token_cert_pem,
context_identifier_type=CONTEXT_TYPE,
context_identifier_value=CONTEXT_VALUE,
max_attempts=90,
poll_interval_seconds=2.0,
).access_token
metadata = client.invoices.query_invoice_metadata_by_date_range(
subject_type=m.InvoiceQuerySubjectType.SUBJECT1,
date_type=m.InvoiceQueryDateType.ISSUE,
date_from="2026-01-01T00:00:00Z",
date_to="2026-01-31T23:59:59Z",
access_token=access_token,
page_size=10,
)
print(f"Liczba faktur: {len(metadata.invoices)}")
📤 Wysyłka faktury w sesji online
Do wysyłki faktur używaj scenariusza OnlineSessionWorkflow. Aktualny model pracy to:
open_session() -> session.send_invoice() -> session.close().
Poniższy fragment zakłada, że jesteś wewnątrz bloku with KsefClient(...) as client: i masz już access_token z poprzedniego kroku.
from pathlib import Path
from ksef_client import models as m
from ksef_client.services import OnlineSessionWorkflow
invoice_xml = Path("./fa.xml").read_bytes()
symmetric_cert_pem = client.security.get_public_key_certificate_pem(
m.PublicKeyCertificateUsage.SYMMETRICKEYENCRYPTION,
)
workflow = OnlineSessionWorkflow(client.sessions)
session = workflow.open_session(
form_code=m.FormCode(system_code="FA (3)", schema_version="1-0E", value="FA"),
public_certificate=symmetric_cert_pem,
access_token=access_token,
)
send_result = session.send_invoice(invoice_xml, access_token=access_token)
session.close(access_token=access_token)
print(send_result.reference_number)
Pełne, uruchamialne przykłady znajdują się w docs/examples/.
🧾 FA(3) SDK
Warstwa ksef_client.documents.fa3 służy do programistycznego przygotowania faktur FA(3) przed wysyłką do KSeF. Zakres tej warstwy obejmuje:
- typed buildery dla faktur podstawowych, korekt, zaliczek i rozliczeń zaliczek,
- prostsze drafty
FA3Draft/FA3BatchDraftprzydatne dla integracji JSON i generowania ZIP, - serializację do XML oraz opcjonalną walidację XSD przez
to_xml(xsd_validate=True), - przygotowanie XML do sesji online i paczek ZIP do sesji wsadowych.
Walidacja XSD używa dodatku fa3 (pip install "ksef-client[fa3]" albo lokalnie pip install -e .[fa3]).
Szczegóły: docs/fa3-sdk.md oraz docs/workflows/fa3.md.
Przykłady uruchomieniowe:
docs/examples/fa3_single_invoice_sdk.py— pojedyncza faktura FA(3) do XML,docs/examples/fa3_batch_zip_sdk.py— wiele faktur FA(3) do ZIP,docs/examples/fa3_correction_settlement_sdk.py— korekta i rozliczenie zaliczki,docs/examples/fa3_json_roundtrip_sdk.py— JSON draft → ZIP XML.
🧰 Najważniejsze możliwości
| Obszar | Co dostajesz |
|---|---|
| Klienci API | KsefClient, AsyncKsefClient i podklienci mapujący endpointy KSeF. |
| Modele | Typowane modele żądań i odpowiedzi w ksef_client.models. |
| Uwierzytelnianie | Token KSeF, XAdES, odświeżanie tokenów i unieważnianie bieżącego tokena. |
| Sesje | Sesje online i wsadowe, obsługa ZIP, części, szyfrowania i zamykania sesji. |
| Faktury | Lista metadanych, pobieranie faktur, eksport paczek i narzędzia do ich przetwarzania. |
| FA(3) | Buildery, drafty, XML, walidacja XSD i ZIP do sesji wsadowych. |
| UPO | Sprawdzanie statusów i pobieranie urzędowego poświadczenia odbioru. |
| CLI | Operacje administracyjne i diagnostyczne bez pisania kodu. |
| Latarnia | Publiczny status dostępności KSeF i komunikaty serwisowe. |
| QR i linki | Linki weryfikacyjne, podpisy i generowanie kodów QR. |
📚 Dokumentacja
Główna dokumentacja znajduje się w katalogu docs/:
- pierwsze kroki,
- konfiguracja klienta,
- błędy, retry i limity,
- referencja API,
- scenariusze sesji i eksportu,
- usługi pomocnicze,
- narzędzia użytkowe,
- przykłady Python,
- migracja z
dictna typowane modele.
🧪 Jakość i rozwój
Instalacja zależności developerskich:
pip install -r requirements-dev.txt
Podstawowe sprawdzenia lokalne:
pytest
pytest --cov=ksef_client --cov-report=term-missing --cov-fail-under=100
python tools/lint.py
Repozytorium zawiera też narzędzia do synchronizacji modeli ze specyfikacją KSeF oraz kontroli pokrycia obsługiwanych endpointów:
python tools/sync_generated.py --check
python tools/check_coverage.py --src src/ksef_client/clients
Testy E2E wymagają osobnej konfiguracji środowiska KSeF i danych dostępowych. Szczegóły scenariuszy oraz zmiennych środowiskowych są opisane w dokumentacji i testach.
🤝 Kontrybucja
Zgłoszenia błędów, propozycje zmian i pull requesty są mile widziane.
Rekomendowany przebieg pracy:
- opisz problem albo propozycję w Issue,
- pracuj w osobnej gałęzi,
- dodaj testy dla zmian zachowania,
- uruchom lokalnie
python tools/lint.pyoraz testy, - w PR opisz zakres zmiany, uzasadnienie i sposób weryfikacji.
Metadata
Release files for ksef-client 0.17.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ksef_client-0.17.1.tar.gz | 254.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ksef_client-0.17.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 468.6 kB
Release files / ksef_client-0.17.1.tar.gz
| Download URL | ksef_client-0.17.1.tar.gz |
|---|---|
| Size | 254.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
14365e25c00ccdc7c1419b43c01bd9a2eda11808b7635f3b0150ea91f68ba2cb
|
|
BLAKE2b-256 checksum How to use checksums |
98d3c55c2fe4ca739f09f17a0ed8e849454c63413cd23378281823cba9717a5f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 30, 2026.
Transparency logRelease files / ksef_client-0.17.1-py3-none-any.whl
| Download URL | ksef_client-0.17.1-py3-none-any.whl |
|---|---|
| Size | 214.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4dde19e99677dd85b37e4e7d1db9e4b021fe83f0990e8763e9c9f3314f6ad48c
|
|
BLAKE2b-256 checksum How to use checksums |
82c2d05c22813fd811db6c5312fa7057fa4424b65a84716697b7e922c135d81e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 30, 2026.
Transparency log