Wysyłasz fakturę do Krajowego Systemu e-Faktur (KSeF), a program pokazuje kod 440 i komunikat „Duplikat faktury”. W szczegółach odrzucenia KSeF podaje, gdzie jest oryginał. Przykład z dokumentacji MF: „Duplikat faktury. Faktura o numerze KSeF: 5265877635-20250626-010080DD2B5E-26 została już prawidłowo przesłana do systemu w sesji: 20250626-SO-2F14610000-242991F8C9-B4”.
Ten tekst pokazuje, jak odróżnić niegroźne powtórzenie od prawdziwego konfliktu numerów i co zrobić w każdym z tych przypadków. Opisujemy też drugie znaczenie kodu 440, czyli status sesji „Sesja anulowana”. Inne kody znajdziesz na pełnej liście kodów błędów KSeF.
Co oznacza kod 440
Numer 440 występuje w KSeF w dwóch miejscach i znaczy w nich co innego:
- Status faktury: „Duplikat faktury”. Dotyczy jednej faktury w sesji. Tej sytuacji poświęcona jest większość tekstu.
- Status sesji: „Sesja anulowana”. Dotyczy całej sesji, a nie konkretnej faktury. Opisujemy go w osobnej części niżej.
Jak KSeF rozpoznaje duplikat
Dokumentacja MF mówi wprost: „KSeF wykrywa duplikaty faktur globalnie” (weryfikacja faktury, sekcja „Unikalność faktury”). O tym, czy faktura jest duplikatem, decydują trzy pola:
- NIP sprzedawcy (
Podmiot1/NIP), - rodzaj faktury (
RodzajFaktury), - numer faktury (
P_2).
Jeżeli w KSeF jest już faktura z tymi samymi trzema wartościami, nowa dostaje kod 440. Unikalność obowiązuje przez 10 pełnych lat, licząc od końca roku wystawienia.
Z tej reguły wynikają trzy rzeczy:
- Ten sam numer przy innym rodzaju faktury to nie duplikat. Faktura
VATi korektaKORz tym samymP_2nie blokują się nawzajem. - Ten sam numer u innego sprzedawcy to nie duplikat. Jeżeli dwóch klientów Twojego biura wystawi fakturę
FV/1/10/2026, KSeF przyjmie obie, bo NIP-y sprzedawców są różne. - KSeF nie porównuje treści. Kwoty, nabywca i data nie mają tu znaczenia. Faktura z poprawioną kwotą, ale ze starym numerem, też dostanie 440. Zmianę w fakturze, która już jest w KSeF, wprowadzasz wyłącznie korektą. Opisujemy to w tekście o korekcie faktury w KSeF.
Co KSeF podaje w odrzuceniu
Odrzucenie z kodem 440 zawiera numer KSeF oryginalnej faktury i numer sesji, w której KSeF ją przyjął, jak w przykładzie na początku. Dzięki temu od razu znajdziesz oryginał.
Dla programistów. Status faktury z GET /sessions/{referenceNumber}/invoices/{invoiceReferenceNumber} ma code 440. W extensions są pola originalKsefNumber i originalSessionReferenceNumber. Gdy dało się odczytać numer faktury, odpowiedź zawiera też invoiceNumber. Biblioteka open source ksef-client-ts udostępnia te pola od wersji 0.14.0 (październik 2026 r.). Traktuj 440 jako stan końcowy tego pliku i nie ponawiaj wysyłki automatycznie. Numer z originalKsefNumber zapisz przy fakturze dopiero wtedy, gdy potwierdzisz, że oryginał ma tę samą treść.
Najczęstsze przyczyny
Przyczyny dzielą się na dwie grupy o odwrotnych skutkach. W pierwszej ta sama faktura już jest w KSeF i nic złego się nie stało. W drugiej inna faktura zajęła numer i trzeba go zmienić.
Grupa A: ta sama faktura już jest w KSeF
- Zgubiona odpowiedź. Program wysłał fakturę, ale połączenie zerwało się, zanim przyszła odpowiedź KSeF. KSeF fakturę przyjął, a program uznał wysyłkę za nieudaną i wysłał ją ponownie. Rozpoznasz to w historii wysyłek: pierwsza próba kończy się błędem połączenia lub brakiem odpowiedzi, druga kodem 440.
- Podwójna wysyłka. Ktoś kliknął przycisk wysyłki dwa razy albo dwie osoby w biurze wysłały tę samą paczkę. Sesja z odrzucenia jest wtedy w Twojej historii wysyłek, zwykle tuż przed odrzuconą.
- Faktura wysłana z dwóch miejsc. Klient wysłał fakturę ze swojego programu albo z Aplikacji Podatnika KSeF, a biuro wysłało ją jeszcze raz. Rozpoznasz to po sesji z odrzucenia: nie ma jej w Twojej historii wysyłek.
- Ponowiona cała paczka. Po przerwie lub błędzie ktoś wysłał jeszcze raz całą paczkę, która za pierwszym razem przeszła. Każda faktura dostaje wtedy 440. Jeżeli w nowej sesji nie przeszła żadna faktura, cała sesja może skończyć się kodem 445, opisanym w tekście o błędzie 445 w KSeF.
Grupa B: inna faktura ma już ten numer
- Numeracja zaczyna się od nowa. Seria jest liczona od 1 co rok lub co miesiąc, ale numer nie zawiera roku. Numer z zeszłego roku nadal blokuje ten sam numer w tym roku, bo unikalność trwa 10 lat. Rozpoznasz to po dacie wystawienia oryginału: jest z innego roku.
- Dwa programy, jeden NIP. Na przykład program księgowy i system sklepu wystawiają faktury w imieniu tej samej firmy według tego samego wzoru. Prędzej czy później oba nadadzą ten sam numer. Oryginał ma wtedy innego nabywcę i inne kwoty.
- Licznik cofnięty po zmianie programu. Po migracji lub ponownej instalacji numeracja rusza od numeru, który był już użyty. Oryginał pochodzi wtedy sprzed zmiany.
Co zrobić krok po kroku
- Skopiuj numer KSeF i numer sesji ze szczegółów odrzucenia. Na razie nie zmieniaj niczego w fakturze.
- Znajdź oryginał. Zaloguj się do Aplikacji Podatnika KSeF i odszukaj tę fakturę wśród faktur wystawionych. Numer KSeF z odrzucenia potwierdzi, że patrzysz na właściwy dokument.
- Porównaj treść. Sprawdź nabywcę, datę wystawienia, pozycje i kwoty z fakturą w Twoim programie.
- Treść jest ta sama: faktura już jest w KSeF. Nie wysyłaj jej ponownie. Zapisz numer KSeF z odrzucenia przy fakturze w programie lub w ewidencji. UPO dla oryginału szukaj w sesji, której numer podaje odrzucenie, a nie w nowej sesji. Na tym koniec.
- Treść jest inna: to konflikt numerów. Nadaj fakturze nowy, wolny numer z serii i wyślij ją jeszcze raz. Potem usuń przyczynę w numeracji, opisaną niżej.
- Treść prawie ta sama, ale przed ponowną wysyłką coś poprawiałeś. W KSeF obowiązuje oryginał, a Twoja poprawka do systemu nie trafiła. Wystaw do oryginału korektę.
Najważniejsze ostrzeżenie: w sytuacji z punktu 4 nie zmieniaj numeru. Przy innym P_2 KSeF nie widzi duplikatu. Przyjmie fakturę jako nowy, osobny dokument z własnym numerem KSeF. Masz wtedy w KSeF dwie faktury na jedną sprzedaż. Drugiej nie usuniesz, trzeba ją skorygować do zera. Opisujemy to w tekście o anulowaniu faktury w KSeF. W tej sytuacji kod 440 to dobra wiadomość: faktura już jest w systemie, a jej numer KSeF masz w odrzuceniu.
Jeżeli 440 dotyczy wielu faktur z jednej paczki, przejdź te kroki dla każdej z nich. Pozostałe faktury z paczki mają własne kody i własne przyczyny.
Jak temu zapobiec
- Jedna seria na jeden program. Jeżeli dla jednego NIP-u faktury wystawiają dwa systemy, każdy powinien mieć własny prefiks, na przykład
FV/iSKL/. - Rok w numerze. Seria liczona od 1 co rok musi zawierać rok. Seria miesięczna musi zawierać miesiąc i rok. Inaczej numer powtórzy się w ciągu 10 lat.
- Jedno miejsce wysyłki. Ustal z klientem, kto wysyła jego faktury do KSeF: jego program czy Twoje biuro. Nigdy oba naraz.
- Brak odpowiedzi to jeszcze nie błąd. Po przerwanym połączeniu najpierw sprawdź status sesji i listę faktur przyjętych w tej sesji. Dopiero potem decyduj o ponownej wysyłce.
Kod 440 jako status sesji: „Sesja anulowana”
Ten sam numer pojawia się też jako status całej sesji. Komunikat brzmi „Sesja anulowana”, a szczegóły podają jedną z dwóch przyczyn. MF doprecyzowało je w historii zmian API KSeF:
- „Przekroczono czas wysyłki”: w sesji wsadowej,
- „Nie przesłano faktur”: w sesji wsadowej i interaktywnej.
Ten status nie ma nic wspólnego z duplikatami. Mówi, że sesja została anulowana. Faktury, które miały w niej pójść, wysyłasz od nowa w nowej sesji. Przedtem sprawdź tylko, czy program nie wysłał ich w międzyczasie w innej sesji.
„Nie przesłano faktur”
Program otworzył sesję, ale nie wysłał do niej żadnej faktury. Dokumentacja nie wyjaśnia przyczyn. Możliwe sytuacje: program przerwał pracę zaraz po otwarciu sesji albo pierwsza wysyłka została odrzucona już na wejściu, kodem z grupy 21xxx. Przykładem jest błąd 21405 w KSeF, czyli błąd walidacji samego żądania. Sprawdź log programu z chwili otwarcia sesji, usuń przyczynę i wyślij faktury w nowej sesji. KSeF tych faktur w ogóle nie sprawdzał, więc ten kod nic o nich nie mówi.
„Przekroczono czas wysyłki”
W sesji wsadowej KSeF czeka na przesłanie części paczki i zamknięcie sesji tylko przez ograniczony czas. Jeżeli program nie zdąży, sesja zostaje anulowana. Możliwe przyczyny to przerwane przesyłanie, wolne łącze przy dużej paczce albo program zatrzymany przed zamknięciem sesji. W logu możesz wtedy zobaczyć także HTTP 403 przy przesyłaniu części, z opisem „brak uprawnień do zapisu (np. upłynął czas na zapis)”, albo błąd 21208. Wyślij paczkę ponownie w nowej sesji. Jeżeli problem wraca przy dużych paczkach, wysyłaj mniejsze.
Z naszej praktyki
W FakturaFlow wysłaliśmy do produkcyjnego KSeF ponad 1 700 faktur, większość w sesjach wsadowych. Przy duplikatach przyjęliśmy jedną twardą zasadę. Nasza kolejka nigdy nie wysyła faktury drugi raz automatycznie, jeżeli nie wie na pewno, że pierwsza wysyłka się nie udała.
Przykład: program wysłał fakturę, a potem stracił połączenie, zanim przyszła odpowiedź KSeF. KSeF mógł ją już przyjąć. Ślepe ponowienie skończyłoby się kodem 440. Gorzej, gdyby numer faktury w międzyczasie się zmienił: wtedy powstałby prawdziwy duplikat. Dlatego taka faktura po 60 minutach trafia do sprawdzenia przez człowieka i nigdy nie jest wysyłana ponownie sama.
Przed każdą ponowną wysyłką po przerwie sprawdzamy status sesji i listę faktur już w niej przyjętych.
FakturaFlow sprawdza każdą fakturę pod kątem reguł FA(3), zanim trafi do KSeF. Wysyła pojedyncze faktury i duże paczki w sesjach wsadowych, a UPO (Urzędowe Poświadczenie Odbioru) pobiera sam. Każdy błąd KSeF pokazuje po polsku, z informacją, co poprawić. W oknie „Szczegóły KSeF” widzisz historię statusów faktury, jej numer KSeF i link do strony weryfikacji MF. Działa obok Twojego programu księgowego. Zobacz, jak działa FakturaFlow.
Podsumowanie
Kod 440 przy fakturze to „Duplikat faktury”: KSeF ma już fakturę z tym samym NIP-em sprzedawcy, rodzajem i numerem. Porównaj ją z oryginałem: przy tej samej treści faktura już jest w KSeF i nie zmieniasz numeru, przy innej treści nadajesz nowy numer. Kod 440 przy sesji to „Sesja anulowana” i dotyczy wysyłki, a nie treści faktur. Pozostałe kody opisuje pełna lista kodów błędów KSeF.
Stan na październik 2026 r. Opis na podstawie dokumentacji API KSeF 2.0 (wersja 2.8). Kody i komunikaty mogą się zmienić wraz z nowymi wersjami API.