Factures recurrents
Omet un cicle, crea una recurrència des d'una factura, configura l'enviament automàtic, previsualitza el pròxim document i defineix camps fiscals per línia.
Una factura recurrent és una plantilla més una cadència: Factuarea genera una factura real a cada execució programada. Aquesta guia cobreix els controls que van més enllà del create/update bàsic — ometre un cicle, arrencar una recurrència a partir d'una factura existent, l'enviament automàtic per correu, la previsualització del document calculat i els camps fiscals per línia que exigeix VeriFactu.
Tots els endpoints de sota viuen sota https://api.factuarea.com/v1 i usen el
mateix embolcall d'error, paginació per
cursor i scopes que la
resta de l'API.
Ometre la pròxima generació
POST /v1/recurring_invoices/{recurring_invoice}/skipAvança next_run_at exactament un període sense generar cap factura per al
cicle actual. L'ocurrència omesa no compta per a max_occurrences — el
comptador de factures generades no es mou. Fes-lo servir per saltar-te un període
de facturació (festius, un client en pausa) mantenint intacte el calendari.
Requereix l'scope recurring_invoices:write. Retorna 200 amb el recurs de la
factura recurrent (fixa't en el next_run_at avançat). Una recurrència
cancel·lada o completada respon 422; una factura recurrent que pertany a una
altra empresa respon 404.
curl -X POST https://api.factuarea.com/v1/recurring_invoices/01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a0b/skip \
-H "Authorization: Bearer $FACTUAREA_API_KEY"Ometre registra una entrada skipped a l'activitat de la factura recurrent —
l'historial mostra que el cicle es va ometre expressament, no que es va perdre.
Crear una recurrència des d'una factura existent
POST /v1/invoices/{invoice}/create-recurringCopia les línies, el client i la sèrie d'una factura origen en una factura
recurrent nova (amb el seu propi UUID v7) i aplica la cadència indicada al cos.
La factura origen queda intacta. Requereix l'scope recurring_invoices:write.
| Camp | Tipus | Obligatori | Notes |
|---|---|---|---|
frequency | string | sí | daily, weekly, biweekly, monthly, quarterly, semiannual, yearly. |
start_on | string (YYYY-MM-DD) | sí | Primera execució programada. |
end_on | string (YYYY-MM-DD) | no | Última execució permesa. |
name | string | no | Etiqueta de la recurrència (≤255). |
description | string | no | |
notes | string | no | |
metadata | object | no | Els teus parells clau/valor. |
holiday_handling | string | no | Com desplaçar una execució que cau en festiu. |
days_before_due | integer | no | Desfasament de venciment de cada factura generada. |
max_occurrences | integer | no | Aturar després de N factures generades. |
auto_delivery | object | no | Vegeu Enviament automàtic. |
Retorna 201 amb la nova factura recurrent i una capçalera Location que hi
apunta. Una factura origen que pertany a una altra empresa respon 404.
curl -X POST https://api.factuarea.com/v1/invoices/01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a42/create-recurring \
-H "Authorization: Bearer $FACTUAREA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"frequency": "monthly",
"start_on": "2026-07-01",
"max_occurrences": 12,
"auto_delivery": {
"send_automatically": true,
"recipients": ["billing@acme.example"]
}
}'Enviament automàtic
L'objecte auto_delivery — disponible en crear i actualitzar una recurrent i a
create-recurring — envia per correu cada factura generada de manera automàtica.
| Camp | Tipus | Notes |
|---|---|---|
send_automatically | boolean | Interruptor mestre. false desactiva l'enviament. |
recipients | string[] | Destinataris principals (email). |
cc | string[] | Destinataris en còpia (email). |
subject | string | Assumpte personalitzat (≤255). null usa el predeterminat. |
body | string | Cos personalitzat (≤5000). null usa el predeterminat. |
Quan send_automatically és true, cada factura generada s'envia per correu a
recipients (amb cc opcional) usant subject/body. Posar
send_automatically a false desactiva l'enviament. Una llista recipients
buida amb send_automatically: true es rebutja amb 422 — no hi ha a qui
enviar.
{
"auto_delivery": {
"send_automatically": true,
"recipients": ["billing@acme.example"],
"cc": ["copy@acme.example"],
"subject": "La teva factura mensual",
"body": "Hola, aquí tens la teva factura d'aquest període."
}
}Previsualitzar el document calculat
GET /v1/recurring_invoices/{recurring_invoice}/previewSense expand, preview retorna només la previsió de dates — les pròximes
dates d'execució (usa count per controlar quantes).
Passa expand=document per calcular a més el pròxim document en sec: la
resposta afegeix un bloc next_invoice amb les lines resoltes i els totals
(subtotal, tax, total), construïts des de template_data sense persistir
res. Fes-lo servir per mostrar al client què contindrà exactament la pròxima
factura abans d'emetre-la.
curl -G https://api.factuarea.com/v1/recurring_invoices/01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a0b/preview \
-H "Authorization: Bearer $FACTUAREA_API_KEY" \
--data-urlencode "expand=document"{
"data": { "id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a0b", "object": "recurring_invoice" },
"next_invoice": {
"lines": [
{ "description": "Quota mensual", "quantity": 1, "unit_price": 500, "subtotal": 500 }
],
"totals": { "subtotal": 500, "tax": 105, "total": 605 }
}
}preview mai crea cap factura. És una lectura pura — els totals en sec es
calculen en memòria des de template_data.
Camps fiscals per línia
Cada línia de template_data accepta els camps fiscals que necessiten VeriFactu i
el model tributari espanyol. Es traslladen a cada factura generada.
| Camp | Tipus | Notes |
|---|---|---|
exemption_reason | string | Causa d'exempció / no subjecció segons LIVA. Un de E1–E6, N1, N2. null si no s'informa. |
regime_key | string | Clau de règim VeriFactu (ClaveRegimen, llista L8.1 de l'AEAT). null si no s'informa. |
retention | number | Percentatge de retenció IRPF (0–100). |
retention_rate_id | string (UUID v7) | Impost del catàleg aplicat com a retenció IRPF. Opac — no canvia el càlcul de taxes/total (ho fa el percentatge pla retention). |
surcharge | number | Percentatge de recàrrec d'equivalència (0–100). |
surcharge_rate_id | string (UUID v7) | Impost del catàleg aplicat com a recàrrec d'equivalència. Opac — el percentatge pla surcharge governa el càlcul. |
El recàrrec d'equivalència va lligat per llei a l'IVA de la línia. Els únics
parells legals tax_rate → surcharge són:
IVA (tax_rate) | Recàrrec (surcharge) |
|---|---|
21 | 5.2 |
10 | 1.4 |
4 | 0.5 |
Enviar un exemption_reason, regime_key, retention_rate_id o
surcharge_rate_id fora del seu catàleg respon 422 amb una llista
allowed_values a l'error. Un parell IVA↔recàrrec il·legal (p.ex. 21 amb
1.4) també es rebutja amb 422.
{
"template_data": {
"lines": [
{
"description": "Consultoria",
"quantity": 1,
"unit_price": 1000,
"tax_rate": 21,
"surcharge": 5.2,
"retention": 15,
"regime_key": "01",
"exemption_reason": null
}
]
}
}