Guía Rápida

Integra VERI*FACTU en tu software de facturación en 5 minutos

Tu software solo necesita enviar un JSON con los datos de la factura. Nosotros calculamos la huella SHA-256, generamos el QR, formateamos el XML y lo enviamos a la AEAT.
1

Crea tu cuenta de desarrollador

Regístrate en nuestro Panel de Control. Una vez dentro, ve a la sección Configuración para obtener tu API Key de Pruebas.

2

Configura la autenticación

Usa tu API de Pruebas como Bearer token en todas las llamadas a los endpoints de la API.

http Authorization: Bearer vf_test_a1b2c3d4e5f6g7h8...
3

Envía tu factura con tu certificado

Envía los datos de la factura junto con tu certificado P12/PFX en Base64. Nuestra API lo usa para firmar y remitir a la AEAT, descartándolo inmediatamente después.

json POST /v1/verifactu/create { "id_transaccion": "MI-FACTURA-001", "certificado_base64": "MIIKogIBAzCCCmAGCSqGSIb3...", "password_certificado": "mi_password_secreta", "desglose": [ { "total": 121.00 } ] }
4

Recibe el resultado completo

La API devuelve la factura con desglose calculado, huella SHA-256, QR y estado de envío a AEAT.

json { "factura": { "tipo": "F2", "serie": "S", "numero": 1, "importe_total": 121.00, "huella": "6E3D2B4B6528...", "qr": "https://prewww2.aeat.es/wlpl/TIKE-CONT/ValidarQR?...", "estado": "Grabada" }, "desglose": [ { "base": 100.00, "tipo_iva": 21, "cuota_iva": 21.00 } ] }
5

Imprime el QR en la factura

Incluye el código QR devuelto en el documento de la factura. Es obligatorio por la normativa VERI*FACTU.

El QR debe ser legible y contener: NIF emisor, nº serie, fecha expedición e importe total. La URL apunta a la sede electrónica de la AEAT.

Resultado esperado en la Sede Electrónica de la AEAT

Al escanear el QR de la factura en el entorno de preproducción de la AEAT e identificarte con el mismo certificado digital usado en el envío, deberías ver una pantalla como esta, que confirma que la factura ha sido recibida y contrastada correctamente por Hacienda:

Captura de la Sede Electrónica de la AEAT en preproducción mostrando la factura como Encontrada
Si ves este resultado, tu integración con VERI*FACTU está funcionando correctamente. La AEAT ha recibido y contrastado la factura de forma satisfactoria.

¿Cómo implemento un script de prueba?

Copia este código en un archivo llamado prueba_verifactu.py para realizar tu primer envío real a la AEAT desde tu terminal en segundos.

python # en caso de no tener estos import, ejecutar: pip install requests import requests import time import base64 import os # --- CONSEJOS PREVIOS --- # 1. Este script simula ser un software de facturación de un tercero. # 2. Necesitas tu API Key de Sandbox (Pruebas) de tu panel. # 3. Necesitas un certificado '.p12' válido por parte de la AEAT o FNMT. # 4. Pon el archivo '.p12' con la ruta correcta. # --- CONFIGURACIÓN DEL AGENTE EXTERNO --- API_KEY = "vf_test_xxxx" # api_key de prueba en "Panel" -> "Configuración" URL_BASE = "https://verifactusi.com/v1/verifactu" #localización de tu certificado CERT_PATH = r"C:\Users\{Usuario}\Documents\xxxx.p12" CERT_PASSWORD = "contraseña" # contraseña del certificado HEADERS = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" } # --- LECTURA DEL CERTIFICADO --- print("0. Cargando y codificando el certificado...") try: with open(CERT_PATH, "rb") as f: cert_data = f.read() cert_base64 = base64.b64encode(cert_data).decode('utf-8') except FileNotFoundError: print(f"❌ Error: No se encuentra el archivo en {CERT_PATH}") exit() # --- 1. EMISIÓN DE FACTURA DE PRUEBA --- print("\n1. Generando nueva factura en VERI*FACTU SIF...") numero_factura = str(int(time.time())) fecha_hoy = time.strftime("%d-%m-%Y") payload_factura = { "operacion": "alta_factura", "serie": "EXTERNA", "numero": numero_factura, "fecha_expedicion": fecha_hoy, "tipo_factura": "F1", "descripcion": "Venta de Software a cliente Random", "destinatario": { "nif": "B12345674", "nombre": "Cliente Random SL" }, "desglose": [{ "base": 1000.00, "tipo_iva": 21 }], "certificado_base64": cert_base64, "password_certificado": CERT_PASSWORD } alta_response = requests.post(f"{URL_BASE}/create", headers=HEADERS, json=payload_factura) if alta_response.status_code == 200: alta_json = alta_response.json() print("✅ FACTURA ACEPTADA POR LA AEAT!") print(f" Estado: {alta_json['factura']['estado']}") print(f" QR AEAT: {alta_json['factura']['qr']}") else: print(f"❌ Error HTTP {alta_response.status_code}: {alta_response.text}") exit() # --- 2. ESPERA Y VERIFICACIÓN --- input("\nComprueba el enlace anterior. Pulsa ENTER para anular la factura...") # --- 3. ANULACIÓN DE FACTURA --- print("\n3. Anulando la factura enviada...") payload_anular = { "serie": "EXTERNA", "numero": numero_factura, "fecha_expedicion": fecha_hoy, "certificado_base64": cert_base64, "password_certificado": CERT_PASSWORD } anula_response = requests.post(f"{URL_BASE}/cancel", headers=HEADERS, json=payload_anular) if anula_response.status_code == 200: print("✅ FACTURA ANULADA CORRECTAMENTE EN LA AEAT!") else: print(f"❌ Error al anular: {anula_response.text}")

¿Qué hace la API por ti?

Requisito RD 1007/2023 ¿Automático?
Huella SHA-256 + encadenamiento
Generación de QR estandarizado
Formato XML para AEAT
Envío SOAP a AEAT Sí (modo VERI*FACTU)
Cálculo IVA desde total
Numeración correlativa
Idempotencia Sí (via id_transaccion)
Firma sin necesidad de poner tu certificado No, necesitas poner tu certificado