Introducción
Emite tu primer registro de facturación en el entorno TEST en menos de diez minutos.
VeriBai es una API REST para el cumplimiento de VeriFactu y TicketBAI. Tu software envía los datos de la factura en JSON; VeriBai valida, firma, encadena y remite el registro a la administración que corresponda, y devuelve el código QR listo para incrustar.
Esta página te lleva de cero a tu primer registro en el entorno TEST.
1. Crea tu cuenta
Regístrate en app.veribai.com/registro. La cuenta incluye acceso completo al entorno TEST, sin coste.
2. Obtén tu clave API
Desde el panel, en Claves API, genera una clave para el entorno TEST. Las claves se envían en la cabecera x-api-key de cada petición. Más detalle en Autenticación.
3. Emite tu primera factura
Una petición POST con los datos mínimos es suficiente:
curl -X POST https://sandbox.veribai.com/v1/verifactu/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"cabecera": {
"serie": "A",
"numero": "12345",
"fechaExpedicion": "03-04-2026",
"tipoFactura": "F1",
"descripcion": "Descripcion de la factura"
},
"emisor": {
"nif": "B76116342",
"nombre": "Prueba 1 SL"
},
"destinatario": {
"nif": "B17195595",
"nombre": "Nombre cliente, SL"
},
"detalleDesglose": [
{
"impuesto": "01",
"claveRegimen": "01",
"calificacionOperacion": "S1",
"baseImponible": "100.00",
"tipoImpositivo": "21.00",
"cuotaRepercutida": "21.00"
}
],
"totales": {
"cuotaTotal": "21.00",
"importeTotal": "121.00"
}
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.verifactu.crear({
"version": "1.0",
"cabecera": {
"serie": "A",
"numero": "12345",
"fechaExpedicion": date(2026, 4, 3),
"tipoFactura": "F1",
"descripcion": "Descripcion de la factura",
},
"emisor": {
"nif": "B76116342",
"nombre": "Prueba 1 SL",
},
"destinatario": {
"nif": "B17195595",
"nombre": "Nombre cliente, SL",
},
"detalleDesglose": [
{
"impuesto": "01",
"claveRegimen": "01",
"calificacionOperacion": "S1",
"baseImponible": Decimal("100.00"),
"tipoImpositivo": Decimal("21.00"),
"cuotaRepercutida": Decimal("21.00"),
},
],
"totales": {
"cuotaTotal": Decimal("21.00"),
"importeTotal": Decimal("121.00"),
},
})
print(respuesta["idFactura"], respuesta["estado"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/verifactu/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"cabecera": {
"serie": "A",
"numero": "12345",
"fechaExpedicion": "03-04-2026",
"tipoFactura": "F1",
"descripcion": "Descripcion de la factura"
},
"emisor": {
"nif": "B76116342",
"nombre": "Prueba 1 SL"
},
"destinatario": {
"nif": "B17195595",
"nombre": "Nombre cliente, SL"
},
"detalleDesglose": [
{
"impuesto": "01",
"claveRegimen": "01",
"calificacionOperacion": "S1",
"baseImponible": "100.00",
"tipoImpositivo": "21.00",
"cuotaRepercutida": "21.00"
}
],
"totales": {
"cuotaTotal": "21.00",
"importeTotal": "121.00"
}
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
La pestaña de Python usa el cliente oficial:
pip install veribai
Acepta Decimal y date tal cual y los convierte al formato del cable, que es justo donde se cuelan los errores de un céntimo. El float lo rechaza de plano. Los entornos, los reintentos y el resto del paquete, en Cliente de Python.
Las pestañas de cURL y JavaScript muestran el HTTP en crudo, que es el contrato.
La respuesta llega en el momento, con el QR generado:
{
"estado": "pendiente_proceso",
"serieNumero": "A12345",
"tipoFactura": "F1",
"importeTotal": "121.00",
"urlValidacion": "https://…",
"qrBase64": "iVBORw0KG…"
}
El envío a Hacienda es asíncrono: la petición valida, firma y encola el registro, y la remisión se completa en segundo plano. Consulta el estado final con
GET /v1/facturas/{idFactura}/estado.
4. Siguientes pasos
- Autenticación: claves API y entornos.
- Crear factura (VeriFactu): el contrato completo, campo a campo.
- Crear factura (TicketBAI): la variante foral, con
provincia. - ¿VeriFactu o TicketBAI?: qué sistema aplica a cada emisor.
- Endpoints: el mapa completo de la API, con la referencia de cada endpoint.