InicioTraazzaGuías › Integrar Verifactu en Python

Guía técnica

Cómo integrar Verifactu en Python paso a paso

Verifactu exige que tu software genere, por cada factura, una huella encadenada, un QR tributario y un registro en XML, y que pueda remitirlo a la AEAT. Aquí ves cómo hacerlo en Python con la librería open source Traazza.

Guía técnica · Python · Traazza

1. Instala la librería

El núcleo no tiene dependencias; los extras (imagen del QR, envío, firma) se instalan aparte.

terminal
# núcleo
pip install traazza
# con extras opcionales
pip install "traazza[qr]"     # imagen del QR
pip install "traazza[envio]"  # envío a la AEAT (mTLS)

2. Genera la huella, el QR y el XML

Creas una cadena y das de alta la factura. Cada registro incorpora automáticamente la huella del anterior.

python
from traazza.modelos import Emisor, Cadena, SistemaInformatico, LineaDesglose
from traazza import qr, xml

emisor = Emisor("89890001K", "EMPRESA EJEMPLO SL")
sistema = SistemaInformatico("EMPRESA EJEMPLO SL", "89890001K",
    "MiFacturador", "01", "1.0.0", "INST-001")

cadena = Cadena(emisor)
factura = cadena.alta(
    num_serie="2026/A-1", fecha_expedicion="01-01-2026",
    tipo_factura="F1", cuota_total="21.00", importe_total="121.00",
    descripcion_operacion="Venta",
    desglose=[LineaDesglose("100.00", "21.00", "21.00")])

print(factura.huella)                 # huella SHA-256 encadenada
print(qr.url_desde_registro(factura)) # URL del QR tributario
print(xml.registro_alta_xml(factura, sistema))  # XML del registro

3. Valida contra el XSD oficial

Traazza incluye los esquemas oficiales de la AEAT, así que puedes validar el XML sin buscarlos.

python
from traazza import validacion
esquema = validacion.esquema_registros()
validacion.validar_alta(factura, sistema, esquema)  # True o lanza con el detalle

4. Envía a la AEAT (modalidad Verifactu)

El envío usa tu certificado electrónico por mTLS. En modalidad Verifactu, la remisión con certificado cualificado cuenta como firma básica: no hace falta firmar los registros.

python
from traazza.cliente import Cliente, Entorno
cli = Cliente(entorno=Entorno.PRUEBAS, cert=("cert.pem", "clave.pem"))
resp = cli.enviar(emisor, [factura], sistema)
print(resp.estado_envio, resp.csv)  # "Correcto" + CSV = aceptado

Cuando envíes de verdad te encontrarás con los errores de validación de la AEAT. Los más comunes, explicados: base de errores de Verifactu.

Consejos que evitan dolores

  • Fecha de generación: debe ser la actual, sin microsegundos y con huso (errores 2004 y 1244).
  • Encadenamiento: persiste la huella del último registro entre ejecuciones o verás el error 2007.
  • Nombre del emisor: tal cual consta en el censo de la AEAT (error 4104).
Edu García
Edu García Desarrollador Full Stack en Sevilla y autor de Traazza, la librería open source de Verifactu en Python. Lo que escribo aquí sale de integrar Verifactu de verdad contra los sistemas de la AEAT, con sus errores reales incluidos. edugarciadev.com · GitHub