Ejemplos (TicketBAI)
Un cuerpo de petición completo por cada tipo de factura TicketBAI. Cada uno se ha enviado a Sandbox y ha devuelto 200.
Cada ejemplo es un cuerpo completo para POST /v1/ticketbai/crear, salvo la subsanación y la anulación, que usan su propio endpoint. Copia el ejemplo que corresponda a la operación y sustituye emisor, destinatario, provincia, serie, número y fecha por los tuyos.
Los ejemplos usan provincia: "bizkaia". provincia debe coincidir con la hacienda del emisor. Todos los cuerpos llevan lineas y descripcion en cada línea del desglose: Araba exige lo primero y Gipuzkoa lo segundo, y en las tres provincias se aceptan. Donde una provincia aplica una regla distinta, el caso lo indica.
Todos los cuerpos de esta página se han enviado a Sandbox con la fecha updated de la cabecera y han devuelto 200. Los NIF y los importes son ficticios.
Las reglas de cada campo están en la referencia de TicketBAI. La versión VeriFactu de estos mismos casos está en Ejemplos (VeriFactu).
Factura completa (F1)
Una factura con destinatario identificado y una línea al 21 %. desglose es el resumen fiscal; lineas, los conceptos de la factura. importeTotal va en el nivel superior, con IVA.
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12345",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Servicios de consultoría",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"desglose": [
{
"descripcion": "Consultoría",
"baseImponible": "1000.00",
"tipoImpositivo": "21.00",
"cuota": "210.00"
}
],
"lineas": [
{
"descripcion": "Consultoría",
"cantidad": "1",
"importeUnitario": "1000.00",
"importeTotal": "1210.00"
}
],
"importeTotal": "1210.00"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12345",
"fechaExpedicion": date(2026, 9, 15),
"tipoFactura": "F1",
"descripcion": "Servicios de consultoría",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001",
},
"desglose": [
{
"descripcion": "Consultoría",
"baseImponible": Decimal("1000.00"),
"tipoImpositivo": Decimal("21.00"),
"cuota": Decimal("210.00"),
},
],
"lineas": [
{
"descripcion": "Consultoría",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("1000.00"),
"importeTotal": Decimal("1210.00"),
},
],
"importeTotal": Decimal("1210.00"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12345",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Servicios de consultoría",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"desglose": [
{
"descripcion": "Consultoría",
"baseImponible": "1000.00",
"tipoImpositivo": "21.00",
"cuota": "210.00"
}
],
"lineas": [
{
"descripcion": "Consultoría",
"cantidad": "1",
"importeUnitario": "1000.00",
"importeTotal": "1210.00"
}
],
"importeTotal": "1210.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Factura simplificada (F2)
Sin destinatario. La suma de bases y cuotas del desglose no puede superar los 3.000 €; ver el tope de las simplificadas.
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "T",
"numero": "8001",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F2",
"descripcion": "Venta en tienda",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"desglose": [
{
"descripcion": "Venta en tienda",
"baseImponible": "24.79",
"tipoImpositivo": "21.00",
"cuota": "5.21"
}
],
"lineas": [
{
"descripcion": "Artículo",
"cantidad": "1",
"importeUnitario": "24.79",
"importeTotal": "30.00"
}
],
"importeTotal": "30.00"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "T",
"numero": "8001",
"fechaExpedicion": date(2026, 9, 15),
"tipoFactura": "F2",
"descripcion": "Venta en tienda",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"desglose": [
{
"descripcion": "Venta en tienda",
"baseImponible": Decimal("24.79"),
"tipoImpositivo": Decimal("21.00"),
"cuota": Decimal("5.21"),
},
],
"lineas": [
{
"descripcion": "Artículo",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("24.79"),
"importeTotal": Decimal("30.00"),
},
],
"importeTotal": Decimal("30.00"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "T",
"numero": "8001",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F2",
"descripcion": "Venta en tienda",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"desglose": [
{
"descripcion": "Venta en tienda",
"baseImponible": "24.79",
"tipoImpositivo": "21.00",
"cuota": "5.21"
}
],
"lineas": [
{
"descripcion": "Artículo",
"cantidad": "1",
"importeUnitario": "24.79",
"importeTotal": "30.00"
}
],
"importeTotal": "30.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Factura con varios tipos de IVA
Una línea de desglose por cada tipo impositivo. Cada concepto de lineas lleva su total con el IVA que le corresponde.
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12346",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Suministro de productos alimentarios y material",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"desglose": [
{
"descripcion": "Material",
"baseImponible": "500.00",
"tipoImpositivo": "21.00",
"cuota": "105.00"
},
{
"descripcion": "Alimentación",
"baseImponible": "300.00",
"tipoImpositivo": "10.00",
"cuota": "30.00"
},
{
"descripcion": "Pan y leche",
"baseImponible": "200.00",
"tipoImpositivo": "4.00",
"cuota": "8.00"
}
],
"lineas": [
{
"descripcion": "Material",
"cantidad": "1",
"importeUnitario": "500.00",
"importeTotal": "605.00"
},
{
"descripcion": "Alimentación",
"cantidad": "1",
"importeUnitario": "300.00",
"importeTotal": "330.00"
},
{
"descripcion": "Pan y leche",
"cantidad": "1",
"importeUnitario": "200.00",
"importeTotal": "208.00"
}
],
"importeTotal": "1143.00"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12346",
"fechaExpedicion": date(2026, 9, 15),
"tipoFactura": "F1",
"descripcion": "Suministro de productos alimentarios y material",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001",
},
"desglose": [
{
"descripcion": "Material",
"baseImponible": Decimal("500.00"),
"tipoImpositivo": Decimal("21.00"),
"cuota": Decimal("105.00"),
},
{
"descripcion": "Alimentación",
"baseImponible": Decimal("300.00"),
"tipoImpositivo": Decimal("10.00"),
"cuota": Decimal("30.00"),
},
{
"descripcion": "Pan y leche",
"baseImponible": Decimal("200.00"),
"tipoImpositivo": Decimal("4.00"),
"cuota": Decimal("8.00"),
},
],
"lineas": [
{
"descripcion": "Material",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("500.00"),
"importeTotal": Decimal("605.00"),
},
{
"descripcion": "Alimentación",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("300.00"),
"importeTotal": Decimal("330.00"),
},
{
"descripcion": "Pan y leche",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("200.00"),
"importeTotal": Decimal("208.00"),
},
],
"importeTotal": Decimal("1143.00"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12346",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Suministro de productos alimentarios y material",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"desglose": [
{
"descripcion": "Material",
"baseImponible": "500.00",
"tipoImpositivo": "21.00",
"cuota": "105.00"
},
{
"descripcion": "Alimentación",
"baseImponible": "300.00",
"tipoImpositivo": "10.00",
"cuota": "30.00"
},
{
"descripcion": "Pan y leche",
"baseImponible": "200.00",
"tipoImpositivo": "4.00",
"cuota": "8.00"
}
],
"lineas": [
{
"descripcion": "Material",
"cantidad": "1",
"importeUnitario": "500.00",
"importeTotal": "605.00"
},
{
"descripcion": "Alimentación",
"cantidad": "1",
"importeUnitario": "300.00",
"importeTotal": "330.00"
},
{
"descripcion": "Pan y leche",
"cantidad": "1",
"importeUnitario": "200.00",
"importeTotal": "208.00"
}
],
"importeTotal": "1143.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Factura con descuento en las líneas
descuento es un importe en euros para toda la línea, no un porcentaje. importeUnitario es el precio de tarifa sin IVA e importeTotal el total rebajado con IVA. Aquí, dos unidades a 50,00 € con un 10 % de descuento.
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12347",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Licencias de software",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"desglose": [
{
"descripcion": "Licencias",
"baseImponible": "90.00",
"tipoImpositivo": "21.00",
"cuota": "18.90"
}
],
"lineas": [
{
"descripcion": "Licencia anual",
"cantidad": "2",
"importeUnitario": "50.00",
"descuento": "10.00",
"importeTotal": "108.90"
}
],
"importeTotal": "108.90"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12347",
"fechaExpedicion": date(2026, 9, 15),
"tipoFactura": "F1",
"descripcion": "Licencias de software",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001",
},
"desglose": [
{
"descripcion": "Licencias",
"baseImponible": Decimal("90.00"),
"tipoImpositivo": Decimal("21.00"),
"cuota": Decimal("18.90"),
},
],
"lineas": [
{
"descripcion": "Licencia anual",
"cantidad": Decimal("2"),
"importeUnitario": Decimal("50.00"),
"descuento": Decimal("10.00"),
"importeTotal": Decimal("108.90"),
},
],
"importeTotal": Decimal("108.90"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12347",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Licencias de software",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"desglose": [
{
"descripcion": "Licencias",
"baseImponible": "90.00",
"tipoImpositivo": "21.00",
"cuota": "18.90"
}
],
"lineas": [
{
"descripcion": "Licencia anual",
"cantidad": "2",
"importeUnitario": "50.00",
"descuento": "10.00",
"importeTotal": "108.90"
}
],
"importeTotal": "108.90"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Factura exenta de IVA
La línea lleva operacionExenta con la causa en lugar de tipo y cuota. E1 es la exención del artículo 20 de la LIVA (sanidad, educación, seguros, alquiler de vivienda).
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12348",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Curso de formación profesional",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"desglose": [
{
"descripcion": "Formación exenta, art. 20 LIVA",
"baseImponible": "800.00",
"operacionExenta": "E1"
}
],
"lineas": [
{
"descripcion": "Curso de formación",
"cantidad": "1",
"importeUnitario": "800.00",
"importeTotal": "800.00"
}
],
"importeTotal": "800.00"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12348",
"fechaExpedicion": date(2026, 9, 15),
"tipoFactura": "F1",
"descripcion": "Curso de formación profesional",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001",
},
"desglose": [
{
"descripcion": "Formación exenta, art. 20 LIVA",
"baseImponible": Decimal("800.00"),
"operacionExenta": "E1",
},
],
"lineas": [
{
"descripcion": "Curso de formación",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("800.00"),
"importeTotal": Decimal("800.00"),
},
],
"importeTotal": Decimal("800.00"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12348",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Curso de formación profesional",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"desglose": [
{
"descripcion": "Formación exenta, art. 20 LIVA",
"baseImponible": "800.00",
"operacionExenta": "E1"
}
],
"lineas": [
{
"descripcion": "Curso de formación",
"cantidad": "1",
"importeUnitario": "800.00",
"importeTotal": "800.00"
}
],
"importeTotal": "800.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Operación no sujeta
calificacionOperacion: "N1" con causaNoSujecion: "OT" declara una operación no sujeta por el artículo 7, 14 u otros de la LIVA. Sin tipo ni cuota.
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12349",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Indemnización por resolución de contrato",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"desglose": [
{
"descripcion": "Indemnización no sujeta, art. 78.Tres LIVA",
"baseImponible": "2500.00",
"calificacionOperacion": "N1",
"causaNoSujecion": "OT"
}
],
"lineas": [
{
"descripcion": "Indemnización",
"cantidad": "1",
"importeUnitario": "2500.00",
"importeTotal": "2500.00"
}
],
"importeTotal": "2500.00"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12349",
"fechaExpedicion": date(2026, 9, 15),
"tipoFactura": "F1",
"descripcion": "Indemnización por resolución de contrato",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001",
},
"desglose": [
{
"descripcion": "Indemnización no sujeta, art. 78.Tres LIVA",
"baseImponible": Decimal("2500.00"),
"calificacionOperacion": "N1",
"causaNoSujecion": "OT",
},
],
"lineas": [
{
"descripcion": "Indemnización",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("2500.00"),
"importeTotal": Decimal("2500.00"),
},
],
"importeTotal": Decimal("2500.00"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12349",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Indemnización por resolución de contrato",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"desglose": [
{
"descripcion": "Indemnización no sujeta, art. 78.Tres LIVA",
"baseImponible": "2500.00",
"calificacionOperacion": "N1",
"causaNoSujecion": "OT"
}
],
"lineas": [
{
"descripcion": "Indemnización",
"cantidad": "1",
"importeUnitario": "2500.00",
"importeTotal": "2500.00"
}
],
"importeTotal": "2500.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Inversión del sujeto pasivo
calificacionOperacion: "S2": la operación está sujeta y el IVA lo ingresa el destinatario. La línea no lleva tipo ni cuota. Exige destinatario y no se admite en simplificadas.
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12350",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Ejecución de obra. Inversión del sujeto pasivo, art. 84.Uno.2.f LIVA",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"desglose": [
{
"descripcion": "Ejecución de obra",
"baseImponible": "15000.00",
"calificacionOperacion": "S2"
}
],
"lineas": [
{
"descripcion": "Ejecución de obra",
"cantidad": "1",
"importeUnitario": "15000.00",
"importeTotal": "15000.00"
}
],
"importeTotal": "15000.00"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12350",
"fechaExpedicion": date(2026, 9, 15),
"tipoFactura": "F1",
"descripcion": "Ejecución de obra. Inversión del sujeto pasivo, art. 84.Uno.2.f LIVA",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001",
},
"desglose": [
{
"descripcion": "Ejecución de obra",
"baseImponible": Decimal("15000.00"),
"calificacionOperacion": "S2",
},
],
"lineas": [
{
"descripcion": "Ejecución de obra",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("15000.00"),
"importeTotal": Decimal("15000.00"),
},
],
"importeTotal": Decimal("15000.00"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12350",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Ejecución de obra. Inversión del sujeto pasivo, art. 84.Uno.2.f LIVA",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"desglose": [
{
"descripcion": "Ejecución de obra",
"baseImponible": "15000.00",
"calificacionOperacion": "S2"
}
],
"lineas": [
{
"descripcion": "Ejecución de obra",
"cantidad": "1",
"importeUnitario": "15000.00",
"importeTotal": "15000.00"
}
],
"importeTotal": "15000.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Entrega intracomunitaria de bienes (B2B)
Entrega exenta a un empresario de otro Estado miembro: operacionExenta: "E5", destinatario con idOtro de tipo 02 (NIF-IVA) y tipoOperacion: "entrega" en cada línea. Con destinatario extranjero, tipoOperacion es obligatorio en todo el desglose.
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12351",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Entrega intracomunitaria de maquinaria",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nombre": "Kunde GmbH",
"direccion": "Hauptstrasse 1, Berlin",
"codigoPostal": "10115",
"idOtro": {
"idType": "02",
"id": "DE123456789"
}
},
"desglose": [
{
"descripcion": "Entrega intracomunitaria de maquinaria",
"baseImponible": "12000.00",
"operacionExenta": "E5",
"tipoOperacion": "entrega"
}
],
"lineas": [
{
"descripcion": "Maquinaria",
"cantidad": "1",
"importeUnitario": "12000.00",
"importeTotal": "12000.00"
}
],
"importeTotal": "12000.00"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12351",
"fechaExpedicion": date(2026, 9, 15),
"tipoFactura": "F1",
"descripcion": "Entrega intracomunitaria de maquinaria",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nombre": "Kunde GmbH",
"direccion": "Hauptstrasse 1, Berlin",
"codigoPostal": "10115",
"idOtro": {
"idType": "02",
"id": "DE123456789",
},
},
"desglose": [
{
"descripcion": "Entrega intracomunitaria de maquinaria",
"baseImponible": Decimal("12000.00"),
"operacionExenta": "E5",
"tipoOperacion": "entrega",
},
],
"lineas": [
{
"descripcion": "Maquinaria",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("12000.00"),
"importeTotal": Decimal("12000.00"),
},
],
"importeTotal": Decimal("12000.00"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12351",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Entrega intracomunitaria de maquinaria",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nombre": "Kunde GmbH",
"direccion": "Hauptstrasse 1, Berlin",
"codigoPostal": "10115",
"idOtro": {
"idType": "02",
"id": "DE123456789"
}
},
"desglose": [
{
"descripcion": "Entrega intracomunitaria de maquinaria",
"baseImponible": "12000.00",
"operacionExenta": "E5",
"tipoOperacion": "entrega"
}
],
"lineas": [
{
"descripcion": "Maquinaria",
"cantidad": "1",
"importeUnitario": "12000.00",
"importeTotal": "12000.00"
}
],
"importeTotal": "12000.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Prestación de servicios intracomunitaria (B2B)
Servicio a un empresario de otro Estado miembro. Se localiza en destino y no está sujeto al IVA español: calificacionOperacion: "N2" con causaNoSujecion: "RL" y tipoOperacion: "servicios".
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12352",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Desarrollo de software a medida",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nombre": "Client SARL",
"direccion": "Rue de Rivoli 1, Paris",
"codigoPostal": "75001",
"idOtro": {
"idType": "02",
"id": "FR12345678901"
}
},
"desglose": [
{
"descripcion": "Desarrollo de software",
"baseImponible": "6000.00",
"calificacionOperacion": "N2",
"causaNoSujecion": "RL",
"tipoOperacion": "servicios"
}
],
"lineas": [
{
"descripcion": "Desarrollo de software",
"cantidad": "1",
"importeUnitario": "6000.00",
"importeTotal": "6000.00"
}
],
"importeTotal": "6000.00"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12352",
"fechaExpedicion": date(2026, 9, 15),
"tipoFactura": "F1",
"descripcion": "Desarrollo de software a medida",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nombre": "Client SARL",
"direccion": "Rue de Rivoli 1, Paris",
"codigoPostal": "75001",
"idOtro": {
"idType": "02",
"id": "FR12345678901",
},
},
"desglose": [
{
"descripcion": "Desarrollo de software",
"baseImponible": Decimal("6000.00"),
"calificacionOperacion": "N2",
"causaNoSujecion": "RL",
"tipoOperacion": "servicios",
},
],
"lineas": [
{
"descripcion": "Desarrollo de software",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("6000.00"),
"importeTotal": Decimal("6000.00"),
},
],
"importeTotal": Decimal("6000.00"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12352",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Desarrollo de software a medida",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nombre": "Client SARL",
"direccion": "Rue de Rivoli 1, Paris",
"codigoPostal": "75001",
"idOtro": {
"idType": "02",
"id": "FR12345678901"
}
},
"desglose": [
{
"descripcion": "Desarrollo de software",
"baseImponible": "6000.00",
"calificacionOperacion": "N2",
"causaNoSujecion": "RL",
"tipoOperacion": "servicios"
}
],
"lineas": [
{
"descripcion": "Desarrollo de software",
"cantidad": "1",
"importeUnitario": "6000.00",
"importeTotal": "6000.00"
}
],
"importeTotal": "6000.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Venta a consumidor de otro Estado miembro (B2C)
Por debajo del umbral de 10.000 € anuales de ventas a distancia, la venta tributa en España con IVA español. El destinatario particular se identifica con idOtro de tipo 03 (pasaporte) o 04 (documento oficial de su país), con codigoPais.
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "W",
"numero": "5001",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Venta en tienda online",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nombre": "Anna Rossi",
"direccion": "Via Roma 1, Milano",
"codigoPostal": "20121",
"idOtro": {
"codigoPais": "IT",
"idType": "04",
"id": "CA12345AB"
}
},
"desglose": [
{
"descripcion": "Venta online",
"baseImponible": "82.64",
"tipoImpositivo": "21.00",
"cuota": "17.36",
"tipoOperacion": "entrega"
}
],
"lineas": [
{
"descripcion": "Artículo",
"cantidad": "1",
"importeUnitario": "82.64",
"importeTotal": "100.00"
}
],
"importeTotal": "100.00"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "W",
"numero": "5001",
"fechaExpedicion": date(2026, 9, 15),
"tipoFactura": "F1",
"descripcion": "Venta en tienda online",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nombre": "Anna Rossi",
"direccion": "Via Roma 1, Milano",
"codigoPostal": "20121",
"idOtro": {
"codigoPais": "IT",
"idType": "04",
"id": "CA12345AB",
},
},
"desglose": [
{
"descripcion": "Venta online",
"baseImponible": Decimal("82.64"),
"tipoImpositivo": Decimal("21.00"),
"cuota": Decimal("17.36"),
"tipoOperacion": "entrega",
},
],
"lineas": [
{
"descripcion": "Artículo",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("82.64"),
"importeTotal": Decimal("100.00"),
},
],
"importeTotal": Decimal("100.00"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "W",
"numero": "5001",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Venta en tienda online",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nombre": "Anna Rossi",
"direccion": "Via Roma 1, Milano",
"codigoPostal": "20121",
"idOtro": {
"codigoPais": "IT",
"idType": "04",
"id": "CA12345AB"
}
},
"desglose": [
{
"descripcion": "Venta online",
"baseImponible": "82.64",
"tipoImpositivo": "21.00",
"cuota": "17.36",
"tipoOperacion": "entrega"
}
],
"lineas": [
{
"descripcion": "Artículo",
"cantidad": "1",
"importeUnitario": "82.64",
"importeTotal": "100.00"
}
],
"importeTotal": "100.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Venta a distancia en régimen OSS
Por encima del umbral, la venta tributa en el país del consumidor y se declara en la ventanilla única (OSS). clavesRegimen: ["17"] y una línea N2 con causaNoSujecion: "IE" (localizada fuera con impuesto extranjero). importeTotal es el importe que paga el cliente, con el IVA de su país incluido; con la causa IE no se cuadra contra el desglose.
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "W",
"numero": "5002",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Venta a distancia intracomunitaria, régimen OSS",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nombre": "Anna Rossi",
"direccion": "Via Roma 1, Milano",
"codigoPostal": "20121",
"idOtro": {
"codigoPais": "IT",
"idType": "04",
"id": "CA12345AB"
}
},
"clavesRegimen": [
"17"
],
"desglose": [
{
"descripcion": "Venta a distancia, IVA italiano 22 %",
"baseImponible": "100.00",
"calificacionOperacion": "N2",
"causaNoSujecion": "IE",
"tipoOperacion": "entrega"
}
],
"lineas": [
{
"descripcion": "Artículo",
"cantidad": "1",
"importeUnitario": "100.00",
"importeTotal": "122.00"
}
],
"importeTotal": "122.00"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "W",
"numero": "5002",
"fechaExpedicion": date(2026, 9, 15),
"tipoFactura": "F1",
"descripcion": "Venta a distancia intracomunitaria, régimen OSS",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nombre": "Anna Rossi",
"direccion": "Via Roma 1, Milano",
"codigoPostal": "20121",
"idOtro": {
"codigoPais": "IT",
"idType": "04",
"id": "CA12345AB",
},
},
"clavesRegimen": [
"17",
],
"desglose": [
{
"descripcion": "Venta a distancia, IVA italiano 22 %",
"baseImponible": Decimal("100.00"),
"calificacionOperacion": "N2",
"causaNoSujecion": "IE",
"tipoOperacion": "entrega",
},
],
"lineas": [
{
"descripcion": "Artículo",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("100.00"),
"importeTotal": Decimal("122.00"),
},
],
"importeTotal": Decimal("122.00"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "W",
"numero": "5002",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Venta a distancia intracomunitaria, régimen OSS",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nombre": "Anna Rossi",
"direccion": "Via Roma 1, Milano",
"codigoPostal": "20121",
"idOtro": {
"codigoPais": "IT",
"idType": "04",
"id": "CA12345AB"
}
},
"clavesRegimen": [
"17"
],
"desglose": [
{
"descripcion": "Venta a distancia, IVA italiano 22 %",
"baseImponible": "100.00",
"calificacionOperacion": "N2",
"causaNoSujecion": "IE",
"tipoOperacion": "entrega"
}
],
"lineas": [
{
"descripcion": "Artículo",
"cantidad": "1",
"importeUnitario": "100.00",
"importeTotal": "122.00"
}
],
"importeTotal": "122.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Exportación de bienes
Entrega a un país fuera de la Unión Europea: clavesRegimen: ["02"] (exportación) y operacionExenta: "E2" (artículo 21 de la LIVA). Con la clave 02, todas las líneas del desglose son exentas.
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12353",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Exportación de componentes electrónicos",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nombre": "Buyer Inc",
"direccion": "1 Market St, San Francisco",
"codigoPostal": "94105",
"idOtro": {
"codigoPais": "US",
"idType": "06",
"id": "US987654321"
}
},
"clavesRegimen": [
"02"
],
"desglose": [
{
"descripcion": "Exportación, art. 21 LIVA",
"baseImponible": "45000.00",
"operacionExenta": "E2",
"tipoOperacion": "entrega"
}
],
"lineas": [
{
"descripcion": "Componentes electrónicos",
"cantidad": "1",
"importeUnitario": "45000.00",
"importeTotal": "45000.00"
}
],
"importeTotal": "45000.00"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12353",
"fechaExpedicion": date(2026, 9, 15),
"tipoFactura": "F1",
"descripcion": "Exportación de componentes electrónicos",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nombre": "Buyer Inc",
"direccion": "1 Market St, San Francisco",
"codigoPostal": "94105",
"idOtro": {
"codigoPais": "US",
"idType": "06",
"id": "US987654321",
},
},
"clavesRegimen": [
"02",
],
"desglose": [
{
"descripcion": "Exportación, art. 21 LIVA",
"baseImponible": Decimal("45000.00"),
"operacionExenta": "E2",
"tipoOperacion": "entrega",
},
],
"lineas": [
{
"descripcion": "Componentes electrónicos",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("45000.00"),
"importeTotal": Decimal("45000.00"),
},
],
"importeTotal": Decimal("45000.00"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12353",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Exportación de componentes electrónicos",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nombre": "Buyer Inc",
"direccion": "1 Market St, San Francisco",
"codigoPostal": "94105",
"idOtro": {
"codigoPais": "US",
"idType": "06",
"id": "US987654321"
}
},
"clavesRegimen": [
"02"
],
"desglose": [
{
"descripcion": "Exportación, art. 21 LIVA",
"baseImponible": "45000.00",
"operacionExenta": "E2",
"tipoOperacion": "entrega"
}
],
"lineas": [
{
"descripcion": "Componentes electrónicos",
"cantidad": "1",
"importeUnitario": "45000.00",
"importeTotal": "45000.00"
}
],
"importeTotal": "45000.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Prestación de servicios a un país tercero
Servicio a un empresario establecido fuera de la Unión Europea. Se localiza fuera del territorio de aplicación del impuesto: N2 con causa RL y tipoOperacion: "servicios".
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12354",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Servicios de asesoría técnica",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nombre": "Consulting Ltd",
"direccion": "1 King Street, London",
"codigoPostal": "EC2V 8AU",
"idOtro": {
"codigoPais": "GB",
"idType": "06",
"id": "GB123456789"
}
},
"desglose": [
{
"descripcion": "Asesoría técnica",
"baseImponible": "3200.00",
"calificacionOperacion": "N2",
"causaNoSujecion": "RL",
"tipoOperacion": "servicios"
}
],
"lineas": [
{
"descripcion": "Asesoría técnica",
"cantidad": "1",
"importeUnitario": "3200.00",
"importeTotal": "3200.00"
}
],
"importeTotal": "3200.00"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12354",
"fechaExpedicion": date(2026, 9, 15),
"tipoFactura": "F1",
"descripcion": "Servicios de asesoría técnica",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nombre": "Consulting Ltd",
"direccion": "1 King Street, London",
"codigoPostal": "EC2V 8AU",
"idOtro": {
"codigoPais": "GB",
"idType": "06",
"id": "GB123456789",
},
},
"desglose": [
{
"descripcion": "Asesoría técnica",
"baseImponible": Decimal("3200.00"),
"calificacionOperacion": "N2",
"causaNoSujecion": "RL",
"tipoOperacion": "servicios",
},
],
"lineas": [
{
"descripcion": "Asesoría técnica",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("3200.00"),
"importeTotal": Decimal("3200.00"),
},
],
"importeTotal": Decimal("3200.00"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12354",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Servicios de asesoría técnica",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nombre": "Consulting Ltd",
"direccion": "1 King Street, London",
"codigoPostal": "EC2V 8AU",
"idOtro": {
"codigoPais": "GB",
"idType": "06",
"id": "GB123456789"
}
},
"desglose": [
{
"descripcion": "Asesoría técnica",
"baseImponible": "3200.00",
"calificacionOperacion": "N2",
"causaNoSujecion": "RL",
"tipoOperacion": "servicios"
}
],
"lineas": [
{
"descripcion": "Asesoría técnica",
"cantidad": "1",
"importeUnitario": "3200.00",
"importeTotal": "3200.00"
}
],
"importeTotal": "3200.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Factura con recargo de equivalencia
Venta a un comerciante minorista en recargo de equivalencia. La línea S1 añade tipoRecargoEquivalencia y cuotaRecargoEquivalencia, y el recargo forma parte de importeTotal y del total de cada concepto. Exige un destinatario con NIF español. En Araba no se admite en servicios y solo con las claves 01, 07 o 52.
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12355",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Suministro de mercancía a comercio minorista",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "12345678Z",
"nombre": "Comercio Minorista",
"direccion": "Calle Mayor 2, Bilbao",
"codigoPostal": "48001"
},
"desglose": [
{
"descripcion": "Mercancía",
"baseImponible": "1000.00",
"tipoImpositivo": "21.00",
"cuota": "210.00",
"tipoRecargoEquivalencia": "5.20",
"cuotaRecargoEquivalencia": "52.00"
}
],
"lineas": [
{
"descripcion": "Mercancía",
"cantidad": "1",
"importeUnitario": "1000.00",
"importeTotal": "1262.00"
}
],
"importeTotal": "1262.00"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12355",
"fechaExpedicion": date(2026, 9, 15),
"tipoFactura": "F1",
"descripcion": "Suministro de mercancía a comercio minorista",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nif": "12345678Z",
"nombre": "Comercio Minorista",
"direccion": "Calle Mayor 2, Bilbao",
"codigoPostal": "48001",
},
"desglose": [
{
"descripcion": "Mercancía",
"baseImponible": Decimal("1000.00"),
"tipoImpositivo": Decimal("21.00"),
"cuota": Decimal("210.00"),
"tipoRecargoEquivalencia": Decimal("5.20"),
"cuotaRecargoEquivalencia": Decimal("52.00"),
},
],
"lineas": [
{
"descripcion": "Mercancía",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("1000.00"),
"importeTotal": Decimal("1262.00"),
},
],
"importeTotal": Decimal("1262.00"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12355",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Suministro de mercancía a comercio minorista",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "12345678Z",
"nombre": "Comercio Minorista",
"direccion": "Calle Mayor 2, Bilbao",
"codigoPostal": "48001"
},
"desglose": [
{
"descripcion": "Mercancía",
"baseImponible": "1000.00",
"tipoImpositivo": "21.00",
"cuota": "210.00",
"tipoRecargoEquivalencia": "5.20",
"cuotaRecargoEquivalencia": "52.00"
}
],
"lineas": [
{
"descripcion": "Mercancía",
"cantidad": "1",
"importeUnitario": "1000.00",
"importeTotal": "1262.00"
}
],
"importeTotal": "1262.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Factura de autónomo con retención de IRPF
La retención viaja aparte, en retencionSoportada. importeTotal es la base más el IVA, antes de descontar el IRPF: aquí 665.50, no 583.00. Un total con la retención descontada deja de cuadrar con el desglose y devuelve 400.
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12356",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Honorarios profesionales",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"desglose": [
{
"descripcion": "Honorarios",
"baseImponible": "550.00",
"tipoImpositivo": "21.00",
"cuota": "115.50"
}
],
"lineas": [
{
"descripcion": "Honorarios profesionales",
"cantidad": "1",
"importeUnitario": "550.00",
"importeTotal": "665.50"
}
],
"retencionSoportada": "82.50",
"importeTotal": "665.50"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12356",
"fechaExpedicion": date(2026, 9, 15),
"tipoFactura": "F1",
"descripcion": "Honorarios profesionales",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001",
},
"desglose": [
{
"descripcion": "Honorarios",
"baseImponible": Decimal("550.00"),
"tipoImpositivo": Decimal("21.00"),
"cuota": Decimal("115.50"),
},
],
"lineas": [
{
"descripcion": "Honorarios profesionales",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("550.00"),
"importeTotal": Decimal("665.50"),
},
],
"retencionSoportada": Decimal("82.50"),
"importeTotal": Decimal("665.50"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12356",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Honorarios profesionales",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"desglose": [
{
"descripcion": "Honorarios",
"baseImponible": "550.00",
"tipoImpositivo": "21.00",
"cuota": "115.50"
}
],
"lineas": [
{
"descripcion": "Honorarios profesionales",
"cantidad": "1",
"importeUnitario": "550.00",
"importeTotal": "665.50"
}
],
"retencionSoportada": "82.50",
"importeTotal": "665.50"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Régimen especial de bienes usados (REBU)
clavesRegimen: ["03"]. La base imponible es el margen de beneficio, no el precio de venta, e importeTotal es el precio que paga el cliente. Con esta clave, importeTotal no se cuadra contra el desglose ni contra lineas.
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12357",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Venta de vehículo usado. Régimen especial de bienes usados",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "12345678Z",
"nombre": "María García López",
"direccion": "Calle Mayor 3, Bilbao",
"codigoPostal": "48001"
},
"clavesRegimen": [
"03"
],
"desglose": [
{
"descripcion": "Margen de la operación",
"baseImponible": "1652.89",
"tipoImpositivo": "21.00",
"cuota": "347.11"
}
],
"lineas": [
{
"descripcion": "Vehículo usado",
"cantidad": "1",
"importeUnitario": "9000.00",
"importeTotal": "9000.00"
}
],
"importeTotal": "9000.00"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12357",
"fechaExpedicion": date(2026, 9, 15),
"tipoFactura": "F1",
"descripcion": "Venta de vehículo usado. Régimen especial de bienes usados",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nif": "12345678Z",
"nombre": "María García López",
"direccion": "Calle Mayor 3, Bilbao",
"codigoPostal": "48001",
},
"clavesRegimen": [
"03",
],
"desglose": [
{
"descripcion": "Margen de la operación",
"baseImponible": Decimal("1652.89"),
"tipoImpositivo": Decimal("21.00"),
"cuota": Decimal("347.11"),
},
],
"lineas": [
{
"descripcion": "Vehículo usado",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("9000.00"),
"importeTotal": Decimal("9000.00"),
},
],
"importeTotal": Decimal("9000.00"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12357",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Venta de vehículo usado. Régimen especial de bienes usados",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "12345678Z",
"nombre": "María García López",
"direccion": "Calle Mayor 3, Bilbao",
"codigoPostal": "48001"
},
"clavesRegimen": [
"03"
],
"desglose": [
{
"descripcion": "Margen de la operación",
"baseImponible": "1652.89",
"tipoImpositivo": "21.00",
"cuota": "347.11"
}
],
"lineas": [
{
"descripcion": "Vehículo usado",
"cantidad": "1",
"importeUnitario": "9000.00",
"importeTotal": "9000.00"
}
],
"importeTotal": "9000.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Rectificativa por sustitución
Una R1 con rectificativa.tipo: "S" sustituye por completo a la factura rectificada. El desglose e importeTotal llevan los importes correctos definitivos, y rectificativa.importes los de la factura que se rectifica. Cuándo rectificar y cuándo subsanar: Rectificar y anular.
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "R",
"numero": "301",
"fechaExpedicion": "22-09-2026",
"tipoFactura": "R1",
"descripcion": "Rectificativa por sustitución de la factura A-12345",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"rectificativa": {
"tipo": "S",
"facturasRectificadas": [
{
"serie": "A",
"numero": "12345",
"fechaExpedicion": "15-09-2026"
}
],
"importes": {
"baseRectificada": "1000.00",
"cuotaRectificada": "210.00"
}
},
"desglose": [
{
"descripcion": "Consultoría",
"baseImponible": "900.00",
"tipoImpositivo": "21.00",
"cuota": "189.00"
}
],
"lineas": [
{
"descripcion": "Consultoría",
"cantidad": "1",
"importeUnitario": "900.00",
"importeTotal": "1089.00"
}
],
"importeTotal": "1089.00"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "R",
"numero": "301",
"fechaExpedicion": date(2026, 9, 22),
"tipoFactura": "R1",
"descripcion": "Rectificativa por sustitución de la factura A-12345",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001",
},
"rectificativa": {
"tipo": "S",
"facturasRectificadas": [
{
"serie": "A",
"numero": "12345",
"fechaExpedicion": date(2026, 9, 15),
},
],
"importes": {
"baseRectificada": Decimal("1000.00"),
"cuotaRectificada": Decimal("210.00"),
},
},
"desglose": [
{
"descripcion": "Consultoría",
"baseImponible": Decimal("900.00"),
"tipoImpositivo": Decimal("21.00"),
"cuota": Decimal("189.00"),
},
],
"lineas": [
{
"descripcion": "Consultoría",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("900.00"),
"importeTotal": Decimal("1089.00"),
},
],
"importeTotal": Decimal("1089.00"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "R",
"numero": "301",
"fechaExpedicion": "22-09-2026",
"tipoFactura": "R1",
"descripcion": "Rectificativa por sustitución de la factura A-12345",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"rectificativa": {
"tipo": "S",
"facturasRectificadas": [
{
"serie": "A",
"numero": "12345",
"fechaExpedicion": "15-09-2026"
}
],
"importes": {
"baseRectificada": "1000.00",
"cuotaRectificada": "210.00"
}
},
"desglose": [
{
"descripcion": "Consultoría",
"baseImponible": "900.00",
"tipoImpositivo": "21.00",
"cuota": "189.00"
}
],
"lineas": [
{
"descripcion": "Consultoría",
"cantidad": "1",
"importeUnitario": "900.00",
"importeTotal": "1089.00"
}
],
"importeTotal": "1089.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Rectificativa por diferencias
Una R1 con rectificativa.tipo: "I" declara solo la diferencia respecto a la factura rectificada. Un descuento posterior o una devolución llevan importes negativos. No lleva rectificativa.importes.
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "R",
"numero": "302",
"fechaExpedicion": "22-09-2026",
"tipoFactura": "R1",
"descripcion": "Abono parcial de la factura A-12345",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"rectificativa": {
"tipo": "I",
"facturasRectificadas": [
{
"serie": "A",
"numero": "12345",
"fechaExpedicion": "15-09-2026"
}
]
},
"desglose": [
{
"descripcion": "Abono",
"baseImponible": "-100.00",
"tipoImpositivo": "21.00",
"cuota": "-21.00"
}
],
"lineas": [
{
"descripcion": "Abono parcial",
"cantidad": "1",
"importeUnitario": "-100.00",
"importeTotal": "-121.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.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "R",
"numero": "302",
"fechaExpedicion": date(2026, 9, 22),
"tipoFactura": "R1",
"descripcion": "Abono parcial de la factura A-12345",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001",
},
"rectificativa": {
"tipo": "I",
"facturasRectificadas": [
{
"serie": "A",
"numero": "12345",
"fechaExpedicion": date(2026, 9, 15),
},
],
},
"desglose": [
{
"descripcion": "Abono",
"baseImponible": Decimal("-100.00"),
"tipoImpositivo": Decimal("21.00"),
"cuota": Decimal("-21.00"),
},
],
"lineas": [
{
"descripcion": "Abono parcial",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("-100.00"),
"importeTotal": Decimal("-121.00"),
},
],
"importeTotal": Decimal("-121.00"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "R",
"numero": "302",
"fechaExpedicion": "22-09-2026",
"tipoFactura": "R1",
"descripcion": "Abono parcial de la factura A-12345",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"rectificativa": {
"tipo": "I",
"facturasRectificadas": [
{
"serie": "A",
"numero": "12345",
"fechaExpedicion": "15-09-2026"
}
]
},
"desglose": [
{
"descripcion": "Abono",
"baseImponible": "-100.00",
"tipoImpositivo": "21.00",
"cuota": "-21.00"
}
],
"lineas": [
{
"descripcion": "Abono parcial",
"cantidad": "1",
"importeUnitario": "-100.00",
"importeTotal": "-121.00"
}
],
"importeTotal": "-121.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Rectificativa por crédito incobrable (R3)
R3 corresponde al artículo 80.4 de la LIVA. Solo se admite cuando han pasado al menos seis meses desde cada factura rectificada. Con menos, la API responde 400 R3_TIMING_ERROR.
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "R",
"numero": "303",
"fechaExpedicion": "22-09-2026",
"tipoFactura": "R3",
"descripcion": "Rectificativa por crédito incobrable de la factura A-11890",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"rectificativa": {
"tipo": "I",
"facturasRectificadas": [
{
"serie": "A",
"numero": "11890",
"fechaExpedicion": "10-03-2026"
}
]
},
"desglose": [
{
"descripcion": "Crédito incobrable",
"baseImponible": "-1000.00",
"tipoImpositivo": "21.00",
"cuota": "-210.00"
}
],
"lineas": [
{
"descripcion": "Crédito incobrable",
"cantidad": "1",
"importeUnitario": "-1000.00",
"importeTotal": "-1210.00"
}
],
"importeTotal": "-1210.00"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "R",
"numero": "303",
"fechaExpedicion": date(2026, 9, 22),
"tipoFactura": "R3",
"descripcion": "Rectificativa por crédito incobrable de la factura A-11890",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001",
},
"rectificativa": {
"tipo": "I",
"facturasRectificadas": [
{
"serie": "A",
"numero": "11890",
"fechaExpedicion": date(2026, 3, 10),
},
],
},
"desglose": [
{
"descripcion": "Crédito incobrable",
"baseImponible": Decimal("-1000.00"),
"tipoImpositivo": Decimal("21.00"),
"cuota": Decimal("-210.00"),
},
],
"lineas": [
{
"descripcion": "Crédito incobrable",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("-1000.00"),
"importeTotal": Decimal("-1210.00"),
},
],
"importeTotal": Decimal("-1210.00"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "R",
"numero": "303",
"fechaExpedicion": "22-09-2026",
"tipoFactura": "R3",
"descripcion": "Rectificativa por crédito incobrable de la factura A-11890",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"rectificativa": {
"tipo": "I",
"facturasRectificadas": [
{
"serie": "A",
"numero": "11890",
"fechaExpedicion": "10-03-2026"
}
]
},
"desglose": [
{
"descripcion": "Crédito incobrable",
"baseImponible": "-1000.00",
"tipoImpositivo": "21.00",
"cuota": "-210.00"
}
],
"lineas": [
{
"descripcion": "Crédito incobrable",
"cantidad": "1",
"importeUnitario": "-1000.00",
"importeTotal": "-1210.00"
}
],
"importeTotal": "-1210.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Rectificativa de una factura simplificada (R5)
Rectifica una F2. Como la simplificada, no lleva destinatario.
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "RT",
"numero": "91",
"fechaExpedicion": "22-09-2026",
"tipoFactura": "R5",
"descripcion": "Devolución del ticket T-7990",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"rectificativa": {
"tipo": "I",
"facturasRectificadas": [
{
"serie": "T",
"numero": "7990",
"fechaExpedicion": "12-09-2026"
}
]
},
"desglose": [
{
"descripcion": "Devolución",
"baseImponible": "-24.79",
"tipoImpositivo": "21.00",
"cuota": "-5.21"
}
],
"lineas": [
{
"descripcion": "Devolución de artículo",
"cantidad": "1",
"importeUnitario": "-24.79",
"importeTotal": "-30.00"
}
],
"importeTotal": "-30.00"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "RT",
"numero": "91",
"fechaExpedicion": date(2026, 9, 22),
"tipoFactura": "R5",
"descripcion": "Devolución del ticket T-7990",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"rectificativa": {
"tipo": "I",
"facturasRectificadas": [
{
"serie": "T",
"numero": "7990",
"fechaExpedicion": date(2026, 9, 12),
},
],
},
"desglose": [
{
"descripcion": "Devolución",
"baseImponible": Decimal("-24.79"),
"tipoImpositivo": Decimal("21.00"),
"cuota": Decimal("-5.21"),
},
],
"lineas": [
{
"descripcion": "Devolución de artículo",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("-24.79"),
"importeTotal": Decimal("-30.00"),
},
],
"importeTotal": Decimal("-30.00"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "RT",
"numero": "91",
"fechaExpedicion": "22-09-2026",
"tipoFactura": "R5",
"descripcion": "Devolución del ticket T-7990",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"rectificativa": {
"tipo": "I",
"facturasRectificadas": [
{
"serie": "T",
"numero": "7990",
"fechaExpedicion": "12-09-2026"
}
]
},
"desglose": [
{
"descripcion": "Devolución",
"baseImponible": "-24.79",
"tipoImpositivo": "21.00",
"cuota": "-5.21"
}
],
"lineas": [
{
"descripcion": "Devolución de artículo",
"cantidad": "1",
"importeUnitario": "-24.79",
"importeTotal": "-30.00"
}
],
"importeTotal": "-30.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Factura en sustitución de simplificadas (F3)
El cliente pide una factura completa por compras que ya tienen ticket. La F3 identifica las simplificadas que sustituye en rectificativa.facturasSustituidas. No es una rectificativa: no lleva tipo ni facturasRectificadas.
curl -X POST https://sandbox.veribai.com/v1/ticketbai/crear \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12358",
"fechaExpedicion": "22-09-2026",
"tipoFactura": "F3",
"descripcion": "Factura en sustitución de los tickets T-8003 y T-8004",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"rectificativa": {
"facturasSustituidas": [
{
"serie": "T",
"numero": "8003",
"fechaExpedicion": "15-09-2026"
},
{
"serie": "T",
"numero": "8004",
"fechaExpedicion": "16-09-2026"
}
]
},
"desglose": [
{
"descripcion": "Compras en tienda",
"baseImponible": "49.58",
"tipoImpositivo": "21.00",
"cuota": "10.42"
}
],
"lineas": [
{
"descripcion": "Compras en tienda",
"cantidad": "1",
"importeUnitario": "49.58",
"importeTotal": "60.00"
}
],
"importeTotal": "60.00"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.crear({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12358",
"fechaExpedicion": date(2026, 9, 22),
"tipoFactura": "F3",
"descripcion": "Factura en sustitución de los tickets T-8003 y T-8004",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001",
},
"rectificativa": {
"facturasSustituidas": [
{
"serie": "T",
"numero": "8003",
"fechaExpedicion": date(2026, 9, 15),
},
{
"serie": "T",
"numero": "8004",
"fechaExpedicion": date(2026, 9, 16),
},
],
},
"desglose": [
{
"descripcion": "Compras en tienda",
"baseImponible": Decimal("49.58"),
"tipoImpositivo": Decimal("21.00"),
"cuota": Decimal("10.42"),
},
],
"lineas": [
{
"descripcion": "Compras en tienda",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("49.58"),
"importeTotal": Decimal("60.00"),
},
],
"importeTotal": Decimal("60.00"),
})
print(respuesta["idTbai"], respuesta["urlValidacion"])
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/crear", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12358",
"fechaExpedicion": "22-09-2026",
"tipoFactura": "F3",
"descripcion": "Factura en sustitución de los tickets T-8003 y T-8004",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo SL",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"rectificativa": {
"facturasSustituidas": [
{
"serie": "T",
"numero": "8003",
"fechaExpedicion": "15-09-2026"
},
{
"serie": "T",
"numero": "8004",
"fechaExpedicion": "16-09-2026"
}
]
},
"desglose": [
{
"descripcion": "Compras en tienda",
"baseImponible": "49.58",
"tipoImpositivo": "21.00",
"cuota": "10.42"
}
],
"lineas": [
{
"descripcion": "Compras en tienda",
"cantidad": "1",
"importeUnitario": "49.58",
"importeTotal": "60.00"
}
],
"importeTotal": "60.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Subsanación de un registro
Corrige datos mal informados de un registro ya remitido sin cambiar la operación. El cuerpo es el de crear con los datos corregidos y la misma identidad (serie, numero, fechaExpedicion). Aquí se corrige el nombre del destinatario de la factura A-12345.
curl -X PUT https://sandbox.veribai.com/v1/ticketbai/subsanar \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12345",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Servicios de consultoría",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo Sociedad Limitada",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"desglose": [
{
"descripcion": "Consultoría",
"baseImponible": "1000.00",
"tipoImpositivo": "21.00",
"cuota": "210.00"
}
],
"lineas": [
{
"descripcion": "Consultoría",
"cantidad": "1",
"importeUnitario": "1000.00",
"importeTotal": "1210.00"
}
],
"importeTotal": "1210.00"
}'
from datetime import date
from decimal import Decimal
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.subsanar({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12345",
"fechaExpedicion": date(2026, 9, 15),
"tipoFactura": "F1",
"descripcion": "Servicios de consultoría",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL",
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo Sociedad Limitada",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001",
},
"desglose": [
{
"descripcion": "Consultoría",
"baseImponible": Decimal("1000.00"),
"tipoImpositivo": Decimal("21.00"),
"cuota": Decimal("210.00"),
},
],
"lineas": [
{
"descripcion": "Consultoría",
"cantidad": Decimal("1"),
"importeUnitario": Decimal("1000.00"),
"importeTotal": Decimal("1210.00"),
},
],
"importeTotal": Decimal("1210.00"),
})
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/subsanar", {
method: "PUT",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"version": "1.0",
"provincia": "bizkaia",
"serie": "A",
"numero": "12345",
"fechaExpedicion": "15-09-2026",
"tipoFactura": "F1",
"descripcion": "Servicios de consultoría",
"emisor": {
"nif": "B00000000",
"nombre": "Empresa Emisora SL"
},
"destinatario": {
"nif": "B11111119",
"nombre": "Cliente Ejemplo Sociedad Limitada",
"direccion": "Calle Mayor 1, Bilbao",
"codigoPostal": "48001"
},
"desglose": [
{
"descripcion": "Consultoría",
"baseImponible": "1000.00",
"tipoImpositivo": "21.00",
"cuota": "210.00"
}
],
"lineas": [
{
"descripcion": "Consultoría",
"cantidad": "1",
"importeUnitario": "1000.00",
"importeTotal": "1210.00"
}
],
"importeTotal": "1210.00"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();
Anulación de una factura
Deja sin efecto un registro remitido. El cuerpo es plano e incluye provincia. serie, numero y fechaExpedicion deben coincidir exactamente con la factura original. Una factura con rectificativas no se puede anular. Aquí se anula el ticket T-8001, la simplificada de esta página.
curl -X POST https://sandbox.veribai.com/v1/ticketbai/anular \
-H "x-api-key: TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"provincia": "bizkaia",
"nifEmisor": "B00000000",
"serie": "T",
"numero": "8001",
"fechaExpedicion": "15-09-2026"
}'
from datetime import date
import veribai
client = veribai.Client(api_key="TU_CLAVE", environment="test")
respuesta = client.ticketbai.anular({
"provincia": "bizkaia",
"nifEmisor": "B00000000",
"serie": "T",
"numero": "8001",
"fechaExpedicion": date(2026, 9, 15),
})
const respuesta = await fetch("https://sandbox.veribai.com/v1/ticketbai/anular", {
method: "POST",
headers: {
"x-api-key": "TU_CLAVE",
"Content-Type": "application/json",
},
body: JSON.stringify({
"provincia": "bizkaia",
"nifEmisor": "B00000000",
"serie": "T",
"numero": "8001",
"fechaExpedicion": "15-09-2026"
}),
});
if (!respuesta.ok) throw new Error(`VeriBai ${respuesta.status}`);
const datos = await respuesta.json();