Código QR VeriFactu: especificación oficial y cómo implementarlo
Especificación técnica completa del QR obligatorio en cada factura desde 2027. ISO/IEC 18004 nivel M, dimensiones 30-40 mm, URL HTTPS a sede AEAT con 4 parámetros. Endpoint, formato, posición, validación móvil y librerías open source.
El código QR de VeriFactu está regulado por el Capítulo VIII de la Orden HAC/1177/2024 (BOE 28 de octubre de 2024), que desarrolla técnicamente el artículo 7 del RD 1007/2023. No contiene datos cifrados: es una URL HTTPS apuntando a la sede de la AEAT con cuatro parámetros (NIF, número de serie, fecha e importe). Codificación ISO/IEC 18004 nivel M, dimensiones 30 × 30 mm a 40 × 40 mm, posición al inicio de la factura, obligatorio en todas las facturas emitidas por un SIF desde 2027.
Qué contiene exactamente el QR
El QR codifica una URL HTTPS con la estructura:
Los cuatro parámetros obligatorios:
- nif — NIF del emisor de la factura.
- numserie — Número y serie de factura (puede contener barras y caracteres alfanuméricos).
- fecha — Fecha de expedición en formato dd-mm-yyyy.
- importe — Importe total con punto decimal. Hasta 12 enteros + 2 decimales.
Para entorno de pruebas (preproducción AEAT), el endpoint cambia a:
Fuentes: AEAT — Características QR, Orden HAC/1177/2024.
Especificaciones físicas en la factura
| Atributo | Valor |
|---|---|
| Estándar | ISO/IEC 18004 |
| Nivel de corrección de errores | M (Medium, ~15 %) |
| Tamaño impreso | 30 × 30 mm a 40 × 40 mm |
| Margen blanco mínimo (quiet zone) | 2 mm cada lado |
| Margen recomendado | 6 mm cada lado |
| Posición en factura vertical | Arriba, centrado o superior izquierdo |
| Posición en factura horizontal | Izquierda |
| Posición en facturas multipágina | Sólo en la primera página |
| Endpoint producción | www2.agenciatributaria.es/wlpl/TIKE-CONT/ValidarQR |
| Endpoint preproducción | prewww2.aeat.es/wlpl/TIKE-CONT/ValidarQR |
Implementaciones verificadas en GitHub
Para el QR raw (sólo generar el código a partir de la URL):
- Multi-lenguaje: nayuki/QR-Code-generator (Python, JavaScript, Java, C++, Rust).
- Python:
qrcodeen PyPI con backend Pillow. - JavaScript:
qrcodeen npm,kjur/jsqrcode.
Para el ciclo completo VeriFactu (registros + envío AEAT + QR):
- .NET / C#: mdiago/VeriFactu (paquete NuGet).
- PHP: jdgOpenCode/verifactu, eseperio/verifactu-php.
- Ruby: mybooking-es/verifactu-rb.
- Esquemas XSD oficiales: hectorsipe/aeat-verifactu.
- Wiki comunitaria: verifactu-aeat.github.io.
— FAQ
Preguntas frecuentes sobre el código QR de VeriFactu
Estructura, formato, dimensiones, validación y errores comunes al implementar.
Ver todas las preguntas¿Qué contiene el código QR de VeriFactu?+−
¿Qué tamaño debe tener el QR en la factura?+−
¿Dónde se coloca el QR en la factura?+−
¿Es opcional el QR?+−
¿Cómo se valida desde un móvil?+−
¿Necesito librerías específicas AEAT para generar el QR?+−
¿Es lo mismo que el QR de TicketBAI?+−
¿Qué pasa si el QR genera errores al imprimir?+−
Profundiza en VeriFactu técnico
¿Necesitas implementar el QR en tu software?
Si fabricas software o has heredado un sistema sin QR conforme, podemos ayudarte a desarrollarlo, certificar la declaración responsable y conectarlo al entorno de pruebas AEAT antes de pasar a producción.