Código QR de VeriFactu: URL, parámetros, tamaño y texto obligatorio
El QR de una factura VeriFactu no contiene la factura ni la huella. Contiene una dirección web de la AEAT con cuatro datos de la factura, para que el cliente pueda cotejarla en la sede electrónica.
1. La URL de cotejo
La dirección depende de la modalidad del sistema de facturación y del entorno:
| Modalidad | Entorno | URL base |
|---|---|---|
| VERI*FACTU | Producción | https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQR |
| No VERI*FACTU | Producción | https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQRNoVerifactu |
| VERI*FACTU | Pruebas | https://prewww2.aeat.es/wlpl/TIKE-CONT/ValidarQR |
| No VERI*FACTU | Pruebas | https://prewww2.aeat.es/wlpl/TIKE-CONT/ValidarQRNoVerifactu |
En una factura real se usa siempre la de producción. La de pruebas sirve mientras desarrollas contra el entorno de pruebas de la AEAT.
2. Los 4 parámetros y su formato
| Parámetro | Contenido | Formato |
|---|---|---|
nif | NIF del emisor de la factura | 9 caracteres, p. ej. 89890001K |
numserie | Serie y número de la factura | Tal cual, codificado para URL |
fecha | Fecha de expedición | DD-MM-AAAA |
importe | Importe total de la factura | Punto decimal y dos decimales, p. ej. 123.45 |
Los valores se escriben en UTF-8 y se codifican para URL (percent-encoding). En la práctica, lo que más se nota es la serie: la barra de 12345678/G33 pasa a ser %2F, y los espacios, %20.
En la huella la serie va sin codificar (12345678/G33). En el QR va codificada (12345678%2FG33). Son dos usos distintos del mismo dato.
3. Un ejemplo completo
Para una factura del NIF 89890001K, número 12345678/G33, expedida el 1 de enero de 2024 por 123,45 €:
https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQR?nif=89890001K&numserie=12345678%2FG33&fecha=01-01-2024&importe=123.45
En JavaScript, con encodeURIComponent (codifica los espacios como %20; URLSearchParams los convertiría en +):
const base = 'https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQR';
const params = {
nif: '89890001K',
numserie: '12345678/G33',
fecha: '01-01-2024',
importe: (123.45).toFixed(2),
};
const query = Object.entries(params)
.map(([k, v]) => `${k}=${encodeURIComponent(v)}`)
.join('&');
const urlQR = `${base}?${query}`;
En PHP, http_build_query($params, '', '&', PHP_QUERY_RFC3986). En Python, urllib.parse.urlencode(params, quote_via=urllib.parse.quote).
Con esa URL, cualquier librería de QR genera la imagen. El validador te muestra la URL y el QR de cualquier registro.
4. Tamaño, corrección de errores y texto
- Tamaño: entre 30×30 mm y 40×40 mm.
- Norma: ISO/IEC 18004, con nivel de corrección de errores M.
- Encima del código: el texto «QR tributario», para distinguirlo de otros QR que tenga la factura.
- En los sistemas VERI*FACTU: la frase «Factura verificable en la sede electrónica de la AEAT» o su forma corta «VERI*FACTU», con un tamaño de letra claramente visible.
El QR debe figurar en las facturas que expide el sistema, incluidas las simplificadas (tiques).
5. Errores frecuentes
- Meter la huella en el QR. No forma parte de la URL.
- Fecha en formato AAAA-MM-DD. El parámetro
fechaesDD-MM-AAAA. - Importe con coma o sin decimales (
123,45o123). Debe ser123.45o123.00. - No codificar la serie. Una serie con
/,&,#o espacios rompe la URL si no se codifica. - Usar la URL de pruebas en producción, o la de VERI*FACTU en un sistema que no remite los registros.
- Imprimirlo demasiado pequeño en un tique térmico. Por debajo de 30 mm incumple la norma y puede no leerse.
Genera la URL y el QR de tu factura
Introduce los datos en el validador y obtendrás la URL de cotejo, el QR y la huella, con los errores de formato marcados. Todo se calcula en tu navegador.