Dokumenty cykliczne
Reguła cykliczna to szablon dokumentu połączony z harmonogramem. Raz skonfigurowana, sama wystawia faktury (tryb AUTO), przygotowuje szkice do akceptacji (DRAFT) albo tylko przypomina o wystawieniu (REMINDER). Przez API odczytasz stan reguł i historię generacji oraz wstrzymasz lub wznowisz regułę, np. gdy klient zrezygnuje z abonamentu w Twoim systemie.
Moduł wymaga planu MAX na koncie Fakturnia. Bez niego każdy endpoint zwraca 403 z kodem SUBSCRIPTION_REQUIRED.
Zakresy uprawnień: recurring:browse, recurring:read, recurring:toggle.
Reguły tworzy się i edytuje w aplikacji Fakturnia. API celowo ich nie zakłada: szablon reguły to kompletny dokument z pozycjami i automatyzacjami, a jego konfiguracja jest po prostu wygodniejsza w edytorze niż w JSON-ie.
Lista reguł
curl -s https://prod.api.fakturnia.pl/external/v1/recurring-rules \
-H "Authorization: Bearer $TOKEN"
{
"success": true,
"data": {
"rules": [
{
"id": "665f0c1234567890abcdef12",
"name": "Abonament, Firma Sp. z o.o.",
"status": "ACTIVE",
"mode": "AUTO",
"documentSummary": {
"documentType": "FakturaVAT",
"buyerName": "Firma Sp. z o.o.",
"grossSum": 1230,
"currency": "PLN"
},
"schedule": { "frequency": "MONTHLY", "dayOfMonth": 1, "startDate": "2026-01-01", "endType": "NEVER" },
"nextRunAt": "2026-08-01",
"occurrencesCount": 7,
"documentsIssuedCount": 7
}
],
"summary": {
"total": 3,
"active": 2,
"paused": 1,
"finished": 0,
"nextRunAt": "2026-08-01",
"monthlyRecurringGross": 2460
}
}
}
Parametr ?status=ACTIVE|PAUSED|FINISHED zawęża listę. Blok summary zawsze opisuje wszystkie reguły konta, niezależnie od filtra.
monthlyRecurringGross to miesięczny przychód brutto z aktywnych reguł, po przeliczeniu częstotliwości na miesiąc (np. reguła kwartalna liczy się jako 1/3 kwoty). Sumowane są tylko reguły w PLN, bo API nie zgaduje kursów walut.
Zamiast pełnego szablonu dokumentu reguła zwraca documentSummary: typ dokumentu, nazwę nabywcy, kwotę brutto i walutę. To wystarcza do listowania i raportowania, a wygenerowane dokumenty pobierzesz normalnie przez endpointy dokumentów.
Szczegóły reguły
curl -s https://prod.api.fakturnia.pl/external/v1/recurring-rules/{id} \
-H "Authorization: Bearer $TOKEN"
Poza polami z listy szczegóły zawierają pełny harmonogram i automatyzacje:
| Pole | Znaczenie |
|---|---|
schedule.frequency |
WEEKLY, MONTHLY, BIMONTHLY, QUARTERLY, SEMIANNUALLY, YEARLY lub CUSTOM (z customInterval + customUnit) |
schedule.endType |
NEVER, DATE (do endDate) lub COUNT (po endCount wystąpieniach) |
automation |
wysyłka e-mail do nabywcy, wysyłka do KSeF, powiadomienia |
payment |
status płatności nadawany generowanym dokumentom (PAID / UNPAID + termin) |
nextRunAt |
data najbliższej generacji (null gdy reguła wstrzymana lub zakończona) |
skipDates |
daty wystąpień pominiętych ręcznie w aplikacji |
Historia generacji
Dziennik wystąpień reguły, od najnowszych:
curl -s "https://prod.api.fakturnia.pl/external/v1/recurring-rules/{id}/history?itemsPerPage=50" \
-H "Authorization: Bearer $TOKEN"
{
"success": true,
"data": {
"runs": [
{
"id": "666a0d1234567890abcdef56",
"plannedDate": "2026-07-01",
"issueDate": "2026-07-01",
"documentId": "666a0e1234567890abcdef78",
"documentNumber": "FV/7/2026",
"status": "GENERATED",
"emailSent": true,
"ksefQueued": false
}
]
}
}
| Status | Znaczenie |
|---|---|
GENERATED |
dokument wystawiony automatycznie (tryb AUTO) |
DRAFT |
powstał szkic czekający na akceptację w aplikacji |
REMINDED |
wysłano przypomnienie o wystawieniu (tryb REMINDER) |
SKIPPED |
wystąpienie pominięte |
FAILED |
generacja nieudana, szczegóły w polu error |
PENDING |
wystąpienie w trakcie przetwarzania |
documentId i documentNumber wskazują wygenerowany dokument. Historia jest stronicowana jak listy: currentPage, itemsPerPage (domyślnie 50, do 200), w odpowiedzi totalCount i totalPages; starszy parametr limit nadal działa jako alias itemsPerPage. Lista reguł GET /recurring-rules także jest stronicowana (itemsPerPage do 100), a jej summary zawsze obejmuje wszystkie reguły.
Pauza i wznowienie
# Wstrzymanie
curl -s -X PATCH https://prod.api.fakturnia.pl/external/v1/recurring-rules/{id}/toggle \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "active": false }'
# Wznowienie
curl -s -X PATCH https://prod.api.fakturnia.pl/external/v1/recurring-rules/{id}/toggle \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{ "active": true }'
Wstrzymana reguła nie generuje dokumentów. Wznowienie przelicza nextRunAt od dnia dzisiejszego: wystąpienia zaległe z okresu pauzy nie są nadrabiane. To bezpieczne zachowanie dla typowego scenariusza, w którym klient zawiesza abonament i wraca po kilku miesiącach.
Reguły zakończonej (FINISHED, czyli po dacie końcowej lub limicie wystąpień) nie można wznowić, próba zwraca 409 CONFLICT.
Dobre praktyki
- Nasłuchuj webhooka
document.createdzamiast odpytywać listę. Dokumenty wystawiane przez reguły emitujądocument.created(jak każdy nowy dokument, z API albo z aplikacji), więc Twoja integracja dostaje je natychmiast. Historia reguły (/history) pozwala potem powiązać wystąpienie zdocumentId. - Monitoruj wystąpienia
FAILED. Okresowo (np. raz dziennie) przejrzyj historię aktywnych reguł; poleerrormówi, dlaczego generacja się nie powiodła. Nieudane wystąpienie nie zatrzymuje cyklu, kolejne terminy idą dalej. - Pauzuj zamiast usuwać. Gdy klient zawiesza abonament, wywołaj
togglezactive: false. Historia i konfiguracja reguły zostają, a wznowienie samo przeliczynextRunAtbez ryzyka wystawienia zaległych faktur. - Trzymaj
idreguły, nie jej nazwę. Nazwa jest edytowalna w aplikacji i może się zmienić bez ostrzeżenia. - Rozróżniaj liczniki.
occurrencesCountliczy wystąpienia harmonogramu (także przypomnienia i pominięcia),documentsIssuedCounttylko faktycznie wystawione dokumenty. Do raportowania sprzedaży używaj tego drugiego. - Traktuj
monthlyRecurringGrossjako przybliżenie. Suma obejmuje wyłącznie aktywne reguły w PLN; reguły walutowe dolicz po własnym kursie na podstawiedocumentSummary.