Factuarea APIDevelopers

Ejemplos fiscales de factura

Los 21 escenarios fiscales españoles de facturación, cuáles cuatro de ellos se publican como ejemplos de request listos para enviar en la Referencia de la API y un ejemplo de rectificativa por cada código R de la AEAT (R1–R5).

La facturación española cubre muchos escenarios fiscales — B2B nacional, bienes y servicios intracomunitarios, ventas a distancia OSS, IGIC en Canarias, IPSI en Ceuta/Melilla, retención IRPF, recargo de equivalencia, operaciones exentas y no sujetas. La parte difícil es acertar la combinación correcta de tax_rate, exemption_reason, regime_key, retention_rate y surcharge_rate en cada línea.

Para hacerlo concreto, la Referencia de la API incluye cuatro ejemplos de request nombrados y listos para enviar en POST /v1/companies/{company}/invoices — un conjunto curado y representativo, no uno por escenario. Cada uno es un payload válido que puedes copiar, adaptar y enviar: elige el más cercano a tu caso en el desplegable de ejemplos del request body y apóyate en la tabla siguiente y en la guía enlazada en cada fila para el resto.

Todas las rutas de esta guía cuelgan de /v1/companies/{company}/…: {company} es el id (UUID v7) del NIF con el que operas, y en los ejemplos curl es $COMPANY_ID. Alcanzar un NIF explica cómo resolverlo.

Los 21 escenarios

Cada fila de abajo es un escenario que puedes expresar línea a línea con los campos anteriores. Los cuatro marcados con ★ son además ejemplos de request nombrados que puedes elegir directamente en el desplegable; los otros diecisiete están documentados aquí y en la guía enlazada, pero no tienen ejemplo nombrado en el spec — constrúyelos a partir del marcado más cercano.

Clave del escenarioEscenarioGuía
★ b2b_nacionalB2B nacional, IVA 21% por línea (régimen general AEAT 01).Claves de régimen
b2b_nacional_iva_reducidoIVA reducido (10%) o superreducido (4%), régimen 01.Clasificación por línea
★ b2cConsumidor final (sin NIF del destinatario; factura simplificada cuando aplique).Simplificadas o completas
★ intracomunitario_bienesEntrega intracomunitaria de bienes, exenta E5 (art. 25 LIVA).Clientes internacionales
intracomunitario_serviciosServicios B2B UE, inversión del sujeto pasivo — calificación S2 (sujeta y no exenta, cuota repercutida 0) derivada del régimen de cabecera isp, no una causa de exención.Clientes internacionales
ossVentas a distancia OSS (IVA del país de destino), regime_key: 17.Clientes internacionales · Claves de régimen
igic_canariasIGIC en Canarias, regime_key: 08.Impuestos territoriales
ipsi_ceuta_melillaIPSI en Ceuta / Melilla, regime_key: 08.Impuestos territoriales
★ con_irpfRetención IRPF por línea (retention_rate).Clasificación por línea
con_recargo_equivalenciaRecargo de equivalencia con un par legal IVA↔recargo, regime_key: 18.Clasificación por línea · Claves de régimen
exenta_articulo_20Exenta por art. 20 LIVA, exemption_reason: E1.Clasificación por línea
exenta_exportacionExportación fuera de la UE, exenta E2 (art. 21), regime_key: 02.Clientes internacionales · Claves de régimen
no_sujetaOperación no sujeta, exemption_reason: N1 / N2.Clasificación por línea
inversion_sujeto_pasivo_nacionalInversión del sujeto pasivo nacional (p. ej. ejecución de obra), tax_rate: 0.Clasificación por línea
regimen_especial_bienes_usadosRégimen del margen de bienes usados (REBU), regime_key: 03.Claves de régimen
regimen_agencias_viajesRégimen de agencias de viajes (REAV), regime_key: 05.Claves de régimen
criterio_cajaRégimen del criterio de caja, regime_key: 07.Claves de régimen
multilinea_iva_mixtoVarias líneas a tipos de IVA distintos (21% / 10% / 4%).Clasificación por línea
con_descuento_y_metadatadiscount_percent por línea más metadata de integración.Recetario fiscal
con_idempotency_keyReintentos seguros con el header Idempotency-Key.Recetario fiscal
cliente_extranjero_alternative_idDestinatario extranjero con identificador alternativo (matriz tipo↔país AEAT).Clientes internacionales

Cada uno de los cuatro ejemplos marcados también se publica como una entrada reutilizable components.examples.invoice_* en el spec OpenAPI, para que los SDK y el tooling puedan resolverlos por $ref.

Los value objects fiscales (régimen, motivo de exención, IRPF, recargo) vienen del motor fiscal de Factuarea. Los ejemplos muestran combinaciones válidas; para el contrato campo a campo consulta el schema del request de POST /v1/companies/{company}/invoices e Importes y fechas.

Una factura completa con datos estructurados

Una factura completa para un cliente público que lleva todos los bloques estructurados del contrato: referencias de cabecera y de línea, periodo de facturación, literales legales, los cuatro centros DIR3 y un calendario de pagos. La línea suma 121.00 (100 más 21% de IVA) y los tres vencimientos suman esos mismos 121.00.

curl -X POST https://api.factuarea.com/v1/companies/$COMPANY_ID/invoices \
  -H "Authorization: Bearer $FACTUAREA_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "019e0000-0000-7000-8000-0000000000f1",
    "series_id": "019e0000-0000-7000-8000-0000000000f2",
    "issued_on": "2026-01-15",
    "due_on": "2026-04-15",
    "business_references": {
      "receiver_contract_reference": "CON-2026-1",
      "receiver_transaction_reference": "PED-2026-1",
      "file_reference": "EXP-2026-1"
    },
    "invoicing_period": { "start_date": "2026-01-01", "end_date": "2026-01-31" },
    "legal_literals": ["Pago sujeto al contrato indicado."],
    "administrative_centres": [
      { "role_code": "01", "code": "L01000001", "name": "Oficina contable" },
      { "role_code": "02", "code": "L01000002", "name": "Órgano gestor" },
      { "role_code": "03", "code": "L01000003", "name": "Unidad tramitadora" },
      { "role_code": "04", "code": "L01000004", "name": "Órgano proponente" }
    ],
    "lines": [
      {
        "description": "Servicio contratado",
        "quantity": 1,
        "unit_price": 100,
        "tax_rate": 21,
        "business_references": {
          "issuer_contract_reference": "REF-2026-01",
          "issuer_contract_date": "2026-01-10"
        },
        "delivery_notes_references": [{ "number": "ALB-2026-1", "date": "2026-01-10" }]
      }
    ],
    "payment_terms": [
      { "due_date": "2026-02-15", "amount": "40.00", "payment_means": "01" },
      { "due_date": "2026-03-15", "amount": "30.00", "payment_means": "04",
        "account": { "iban": "ES9121000418450200051332", "bic": "CAIXESBBXXX" } },
      { "due_date": "2026-04-15", "amount": "51.00", "payment_means": "04",
        "account": { "iban": "ES9121000418450200051332", "bic": "CAIXESBBXXX" } }
    ]
  }'

Qué debe cumplir cada bloque:

  • business_references (cabecera) tiene exactamente tres claves, de hasta 20 caracteres cada una; las fechas y las referencias del emisor viven en la línea.
  • administrative_centres contiene como máximo un centro por role_code (01 oficina contable, 02 órgano gestor, 03 unidad tramitadora, 04 órgano proponente). code es un código DIR3 de 9 o 10 caracteres alfanuméricos que empieza por letra; name es opcional, de hasta 40 caracteres. Enviar [] no selecciona ningún centro.
  • Las filas de payment_terms conservan tu orden, las fechas no decrecen, los importes son cadenas de dos decimales y suman exactamente total_to_pay. Los códigos de pago 02 y 04 llevan la account; el resto no.
  • delivery_notes_references[].number tiene hasta 30 caracteres y date es opcional.

La respuesta es 201 con la factura, que ahora devuelve la identidad persistida de cada vencimiento (payment_terms[].id, UUID v7), payment_terms_version y administrative_version. Guárdalas: cualquier cambio posterior de un calendario existente o del encaminamiento reenvía la versión (expected_payment_terms_version, expected_version de las revisiones administrativas), y si falta la versión responde 428.

Si un vencimiento es incorrecto, por ejemplo "40.5" en lugar de "40.50", no se escribe nada:

{
  "error": {
    "type": "invalid_request_error",
    "code": "invalid_invoice_payment_terms",
    "message": "Las condiciones de pago de la factura no son válidas.",
    "param": "payment_terms.1.amount",
    "request_id": "req_..."
  }
}

Una factura rectificativa de -50.00 lleva vencimientos con signo con la misma regla: "-20.00" y "-30.00". Consulta Facturas rectificativas y Datos de negocio de la factura.

Facturas rectificativas por código R

Una factura rectificativa lleva el código de rectificación de la AEAT que indica por qué se corrige la original. POST /v1/companies/{company}/invoices/{id}/corrective incluye un ejemplo nombrado por cada código, cada uno un payload válido que produce ese correction_code exacto:

EjemploCódigoAplica aGuía
r1_error_fundadoR1Error fundado de derecho / anulación. Facturas completas F1/F3.Facturas rectificativas
r2_concursoR2Concurso de acreedores del destinatario. F1/F3.Facturas rectificativas
r3_incobrableR3Créditos incobrables. F1/F3.Facturas rectificativas
r4_otrasR4Resto de causas; total o parcial (correction_type: partial con lines). F1/F3.Facturas rectificativas
r5_simplificadaR5Rectificación de una factura simplificada. Solo F2.Facturas rectificativas · Simplificadas o completas

Pasa correction_code explícitamente para seleccionar el código R; R5 solo aplica a facturas simplificadas (F2).

Una rectificativa es a su vez un documento fiscal: una vez emitida se reporta a la AEAT vía VeriFactu igual que cualquier otra factura. Usa el ejemplo que coincida con la causa legal — el código no es cosmético.

En esta página

¿Te echamos una mano?Contactar con soporte