Skip to main content

Recurring Invoices

This section covers the Recurring Invoices API for creating and managing automated invoice schedules. Schedules generate invoices on a recurring basis (weekly, monthly, quarterly, yearly, or on custom dates) and can optionally auto-deliver them by email.

Requires the RECURRING_INVOICE subscription feature and apiKeyAuth.


Endpoints

EndpointMethodDescription
GET /recurring-invoicesGETPaginated list of all schedules. Supports filtering and sorting.
GET /recurring-invoice/{id}GETGet a single schedule by ID.
POST /recurring-invoicePOSTCreate a new schedule. Immediately set to active.
PATCH /recurring-invoice/{id}PATCHUpdate schedule fields (partial update).
PATCH /recurring-invoice/{id}/{status}PATCHChange schedule status (active, paused, or cancelled).

Frequency Types

Every schedule has a frequency that determines when invoices are generated.

FrequencynthDaymonthOffsetstartDateendDatecustomDates
weekly0 – 6 (day of week, 0 = Sunday)requiredoptional
monthly1 – 31 (day of month)requiredoptional
quarterly1 – 31 (day of month)0 – 2 (month within quarter)requiredoptional
yearly1 – 31 (day of month)1 – 12 (month)requiredoptional
customoptionaloptionalrequired

All dates use ISO 8601 format (2025-01-15T00:00:00.000Z).


Query Parameters for GET /recurring-invoices

ParameterTypeDescription
offsetnumberNumber of records to skip (default: 0).
limitnumberNumber of records to return.
sortstringSort by: createdAt, startDate, endDate, or name.
orderstringSort direction: asc or desc.
status[]string[]Filter by status: active, paused, cancelled, draft.
keywordstringFull-text search across schedule fields.

Schedule Fields (Create / Update)

Scheduling

FieldTypeRequiredDescription
frequencystringcreateOne of: weekly, monthly, quarterly, yearly, custom.
nthDayintegercreate*Day of occurrence. Range depends on frequency (see table above).
monthOffsetintegercreate*Month offset within period. Required for quarterly and yearly.
startDatestringcreate*ISO 8601 date-time. Required for all frequencies except custom.
endDatestringISO 8601 date-time. Schedule stops after this date.
customDatesarraycreate*Array of ISO 8601 date-time strings. Required for custom only.

Template

FieldTypeDescription
namestringDisplay name for the schedule (max 255 characters).
subjectstringInvoice subject line.
currencystringISO 4217 currency code (e.g., EUR, USD).
invoiceItemsarrayArray of invoice line items (same schema as POST /invoices).
issueDateOffsetintegerDays to offset the issue date from the execution date.
lastPaymentDateOffsetintegerDays to offset the payment due date.
deliveryDateOffsetintegerDays to offset the delivery date.
invoiceTypeCodenumberInvoice type code (e.g., 380 for standard invoice).
autoDeliverybooleanWhen true, generated invoices are automatically sent by email.

Customer

The customer object sets the invoice recipient. You can link an existing customer by faktooraCustomerId or provide inline address data.

FieldTypeDescription
faktooraCustomerIdstringUUID of an existing customer (auto-populates snapshot).
namestringCompany name.
firstNamestringFirst name (individuals).
lastNamestringLast name (individuals).
addressstringStreet address.
postcodestringPostal code.
citystringCity.
countrystringISO 3166-1 alpha-2 country code.
emailstringContact email.
vatIdstringVAT registration number.
taxIdstringTax ID.

Delivery Email

The deliveryEmail object configures automatic email delivery when autoDelivery is enabled.

FieldTypeRequiredDescription
tostringyesRecipient email.
ccstringCC email.
bccstringBCC email.
subjectstringEmail subject line.
messagestringEmail body text.

Response Object

GET endpoints return schedule objects with the following shape:

FieldTypeDescription
idstringSchedule UUID.
namestringDisplay name.
frequencystringweekly, monthly, quarterly, yearly, or custom.
nthDayintegerDay of occurrence.
monthOffsetintegerMonth offset within period.
startDatestringISO 8601 start date.
endDatestringISO 8601 end date (or null).
statusstringactive, paused, cancelled, or draft.
autoDeliverybooleanWhether invoices are auto-sent.
nextExecutionDatestringComputed ISO 8601 date of next pending invoice (or null).
createdAtstringISO 8601 creation timestamp.
updatedAtstringISO 8601 last update timestamp.
templateobjectNested template summary (see below).

Template Object

FieldTypeDescription
idstringTemplate UUID.
subjectstringInvoice subject line.
currencystringISO 4217 currency code.
amountnumberTotal invoice amount.
customerobject{ name, firstName, lastName, email, country } or null.

Status Transitions

FromAllowed transitions
activepaused, cancelled
pausedactive, cancelled
cancelled(terminal — no transitions)

Cancelling a schedule also cancels all pending tasks. This action cannot be undone.


Examples

Example: Create a monthly recurring invoice
curl -X POST \
-H "X-API-KEY: your-api-token" \
-H "Content-Type: application/json" \
-d '{
"frequency": "monthly",
"nthDay": 1,
"startDate": "2025-02-01T00:00:00.000Z",
"name": "Monthly hosting fee",
"currency": "EUR",
"autoDelivery": true,
"customer": {
"faktooraCustomerId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
},
"invoiceItems": [
{
"description": "Web hosting — Standard plan",
"quantity": 1,
"unitPrice": 49.90,
"vatRate": 19
}
],
"deliveryEmail": {
"to": "billing@customer.example.com",
"subject": "Your monthly hosting invoice"
}
}' \
https://api.faktoora.com/api/v1/recurring-invoice

Response (201)

{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Monthly hosting fee",
"frequency": "monthly",
"nthDay": 1,
"monthOffset": null,
"startDate": "2025-02-01T00:00:00.000Z",
"endDate": null,
"status": "active",
"autoDelivery": true,
"nextExecutionDate": "2025-02-01T00:00:00.000Z",
"createdAt": "2025-01-15T10:30:00.000Z",
"updatedAt": "2025-01-15T10:30:00.000Z",
"template": {
"id": "d290f1ee-6c54-4b01-90e6-d701748f0851",
"subject": null,
"currency": "EUR",
"amount": 49.90,
"customer": {
"name": "Acme GmbH",
"firstName": null,
"lastName": null,
"email": "billing@customer.example.com",
"country": "DE"
}
}
}
Example: Create a quarterly schedule with month offset
curl -X POST \
-H "X-API-KEY: your-api-token" \
-H "Content-Type: application/json" \
-d '{
"frequency": "quarterly",
"nthDay": 15,
"monthOffset": 2,
"startDate": "2025-01-01T00:00:00.000Z",
"endDate": "2026-12-31T00:00:00.000Z",
"name": "Quarterly license fee",
"currency": "EUR"
}' \
https://api.faktoora.com/api/v1/recurring-invoice

This creates invoices on the 15th of the 3rd month of each quarter (March, June, September, December) because monthOffset: 2 offsets by 2 months from the quarter start.

Example: Create a schedule with custom dates
curl -X POST \
-H "X-API-KEY: your-api-token" \
-H "Content-Type: application/json" \
-d '{
"frequency": "custom",
"customDates": [
"2025-03-15T00:00:00.000Z",
"2025-06-30T00:00:00.000Z",
"2025-12-01T00:00:00.000Z"
],
"name": "Project milestone invoices",
"currency": "EUR"
}' \
https://api.faktoora.com/api/v1/recurring-invoice
Example: List active schedules
curl -H "X-API-KEY: your-api-token" \
"https://api.faktoora.com/api/v1/recurring-invoices?status[]=active&sort=createdAt&order=desc&limit=10"

Response (200)

{
"data": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "Monthly hosting fee",
"frequency": "monthly",
"status": "active",
"nextExecutionDate": "2025-03-01T00:00:00.000Z",
"template": { "id": "...", "currency": "EUR", "amount": 49.90, "customer": null }
}
],
"meta": {
"offset": 0,
"limit": 10,
"total": 1,
"pages": 1
}
}
Example: Pause a schedule
curl -X PATCH \
-H "X-API-KEY: your-api-token" \
https://api.faktoora.com/api/v1/recurring-invoice/f47ac10b-58cc-4372-a567-0e02b2c3d479/paused
Example: Update schedule template fields
curl -X PATCH \
-H "X-API-KEY: your-api-token" \
-H "Content-Type: application/json" \
-d '{
"name": "Updated monthly fee",
"invoiceItems": [
{
"description": "Web hosting — Premium plan",
"quantity": 1,
"unitPrice": 79.90,
"vatRate": 19
}
]
}' \
https://api.faktoora.com/api/v1/recurring-invoice/f47ac10b-58cc-4372-a567-0e02b2c3d479

Unspecified fields are preserved. To clear a field, set it to null.