El XML que se remite a la AEAT
Cabecera, registro de alta, encadenamiento y sistema informático. Y los cuatro puntos donde el XML deja de cuadrar con la huella que declaraste.
¿Qué estructura tiene el XML de VeriFactu?
Un mensaje con una Cabecera —que identifica al obligado a expedir y, si lo hay, al representante— y uno o más RegistroFactura, cada uno con los datos de la factura, el encadenamiento con la huella anterior, el sistema informático y la huella del registro.
El punto crítico es que los importes y la fecha del XML deben escribirse con el mismo formato que se usó al calcular la huella: la AEAT recalcula la huella a partir del XML y compara.
El registro viaja dentro de un mensaje SOAP con dos partes: una cabecera que dice de quién es la factura y quién la presenta, y uno o varios registros con los datos y la huella.
<sfLR:RegFactuSistemaFacturacion>
<sfLR:Cabecera>
<sf:ObligadoEmision>
<sf:NombreRazon>ESTILISMO MARTA SL</sf:NombreRazon>
<sf:NIF>B12345678</sf:NIF>
</sf:ObligadoEmision>
<!-- Solo si remites en representación -->
<sf:Representante>
<sf:NombreRazon>KRAAKVC OU</sf:NombreRazon>
<sf:NIF>B99999999</sf:NIF>
</sf:Representante>
</sfLR:Cabecera>
<sfLR:RegistroFactura>
<sf:RegistroAlta>
<sf:IDVersion>1.0</sf:IDVersion>
<sf:IDFactura>
<sf:IDEmisorFactura>B12345678</sf:IDEmisorFactura>
<sf:NumSerieFactura>F2026/0184</sf:NumSerieFactura>
<sf:FechaExpedicionFactura>26-08-2026</sf:FechaExpedicionFactura>
</sf:IDFactura>
<sf:TipoFactura>F1</sf:TipoFactura>
<sf:CuotaTotal>7.00</sf:CuotaTotal>
<sf:ImporteTotal>107.00</sf:ImporteTotal>
<sf:Encadenamiento>
<sf:RegistroAnterior>
<sf:Huella>A91C...E4</sf:Huella>
</sf:RegistroAnterior>
</sf:Encadenamiento>
<sf:SistemaInformatico>
<sf:IdSistemaInformatico>K1</sf:IdSistemaInformatico>
</sf:SistemaInformatico>
<sf:FechaHoraHusoGenRegistro>2026-08-26T10:15:00+02:00</sf:FechaHoraHusoGenRegistro>
<sf:TipoHuella>01</sf:TipoHuella>
<sf:Huella>3C464DAF...F60</sf:Huella>
</sf:RegistroAlta>
</sfLR:RegistroFactura>
</sfLR:RegFactuSistemaFacturacion>Los importes con distinto formato que la huella
El XML escribe 107.00. Si tu huella se calculó sobre 107, la AEAT recalcula desde el XML, no le cuadra y marca el registro como «aceptado con errores». Es el fallo que más tarda en detectarse porque no bloquea nada.
La marca de tiempo regenerada
FechaHoraHusoGenRegistro tiene que ser el mismo instante que entró en la huella. Si se genera de nuevo al montar el XML, aunque sea dos segundos después, la huella ya no se puede reproducir.
El bloque Representante cuando no toca
Va solo si remites en nombre de otro. Incluirlo remitiendo en nombre propio, o omitirlo remitiendo en representación, produce rechazo.
La fecha en ISO dentro del XML
FechaExpedicionFactura va en dd-mm-aaaa, igual que en la huella. Mezclarla con el ISO de la marca de tiempo es un despiste habitual.
GET /v1/registros/{id}/xml, y la cadena literal que se sometió a SHA-256 en /cadena. Son las dos cosas que hay que poder mirar cuando la AEAT dice que algo no cuadra.¿Tengo que generar yo el XML?
No si integras por API: envías JSON y el motor monta el XML contra los esquemas oficiales. Puedes recuperar el XML remitido para auditoría en cualquier momento.
¿Qué versión de los esquemas se usa?
La publicada en la Orden HAC/1177/2024 y sus actualizaciones técnicas. Cualquier cambio de versión queda anotado en el changelog con su fecha.
¿El XML lleva firma electrónica?
En modalidad VERI*FACTU no se firma cada registro: el envío viaja por un canal autenticado con certificado electrónico. La firma electrónica de los registros es un requisito de los sistemas NO VERI*FACTU.
¿Se pueden mandar varios registros en un envío?
Sí, el mensaje admite varios RegistroFactura. Pero la cadena de huellas es por emisor y secuencial, así que el orden dentro del lote importa.
Última revisión normativa: Especificaciones de huella AEAT v0.1.2 Revisado por el equipo técnico de verifactu.co