Jak działa KSeF API? Szybki przegląd techniczny
KSeF udostępnia REST API do wystawiania, odbierania i weryfikacji faktur ustrukturyzowanych. Dokumentacja jest na ksef.podatki.gov.pl. Brzmi prosto, ale diabeł tkwi w szczegółach.
Autoryzacja i tokeny
KSeF API wymaga autoryzacji tokenem sesyjnym. Żeby go uzyskać, musisz się uwierzytelnić jedną z trzech metod:
- Podpis Zaufany (profil zaufany) — interaktywny, nie da się zautomatyzować
- Podpis kwalifikowany — wymaga fizycznego tokenu USB lub karty kryptograficznej
- Pieczęć kwalifikowana — jedyna opcja sensowna do automatyzacji (M2M), ale wymaga zakupu certyfikatu od kwalifikowanego dostawcy
Token sesyjny ma ograniczony czas życia. Musisz zaimplementować odświeżanie, obsługę wygaśnięcia i bezpieczne przechowywanie poświadczeń. To nie jest Authorization: Bearer <token> — flow jest znacznie bardziej skomplikowany niż typowe REST API.
Format XML FA(2) — co musi zawierać faktura?
Faktura ustrukturyzowana to plik XML zgodny ze schematem FA(2) opublikowanym przez MF. Schemat definiuje kilkadziesiąt pól — wiele obowiązkowych, z rygorystyczną walidacją. Przykładowa struktura (uproszczona):
<Faktura xmlns="...">
<Naglowek>
<KodFormularza>FA</KodFormularza>
<WariantFormularza>2</WariantFormularza>
<DataWytworzeniaFa>2026-03-04T10:00:00</DataWytworzeniaFa>
</Naglowek>
<Podmiot1> <!-- Sprzedawca -->
<DaneIdentyfikacyjne>
<NIP>1234567890</NIP>
<Nazwa>Twoja Firma Sp. z o.o.</Nazwa>
</DaneIdentyfikacyjne>
<Adres> ... </Adres>
</Podmiot1>
<Podmiot2> <!-- Nabywca -->
<DaneIdentyfikacyjne> ... </DaneIdentyfikacyjne>
</Podmiot2>
<Fa>
<P_1>2026-03-04</P_1> <!-- Data wystawienia -->
<P_2>FV 42/03/2026</P_2> <!-- Numer faktury -->
<P_15>500.00</P_15> <!-- Kwota netto -->
<P_16>true</P_16> <!-- Czy jest VAT -->
<FaWiersz>
<NrWierszaFa>1</NrWierszaFa>
<P_7>Usługa SaaS</P_7>
<P_8A>szt.</P_8A>
<P_8B>1</P_8B>
<P_9A>500.00</P_9A>
<P_11>500.00</P_11>
<P_12>23</P_12> <!-- Stawka VAT -->
</FaWiersz>
</Fa>
</Faktura>To wersja uproszczona — pełny schemat ma ponad 300 pól. Pominięcie wymaganego elementu, zły format daty, niepoprawny NIP — i walidacja odrzuca całą fakturę. Musisz znać schemat XSD i testować przeciwko niemu każdą wygenerowaną fakturę.
UPO — Urzędowe Poświadczenie Odbioru
Po przyjęciu faktury KSeF zwraca UPO — potwierdzenie z unikalnym numerem KSeF i timestampem. Musisz:
- Pobrać UPO asynchronicznie (wysyłka i potwierdzenie to osobne endpointy)
- Przechowywać UPO jako dowód wystawienia
- Obsłużyć scenariusz, gdy UPO nie przychodzi (timeout, awaria KSeF)
Środowisko testowe KSeF
MF udostępnia sandbox na ksef-demo.mf.gov.pl. Możesz testować wysyłkę faktur bez skutków prawnych. Autoryzacja w sandboxie działa na uproszczonych tokenach. Przygotuj się na to, że środowisko testowe bywa niestabilne — timeout i błędy 5xx nie są rzadkością.
Problem: Stripe + KSeF = brak natywnej integracji
Stripe ma świetne API i bogate eventy webhookowe: charge.succeeded, invoice.paid, checkout.session.completed. Dostajesz kwotę, walutę, dane klienta, billing details, tax ID (NIP).
Problem: te dane to input, a nie output. Event charge.succeeded nie generuje XML FA(2). Stripe Invoicing tworzy PDF-y — nie faktury ustrukturyzowane. Między webhookiem Stripe a fakturą w KSeF jest przepaść, którą musisz zasypać kodem.
Jak wygląda samodzielna integracja Stripe → KSeF?
Jeśli chcesz zbudować to sam, oto pipeline, który musisz zaimplementować:
- 1
Webhook listener
Endpoint przyjmujący eventy Stripe. Weryfikacja sygnatur, idempotency, obsługa retry. Musisz zdecydować, na które eventy reagujesz (
invoice.paid?charge.succeeded?checkout.session.completed?). - 2
Parsowanie danych kupującego
Wyciągnięcie NIP-u (z
customer.tax_ids), nazwy firmy, adresu z billing details, opisu pozycji z line items. Obsługa brakujących danych (klient nie podał NIP-u, brak adresu). - 3
Generowanie XML FA(2)
Budowanie poprawnego XML-a zgodnego ze schematem XSD. Mapowanie kwot (grosze → złotówki), walut, stawek VAT, dat. Walidacja przeciwko XSD przed wysyłką.
- 4
Autoryzacja w KSeF API
Uzyskanie tokenu sesyjnego (pieczęć kwalifikowana dla M2M), odświeżanie, obsługa wygaśnięcia. Przechowywanie certyfikatu.
- 5
Wysyłka + pobranie UPO
POST do KSeF API, polling po numer KSeF i UPO (osobny endpoint, asynchroniczny). Obsługa statusów: przyjęta, odrzucona, w trakcie przetwarzania.
- 6
Obsługa błędów i retry
Błędy walidacji XML, timeouty KSeF, tryb offline (KSeF niedostępny), kolejkowanie, exponential backoff. Plus monitoring i alerty — musisz wiedzieć, gdy faktura nie przeszła.
- 7
Utrzymanie
Schemat FA(2) się zmienia. MF publikuje nowe wersje XSD. Musisz śledzić zmiany i aktualizować generator XML-a. To nie jest "zbuduj i zapomnij".
Ile to zajmuje? Realny szacunek pracy
Na podstawie publicznych postmortemów i naszego doświadczenia — realne oszacowanie samodzielnej integracji Stripe → KSeF:
| Komponent | Szacunek (h) |
|---|---|
| Webhook listener + parsowanie Stripe | 4–8 |
| Generator XML FA(2) + walidacja XSD | 12–20 |
| Autoryzacja KSeF (pieczęć kwalifikowana, tokeny) | 8–12 |
| Wysyłka do KSeF + polling UPO | 4–8 |
| Obsługa błędów, retry, tryb offline | 6–10 |
| Testy (sandbox KSeF, edge cases) | 8–16 |
| Suma | 42–74h |
Do tego dochodzi utrzymanie: śledzenie zmian w schemacie FA, aktualizacje API KSeF, obsługa nowych edge case'ów. Realnie 2–4h miesięcznie na bieżąco.
Przy stawce 200 zł/h to 8 400–14 800 zł jednorazowo + 400–800 zł/mies. na utrzymanie. Stripto kosztuje 29 zł/mies.
Alternatywa: Stripto jako gotowa integracja
Stripto eliminuje cały pipeline opisany powyżej. Architektura jest prosta:
Stripe webhook
→ Stripto (parsowanie danych, mapowanie pól)
→ API Fakturowni lub inFakt (tworzenie faktury)
→ Fakturownia/inFakt → KSeF (XML FA(2), UPO)Kluczowy insight: Stripto nie komunikuje się bezpośrednio z KSeF API. Deleguje to do Fakturowni lub inFakt — programów, które od lat obsługują KSeF, mają sprawdzoną walidację XML i zarządzanie tokenami. Stripto odpowiada za warstwę Stripe → program księgowy.
Co Stripto obsługuje za Ciebie:
- Webhook listener na eventy Stripe (charge, invoice, checkout)
- Parsowanie danych kupującego (NIP, adres, nazwa firmy)
- Mapowanie kwot, walut, stawek VAT
- Tworzenie klienta + faktury przez API Fakturowni/inFakt
- Automatyczny retry przy błędach tymczasowych
- Dashboard z historią synchronizacji i statusami
- Opcjonalna wysyłka faktury e-mailem do klienta
Konfiguracja: połącz Stripe (OAuth), podaj klucz API Fakturowni lub inFakt, gotowe. Zero kodu po Twojej stronie.
Kiedy budować samemu, a kiedy użyć Stripto?
| Scenariusz | Rekomendacja |
|---|---|
| Standardowe płatności Stripe (Checkout, subskrypcje, Payment Links) | Stripto — gotowe, 29 zł/mies. |
| Niestandardowe flow (marketplace, Connect, split payments) | Rozważ własną integrację z API Fakturowni/inFakt |
| Własny system fakturowania (nie Fakturownia/inFakt) | Własna integracja z KSeF API (nie ma alternatywy) |
| Potrzebujesz faktur jak najszybciej, bez DevOps | Stripto — konfiguracja w minutę |
| Wolisz nie utrzymywać kodu integracji z KSeF | Stripto — zero kodu, zero utrzymania |
Dla 90% firm korzystających ze Stripe sensowna odpowiedź to: użyj Stripto i zajmij się produktem. Nie dlatego, że nie potrafisz tego zbudować — ale dlatego, że te 40–80h lepiej zainwestować w feature'y, które odróżniają Twój produkt od konkurencji.
Zaoszczędź 40h developerskich
Podłącz Stripe do KSeF przez Stripto w minutę — 10 transakcji free, bez karty.
FAQ techniczne
Czy Stripto ma własne API?
Nie w tradycyjnym sensie. Stripto działa w pełni automatycznie — nasłuchuje webhooków Stripe i wywołuje API Fakturowni lub inFakt bez udziału użytkownika. Nie musisz integrować się z API Stripto. Konfiguracja odbywa się przez UI: podajesz klucz API programu księgowego i gotowe. Jeśli potrzebujesz programistycznego dostępu do statusów faktur, wszystkie dane są widoczne w panelu Stripto.
Jak Stripto obsługuje błędy walidacji KSeF?
Stripto nie komunikuje się bezpośrednio z KSeF — robi to Fakturownia lub inFakt. Jeśli API programu księgowego odrzuci fakturę (np. brakujące pole, nieprawidłowy NIP), Stripto zapisuje błąd i wyświetla go w panelu przy danej transakcji. Możesz poprawić dane i powtórzyć synchronizację jednym kliknięciem. Retry dla tymczasowych błędów (timeout, 5xx) jest automatyczny.
Czy mogę używać Stripto i własnej integracji jednocześnie?
Technicznie tak — Stripto nasłuchuje webhooków Stripe niezależnie od Twojego kodu. Ale uwaga: jeśli Twoja integracja też tworzy faktury w tym samym programie księgowym, dostaniesz duplikaty. Jeśli potrzebujesz własnej logiki tylko dla wybranych zdarzeń, możesz obsłużyć je w swoim kodzie i wyłączyć je w konfiguracji Stripto.
Czy Stripto obsługuje tryb offline KSeF?
Stripto deleguje wystawianie faktur do Fakturowni lub inFakt — to one zarządzają wysyłką do KSeF, w tym trybem awaryjnym (offline). Jeśli KSeF jest chwilowo niedostępny, program księgowy kolejkuje faktury i wysyła je automatycznie po przywróceniu systemu. Stripto nie musi się tym zajmować — to warstwa odpowiedzialności programu księgowego.
Połącz Stripe z Fakturownią lub inFakt
Konfiguracja w minutę. Automatyczne faktury gotowe na KSeF.