KSeF — Perspektywa techniczna

KSeF API — integracja ze Stripe krok po kroku (i dlaczego Stripto robi to za Ciebie)

Masz appkę na Stripe, płatności lecą, teraz musisz wystawiać faktury w KSeF. Naturalny odruch programisty: "napiszę to sam". Zanim otworzysz IDE — przeczytaj, co Cię czeka. Ten artykuł to techniczny przegląd integracji Stripe → KSeF i uczciwa analiza build vs buy.

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. 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. 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. 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. 4

    Autoryzacja w KSeF API

    Uzyskanie tokenu sesyjnego (pieczęć kwalifikowana dla M2M), odświeżanie, obsługa wygaśnięcia. Przechowywanie certyfikatu.

  5. 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. 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. 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:

KomponentSzacunek (h)
Webhook listener + parsowanie Stripe4–8
Generator XML FA(2) + walidacja XSD12–20
Autoryzacja KSeF (pieczęć kwalifikowana, tokeny)8–12
Wysyłka do KSeF + polling UPO4–8
Obsługa błędów, retry, tryb offline6–10
Testy (sandbox KSeF, edge cases)8–16
Suma42–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?

ScenariuszRekomendacja
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 DevOpsStripto — konfiguracja w minutę
Wolisz nie utrzymywać kodu integracji z KSeFStripto — 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.

Zacznij za darmo

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.

Wypróbuj Stripto