Ten dokument opisuje aktualne CLI 1:1 wobec implementacji w src/ksef_client/cli.
CLI ma skracac droge od instalacji do pierwszej realnej operacji KSeF:
init -> auth -> invoice/send/upo.
- onboarding i profile:
initprofile list/show/use/create/set/delete
- auth:
auth login-tokenauth login-xadesauth statusauth refreshauth logout
- diagnostyka:
health check
- latarnia:
lighthouse statuslighthouse messages
- faktury i UPO:
invoice list,invoice downloadsend online,send batch,send statusupo get,upo wait
- eksport:
export run,export status
- output:
- human
--json(stabilny envelope)
- Instalacja:
pip install -e .- Inicjalizacja profilu:
ksef init --non-interactive --name demo --env DEMO --context-type nip --context-value <NIP> --set-active- Logowanie tokenem + szybka weryfikacja sesji:
ksef auth login-token
ksef auth status
ksef profile show- 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/ksef
init
profile
list
show
use
create
set
delete
auth
login-token
login-xades
status
refresh
logout
health
check
lighthouse
status
messages
invoice
list
download
send
online
batch
status
upo
get
wait
export
run
status
Usage: ksef [OPTIONS] COMMAND [ARGS]...
Options:
--profile TEXT
--json
-v, --verbose
--no-color
--version
--help
Zachowanie profilu:
- gdy podasz
--profile, CLI uzywa tej nazwy, - gdy podasz nieistniejacy
--profile, CLI zwraca blad walidacji (exit code2), - gdy nie podasz, CLI bierze
active_profilez configu, - gdy brak
active_profile, komendy biznesowe zwracaja blad konfiguracji (exit code6). - gdy nie podasz
--base-url, CLI bierze kolejno: CLI option ->KSEF_BASE_URL->profile.base_url-> DEMO.
Brak aktywnego profilu:
- komendy
auth,health,invoice,send,upo,exportwymagaja aktywnego profilu, - komendy
lighthouse ...dzialaja bez profilu (publiczne API Latarni), - jesli profil nie jest ustawiony, CLI zwraca czytelny blad z podpowiedzia:
ksef init --set-activeksef profile use --name <name>- albo uruchomienie komendy z
--profile <name>.
- komendy onboardingu (
init,profile ...) dzialaja bez aktywnego profilu.
Srodowiska i base_url (aby uniknac przypadkowego DEMO):
ksef init --env DEMOustawiahttps://api-demo.ksef.mf.gov.pl,ksef init --env TESTustawiahttps://api-test.ksef.mf.gov.pl,ksef init --env PRODustawiahttps://api.ksef.mf.gov.pl.--base-urlma najwyzszy priorytet i nadpisuje--env.- po zmianie profilu/srodowiska uruchom:
ksef profile showksef auth status
- tryb interaktywny (domyslnie): CLI pyta o brakujace dane,
- tryb nieinteraktywny:
--non-interactive+ komplet danych, --set-activeustawia profil jako aktywny.
Usage: ksef init [OPTIONS]
Options:
--name TEXT
--env TEXT
--base-url TEXT
--context-type TEXT
--context-value TEXT
--non-interactive
--set-active
Usage: ksef profile create [OPTIONS]
Options:
--name TEXT [required]
--env TEXT
--base-url TEXT
--context-type TEXT [default: nip]
--context-value TEXT [required]
--set-active
Uwagi:
- podaj
--envalbo--base-url(gdy oba puste, fallback to DEMO), profile set --key env --value TESTautomatycznie przestawia tezbase_url.
Usage: ksef profile show [OPTIONS]
Options:
--name TEXT
Uwagi:
- bez
--namekomenda bierze aktywny profil, - gdy brak aktywnego profilu i brak
--name, CLI zwraca blad konfiguracji (exit code6).
Usage: ksef profile set [OPTIONS]
Options:
--name TEXT [required]
--key [env|base_url|context_type|context_value] [required]
--value TEXT [required]
Usage: ksef auth login-token [OPTIONS]
Options:
--ksef-token TEXT
--context-type TEXT
--context-value TEXT
--base-url TEXT
--poll-interval FLOAT [default: 2.0]
--max-attempts INTEGER [default: 90]
--save/--no-save [default: save]
Zrodlo tokenu:
--ksef-tokenma najwyzszy priorytet,- gdy
--ksef-tokennie jest podany, CLI czytaKSEF_TOKEN. - gdy
--ksef-tokennie jest podany i brakKSEF_TOKEN, CLI pyta o token ukrytym promptem (tryb interaktywny). - podanie sekretu bezposrednio w
--ksef-token <wartosc>powoduje ostrzezenie runtime (bez ujawniania sekretu).
Fallback kontekstu:
context_typeicontext_valuesa brane kolejno z: CLI option -> env (KSEF_CONTEXT_*) -> aktywny profil.
Usage: ksef auth login-xades [OPTIONS]
Options:
--pkcs12-path TEXT
--pkcs12-password TEXT
--cert-pem TEXT
--key-pem TEXT
--key-password TEXT
--context-type TEXT
--context-value TEXT
--base-url TEXT
--subject-identifier-type TEXT [default: certificateSubject]
--poll-interval FLOAT [default: 2.0]
--max-attempts INTEGER [default: 90]
--save/--no-save [default: save]
Walidacja:
- uzyj dokladnie jednego zrodla certyfikatu:
--pkcs12-path, albo- para
--cert-pem+--key-pem.
- gdy hasla (
--pkcs12-password,--key-password) nie sa podane, CLI moze zapytac o nie ukrytym promptem (tryb interaktywny; puste wejscie = brak hasla). - podanie hasla bezposrednio w opcji (
--pkcs12-password <wartosc>,--key-password <wartosc>) powoduje ostrzezenie runtime (bez ujawniania sekretu).
Fallback kontekstu:
context_typeicontext_valuesa brane kolejno z: CLI option -> env (KSEF_CONTEXT_*) -> aktywny profil.
Usage: ksef auth refresh [OPTIONS]
Options:
--base-url TEXT
--save/--no-save [default: save]
Kiedy uzywac:
- gdy access token wygasl, a refresh token jest nadal wazny,
- gdy chcesz odswiezyc token bez ponownego pelnego logowania.
Uwagi:
- komenda wymaga zapisanych tokenow dla wybranego profilu,
--saveaktualizuje zapisany access token.
Usage: ksef auth logout [OPTIONS]
Kiedy uzywac:
- gdy chcesz usunac lokalnie zapisane tokeny dla biezacego profilu,
- przed przelaczeniem konta lub kontekstu autoryzacji.
Usage: ksef health check [OPTIONS]
Options:
--dry-run
--check-auth
--check-certs
--base-url TEXT
Usage: ksef lighthouse status [OPTIONS]
Options:
--base-url TEXT
Uwagi:
- komenda korzysta z publicznego API Latarni (bez tokenu dostepowego),
- domyslnie base URL Latarni mapowany jest z profilu KSeF (
TEST/DEMO-> latarnia TEST,PROD-> latarnia PROD), - gdy brak profilu i brak override (
--base-url/KSEF_LIGHTHOUSE_BASE_URL), uzywana jest domyslnie latarnia test:https://api-latarnia-test.ksef.mf.gov.pl, --base-urllubKSEF_LIGHTHOUSE_BASE_URLpozwala nadpisac endpoint Latarni.
Usage: ksef lighthouse messages [OPTIONS]
Options:
--base-url TEXT
Usage: ksef invoice list [OPTIONS]
Options:
--from TEXT
--to TEXT
--subject-type TEXT [default: Subject1]
--date-type TEXT [default: Issue]
--page-size INTEGER [default: 10]
--page-offset INTEGER [default: 0]
--sort-order [Asc|Desc] [default: Desc]
--base-url TEXT
Usage: ksef invoice download [OPTIONS]
Options:
--ksef-number TEXT [required]
--out TEXT [required]
--as TEXT [default: xml]
--overwrite
--base-url TEXT
Uwagi:
--outmoze wskazywac plik albo katalog,- sciezka bez rozszerzenia jest traktowana jako plik (np.
./out/invoice).
Usage: ksef send online [OPTIONS]
Options:
--invoice TEXT [required]
--system-code TEXT [default: FA (3)]
--schema-version TEXT [default: 1-0E]
--form-value TEXT [default: FA]
--upo-v43
--wait-status
--wait-upo
--poll-interval FLOAT [default: 2.0]
--max-attempts INTEGER [default: 60]
--save-upo TEXT
--save-upo-overwrite
--base-url TEXT
Uwagi:
--save-upowymaga--wait-upo.--save-upobez rozszerzenia jest traktowane jako sciezka pliku.--save-upo-overwritepozwala nadpisac istniejacy plik UPO wskazany przez--save-upo.
Usage: ksef send batch [OPTIONS]
Options:
--zip TEXT
--dir TEXT
--system-code TEXT [default: FA (3)]
--schema-version TEXT [default: 1-0E]
--form-value TEXT [default: FA]
--parallelism INTEGER [default: 4]
--upo-v43
--wait-status
--wait-upo
--poll-interval FLOAT [default: 2.0]
--max-attempts INTEGER [default: 120]
--save-upo TEXT
--save-upo-overwrite
--base-url TEXT
Walidacja:
- dokladnie jedno z
--zipalbo--dir. --save-upo-overwritepozwala nadpisac istniejacy plik UPO wskazany przez--save-upo.
Usage: ksef upo get [OPTIONS]
Options:
--session-ref TEXT [required]
--invoice-ref TEXT
--ksef-number TEXT
--upo-ref TEXT
--out TEXT [required]
--overwrite
--base-url TEXT
Walidacja:
- dokladnie jedno z:
--invoice-ref,--ksef-number,--upo-ref.
Usage: ksef upo wait [OPTIONS]
Options:
--session-ref TEXT [required]
--invoice-ref TEXT
--upo-ref TEXT
--batch-auto
--poll-interval FLOAT [default: 2.0]
--max-attempts INTEGER [default: 60]
--out TEXT
--overwrite
--base-url TEXT
Walidacja:
- dokladnie jeden tryb:
--invoice-refalbo--upo-refalbo--batch-auto.
Usage: ksef export run [OPTIONS]
Options:
--from TEXT
--to TEXT
--subject-type TEXT [default: Subject1]
--poll-interval FLOAT [default: 2.0]
--max-attempts INTEGER [default: 120]
--out TEXT [required]
--base-url TEXT
0sukces2blad walidacji3blad auth/token4retry exhausted / rate-limit5blad API KSeF6blad konfiguracji/srodowiska7circuit breaker open8blad I/O
-
Rekomendacja dla sekretow auth: nie podawaj ich bezposrednio w argumentach CLI.
- interaktywnie: pomin opcje sekretu i wpisz wartosc w ukrytym prompcie,
- automatyzacja: uzyj zmiennych srodowiskowych (np.
KSEF_TOKEN) albo managera sekretow.
-
Domyslnie CLI wymaga systemowego keyringu do zapisu tokenow.
-
Gdy keyring jest niedostepny, mozliwy jest fallback szyfrowany przez klucz z env:
KSEF_CLI_TOKEN_STORE_KEY=<TWOJ_KLUCZ>- Plaintext fallback do
tokens.jsonpozostaje domyslnie zablokowany i jest tylko trybem awaryjnym. - Mozesz go jawnie wlaczyc (niezalecane) tylko gdy to konieczne:
KSEF_CLI_ALLOW_INSECURE_TOKEN_STORE=1- Gdy CLI faktycznie uzyje plaintext fallback, wypisuje jawne ostrzezenie o niezabezpieczonym zapisie tokenow.
- Na Windows plaintext fallback jest zablokowany nawet po ustawieniu tej zmiennej; uzyj keyringa albo fallbacku szyfrowanego.
- Gdy keyring jest obecny, ale backend zwraca blad, CLI automatycznie przechodzi na dostepny fallback (
KSEF_CLI_TOKEN_STORE_KEYlub awaryjny plaintext poza Windows). ksef health checkoraz diagnostyka preflight pokazuja aktualny tryb polityki token-store jako jedno z:keyringencrypted-fallbackplaintext-fallbackunavailable
Lokalizacja token fallback:
- Windows:
%LOCALAPPDATA%/ksef-cli/tokens.json - Linux/macOS:
~/.cache/ksef-cli/tokens.json
- Zapis
config.jsonjest atomowy (tmp + rename), aby ograniczyc ryzyko uszkodzenia pliku. - Gdy
config.jsonjest uszkodzony (np. niepoprawny JSON), CLI przenosi go do plikuconfig.corrupt-<timestamp>.jsoni startuje z pustym configiem.
- Konfiguracja:
- Windows:
%APPDATA%/ksef-cli/config.json - Linux/macOS:
~/.config/ksef-cli/config.json
- Windows:
- Cache metadanych:
- Windows:
%LOCALAPPDATA%/ksef-cli/cache.json - Linux/macOS:
~/.cache/ksef-cli/cache.json
- Windows:
- Fallback token store:
- Windows:
%LOCALAPPDATA%/ksef-cli/tokens.json - Linux/macOS:
~/.cache/ksef-cli/tokens.json
- Windows:
- Kopia uszkodzonego configu:
config.corrupt-<timestamp>.jsonw tym samym katalogu coconfig.json.
{
"ok": true,
"command": "invoice.list",
"profile": "demo",
"data": {},
"errors": [],
"meta": {
"duration_ms": 120
}
}Uwagi:
- w zdarzeniach informacyjnych (
command=info) poleprofilemoze bycnull, - w bledzie:
ok=false, aerrorszawieracode,message, opcjonalniehint.