addedInput schema / $defs / CreateRecurringInvoiceRequest / properties / day_of_month / description
Added value: +"Day of the month the invoices are issued. A month that does not have that day falls\nback to its last day: a template on `31` issues on 28 February (29 in a leap year)\nand on 30 April. So `31` is how you ask for the last day of the month it generates\nin — there is no separate flag for it, and the accepted range stays 1–31.\n\nThe adjustment does not stick and the schedule does not drift: every generation is\nrecalculated from the `day_of_month` you sent, never from the date it was adjusted\nto (31 Jan → 28 Feb → 31 Mar).\n"
addedInput schema / $defs / CreateRecurringInvoiceRequest / properties / draft_in_advance
Added value: +{
+ "description": "Whether the template prepares a draft for review before emitting. The window is fixed at\n5 days and both options emit on the scheduled day. Omitted, the template is created\nwithout the review draft.\n",
+ "type": "boolean"
+}
changedInput schema / $defs / CreateRecurringInvoiceRequest / properties / frequency / description
Previous value: -"Generation cadence. Only `MONTHLY` is supported today; the field exists in the\nrequest so an unsupported cadence is rejected instead of silently creating a\nmonthly template. Omitted, `MONTHLY` applies.\n"New value: +"Generation cadence: `MONTHLY` every month, `QUARTERLY` every 3 months, `YEARLY` every 12 months. Omitted, `MONTHLY` applies.\n\nIt governs the step from the first invoice onwards, not where that first one lands: the\nfirst occurrence is the first `day_of_month` on or after `start_date`, found one month at\na time whatever the cadence. A yearly template starting 15 February with `day_of_month`\n10 first invoices on 10 March, then every 10 March after that — it does not wait a year.\n"
changedInput schema / $defs / CreateRecurringInvoiceRequest / properties / frequency / enum
Previous value: -[
- "MONTHLY"
-]New value: +[
+ "MONTHLY",
+ "QUARTERLY",
+ "YEARLY"
+]
addedInput schema / $defs / CreateRecurringInvoiceRequest / properties / invoice_type / $ref
Added value: +"#/$defs/RecurringInvoiceType"
removedInput schema / $defs / CreateRecurringInvoiceRequest / properties / invoice_type / enum
Removed value: -[
- "STANDARD",
- "SIMPLIFIED"
-]
removedInput schema / $defs / CreateRecurringInvoiceRequest / properties / invoice_type / type
Removed value: -"string"
addedInput schema / $defs / CreateRecurringInvoiceRequest / properties / max_invoices
Added value: +{
+ "description": "Total number of invoices this template will generate before ending on its own, between\n2 and 600. Leave it out (or send `null`) for a recurrence that is not capped by number.\n\nA recurrence ends in ONE way: open-ended, on `end_date`, or after `max_invoices`. Sending\nboth `end_date` and `max_invoices` with a value is rejected with `RECURRING_END_MODE_CONFLICT`,\nand so is a `max_invoices` that lands on a template that already has an `end_date`: the\nconflict is judged on the RESULTING state, not on the body. To switch modes, say both things\nin the same call — the new field with a value and the old one as `null`. Nothing is cleared\nsilently.\n\nThe cap counts invoices GENERATED, not calendar turns: a skip does not spend it. The range\nis not enforced by this schema on purpose, so the rejection carries its own code and its own\nmessage: below 2 you do not want a recurrence but a scheduled invoice\n(`PUT /v1/companies/{company_id}/invoices/{invoice_id}/schedule`), which also issues it on an exact date.\n",
+ "type": [
+ "integer",
+ "null"
+ ]
+}
addedInput schema / $defs / CreateRecurringInvoiceRequest / properties / name / minLength
Added value: +1
addedInput schema / $defs / CreateRecurringInvoiceRequest / properties / name / pattern
Added value: +"^\\S.*$"
changedInput schema / $defs / CreateRecurringInvoiceRequest / properties / payment_method / anyOf
Previous value: -[
- {
- "allOf": [
- {
- "$ref": "#/$defs/PaymentMethod"
- }
- ]
- },
- {
- "type": "null"
- }
-]New value: +[
+ {
+ "allOf": [
+ {
+ "$ref": "#/$defs/PaymentMethod"
+ }
+ ],
+ "description": "Payment method. `payment_iban`, `payment_swift` and `payment_term_days` are\ndetail of this method, not standalone fields: sending any of them without a\n`payment_method` that is present, non-null and different from `NONE` is\nrejected with `422` (`PAYMENT_DETAILS_REQUIRE_METHOD`).\n"
+ },
+ {
+ "type": "null"
+ }
+]
removedInput schema / $defs / CreateRecurringInvoiceRequest / properties / preview_days / default
Removed value: -0
changedInput schema / $defs / CreateRecurringInvoiceRequest / properties / preview_days / description
Previous value: -"Days before emission date to create a draft for review. 0 means immediate emission."New value: +"**Deprecated.** Superseded by `draft_in_advance`, because the review window is no longer\na number you pick: it is fixed at 5 days. Still accepted so nothing breaks — any value\ngreater than `0` means the same as `draft_in_advance: true`, and `0` the same as `false`.\nWhen both are sent, `draft_in_advance` wins. It will be removed in a future version.\n"
changedInput schema / $defs / CreateRecurringInvoiceRequest / properties / start_date / description
Previous value: -"Date the subscription started. A past date is accepted and stored as sent — useful\nwhen migrating subscriptions from another system — but it never anchors generation\nin the past: `next_generation` moves to the first upcoming `day_of_month`. Invoices\nare never back-dated, so the missed periods are not generated.\n"New value: +"Date the subscription started. A past date is accepted and stored as sent — useful\nwhen migrating subscriptions from another system — but it never anchors generation\nin the past. `next_generation` becomes the next date of the template's own calendar\nthat is still ahead: the grid of `day_of_month` dates anchored at `start_date`, one\nevery `frequency`. On a quarterly or yearly template that can be months from now, not\nthis month. Invoices are never back-dated, so the missed periods are not generated.\n"
removedInput schema / $defs / CreateRecurringInvoiceRequest / properties / verifactu_enabled
Removed value: -{
- "description": "Whether the invoices generated by this template carry VeriFactu information.\n\n**If omitted, the company's declared preference applies** (the\n\"apply VeriFactu by default\" setting, `apply_by_default`). If the company\nhas no VeriFactu configuration, it resolves to `false`.\nSend the field explicitly (`true` or `false`) to override the preference.\n\nThe resolved value is **frozen into the template at creation time** and is\nreturned by the API: changing the company preference later does not alter\ntemplates that already exist. Edit the template to change it.\n",
- "type": "boolean"
-}
addedInput schema / $defs / Email
Added value: +{
+ "description": "Email address (minimum valid email is 5 chars, e.g. a@b.co)",
+ "format": "email",
+ "maxLength": 255,
+ "minLength": 5,
+ "type": "string"
+}
changedInput schema / $defs / ExemptionReason / description
Previous value: -"Tax exemption reason code per Spanish VAT Law (Ley 37/1992 LIVA).\nVeriFactu mapping: EXENTA_ART_20→E1, EXENTA_ART_21→E2, EXENTA_ART_22→E3,\nEXENTA_ART_24→E4, EXENTA_ART_25→E5, rest→E6. ISP→S2, NO_SUJETA→N1/N2.\nWhen OTRO, a custom text must be provided in exemption_reason_text.\n"New value: +"Tax exemption reason code per the Spanish VAT Law (Ley 37/1992, LIVA), with the\nVeriFactu code each one is reported as.\n\n- `EXENTA_ART_20`: exempt, art. 20 (domestic operations such as medical, educational,\n cultural and financial services, or housing rentals). E1.\n- `EXENTA_ART_21`: exempt, art. 21 (exports of goods). E2.\n- `EXENTA_ART_22`: exempt, art. 22 (operations treated as exports). E3.\n- `EXENTA_ART_24`: exempt, art. 24 (free zones, warehouses and customs regimes). E4.\n- `EXENTA_ART_25`: exempt, art. 25 (intra-community supplies of goods). E5.\n- `EXENTA_ART_26`: exempt, art. 26 (intra-community acquisitions of goods). It exempts the\n buyer's acquisition, not a supply the seller invoices, so an invoice line that carries it\n is rejected with `EXEMPTION_NOT_FOR_ISSUED_INVOICE`; a supply to another Member State is\n `EXENTA_ART_25`.\n- `NO_SUJETA_ART_7_9`: not subject under art. 7 (such as the transfer of a business as\n a going concern, art. 7.1º). N1.\n- `NO_SUJETA_LOCALIZACION`: not subject by the place-of-supply rules (intra-community\n or non-EU services, arts. 69 and 70). N2.\n- `ISP_ART_84_2_A` … `ISP_ART_84_2_F`: reverse charge (the invoice states «inversión del\n sujeto pasivo»), art. 84.Uno.2.º letters a) (supplier not established in Spain), b) (unwrought\n or semi-finished gold), c) (scrap, waste and recovery materials, plastic, paper, cardboard, glass and textile waste, and semi-finished non-ferrous metal products), d) (greenhouse gas emission\n allowances), e) (certain real estate supplies: in insolvency proceedings, with the exemption\n waived, or enforcing a security) and f) (construction or renovation works). S2.\n- `ISP_ART_84_2_G`: reverse charge of letter g) (silver, platinum, palladium, mobile phones,\n consoles, laptops and tablets). The law requires these supplies to be invoiced in a special\n series, so an invoice line that carries it is rejected with\n `REVERSE_CHARGE_CASE_NOT_SUPPORTED`.\n- `EXENTA_ART_140`: investment gold exemption, art. 140 bis (usually with `regime_key`\n `04`). E6.\n- `REGIMEN_ART_129` (agriculture,\n livestock and fishing, arts. 124 to 134 bis), `REGIMEN_ART_135` (second-hand goods,\n art and antiques), `REGIMEN_ART_141` (travel agencies), `REGIMEN_ART_154` (equivalence\n surcharge) and `REGIMEN_ART_163_DECIES` (cash basis, arts. 163 decies to 163\n sexiesdecies): operations of special regimes, which VeriFactu identifies by the regime\n key rather than by an exemption code. An\n invoice line that carries one is rejected with `EXEMPTION_REGIME_NOT_SUPPORTED_IN_VERIFACTU`;\n declare the regime with `regime_key` instead.\n- `OTRO`: any other provision. Requires the text in `exemption_reason_text`. E6.\n"
changedInput schema / $defs / ExemptionReason / enum
Previous value: -[
- "EXENTA_ART_20",
- "EXENTA_ART_21",
- "EXENTA_ART_22",
- "EXENTA_ART_24",
- "EXENTA_ART_25",
- "EXENTA_ART_26",
- "EXENTA_ART_140",
- "NO_SUJETA_ART_7_9",
- "NO_SUJETA_LOCALIZACION",
- "ISP_ART_84_2_A",
- "ISP_ART_84_2_E",
- "ISP_ART_84_2_F",
- "REGIMEN_ART_129",
- "REGIMEN_ART_135",
- "REGIMEN_ART_141",
- "REGIMEN_ART_154",
- "REGIMEN_ART_163_DECIES",
- "OTRO"
-]New value: +[
+ "EXENTA_ART_20",
+ "EXENTA_ART_21",
+ "EXENTA_ART_22",
+ "EXENTA_ART_24",
+ "EXENTA_ART_25",
+ "EXENTA_ART_26",
+ "EXENTA_ART_140",
+ "NO_SUJETA_ART_7_9",
+ "NO_SUJETA_LOCALIZACION",
+ "ISP_ART_84_2_A",
+ "ISP_ART_84_2_B",
+ "ISP_ART_84_2_C",
+ "ISP_ART_84_2_D",
+ "ISP_ART_84_2_E",
+ "ISP_ART_84_2_F",
+ "ISP_ART_84_2_G",
+ "REGIMEN_ART_129",
+ "REGIMEN_ART_135",
+ "REGIMEN_ART_141",
+ "REGIMEN_ART_154",
+ "REGIMEN_ART_163_DECIES",
+ "OTRO"
+]
changedInput schema / $defs / PaymentMethod / description
Previous value: -"Payment method for invoices and recurring invoices.\nNONE means no payment information will be shown.\n"New value: +"Payment method shown on invoices and recurring invoices.\n\n- `NONE`: no payment information is shown.\n- `BANK_TRANSFER`: bank transfer to the IBAN of the payment details; the only method\n that requires an IBAN.\n- `CARD`: card payment.\n- `CASH`: cash payment.\n- `CHECK`: payment by cheque.\n- `DIRECT_DEBIT`: direct debit from the customer's bank account.\n- `BIZUM`: payment through Bizum.\n- `OTHER`: any other method.\n"
addedInput schema / $defs / RecurringEmailConfigRequest / properties / cc / items / $ref
Added value: +"#/$defs/Email"
removedInput schema / $defs / RecurringEmailConfigRequest / properties / cc / items / type
Removed value: -"string"
addedInput schema / $defs / RecurringEmailConfigRequest / properties / recipients / items / $ref
Added value: +"#/$defs/Email"
removedInput schema / $defs / RecurringEmailConfigRequest / properties / recipients / items / type
Removed value: -"string"
addedInput schema / $defs / RecurringInvoiceType
Added value: +{
+ "description": "Type of the invoices a recurring template generates: `STANDARD` for an identified recipient,\n`SIMPLIFIED` for a recipient that is not identified.\n",
+ "enum": [
+ "STANDARD",
+ "SIMPLIFIED"
+ ],
+ "type": "string"
+}
changedInput schema / $defs / RecurringLineRequest / description
Previous value: -"Recurring-invoice line. Unlike invoice lines (which nest tax data under a `main_tax` object),\nrecurring lines use flat tax fields: `vat_rate`, `tax_type`, `regime_key`,\n`equivalence_surcharge_rate` and `irpf_rate`. Do not send a `main_tax` object here.\n"New value: +"Recurring-invoice line. Unlike invoice lines (which nest tax data under a `main_tax` object),\nrecurring lines use flat tax fields: `vat_rate`, `tax_type`, `regime_key`,\n`equivalence_surcharge_rate` and `irpf_rate`. Do not send a `main_tax` object here.\n\n**Line amount**: send **exactly one** of `unit_price`, `total_excluding_tax` or\n`total_including_tax` — same contract as an invoice line. Sending none, or more than\none, is rejected with `LINE_UNIT_PRICE_XOR_DECLARED_TOTAL`; a declared total together\nwith an explicit `discount_percentage` is rejected with\n`LINE_DECLARED_TOTAL_FORBIDS_DISCOUNT` (the discount, if any, already lives inside\nthe total).\n\nThe mode is what the template promises, and it is re-applied on **every** generation:\na line declared as `total_including_tax: 1.00` over 300 units invoices 1,00 € on every\ngeneration, not 300 × 0,0033 = 0,99 €. Because `PATCH` replaces the lines as a whole,\nresending a line with a different amount field switches its mode.\n"
addedInput schema / $defs / RecurringLineRequest / properties / quantity / multipleOf
Added value: +0.0001
addedInput schema / $defs / RecurringLineRequest / properties / total_excluding_tax
Added value: +{
+ "description": "Declared line total excluding taxes: this amount IS the taxable base, exactly,\nwith no recalculation. The stored `unit_price` becomes derived and informational\n(`total / quantity`, 4 decimals). Mutually exclusive with `unit_price` and\n`total_including_tax`.\n\nNegative totals are NOT accepted, for the same reason `unit_price` does not accept\nnegative prices: a template only issues `STANDARD` or `SIMPLIFIED` invoices, and only\na corrective invoice — created through its own endpoint over an already issued\ninvoice — carries a negative amount. A total outside the range is rejected with\n`422 VALIDATION_ERROR` and the offending field in `details`.\n\nThe upper bound is the same one `POST /v1/invoices` declares for a line total: a\ntemplate is a promise to issue an invoice, and it cannot accept less than the\ninvoice it will generate does. The derived `unit_price` (`total / quantity`) can\nstill exceed the `maximum` this contract accepts for `unit_price` itself — what\nactually bounds it then is the domain's price ceiling, not this field's contract.\n",
+ "maximum": 99999999.99,
+ "minimum": 0,
+ "type": "number"
+}
addedInput schema / $defs / RecurringLineRequest / properties / total_including_tax
Added value: +{
+ "description": "Declared line total including taxes — what the customer pays. The engine works\nthe breakdown backwards so that taxable base + VAT + equivalence surcharge equals\nthis amount exactly on every generated invoice. IRPF withholding is never part of\nthe decomposition: it is a retention, not a price. Mutually exclusive with\n`unit_price` and `total_excluding_tax`.\n\nNegative totals are NOT accepted, same as `total_excluding_tax`.\n\nThe upper bound is the same one `POST /v1/invoices` declares for a line total, for\nthe same reason: the template cannot promise more than the invoice it generates\ncould ever accept. The derived `unit_price` (`total / quantity`) can still exceed\nthe `maximum` this contract accepts for `unit_price` itself — what actually bounds\nit then is the domain's price ceiling, not this field's contract.\n",
+ "maximum": 99999999.99,
+ "minimum": 0,
+ "type": "number"
+}
addedInput schema / $defs / RecurringLineRequest / properties / unit_price / description
Added value: +"Unit price before taxes. Supports up to 4 decimal places for micro-pricing\n(e.g. €0.0897/unit for labels, packaging); the generated invoices always round\ntheir amounts to 2 decimals. Mutually exclusive with `total_excluding_tax` and\n`total_including_tax`.\n\nThe upper bound is the same one the invoice line declares, and so is the\nacceptance of `0` (a discount granted before or simultaneously with the sale,\ne.g. a free introductory month). A price outside the range is rejected with\n`422 VALIDATION_ERROR` and the offending field in `details`.\n\nNegative prices are NOT accepted, unlike an invoice line of a corrective invoice:\na recurring template only issues `STANDARD` or `SIMPLIFIED` invoices, and a\ncorrective is created through its own endpoint over an already issued invoice —\nnever generated by a template.\n"
addedInput schema / $defs / RecurringLineRequest / properties / unit_price / maximum
Added value: +999999.9999
changedInput schema / $defs / RecurringLineRequest / required
Previous value: -[
- "description",
- "quantity",
- "unit_price",
- "vat_rate"
-]New value: +[
+ "description",
+ "quantity",
+ "vat_rate"
+]