Przejdź do głównej zawartości

Pobieranie faktur

Metoda fetchInvoices w KsefHttpClient pobiera metadane faktur z endpointu POST /invoices/query/metadata, automatycznie obsluguje paginacje i opcjonalnie wzbogaca wyniki o pelne XML faktur.

  1. Zapytanie o metadane — POST /invoices/query/metadata z filtrem dat i typem podmiotu. Zwraca strone wynikow z polem hasMore i isTruncated.

  2. Automatyczna paginacja — jesli hasMore === true i isTruncated === false, klient pobiera kolejne strony zwiekszajac pageOffset.

  3. Mapowanie — metadane KSeF mapowane sa na typ KsefRawInvoiceExt z kwotami w groszach.

  4. Opcjonalne XML — jesli includeXml: true, klient rownolegle pobiera pelne XML kazdej faktury z GET /invoices/ksef/{ksefNumber}.

import { createHttpAdapter } from '@ksefnik/http'
import { createKsefnik } from '@ksefnik/core'
const adapter = createHttpAdapter({
nip: '5213456784',
token: process.env.KSEF_TOKEN!,
environment: 'production',
})
const ksefnik = createKsefnik({ nip: '5213456784', adapter })
await ksefnik.invoices.sync({
dateFrom: '2026-03-01',
dateTo: '2026-03-31',
})
const invoices = await ksefnik.invoices.getAll()

Klient automatycznie pobiera wszystkie strony wynikow. Mozesz kontrolowac rozmiar strony:

ParametrTypDomyslnieOpis
pageSizenumber100Liczba faktur na strone
pageOffsetnumber0Poczatkowy offset (numer strony * pageSize)
// Nizkopoziomowe uzycie KsefHttpClient
const client = new KsefHttpClient({ environment: 'production' })
const session = await client.initSession({
nip: '5213456784',
token: process.env.KSEF_TOKEN!,
environment: 'production',
})
const result = await client.fetchInvoices({
token: session.token,
dateFrom: '2026-03-01',
dateTo: '2026-03-31',
pageSize: 50,
})
// result.invoices -- tablica KsefRawInvoice
// result.total -- liczba pobranych faktur

Klient iteruje po stronach az do spelnienia jednego z warunkow:

WarunekAkcja
hasMore === falseKoniec — wszystkie wyniki pobrane
Pusta strona (0 wynikow)Koniec — zabezpieczenie przed nieskonczona petla
hasMore === true, isTruncated === falseNastepna strona — zwiekszenie pageOffset
hasMore === true, isTruncated === trueBlad QUERY_TRUNCATED — limit 10k rekordow

Rozwiazanie: zawez zakres dat i wykonaj kilka mniejszych zapytan.

import { KsefApiError } from '@ksefnik/http'
try {
await ksefnik.invoices.sync({
dateFrom: '2026-01-01',
dateTo: '2026-12-31',
})
} catch (error) {
if (
error instanceof KsefApiError &&
error.detailCode === 'QUERY_TRUNCATED'
) {
// Podziel na miesiace
for (let month = 1; month <= 12; month++) {
const from = `2026-${String(month).padStart(2, '0')}-01`
const to = `2026-${String(month).padStart(2, '0')}-${month === 2 ? '28' : '30'}`
await ksefnik.invoices.sync({ dateFrom: from, dateTo: to })
}
}
}

Blad QUERY_TRUNCATED zawiera kontekst z informacja o liczbie juz pobranych rekordow i dacie ostatniej faktury:

{
collected: 10000,
lastDate: '2026-06-15'
}

Parametr subjectType okresla role podatnika w zapytaniu:

WartoscZnaczenie
Subject1Faktury wystawione przez podatnika (sprzedaz)
Subject2Faktury otrzymane przez podatnika (zakupy) — domyslnie
Subject3Faktury, w ktorych podatnik jest dodatkowym podmiotem
const result = await client.fetchInvoices({
token: session.token,
dateFrom: '2026-03-01',
dateTo: '2026-03-31',
subjectType: 'Subject1', // moje faktury sprzedazowe
})
WartoscZnaczenie
InvoicingData wystawienia faktury — domyslnie

Daty dateFrom i dateTo sa automatycznie konwertowane do formatu ISO 8601. Jesli podasz date bez czasu (np. '2026-03-01'), klient doda czas T00:00:00.000Z dla dateFrom i T23:59:59.999Z dla dateTo.

Domyslnie pobierane sa tylko metadane (NIP-y, kwoty, daty, numer KSeF). Metadane wystarczaja do wiekszosc przypadkow — uzgadnianie, raporty, walidacja.

Jesli potrzebujesz pelnego XML faktury (np. do parsowania pozycji), uzyj includeXml: true:

const result = await client.fetchInvoices({
token: session.token,
dateFrom: '2026-03-01',
dateTo: '2026-03-31',
})
// result.invoices[0].xml === ''

Parametr concurrency kontroluje ile zapytan o XML wykonywanych jest rownolegle:

ParametrDomyslnieOpis
concurrency5Maksymalna liczba rownoczesnych zapytan GET o XML

Jesli pobranie XML pojedynczej faktury sie nie powiedzie, klient zwraca metadane bez XML (graceful degradation) — nie przerywa calego procesu.

Metadane KSeF mapowane sa na rozszerzony typ KsefRawInvoiceExt:

interface KsefRawInvoiceExt extends KsefRawInvoice {
grossAmountGrosze?: number // kwota brutto w groszach
currency?: string // waluta (domyslnie 'PLN')
buyerNip?: string // NIP nabywcy
buyerName?: string // nazwa nabywcy
}
Pole zrodlowe (KSeF)Pole doceloweTransformacja
meta.ksefNumberksefReferenceNumberbez zmian
meta.invoiceNumberinvoiceNumberbez zmian
meta.seller.nipsubjectNipfallback na ''
meta.seller.namesubjectNameopcjonalne
meta.invoicingDateinvoicingDateobciete do YYYY-MM-DD
meta.grossAmountgrossAmountGroszeMath.round(amount * 100)
meta.currencycurrencyfallback na 'PLN'
meta.buyer.identifier.valuebuyerNipopcjonalne
meta.buyer.namebuyerNameopcjonalne