# A recurring template's history lists what did not happen too

The history now includes failed runs, skipped periods and pauses, each with a `type`. For those entries `invoice_id` is `null`.

Sep 22, 2026 · Breaking

The history of a recurring template listed only the invoices it generated. So a month with no invoice left no trace, and "why was March not invoiced?" had no answer in the API. The canonical history now records every entry: what was generated, and what was not and why.

The deprecated flat alias keeps returning only generated invoices, unchanged until it retires.

## What breaks

- **The trap: an entry is no longer always an invoice.** Code that takes each entry's `invoice_id` and fetches the invoice now meets `FAILED`, `SKIPPED` and `PAUSED` entries whose `invoice_id` is `null`. Filter on `type: GENERATED` for the previous list.
- **Pages hold entries, not invoices.** The default 20 per page now mixes all four types, so a page can hold fewer invoices than before.

## Does this affect you?

- Grep for `/recurring-invoices/` followed by `/history` under `/v1/companies/`. Anything that reads `invoice_id` from each entry needs to handle `null`, or filter on `type` first.

## What else changed

- **`type`** is `GENERATED`, `FAILED`, `SKIPPED` or `PAUSED`. Only `GENERATED` uses up the period. After the other three the period is still free, and the next run can fill it.
- **`origin`** says who triggered a generation: `MANUAL` (a person) or `UNATTENDED` (the scheduled run). It is absent on entries that are not generations, and on generations recorded before this was stored.
- **`reason`** explains a `FAILED` or `PAUSED` entry, translated to the caller's language. It is text for a person: branch on `type`, never on `reason`.
- **`requested_by` and `requested_by_name`** say who skipped a period, on `SKIPPED` entries only. The name is the user's name, or their email when there is none, and never the raw id.
- **Recorded from 22 September on.** Earlier failures, skips and pauses were never stored, so an older gap in the history still has no entry explaining it.

## Endpoints

- `GET /v1/companies/{company_id}/recurring-invoices/{recurring_invoice_id}/history` — Every entry type, with type, origin, reason and requested_by

## Where to go next

- [Get the history of a recurring invoice](/recurring-invoices/getCompanyRecurringInvoiceHistory)
- [Recurring invoices](/guides/recurring-invoices)

---

Full OpenAPI spec: https://docs.beel.es/api/openapi