Factuarea API

Clasificación fiscal y exenciones por línea

E1–E6 y N1–N2 por línea, la retención de IRPF que resta, y la matriz cerrada de pares legales de IVA y recargo de equivalencia — los cuatro campos que deciden qué dice el desglose que llega a la AEAT.

Una línea de factura lleva más información fiscal que un tipo impositivo. Cuatro campos opcionales deciden cómo se clasifica la operación, si se repercute IVA siquiera y cuánto paga realmente el destinatario:

CampoQué hace
exemption_reasonDeclara la línea exenta (E1E6) o no sujeta (N1, N2).
regime_keyDeclara el régimen especial — ver Claves de régimen.
retention_rateRetención de IRPF, restada del importe a pagar.
surcharge_rateRecargo de equivalencia, sumado — y solo en combinaciones emparejadas legalmente.

Los cuatro son opcionales y aditivos. Una factura que los omite todos se comporta exactamente igual que antes de que existieran, huella incluida.

Cuándo aplica

Declara una causa de exención cuando la operación esté exenta o no sujeta según la Ley del IVA. Declara retención cuando factures como profesional o arriendes un local de negocio. Declara recargo cuando tu cliente sea un minorista en régimen de recargo de equivalencia.

La distinción entre las dos familias de códigos es legal, no cosmética (BR-INV-032):

FamiliaCódigosBase en la LIVADesglose AEAT
ExentaE1 art. 20 · E2 art. 21 · E3 art. 22 · E4 arts. 23 y 24 · E5 art. 25 · E6 otrosLa operación está sujeta al IVA, y exenta.Declara un código de operación exenta. Sin cuota de IVA.
No sujetaN1 arts. 7, 14 y otros · N2 reglas de localizaciónLa operación queda fuera del ámbito del impuesto.Declara una calificación de no sujeción.

El catálogo no contiene ningún código S a propósito. «Sujeta y no exenta» es el valor por defecto, no una causa seleccionable, y la inversión del sujeto pasivo se modela en la cabecera de la factura, no por línea. Como el régimen de cabecera es de solo lectura en la v1, la inversión del sujeto pasivo no se puede declarar por la API pública — ver Clientes internacionales.

Qué envía la API

Exención y no sujeción

lines[].exemption_reason en POST /v1/invoices y PUT /v1/invoices/{id}. Un valor fuera del catálogo de ocho códigos responde 422 con allowed_values.

curl -X POST https://api.factuarea.com/v1/invoices \
  -H "Authorization: Bearer fact_live_3pXnR2VbY7TcA9eFmN5z8KqW" \
  -H "Content-Type: application/json" \
  -d '{
        "client_id": "0197a2a8-4cf0-7a31-9a5e-3f2b8c1d6e42",
        "series_id": "019e5584-7a72-7038-a8f6-561ed180b699",
        "issued_on": "2026-06-01",
        "due_on": "2026-07-01",
        "lines": [
          { "description": "Exportación de maquinaria", "quantity": 1, "unit_price": 100, "tax_rate": 0, "exemption_reason": "E2" },
          { "description": "Servicio de instalación", "quantity": 1, "unit_price": 50, "tax_rate": 21 }
        ]
      }'

El desglose de la AEAT agrupa por el par (tipo impositivo, causa de exención), así que una factura mixta produce un grupo por combinación y cada grupo cuadra por su cuenta. Las líneas que comparten ambos valores se agregan en un solo grupo.

Una línea que omite el campo cae a la calificación derivada de la cabecera de la factura. Como una factura creada por la v1 tiene siempre el régimen general de cabecera, ese valor por defecto es «sujeta y no exenta» — y por eso una línea exenta tiene que decirlo de forma explícita.

La retención de IRPF resta

lines[].retention_rate es un porcentaje de 0 a 100, opcionalmente acompañado de lines[].retention_rate_id, una referencia a una retención de tu catálogo. La fórmula canónica del total es:

total = subtotal + IVA − retención + recargo de equivalencia

La retención es dinero que el cliente se queda e ingresa en la Administración tributaria en nombre del profesional, así que reduce el importe a pagar (BR-INV-033):

{
  "lines": [
    { "description": "Servicios de consultoría", "quantity": 1, "unit_price": 1000, "tax_rate": 21, "retention_rate": 15 }
  ]
}

Esa línea factura 1000, repercute 210 de IVA, retiene 150, y el cliente paga 1060.

Si envías a la vez retention_rate y retention_rate_id, tienen que coincidir. Una discrepancia es un 422 que nombra ambos porcentajes, en lugar de una decisión silenciosa sobre cuál gana.

Algunos tipos de retención se almacenan con signo negativo — una convención visual heredada que significa «esto se retiene». El cálculo toma el valor absoluto y la resta está cableada en la propia fórmula, así que el signo no cambia nunca el resultado (BR-TAX-008). El catálogo fiscal público publica siempre estos tipos en positivo.

La matriz del recargo de equivalencia es cerrada

lines[].surcharge_rate no es un número libre. Toda línea con recargo por encima de cero se valida contra el emparejamiento legal con su tipo de IVA (BR-INV-034):

Tipo de IVARecargo legal
21 %5,2 %
10 %1,4 %
4 %0,5 %
0 %0 %

Una combinación ilegal —21 % de IVA con un recargo del 1,4 %, por ejemplo— responde 422 con los pares legales en allowed_values. La comparación es por valor redondeado a dos decimales, así que 5.2 y 5.20 son el mismo par.

Las operaciones bajo este régimen suelen llevar además regime_key: "18".

Qué devuelve cada línea

El objeto línea de factura devuelve tax_rate, retention_rate, surcharge_rate, discount_percent, el subtotal calculado, taxes y total, más los campos fiscales: regime_key, exemption_reason, indirect_tax_regime y aeat_tax_code.

Los dos últimos son un snapshot fiscal congelado, escrito al construir la línea y nunca recalculado (BR-TAX-023). Una factura emitida no cambia su régimen indirecto porque la empresa traslade después su domicilio fiscal, y las líneas históricas anteriores al snapshot se quedan vacías en lugar de rellenarse con los datos de hoy.

De dónde salen los valores por defecto

Cuando omites un tipo, lo resuelve una única cadena del backend compartida por todas las superficies —panel, API pública, herramientas de agente, importadores, facturas recurrentes— en orden estricto de prioridad (BR-TAX-025):

Valores por defecto del cliente. El cliente guarda tipos, no referencias, y cada tipo se resuelve a un impuesto concreto filtrado por el régimen indirecto del emisor: un 7 % por defecto de un cliente en una empresa canaria resuelve a IGIC al 7 %, no a un IVA peninsular.

Ajustes de la empresa, incluida la sugerencia derivada de la zona AEAT de la empresa.

El catálogo global.

La cadena es de mejor esfuerzo y nunca devuelve error por un valor por defecto irresoluble: degrada al siguiente escalón. Si el cliente está marcado como sujeto al recargo de equivalencia y el tipo de IVA resuelto tiene un recargo legalmente vinculado, ese recargo se inyecta en los valores por defecto (BR-TAX-022).

Consúltala directamente con GET /v1/taxes/defaults/{docType} cuando quieras enseñar a tus usuarios lo que se va a aplicar antes de que lo confirmen.

Qué sale en el PDF

Cambian dos cosas en el documento impreso.

El bloque de totales refleja la fórmula de arriba: la retención aparece como resta y el recargo de equivalencia como suma, así que el importe a pagar difiere de subtotal + IVA.

Las menciones legales. Cuando la factura lleva una causa de exención a nivel de documento, su frase legal —citando el artículo de la LIVA— se añade como primera mención legal de la factura (BR-TAX-024). Esa causa es un campo de cabecera, uno por factura, y es de solo lectura por la API pública: el objeto factura expone exemption_reason y legal_mentions, pero ninguna operación de la v1 los fija. Una factura creada por la v1 no imprime, por tanto, ninguna frase automática de exención; pon el texto en notes si el documento lo necesita.

El campo de línea exemption_reason_text (hasta 255 caracteres) existe con el mismo propósito a nivel de línea, y es solo de presentación — no tiene efecto fiscal.

Qué llega a la AEAT

Una calificación por grupo de desglose. Una línea que declara un código E produce una entrada de operación exenta con ese código literal y sin cuota repercutida; una línea que declara un código N produce una calificación de no sujeción. Una línea que no declara nada hereda la calificación derivada de la cabecera (BR-VFC-029).

La clave de agrupación es el par (tipo impositivo, causa de exención), que es lo que permite a una factura mixta pasar la validación de la AEAT: cada grupo declara su propia base, su propio tipo y su propia cuota, y dentro del grupo se cumple base × tipo = cuota.

La retención no aparece en el desglose VeriFactu — no es IVA. Se declara en las declaraciones de retenciones y reduce el total de la factura.

El recargo de equivalencia solo se propaga a las líneas sujetas y no exentas; las líneas exentas no llevan ni IVA ni recargo.

Trazabilidad

Derivado de las reglas de dominio del backend de Factuarea:

  • BR-INV-032 — el catálogo cerrado E1E6 / N1N2, el valor derivado de la cabecera, la agrupación por (tipo, causa) y la invariante de huella idéntica.
  • BR-INV-033 — la retención de IRPF por línea en el contrato v1 y la comprobación de coherencia entre el tipo y el impuesto referenciado.
  • BR-INV-034 — la matriz legal cerrada de pares de IVA y recargo.
  • BR-TAX-008 — la retención almacenada con signo pero calculada en valor absoluto.
  • BR-TAX-022 — el vínculo legal de un tipo de IVA con su recargo de equivalencia.
  • BR-TAX-023 — el snapshot fiscal inmutable por línea.
  • BR-TAX-024 — la causa de exención a nivel de documento y la mención legal automática.
  • BR-TAX-025 — la cadena cliente → empresa → catálogo global de valores fiscales por defecto.
  • BR-VFC-029 — cómo se deriva la calificación cuando la línea no declara causa.

En esta página