Envío de facturas

Diccionario de campos de POST /send-invoice — cabeceras, body, qué es obligatorio y qué genera el servidor.

Guía de referencia para POST /v1/send-invoice. Para el tutorial paso a paso con curl, usa el Inicio rápido. Esquema completo e interactivo: Referencia API — POST /send-invoice.

Cabeceras

Cabecera Obligatoria Qué es
Content-Type application/json
x-api-key o Authorization: Bearer … Tu API key (vf_…). Ver Autenticación.
x-idempotency-key UUID (u otro string ≤ 128 chars) que generas tú una vez por factura. Reutilízalo solo al reintentar el mismo body tras un fallo de red.

¿Qué valor en x-idempotency-key? Un UUID nuevo por cada factura lógica. Ejemplo: 550e8400-e29b-41d4-a716-446655440000. Más detalle en Autenticación → Idempotencia.

Flujo async

  1. POST /send-invoice202 con { jobId, status: "PENDING" }.
  2. GET /jobs/:jobId hasta SUCCEEDED o DEAD (FAILED = reintento en curso; no dejes de hacer poll).

Emisor e identificación de la factura

Campo Obligatorio Descripción
nif NIF/NIE del obligado a emitir (emisor).
nombre Nombre o razón social del emisor.
numSerie Número de serie de la factura (único en la serie). La “serie” de encadenamiento es el prefijo antes de /, - o _.
fecha Fecha de expedición DD-MM-YYYY.
tipoFactura Código AEAT F1F5 o R1R5. Ver Tipos de factura.
descripcion Descripción de la operación (1–500 caracteres).
fechaOperacion No DD-MM-YYYY. No puede ser posterior a fecha salvo claves de régimen 14/15 (AEAT 1146).
refExterna No Referencia libre del ERP (máx. 60). Omitir si no usas referencia propia.
sistemaInformatico No* Omitir. Simple*Factu rellena el SIF. Solo obligatorio con clientSifEnabled (modo excepcional).

*En el camino feliz no envíes este objeto.

Tipos de factura (tipoFactura)

Códigos del campo TipoFactura según AEAT (RD 1619/2012 y art. 80 LIVA). El valor habitual en integraciones nuevas es F1.

Altas (F*)

Código Significado
F1 Factura ordinaria (factura completa / con identificación del destinatario; arts. 6, 7.2 y 7.3 del RD 1619/2012). Incluye también las simplificadas cualificadas que identifican al destinatario.
F2 Factura simplificada y facturas sin identificación del destinatario (art. 6.1.d RD 1619/2012). No envíes destNif / destNombre / destIdOtro (AEAT 1190). Límite de importe €3000.
F3 Sustitución de facturas simplificadas ya facturadas y declaradas.
F4 Asiento resumen de facturas (agrupación de varias simplificadas / tickets).
F5 Caso menos habitual (la API lo admite si aplica a tu operación; consulta la FAQ / XSD AEAT vigentes).

Rectificativas (R*)

Código Significado
R1 Rectificativa por error fundado en derecho o causas del art. 80.Uno, Dos y Seis LIVA (devoluciones, descuentos posteriores, resolución de operaciones, etc.).
R2 Rectificativa por concurso de acreedores (art. 80.Tres LIVA).
R3 Rectificativa por crédito incobrable (art. 80.Cuatro LIVA).
R4 Rectificativa por otros motivos (resto de causas distintas de R1–R3).
R5 Rectificativa de factura simplificada (cualquier motivo sobre una F2 / sin identificación del destinatario).

Cuando uses R1R5 debes enviar también tipoRectificativa y el resto de campos de Rectificativas.

Fuente AEAT: FAQ Veri*Factu — Procedimientos de facturación.

Destinatario

Campo Obligatorio Descripción
destNombre Casi siempre Nombre o razón social del cliente.
destNif XOR con destIdOtro NIF español del destinatario.
destIdOtro XOR con destNif Identificador no NIF (codigoPais, idType, id).

Excepción F2: factura simplificada sin identificación de destinatario — no envíes destNif / destNombre / destIdOtro (AEAT 1190). Hay límite de importe (€3000).

Importes

Campo Obligatorio Descripción
cuotaTotal Suma de cuotas repercutidas del desglose.
total Importe total de la factura (base + IVA, según tu caso).

Desglose (detalles)

Array de 1–12 líneas. Cada línea debe indicar el tipo de operación fiscal; no basta con enviar solo base.

Campos obligatorios por caso

Caso Qué enviar (obligatorio) No enviar
IVA sujeta (habitual) base, clave, calif: "S1", tipo, cuota
Exenta base, clave, causaExencion (E1E6) tipo, cuota, recargo
No sujeta base, clave, calif: "N1" o "N2" tipo, cuota, recargo
Inversión SP base, clave, calif: "S2", tipo: 0, cuota: 0 recargo

En la Referencia API, el desplegable de cada línea de detalles muestra estos cuatro esquemas con los campos marcados como required.

Detalle de campos

Campo Notas
base Siempre obligatorio.
clave Clave de régimen (2 dígitos). Obligatoria si impuesto se omite, es 01 (IVA) o 03 (IGIC). Opcional para IPSI (02) / Otros (05).
calif o causaExencion Uno de los dos (XOR; AEAT 1195/1196). No ambos; no ninguno.
calif S1 / S2 / N1 / N2.
causaExencion E1E6 — operación exenta; no enviar tipo / cuota / recargo (1238).
tipo / cuota Con calif=S1 (sin baseImponibleACoste): obligatorios (1208). Con S2: deben ser 0 (1198). Con N1/N2: omitir (1237).
impuesto Opcional; default IVA (01).
Recargo Solo con calif=S1; tipoRecargoEquivalencia y cuotaRecargoEquivalencia juntos (1281/1284).
baseImponibleACoste Solo con clave=06 o impuesto 02/05 (1257).

Ejemplos

IVA al 21 % (caso habitual):

{ "clave": "01", "calif": "S1", "tipo": 21, "base": 100, "cuota": 21 }

Anticipo F2 con IVA (como el de vuestro integrador):

{ "clave": "01", "calif": "S1", "tipo": 21, "base": 0.83, "cuota": 0.1735 }

Exenta / no sujeta:

{ "clave": "01", "causaExencion": "E1", "base": 200 }
{ "clave": "01", "calif": "N1", "base": 1000 }

Sistema informático (sistemaInformatico)

No lo envíes en el caso normal. Simple*Factu es el SIF: la API rellena el bloque ante AEAT con la identidad de plataforma. Tu certificado y el nif emisor siguen siendo los del obligado tributario.

*Si envías el objeto sin tener el modo cliente activo, la API lo ignora (salvo numeroInstalacion si lo traes) y sigue usando el SIF de plataforma.

Solo aplica si soporte o un operador activa en tu tenant el modo SIF del cliente (clientSifEnabled): entonces sí debes enviar el objeto completo (tu software es el fabricante y necesitas declaración responsable propia):

Campo Notas
nombreRazon Fabricante / titular del SIF.
nif u idOtro Excluyentes; uno de los dos.
nombreSistemaInformatico Nombre comercial (máx. 30).
idSistemaInformatico Exactamente 2 caracteres [A-Z0-9] (p. ej. "01"). Forma la clave de instalación {NIF}|{idSistema}|{NIF fabricante}. Si cambia, nuevo numeroInstalacion y cadena distinta.
version Versión del software.
numeroInstalacion Opcional; si lo omites, el servidor lo genera.
tipoUsoPosibleSoloVerifactu Capacidad del producto: S = solo Veri*Factu; N = admite otros modos.
tipoUsoPosibleMultiOT Capacidad multi–obligado tributario (OT): S = admite varios OT; N = un solo OT.
indicadorMultiplesOT Uso de esta instalación: S = factura para varios OT; N = solo uno.

Huella y encadenamiento

Campo Obligatorio Comportamiento
huella + tipoHuella + fechaHoraHusoGenRegistro No* Si omites los tres, el servidor los genera. Si envías uno, envía los tres (si no → 400).
primerRegistro No Si se omite, se infiere desde chain_registry.
encadenamiento.registroAnterior No Si hace falta y se omite, el servidor usa la última huella de la cadena.

*Recomendado omitirlos en integraciones nuevas (camino feliz del Inicio rápido).

Conceptos: Huella, Encadenamiento, Primer registro.

Campos avanzados (opt-in)

Omitir en el caso normal. Solo cuando aplica:

Campo Cuándo
cupon Solo facturas con cupones promocionales (S/N).
emitidaPorTerceroODestinatario T = tercero (requiere bloque tercero); D = autofactura (sin tercero).
tercero Solo si el flag es T.
macrodato Solo importes ≥ ±100M €.
fechaFinVeriFactu Solo al salir del régimen Veri*Factu (31-12-YYYY).
subsanacion / rechazoPrevio Solo reenvíos / rechazos previos AEAT.

Rectificativas (R1R5)

Cuando tipoFactura es R1R5:

Campo Regla
tipoRectificativa Obligatorio: S (sustitución) o I (por diferencias). Prohibido fuera de R1–R5.
facturasRectificadas Factura(s) que se rectifican (idEmisorFactura, numSerieFactura, fechaExpedicionFactura).
importeRectificacion Obligatorio si tipoRectificativa=S (importes originales). Prohibido si I.
  • S: el Desglose lleva la diferencia; importeRectificacion con base/cuota originales.
  • I: el Desglose lleva los importes corregidos totales; no envíes importeRectificacion.

Detalle de reglas AEAT: Referencia API — POST /send-invoice.

Respuesta 202

{
  "success": true,
  "jobId": "3e033807-17a0-4e1e-b1ba-7711d690fb3f",
  "status": "PENDING"
}

Luego consulta GET /jobs/:jobId. Errores frecuentes: Códigos de error.