KSeF 2.0 to interfejs REST API Ministerstwa Finansów dla Krajowego Systemu e-Faktur. Integracja uwierzytelnia się za pomocą wyzwania (challenge) podpisanego certyfikatem kwalifikowanym lub zaszyfrowanego tokenem KSeF, wymienia wynik na krótkotrwały JWT, otwiera sesję z wygenerowanym przez siebie kluczem AES, przesyła faktury XML FA(3) zaszyfrowane tym kluczem, odpytuje o ich status i pobiera UPO — urzędowe poświadczenie, które nadaje fakturze numer KSeF i byt prawny. Ten przewodnik podąża za tą sekwencją, a następnie omawia wysyłkę wsadową, tryby offline, limity oraz to, jak moduł KSeF w KRONENWERK odwzorowuje ten proces.
Środowiska
Istnieją trzy publiczne środowiska i nie są one wymienne. Wszystko poniżej dotyczy wszystkich trzech; o wyborze decyduje adres bazowy.
| Środowisko | Adres bazowy | Przeznaczenie |
|---|---|---|
| TEST (TE) | https://api-test.ksef.mf.gov.pl | Testy integracyjne z wersjami release-candidate. Do uwierzytelniania akceptowane są certyfikaty samopodpisane; dane są współdzielone między integratorami i nieizolowane, więc należy używać losowych numerów NIP, nigdy prawdziwych. |
| DEMO | https://api-demo.ksef.mf.gov.pl | Walidacja przedprodukcyjna odzwierciedlająca konfigurację produkcyjną; wymagane prawdziwe certyfikaty. |
| PRODUKCJA (PRD) | https://api.ksef.mf.gov.pl | Faktury z pełnym skutkiem prawnym. |
Dokumentacja API jest udostępniana pod ścieżką /docs/v2 pod każdym adresem bazowym, a ten sam opis OpenAPI, przewodniki i oficjalne biblioteki klienckie (C# i Java) publikuje organizacja CIRFMF Ministerstwa na GitHubie. Od 1 października 2025 r. środowiska testowe mają zaplanowane okna serwisowe (16:00–18:00), podczas których wywołania mogą się nie powieść. Nigdy nie należy przesyłać faktur produkcyjnych ani prawdziwych danych podmiotów do środowisk TEST lub DEMO.
Uwierzytelnianie
Każde chronione wywołanie zawiera token dostępowy JWT. Jego uzyskanie to pięcioetapowy proces, którego pierwszy i ostatni krok są takie same niezależnie od rodzaju poświadczenia.
- Challenge.
POST /auth/challengezwraca wartość wyzwania i znacznik czasu. Jest ważne przez 10 minut. - Potwierdzenie tożsamości na jeden z dwóch sposobów:
- Podpis XAdES. Należy zbudować XML
AuthTokenRequestzawierający wyzwanie, identyfikator kontekstu (NIP, identyfikator wewnętrzny lub identyfikator VAT UE podmiotu, w imieniu którego Państwo działają) oraz typ identyfikatora podmiotu, podpisać go w formacie XAdES certyfikatem kwalifikowanym (osobisty lub organizacyjny certyfikat kwalifikowany, Profil Zaufany, certyfikat KSeF lub certyfikat dostawcy Peppol) i wysłać doPOST /auth/xades-signature. - Token KSeF. Należy połączyć
{ksefToken}|{timestampMs}, zaszyfrować RSA-OAEP (SHA-256, MGF1) opublikowanym kluczem publicznym Ministerstwa, zakodować w Base64 i wysłać razem z wyzwaniem i kontekstem doPOST /auth/ksef-token. Tokeny KSeF są wydawane wewnątrz KSeF przez osobę, która już posiada uprawnienia do podmiotu; nadają się do integracji bezobsługowych.
- Podpis XAdES. Należy zbudować XML
- Odpytywanie.
GET /auth/{referenceNumber}z tokenem tymczasowym, aż status będzie ostateczny. Weryfikacja jest asynchroniczna — system sprawdza podpis i certyfikat wobec OCSP/CRL. - Wymiana.
POST /auth/token/redeemjednorazowo wymienia token tymczasowy naaccessToken(JWT, około 15 minut, dokładny czas życia jest w jego poluexp) orazrefreshToken(około 7 dni). - Odświeżanie.
POST /auth/token/refreshz tokenem odświeżającym zwraca nowy token dostępowy z aktualnymi uprawnieniami podmiotu.
Uprawnienia nadaje się w KSeF per podmiot i per rola (wystawianie, odczyt, zarządzanie poświadczeniami itd.); token dostępowy odzwierciedla uprawnienia z chwili wydania i jest unieważniany po ich odebraniu. Polityka autoryzacji może ograniczyć token do adresów lub zakresów IP. Oba tokeny należy przechowywać jako sekrety.
Sesja interaktywna: wysyłka, status, UPO
Sesja interaktywna przesyła faktury pojedynczo, synchronicznie na poziomie transmisji i asynchronicznie na poziomie przetwarzania. Jest to tryb używany przez większość oprogramowania do fakturowania.
- Przygotowanie klucza. Należy wygenerować 256-bitowy klucz AES i 128-bitowy IV. Klucz szyfruje się kluczem publicznym RSA Ministerstwa (RSAES-OAEP, MGF1 z SHA-256). Biblioteki klienckie Ministerstwa zawierają
CryptographyService, który to wykonuje. - Otwarcie.
POST /sessions/onlinez wersją schematu (FA(3) — aktualny schemat faktury; FA(2) jest nadal wymieniany w dokumentacji) i zaszyfrowanym kluczem. Odpowiedź zawierareferenceNumbersesji ivalidUntil. Sesja żyje 12 godzin, a pod jednym tokenem dostępowym może być otwartych równolegle kilka sesji. - Wysyłka.
POST /sessions/online/{referenceNumber}/invoicesz fakturą zaszyfrowaną AES-256-CBC z dopełnieniem PKCS#7 i zakodowaną w Base64, plus skrót SHA-256 i rozmiar zarówno pliku jawnego, jak i zaszyfrowanego. Odpowiedź potwierdza przyjęcie; walidacja wobec schematu i reguł biznesowych zaczyna się natychmiast i asynchronicznie. - Odpytywanie.
GET /sessions/{referenceNumber}/invoiceswymienia status każdej faktury: przyjęta z numerem KSeF lub odrzucona z podaniem przyczyny. Należy odpytywać z wykładniczym opóźnieniem, a nie w ciasnej pętli. - Zamknięcie.
POST /sessions/online/{referenceNumber}/closekończy sesję i uruchamia generowanie zbiorczego UPO. - Pobranie UPO. UPO (Urzędowe Poświadczenie Odbioru) to podpisany dokument XML wymieniający przyjęte faktury z ich numerami KSeF i znacznikami czasu przyjęcia. Należy je przechowywać razem z fakturami: jest dowodem, że faktura została wystawiona w sensie prawnym.
To numer KSeF, a nie Państwa numer wewnętrzny, widzi nabywca w swojej skrzynce KSeF i to on może być wymagany w tytule płatności. Datą wystawienia dla celów VAT jest data przyjęcia faktury przez KSeF, która może różnić się od daty w FA(3) — kwestia ta w każdym konkretnym przypadku wymaga potwierdzenia przez specjalistę.
Sesja wsadowa
Sesja wsadowa przesyła wiele faktur jako jeden zaszyfrowany plik ZIP. Nadaje się do przetwarzania na koniec miesiąca i migracji.
- Pliki XML FA(3) należy umieścić w archiwum ZIP.
- Binarny ZIP należy podzielić na części o rozmiarze maksymalnie 100 MB, numerowane po kolei.
- Każdą część szyfruje się AES-256-CBC według tego samego schematu klucza co powyżej; oblicza się SHA-256 i rozmiar każdej zaszyfrowanej części.
POST /sessions/batchz zaszyfrowanym kluczem, metadanymi ZIP, wersją schematu i listą części. Odpowiedź zwracareferenceNumberoraz, dla każdej części, adres URL, metodę i nagłówki do przesłania.- Każdą część przesyła się jako surowe dane binarne pod jej adres URL. Okno przesyłania wynosi 20 minut na zadeklarowaną część, sumowane.
POST /sessions/batch/{referenceNumber}/close, następnie odpytanie o status sesji i pobranie zbiorczego UPO jak w sesji interaktywnej.
Oba typy sesji przyjmują do 10 000 faktur. Faktura może mieć maksymalnie 1 MB lub 3 MB z załącznikiem.
Odczyt faktur
Strona odbiorcza jest symetryczna. POST /invoices/query/metadata zwraca metadane faktur dla typu podmiotu (wystawca, odbiorca itd.) i zakresu dat, stronicowane za pomocą pageOffset i pageSize. GET /invoices/ksef/{ksefNumber} pobiera jedną fakturę po numerze KSeF. Do pobierania masowego POST /invoices/exports uruchamia asynchroniczny eksport pod dostarczonym przez Państwa kluczem szyfrującym, a GET /invoices/exports/{referenceNumber} raportuje postęp i zwraca zaszyfrowaną paczkę. Integracja, która musi widzieć każdą fakturę zakupu, odpytuje zapytanie o metadane przyrostowo, zamiast wielokrotnie eksportować.
Tryby offline
Trzy tryby pozwalają podatnikowi wystawiać poza KSeF i przesyłać później. Każdy ma własny warunek uruchomienia i termin, a każdy jest prawnie odrębny.
| Tryb | Warunek uruchomienia | Termin przesłania | Podstawa prawna (według Ministerstwa) |
|---|---|---|---|
| offline24 | Wybór podatnika, w dowolnym momencie | Następny dzień roboczy po wystawieniu | Art. 106nda ustawy o VAT |
| offline (ogłoszona niedostępność) | Ministerstwo ogłasza niedostępność KSeF | Następny dzień roboczy po przywróceniu usługi | Art. 106nh ustawy o VAT, od 1 lutego 2026 r. |
| awaryjny | Ministerstwo ogłasza awarię KSeF | 7 dni roboczych po zakończeniu awarii | Art. 106nf ustawy o VAT, od 1 lutego 2026 r. |
Faktura offline to zwykła FA(3) z dwoma wydrukowanymi lub osadzonymi kodami QR: KOD I, który pozwala nabywcy zweryfikować fakturę w KSeF, oraz KOD II, który potwierdza tożsamość wystawcy na podstawie jego certyfikatu KSeF. Przy późniejszym przesyłaniu należy ustawić offlineMode: true w żądaniu wysyłki w dowolnym typie sesji. Jeśli KSeF stanie się niedostępny w oknie przesyłania, termin biegnie od nowa i może sięgać 7 dni roboczych od zakończenia przerwy.
Limity i błędy
Ministerstwo dokumentuje limity per kontekst (podmiot, w imieniu którego Państwo działają) i per poświadczenie, a nie per klucz API: 10 000 faktur na sesję, 1 MB lub 3 MB na fakturę, 100 MB na część wsadu oraz limity wniosków o certyfikaty i aktywnych certyfikatów per identyfikator (dla NIP: 300 wniosków i 100 aktywnych certyfikatów w chwili odczytu). Istnieją limity częstotliwości żądań — dokumentacja mówi, że system ogranicza liczbę żądań w celu ochrony stabilności — opisane w osobnym dokumencie o limitach; należy projektować z myślą o HTTP 429 z ponawianiem i wykładniczym opóźnieniem, a nie o stałej wartości.
Błędy wracają jako status HTTP z treścią JSON opisującą problem: 400 dla wadliwych żądań, 401 dla brakującego lub wygasłego tokenu, 403 dla uprawnienia, którego token nie zawiera, a błędy walidacji poszczególnych faktur są raportowane w statusie sesji, a nie w wywołaniu wysyłki. Błędy schematu (XML nie pasuje do FA(3)) i błędy semantyczne (nieistniejący NIP, data poza dozwolonym oknem, duplikat) ujawniają się na różnych etapach; należy czytać wpis statusu każdej faktury, zamiast ufać kodowi 2xx przy przesłaniu.
Jak KRONENWERK to obsługuje
JESZCZE NIEGOTOWE Moduł KSeF 2.0 w KRONENWERK implementuje opisany powyżej przepływ: uwierzytelnianie tokenem (challenge, zaszyfrowany token KSeF, wymiana, odświeżanie), sesję interaktywną z kluczem AES generowanym dla każdej sesji, generowanie i wysyłkę FA(3), odpytywanie o status, pobieranie UPO oraz odczyt otrzymanych faktur. Jest zależny od środowiska poprzez konfigurację — ten sam kod kieruje się do TEST, DEMO lub produkcji zgodnie z ustawieniami — i nie był używany wobec produkcyjnego KSeF. Z tego powodu KRONENWERK obecnie nie sprzedaje subskrypcji polskim firmom i nic na tej stronie nie należy odczytywać jako gotowości produkcyjnej. Samo generowanie FA(3) jest OBSŁUGIWANE Z OGRANICZENIAMI: XML jest tworzony i sprawdzany wobec schematu przy wystawianiu, ale przesyłanie oraz wynikający z niego numer KSeF i UPO zależą od sprawdzenia modułu w produkcji. Publiczne API nie udostępnia operacji KSeF: POST /invoices/drafts tworzy szkic, wystawianie odbywa się w produkcie, a żaden punkt końcowy nie przesyła FA(3), nie zwraca numeru KSeF ani nie pobiera UPO. Zob. integracja KSeF — co oferuje API, KSeF — wyjaśnienie i FA(3) — format, oraz przegląd Polski i stronę krajową — aktualny status.
Najczęściej zadawane pytania
Jakiego poświadczenia powinna używać integracja: certyfikatu czy tokenu KSeF?
Token KSeF nadaje się do bezobsługowych integracji serwer-serwer; jest generowany wewnątrz KSeF przez osobę, która już posiada uprawnienia do podmiotu, i używany w postaci zaszyfrowanej kluczem publicznym Ministerstwa. Certyfikat kwalifikowany z XAdES to droga dla osób oraz do uzyskania certyfikatu KSeF w pierwszej kolejności. Z którego podmiot może korzystać, jest kwestią uprawnień tego podmiotu.
Kiedy faktura jest „wystawiona” w KSeF?
Gdy KSeF ją przyjmie i nada numer KSeF, odnotowany w UPO. Do tego czasu przesłana faktura jest w toku, a odrzucona nigdy nie została wystawiona. Konsekwencje dla daty VAT wymagają potwierdzenia przez specjalistę.
Czy mogę testować na prawdziwych danych firmy?
Nie. Ministerstwo stwierdza, że dane w środowisku TEST są współdzielone między integratorami i nieizolowane oraz że faktur produkcyjnych i prawdziwych danych podmiotów nigdy nie wolno wysyłać do TEST lub DEMO. W środowisku TEST należy używać losowych numerów NIP.
Czy KRONENWERK przesyła faktury do produkcyjnego KSeF?
Nie w chwili pisania. Moduł jest zbudowany i zależny od środowiska; nie był używany wobec produkcyjnego KSeF, a KRONENWERK nie sprzedaje subskrypcji polskim firmom, dopóki nie zostanie to sprawdzone.
Jaka jest różnica między FA(2) a FA(3)?
Są to kolejne wersje struktury logicznej faktury ustrukturyzowanej Ministerstwa. FA(3) to aktualny schemat dla KSeF 2.0; dokumentacja nadal wymienia FA(2) jako wybieralną wersję schematu. Daty akceptacji każdej z nich w produkcji należy sprawdzić w changelogu.
Źródła
- Ministry of Finance (CIRFMF) — KSeF 2.0 API documentation, repository overview — odczytano
- Ministry of Finance (CIRFMF) — KSeF API 2.0 environments — odczytano
- Ministry of Finance (CIRFMF) — Authentication — odczytano
- Ministry of Finance (CIRFMF) — Interactive session — odczytano
- Ministry of Finance (CIRFMF) — Batch session — odczytano
- Ministry of Finance (CIRFMF) — Offline modes — odczytano
- Ministry of Finance (CIRFMF) — Retrieving invoices — odczytano
- Ministry of Finance (CIRFMF) — Limits — odczytano
- Ministry of Finance — Scope of mandatory KSeF (ksef.podatki.gov.pl) — odczytano
- KRONENWERK developer documentation — odczytano