CompanyRecurringInvoices
Derive a recurring invoice from an existing invoice
Creates a recurring invoice template of this company taking its lines, recipient, series, payment data and custom fields from an existing invoice, so only the recurrence has to be described.
- from_invoice_id: the source invoice. It must belong to the company in the path, and one you cannot reach is reported the same way as one that does not exist. It is not modified by this call.
- Recurrence: name, day_of_month and start_date are required; end_date and frequency are optional. The cadence is not taken from the source invoice — a one-off invoice has none to copy — so it is described here like any other recurrence field: every 1 (MONTHLY), 3 (QUARTERLY) or 12 (YEARLY) months, MONTHLY when omitted. It governs the step from the first invoice onwards, not where that first one lands.
- VeriFactu: not inherited from the source invoice. Each generated invoice is registered with AEAT, or not, according to the company's regime when it is issued.
- custom_fields: the template takes those of the source invoice, each with the label the field has now; a field the company has archived since is left out instead of failing the call.
post/v1/companies/{company_id}/recurring-invoices/derivations
Request
- Base URL: https://app.beel.es/api
- URL: https://app.beel.es/api/v1/companies/{company_id}/recurring-invoices/derivations
- Auth: HTTP bearer
Headers
Idempotency-Keystring
Idempotency key to prevent duplicates in sensitive operations.
- Any unique client-generated string (e.g. an order id). A UUID also works but is not required
- Allowed characters: letters, digits, _ and - (max 255 chars)
- Retrying with the same key replays the first response when it was a success (2xx) or a server error (5xx): same status and body, plus the header Idempotency-Replay: true. After a 5xx, check whether the operation took effect before retrying with a new key
- A 4xx is not stored: the key is released, so the corrected request can reuse it
- Stored responses expire 24 hours after processing
The key is scoped per user and environment, and bound to the request body, so retrying after a network timeout replays the stored response instead of repeating the operation.
| Status | Code | When |
|---|---|---|
| 400 | INVALID_IDEMPOTENCY_KEY | The key breaks the format rules above. |
| 409 | IDEMPOTENCY_KEY_PROCESSING | The first request is still in flight. Wait for the Retry-After seconds (2) and retry with the same key. |
| 409 | IDEMPOTENCY_KEY_MISMATCH | The key was already used with a different body. Use a new key. |
Request body
Example request
{
"email_configuration": {
"recipients": [
"user@example.com"
],
"cc": [
"user@example.com"
]
}
}Response
Recurring invoice created successfully from the source invoice
Example response
{
"success": true,
"data": {
"draft_in_advance": true,
"status": "ACTIVE",
"pause": {
"reason": "GENERATION_FAILURE",
"blocker": "NIF_NOT_REGISTERED"
},
"lines": [
{
"pricing_mode": "UNIT_PRICE",
"total_excluding_tax": 1,
"total_including_tax": 100,
"exemption_reason": "EXENTA_ART_20"
}
],
"amount": 106,
"custom_fields": [
{
"key": "project",
"label": "Project",
"value": "Corporate website"
}
],
"max_invoices": 6,
"last_generated_scheduled_date": "2026-05-01"
},
"meta": {
"timestamp": "2025-01-15T10:30:00Z",
"request_id": "4bf92f3577b34da6a3ce929d0e0e4736"
}
}Changes
No recorded changes to this operation across all 1 revision of this API.