VeriFactu en Node.js
El ejemplo completo de registrar una factura y reaccionar al resultado, con fetch nativo, Node 18+.
¿Cómo se integra VeriFactu en Node.js?
Con una petición HTTP POST a /v1/registros enviando los datos de la factura en JSON y la clave de API en la cabecera Authorization. La respuesta trae la huella y la URL del QR para imprimir.
Lo único que hay que cuidar en cualquier lenguaje es usar tipos decimales exactos para los importes, enviar una cabecera Idempotency-Key y no bloquear la impresión de la factura esperando la respuesta de la AEAT.
Sin dependencias: fetch está en el runtime desde Node 18. El AbortSignal.timeout importa más de lo que parece — una petición sin timeout en un proceso de facturación puede colgar la emisión entera.
// Node 18+: fetch nativo, sin dependencias. const BASE = 'https://api.verifactu.co/v1'; async function registrar(factura) { const r = await fetch(`${BASE}/registros`, { method: 'POST', headers: { Authorization: `Bearer ${process.env.VERIFACTU_KEY}`, 'Content-Type': 'application/json', 'Idempotency-Key': factura.numero, }, body: JSON.stringify(factura), signal: AbortSignal.timeout(15_000), }); const datos = await r.json(); if (!r.ok) { const { codigo, titulo, quien } = datos.error; throw new Error(`${codigo}: ${titulo} (lo corrige: ${quien})`); } return datos; } const reg = await registrar({ emisor: { nif: 'B12345678' }, numero: 'F2026/0184', fecha: '2026-08-26', tipo: 'F1', base: 100.0, cuota: 7.0, total: 107.0, impuesto: 'IGIC', }); console.log(reg.huella, reg.qr);
Idempotency-Key siempre
Usa el número de factura. Un reintento tuyo sin esa cabecera crea un segundo registro con su propia huella, y en una cadena encadenada eso no se deshace.
Decimales exactos, no coma flotante
decimal, BigDecimal o enteros de céntimos. Un double produce importes que no cuadran con la huella y el registro queda «aceptado con errores».
Timeout en la petición
Una llamada sin timeout dentro del flujo de emisión puede colgar la factura del usuario. Quince segundos sobran.
Imprime con el 201, no esperes a la AEAT
La huella y el QR ya vienen en la respuesta y no cambian con el resultado de la remisión. Bloquear la impresión es un error de diseño.
Última revisión normativa: Especificaciones de huella AEAT v0.1.2 Revisado por el equipo técnico de verifactu.co