Generate corrective invoice
Generate a corrective (rectificativa) invoice that amends a previously issued invoice. The corrective is returned as a new Invoice with `type: "corrective"` referencing the original.
In: header
Path Parameters
Header Parameters
Unique key generated by the client to ensure idempotency on retries. It lets you safely resend the same request: the first response is cached and returned without re-executing the mutation. It is an opaque string to the server; any unique value of up to 64 characters is valid (UUID v7, UUID v4, ULID, nanoid, etc.). UUID v7 is recommended for consistency with the API identifiers. The same key reused with a different body returns 409 idempotency_key_reused.
1 <= length <= 64Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
import { Factuarea } from "@factuarea/sdk";const factuarea = new Factuarea({ apiKey: process.env.FACTUAREA_API_KEY! });const result = await factuarea.invoices.corrective("01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a01", { // request body — see the schema below });{
"data": {
"id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a60",
"object": "invoice",
"number": "RECT-2026-00007",
"is_number_assigned": true,
"type": "R1",
"series": {
"id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8b04",
"code": "RECT-2026"
},
"client": {
"id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a01",
"name": "Acme Soluciones SL"
},
"status": "issued",
"issued_on": "2026-03-22",
"due_on": "2026-04-21",
"subtotal": -500,
"taxes_total": -105,
"total": -605,
"currency": "EUR",
"notes": "Rectificativa por descuento comercial sobre FAC-2026-00010.",
"external_id": "ERP-RECT-2026-0007",
"lines": [
{
"object": "invoice_line",
"description": "Rectificación: descuento comercial 5 h consultoría",
"product": {
"id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8b03",
"name": "Consultoría técnica (hora)"
},
"quantity": 5,
"unit_price": -100,
"tax_rate": 21,
"discount_percent": 0,
"subtotal": -500,
"taxes": -105,
"total": -605
}
],
"metadata": {
"order_id": "PO-2026-0010"
},
"tags": [
"rectificativa",
"cliente-vip"
],
"custom_fields": [
{
"field": "centro_coste",
"value": "CC-2026-001"
}
],
"operation_regime": "general",
"exclude_347": false,
"verifactu_status": "accepted",
"paid_amount": 0,
"pending_amount": -605,
"payments": {
"detail": [],
"total": 0,
"pending": -605
},
"is_corrective": true,
"corrective": {
"original_id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a10",
"original_number": "FAC-2026-00010",
"original_date": "2026-02-01",
"correction_reason": "R1",
"correction_type": "por_sustitucion",
"correction_nature": "S",
"base_rectificada": -500,
"cuota_rectificada": -105,
"correction_aeat_type": "R1"
},
"payment": null,
"public_link": {
"object": "public_link",
"url": "https://app.factuarea.com/d/01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a60",
"id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a60",
"enabled": true,
"expires_at": "2026-09-22T23:59:59Z",
"max_days": 120
},
"substituted_by": {
"id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a50",
"number": "FAC-2026-00050"
},
"recurring": {
"id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8a08"
},
"paid_at": null,
"paid_on": null,
"sent_at": "2026-03-22T09:10:00Z",
"voided_at": null,
"void_reason": null,
"created_at": "2026-03-22T09:00:00Z",
"updated_at": "2026-03-22T09:10:00Z"
}
}{
"error": {
"type": "authentication_error",
"code": "missing_api_key",
"message": "No se ha proporcionado una API key válida en el header Authorization.",
"param": null,
"doc_url": "https://docs.factuarea.com/guides/errors#missing_api_key",
"request_id": "req_01HKQS5N8VR7QXJ9K3T6BWPMZA"
}
}{
"error": {
"type": "authorization_error",
"code": "insufficient_scope",
"message": "Esta API key no tiene el scope requerido para esta operación.",
"param": null,
"doc_url": "https://docs.factuarea.com/guides/errors#insufficient_scope",
"request_id": "req_01HKQS5NBC3P8M1KX4V7SLNHQD"
}
}{
"error": {
"type": "idempotency_error",
"code": "idempotency_key_reused",
"message": "La cabecera `Idempotency-Key` ya se usó con un body distinto. Usa una clave nueva o reenvía exactamente el mismo body.",
"param": null,
"doc_url": "https://docs.factuarea.com/guides/errors#idempotency_key_reused",
"request_id": "req_01HKQS5NHT9A4U7R2E3F8GZWTJ"
}
}{
"error": {
"type": "invalid_request_error",
"code": "parameter_invalid",
"message": "El campo `name` es obligatorio y no puede estar vacío.",
"param": "name",
"doc_url": "https://docs.factuarea.com/guides/errors#parameter_invalid",
"request_id": "req_01HKQS5NGS8Z3T6Q1D2E7FYVSI"
}
}{
"error": {
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Has excedido el rate limit de 60 peticiones por minuto. Reintenta tras 30 segundos.",
"param": null,
"doc_url": "https://docs.factuarea.com/guides/errors#rate_limit_exceeded",
"request_id": "req_01HKQS5NKW1C6W9T4G5H0JBZVL"
}
}{
"error": {
"type": "api_error",
"code": "internal_error",
"message": "Ha ocurrido un error inesperado. Si persiste, contacta con soporte adjuntando el request_id.",
"param": null,
"doc_url": "https://docs.factuarea.com/guides/errors#internal_error",
"request_id": "req_01HKQS5NLX2D7X0U5H6J1KCAWM"
}
}Check annulment eligibility
Validates whether the invoice can be annulled and whether a VeriFactu anulacion record will be created. Call before posting to /annul.
List corrective invoices
Returns all corrective invoices associated with the original invoice. Used to reconstruct the original → rectificativa tree.