Client SDK for KSeF API v2
Project description
KSeF Client Python
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.
🔄 Kompatybilność
Aktualna kompatybilność: KSeF API v2.5.0 (api-changelog.md).
Od tej wersji publiczne payloady requestów SDK są typed-only. Do metod klientów przekazuj
obiekty ksef_client.models.*, a nie surowe dict.
🧭 Spis treści
- Zakres funkcjonalny
- Instalacja
- Szybki start: CLI w 2-3 minuty
- Szybki start: SDK
- Najważniejsze scenariusze SDK
- Dokumentacja
- Migracja typed model API
- Testy i jakość
- Kontrybucja
✅ Zakres funkcjonalny
- 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.
- Latarnia: publiczne endpointy dostępności KSeF (
client.lighthouse,ksef lighthouse ...). - Narzędzia pomocnicze: AES/ZIP/Base64Url, linki weryfikacyjne, QR.
- CLI
ksef: szybka ścieżka od konfiguracji do pierwszych operacji:init -> auth -> invoice/send/upo.
📦 Instalacja
Wymagania: Python >= 3.10.
Podstawowe SDK (bez zależności CLI):
pip install ksef-client
SDK + 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
Po podstawowej instalacji pip install ksef-client pakiet SDK jest gotowy do użycia, ale komenda ksef
zwróci kontrolowany komunikat o brakujących zależnościach CLI. Aby uruchamiać CLI, doinstaluj extra cli.
🚀 Szybki start: CLI
CLI ksef zostało zaprojektowane tak, aby skrócić wejście w SDK do minimum.
Najpierw zainstaluj zależności CLI:
pip install "ksef-client[cli]"
- 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 show
Alternatywnie, 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 revoke-self-token,auth logout - operacje:
invoice ...,send ...,upo ...,export ... - diagnostyka:
health check - latarnia:
lighthouse status,lighthouse messages- komendy Latarni sa publiczne (dzialaja bez logowania; bez profilu domyslnie uzywana jest latarnia test)
Pełna specyfikacja CLI: docs/cli/README.md
🛠️ Troubleshooting CLI
Jeśli po pip install ksef-client uruchomisz ksef, komenda nie zakończy się tracebackiem, tylko czytelną
instrukcją doinstalowania CLI:
Install CLI dependencies with: pip install "ksef-client[cli]"
To zachowanie jest celowe: bazowa instalacja obejmuje SDK, a CLI pozostaje opcjonalne.
🧩 Szybki start: SDK
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, models as m
from ksef_client.services import AuthCoordinator
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="nip",
context_identifier_value="5265877635",
).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,
)
🔐 Najważniejsze scenariusze SDK
Autoryzacja tokenem KSeF
tokens = AuthCoordinator(client.auth).authenticate_with_ksef_token(
token=KSEF_TOKEN,
public_certificate=token_cert_pem,
context_identifier_type="nip",
context_identifier_value="5265877635",
).tokens
Autoryzacja certyfikatem XAdES
Wymaga 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,
).tokens
Wysyłka faktury w sesji online
from 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,
)
Wysyłka wsadowa batch ZIP
from ksef_client.services.workflows import BatchSessionWorkflow
from ksef_client import models as m
session_reference_number = BatchSessionWorkflow(client.sessions, client.http_client).open_upload_and_close(
form_code=m.FormCode(system_code="FA (3)", schema_version="1-0E", value="FA"),
zip_bytes=zip_bytes,
public_certificate=symmetric_cert_pem,
access_token=access_token,
parallelism=4,
)
Odczyt statusu Latarni
status = client.lighthouse.get_status()
messages = client.lighthouse.get_messages()
📚 Dokumentacja
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 - migracja typed model API:
docs/migration-typed-model-api.md - workflows:
docs/workflows/README.md - usługi:
docs/services/README.md - utils:
docs/utils/README.md - przykłady:
docs/examples/README.md
🔁 Migracja typed model API
Jeśli przechodzisz ze starszej integracji opartej o dict, zacznij od krótkiego przewodnika:
docs/migration-typed-model-api.md.
🧪 Testy i jakość
Instalacja zależności developerskich:
pip install -r requirements-dev.txt
Uruchomienie testów:
pytest
Uruchomienie testów z kontrolą pokrycia:
pytest --cov=ksef_client --cov-report=term-missing --cov-fail-under=100
Synchronizacja wygenerowanych artefaktów z aktualna oficjalna specyfikacja KSeF:
python tools/sync_generated.py
Walidacja, że src/ksef_client/openapi_models.py i src/ksef_client/models.pyi sa zgodne z generatorami:
python tools/sync_generated.py --check
python tools/lint.py
Walidacja strict-live bez fallbacku do snapshotu:
python tools/sync_generated.py --check --no-fallback
python tools/check_coverage.py --no-fallback --src src/ksef_client/clients
Przy pracy bez --input narzędzia próbują najpierw pobrać oficjalną specyfikację KSeF, a przy
niedostępności endpointu przechodzą na ostatni snapshot zapisany w repo.
Testy E2E w tests/test_e2e_token_flows.py wymagają osobnej konfiguracji środowiska i danych dostępowych.
🤝 Kontrybucja
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ksef_client-0.12.3.tar.gz.
File metadata
- Download URL: ksef_client-0.12.3.tar.gz
- Upload date:
- Size: 153.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
840133b0305718331d8bb59019e0d12abcd498c90a4a785c0a8fce35a67805a9
|
|
| MD5 |
f4ef6005b2722974b3d302bb76111811
|
|
| BLAKE2b-256 |
4479f50f2c8cff27cb129c67880afcc7931d47dad017bfd3859b1b1f8eaefc5b
|
Provenance
The following attestation bundles were made for ksef_client-0.12.3.tar.gz:
Publisher:
publish-pypi.yml on smekcio/ksef-client-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ksef_client-0.12.3.tar.gz -
Subject digest:
840133b0305718331d8bb59019e0d12abcd498c90a4a785c0a8fce35a67805a9 - Sigstore transparency entry: 1460787301
- Sigstore integration time:
-
Permalink:
smekcio/ksef-client-python@38dd3087960fd398ed5c26f10be51cf2566a6d69 -
Branch / Tag:
refs/tags/v0.12.3 - Owner: https://github.com/smekcio
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@38dd3087960fd398ed5c26f10be51cf2566a6d69 -
Trigger Event:
release
-
Statement type:
File details
Details for the file ksef_client-0.12.3-py3-none-any.whl.
File metadata
- Download URL: ksef_client-0.12.3-py3-none-any.whl
- Upload date:
- Size: 135.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f58534760ab211f3ff58fb0546a03c293d8fc50fec8841977f6a18a4c772bedc
|
|
| MD5 |
c7bf19e63a3baf9bdd6e09a132efd36d
|
|
| BLAKE2b-256 |
11c2eedcd189aa4e4d805f23fdf04ee46935dd921493dad96e0073cea0a17177
|
Provenance
The following attestation bundles were made for ksef_client-0.12.3-py3-none-any.whl:
Publisher:
publish-pypi.yml on smekcio/ksef-client-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ksef_client-0.12.3-py3-none-any.whl -
Subject digest:
f58534760ab211f3ff58fb0546a03c293d8fc50fec8841977f6a18a4c772bedc - Sigstore transparency entry: 1460787371
- Sigstore integration time:
-
Permalink:
smekcio/ksef-client-python@38dd3087960fd398ed5c26f10be51cf2566a6d69 -
Branch / Tag:
refs/tags/v0.12.3 - Owner: https://github.com/smekcio
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@38dd3087960fd398ed5c26f10be51cf2566a6d69 -
Trigger Event:
release
-
Statement type: