KSeF API — dokumentacja, integracja, przykłady

· 10 min czytania

Krajowy System e-Faktur udostępnia REST API, które pozwala programom zewnętrznym wystawiać, pobierać i wyszukiwać faktury. Jeśli budujesz integrację z KSeF — czy to we własnym systemie ERP, czy w SaaS-ie dla klientów — ten artykuł jest Twoim punktem wejścia.

Omówimy: środowiska, autoryzację, główne endpointy, przykłady kodu w JavaScript/Node.js, rate limity i typowe problemy.

Czym jest KSeF API?

KSeF API to interfejs REST udostępniany przez Ministerstwo Finansów. Pozwala na:

API jest bezpłatne. Nie ma opłat za liczbę zapytań. Jedyne ograniczenia to rate limity (opisane niżej).

Środowiska: test i produkcja

KSeF udostępnia dwa środowiska API:

Środowisko Base URL Zastosowanie
Test https://ksef-test.mf.gov.pl/api Rozwój, testy integracyjne
Produkcja https://ksef.mf.gov.pl/api Prawdziwe faktury

Ważne:

Tokeny wygenerowane w środowisku testowym nie działają w produkcji i odwrotnie. To osobne instancje z osobnymi danymi.

Podczas developmentu zawsze używaj środowiska testowego. Przełącz na produkcję dopiero gdy integracja jest przetestowana i stabilna.

Autoryzacja — jak otworzyć sesję

Dostęp do API KSeF wymaga autoryzacji w dwóch krokach:

Krok 1: Wygeneruj token uwierzytelniający

Token generujesz ręcznie w Aplikacji Podatnika (ap.ksef.mf.gov.pl). Szczegółowa instrukcja: Token KSeF — jak wygenerować krok po kroku.

Krok 2: Otwórz sesję (programowo)

Z tokenem uwierzytelniającym wysyłasz request do endpointu inicjalizacji sesji. W odpowiedzi dostajesz session token (krótkoterminowy), którego używasz we wszystkich kolejnych requestach.

Endpoint inicjalizacji sesji:

POST /api/online/Session/InitSigned

Request wymaga podpisania challenge'a tokenem uwierzytelniającym. Po pomyślnej autoryzacji API zwraca:

Główne endpointy

Poniżej najważniejsze endpointy API KSeF, które będziesz potrzebować przy integracji.

Wyszukiwanie faktur

POST /api/v2/invoices/query

Pozwala wyszukać faktury wg kryteriów. Kluczowy parametr to subjectType:

Przykładowy request body:

{
  "queryCriteria": {
    "subjectType": "subject2",
    "type": "incremental",
    "acquisitionTimestampThresholdFrom": "2026-07-01T00:00:00",
    "acquisitionTimestampThresholdTo": "2026-07-22T23:59:59"
  }
}

Odpowiedź zawiera listę faktur z metadanymi: numer KSeF, NIP sprzedawcy, kwota brutto, data wystawienia.

Pobranie XML faktury

GET /api/invoices/ksef/{nrKSeF}

Pobiera pełny XML faktury po jej numerze KSeF. Zwraca dokument XML w formacie FA(3) — oficjalnym schemacie e-faktur.

Wystawienie faktury

POST /api/invoices

Wysyła nową fakturę do KSeF. Wymaga przesłania poprawnego XML faktury w formacie FA(3). Po przyjęciu faktura otrzymuje numer KSeF i jest natychmiast widoczna dla nabywcy.

Przykład kodu: wyszukiwanie faktur przychodzących

Poniżej kompletny przykład w JavaScript (Node.js) — wyszukanie faktur przychodzących z ostatnich 7 dni:

const KSEF_BASE = 'https://ksef.mf.gov.pl/api';

async function queryIncomingInvoices(sessionToken) {
  const now = new Date();
  const weekAgo = new Date(now - 7 * 24 * 60 * 60 * 1000);

  const response = await fetch(
    `${KSEF_BASE}/v2/invoices/query`,
    {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'SessionToken': sessionToken,
      },
      body: JSON.stringify({
        queryCriteria: {
          subjectType: 'subject2',
          type: 'incremental',
          acquisitionTimestampThresholdFrom:
            weekAgo.toISOString(),
          acquisitionTimestampThresholdTo:
            now.toISOString(),
        },
      }),
    }
  );

  if (!response.ok) {
    throw new Error(
      `KSeF query failed: ${response.status}`
    );
  }

  const data = await response.json();
  return data.invoiceHeaderList || [];
}

// Użycie:
const invoices = await queryIncomingInvoices(token);
console.log(`Znaleziono ${invoices.length} faktur`);

for (const inv of invoices) {
  console.log(
    `${inv.invoicingDate} | ` +
    `${inv.subjectBy.issuedByName} | ` +
    `${inv.net} PLN netto | ` +
    `KSeF: ${inv.ksefReferenceNumber}`
  );
}

Uwaga:

Powyższy przykład zakłada, że masz już otwarty sessionToken. Proces otwarcia sesji (autoryzacja tokenem uwierzytelniającym) jest bardziej złożony — wymaga podpisania challenge'a. Pełna dokumentacja: ksef.mf.gov.pl/api.

Pobranie XML faktury — przykład

Gdy znasz numer KSeF faktury, możesz pobrać jej pełny XML:

async function downloadInvoiceXml(
  sessionToken,
  ksefNumber
) {
  const response = await fetch(
    `${KSEF_BASE}/invoices/ksef/${ksefNumber}`,
    {
      headers: {
        'SessionToken': sessionToken,
        'Accept': 'application/xml',
      },
    }
  );

  if (!response.ok) {
    throw new Error(
      `Download failed: ${response.status}`
    );
  }

  return await response.text(); // XML string
}

Zwrócony XML zawiera wszystkie dane faktury: sprzedawca, nabywca, pozycje, stawki VAT, kwoty. Możesz go sparsować i zaimportować do swojego systemu księgowego.

Rate limity i ograniczenia

API KSeF ma ograniczenia, o których warto wiedzieć:

Typowe problemy przy integracji

Błąd 401 — Unauthorized

Token jest nieprawidłowy, wygasły lub sesja została zamknięta. Wygeneruj nowy token uwierzytelniający i otwórz nową sesję.

Błąd 400 — Bad Request

Nieprawidłowy format requestu. Sprawdź strukturę JSON/XML. Częsty błąd: zły format daty (KSeF wymaga ISO 8601).

Pusta odpowiedź z query

Sprawdź zakres dat i parametr subjectType. Jeśli szukasz faktur przychodzących, użyj subject2. Jeśli wychodzących — subject1.

Różnice między środowiskiem test a prod

Tokeny, dane i faktury w środowisku testowym są niezależne od produkcji. Nie mieszaj URLi i tokenów — to częsta przyczyna błędów "token not found".

Oficjalna dokumentacja

Pełna specyfikacja API KSeF jest dostępna na stronie Ministerstwa Finansów:

Dokumentacja jest techniczna i nie zawsze czytelna. Jeśli masz problemy z integracją, możesz sprawdzić nasze inne artykuły:

Alternatywa: gotowe narzędzia

Budowanie integracji z KSeF API od zera to dni lub tygodnie pracy programisty. Musisz obsłużyć autoryzację, sesje, paginację, parsowanie XML, error handling i monitoring.

Jeśli potrzebujesz jedynie powiadomień o nowych fakturach przychodzących, nie musisz budować tego samemu. FakturyKSeF robi dokładnie to — odpytuje API KSeF co 15 minut i wysyła email z danymi każdej nowej faktury.

Konfiguracja trwa 2 minuty: podaj NIP, wklej token KSeF i email. Resztą zajmuje się system.

Nie chcesz ręcznie sprawdzać KSeF?

FakturyKSeF monitoruje faktury 24/7 i wysyła email w 15 minut.

Zacznij za darmo