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 F1F5 o R1R5.
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.

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.