Skip to main content

Client SDK for KSeF API v2

Project description

KSeF Client Python

CI PyPI - License PyPI - Version

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

  • Klienci API: KsefClient, AsyncKsefClient, mapujące endpointy KSeF.
  • Uwierzytelnianie: token KSeF i podpis XAdES, w tym XadesKeyPair dla 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 z lxml i xmlsec
  • qr - generowanie PNG z kodami QR przez qrcode i pillow
  • cli - interfejs wiersza poleceń oparty o typer, 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]"
  1. Utwórz i aktywuj profil:
ksef init --non-interactive --name demo --env DEMO --context-type nip --context-value <NIP> --set-active
  1. 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
  1. 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_token przez 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/:

🔁 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ść

Python E2E TEST token Python E2E TEST cert Python E2E DEMO token Python E2E DEMO cert

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ksef_client-0.12.4.tar.gz (153.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ksef_client-0.12.4-py3-none-any.whl (135.0 kB view details)

Uploaded Python 3

File details

Details for the file ksef_client-0.12.4.tar.gz.

File metadata

  • Download URL: ksef_client-0.12.4.tar.gz
  • Upload date:
  • Size: 153.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for ksef_client-0.12.4.tar.gz
Algorithm Hash digest
SHA256 343e92dd8c1b33bdb27d6d2d8a7be7ec731213ad4dde9a372e28b5eb40933dda
MD5 3bb140e0ee0274fe9268f54a0d737e45
BLAKE2b-256 feb0e9e3e9d6c1928b5c0e95d695fff4e33f433f397c86d5923ca8851e0c6b6b

See more details on using hashes here.

Provenance

The following attestation bundles were made for ksef_client-0.12.4.tar.gz:

Publisher: publish-pypi.yml on smekcio/ksef-client-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ksef_client-0.12.4-py3-none-any.whl.

File metadata

  • Download URL: ksef_client-0.12.4-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

Hashes for ksef_client-0.12.4-py3-none-any.whl
Algorithm Hash digest
SHA256 64cd847df72c715661fff755cc3b580fc90e7fa31d4ec4a404583dc6370276c6
MD5 add79f3c85760f41ab8ae56e8a533939
BLAKE2b-256 3c9a33fbbe1ffe35b7e420ff156ca5274bbc8b4ee6269b8cc34460591b0c876b

See more details on using hashes here.

Provenance

The following attestation bundles were made for ksef_client-0.12.4-py3-none-any.whl:

Publisher: publish-pypi.yml on smekcio/ksef-client-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page