Generar factura rectificativa
Emet una factura rectificativa (RD 1619/2012 art. 15) que corregeix una factura ja emesa. Retorna 201 amb la nova factura: is_corrective: true, corrective apuntant a l'original i un número derivat del d'aquesta a la mateixa sèrie (F-2026-0042-REC1, -REC2… per a rectificatives successives).
Flux: l'original ha d'estar ja emesa (sent o paid) → la rectificativa neix ja emesa, mai com a esborrany → quan VeriFactu està actiu la seva alta es transmet a l'AEAT de manera asíncrona, així que un 201 no significa que l'AEAT ja l'hagi acceptada. L'original no es modifica mai: conserva el seu número, el seu estat i el seu propi registre VeriFactu. Una rectificativa és un document addicional, no una edició.
Total o parcial. correction_type: full és una substitució (naturalesa VeriFactu S): les lines que envies són els imports finals correctes, i ometre lines del tot la converteix en una anul·lació total, on cada línia original es copia negada i amb el prefix [ANULACION]. correction_type: partial és una rectificació per diferències (naturalesa I): lines és obligatori i cadascuna és un delta — típicament negatiu — amb el prefix [AJUSTE]. En una rectificació parcial una línia només mou stock si declara el seu propi product_id; en una substitució el producte s'hereta de la línia original del mateix índex.
Codi R de l'AEAT. Per defecte es deriva de correction_reason: error_fundado → R1, concurso → R2, incobrable → R3, la resta → R4; una rectificativa d'una factura simplificada (F2) neix sempre R5 sigui quin sigui el motiu. correction_code sobreescriu aquesta derivació, però es valida contra la matriu legal — original F2 → només R5; original F1/F3 → només R1–R4. Qualsevol altra combinació retorna 422 amb els allowed_values legals.
Límits: les originals en draft, overdue, cancelled i annulled retornen 422 (una factura overdue s'ha de cobrar o anul·lar abans); una rectificativa no es pot rectificar al seu torn — emet en el seu lloc una nova rectificativa de l'original. Llista totes les rectificatives d'una factura amb GET /v1/invoices/{id}/correctives.
A: header
Paràmetres de ruta
Paràmetres de capçalera
Clau opaca generada pel client (fins a 255 caràcters; es recomana UUID v7) que fa segurs els reintents: la primera resposta es cacheja i es reprodueix a les repeticions sense tornar a executar la mutació. Reutilitzar una clau amb un cos diferent retorna 409 idempotency_key_reused. Consulta la guia d'Idempotency.
1 <= length <= 255Fixa la versió de l'API (YYYY-MM-DD, versionat per data estil Stripe) per a aquesta petició; omet-lo per usar la versió fixada de la clau, o l'última si no n'hi ha cap. Versió no suportada → 400 unsupported_api_version; mal formada → 400 parameter_invalid_format. La versió efectiva es reflecteix a la capçalera de resposta Factuarea-Version. Consulta la guia de Versioning.
dateOpera en nom d'una empresa filla (API key mestra de gestoria): passa el seu id públic (UUID v7) i la petició s'executa contra les dades d'aquella filla sense canviar l'scope, el tier ni l'environment de la clau (omet-lo per usar la pròpia empresa de la clau). UUID no vàlid → 400 parameter_invalid_uuid; id desconegut o no propi → 404 profile_not_found. Consulta la guia d'Acting on behalf.
uuidCos de la petició
application/json
Definicions de TypeScript
Usa el tipus request body a TypeScript.
Cos de la resposta
application/json
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,
"total_disbursements": 0,
"total_to_pay": -605,
"currency": "EUR",
"notes": "Rectificativa por descuento comercial sobre FAC-2026-00010.",
"external_id": "ERP-RECT-2026-0007",
"lines": [
{
"object": "invoice_line",
"description": "Rectificació: descompte comercial 5 h consultoria",
"product": {
"id": "01931b3e-7c4a-7f2e-9a8b-3c5d6e7f8b03",
"name": "Consultoría técnica (hora)"
},
"quantity": 5,
"unit_price": -100,
"tax_rate": 21,
"retention_rate": 0,
"surcharge_rate": 0,
"discount_percent": 0,
"subtotal": -500,
"taxes": -105,
"total": -605,
"indirect_tax_regime": "iva",
"aeat_tax_code": "S1",
"line_type": "NORMAL"
}
],
"metadata": {
"order_id": "PO-2026-0010"
},
"tags": [
"rectificativa",
"cliente-vip"
],
"custom_fields": [
{
"field": "centro_coste",
"value": "CC-2026-001"
}
],
"operation_regime": "general",
"exemption_reason": null,
"legal_mentions": [],
"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,
"scheduled_for": null,
"scheduled_action": 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": "not_found_error",
"code": "resource_not_found",
"message": "El recurso solicitado no existe o pertenece a otra empresa.",
"param": null,
"doc_url": "https://docs.factuarea.com/guides/errors#resource_not_found",
"request_id": "req_01HKQS5NEQ6X1R4N9B0C5DWTPG"
}
}{
"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"
}
}