TicketBAI
TicketBAI es el régimen de facturación electrónica obligatoria del País Vasco. Lo regulan las tres haciendas forales —Araba, Bizkaia y Gipuzkoa— y se aplica a toda factura de venta emitida por empresas y autónomos con obligaciones fiscales en alguno de los tres territorios.
Esta guía cubre cómo se integra TicketBAI con la API pública de FacturaDirecta:
Cuándo se activa.
Qué campos puedes (y debes) enviar en
main.ticketbai.Qué metadatos lee tu integración en
meta.ticketbai.El concepto de encadenamiento entre facturas.
El subsistema Batuz (exclusivo de Bizkaia) y el servicio Zuzendu para subsanaciones.
Anulación y rectificativas.
Cómo monitorizar el estado del envío.
Para el contrato general del recurso de facturas, ver Facturas. Para una visión rápida del régimen equivalente en el resto de España, ver VeriFactu.
Cuándo se activa
TicketBAI se aplica cuando la empresa emisora está dada de alta en TicketBAI en su diputación foral. La configuración la determina el alta administrativa de la empresa; no hay un flag por factura para activarlo o desactivarlo.
La única forma de emitir una factura sin generar TicketBAI en una empresa con TicketBAI activo es marcarla como externa (main.external = true). Esa marca indica que la factura se generó fuera del programa y contabiliza normalmente, pero no produce información para TicketBAI ni VeriFactu. Es el modo apropiado para registrar facturas históricas o emitidas con otro software, no para saltarse la obligación electrónica.
Diputación foral
La factura registra su territorio en meta.ticketbai.diputacionForal, con uno de los tres valores:
Valor | Diputación |
| Diputación Foral de Álava |
| Diputación Foral de Bizkaia |
| Diputación Foral de Gipuzkoa |
Lo decide el sistema según la configuración fiscal de la empresa; tu integración solo lo lee.
Bizkaia es distinto: Batuz
Bizkaia opera un sistema adicional llamado Batuz: el LROE (Libro Registro de Operaciones Económicas) que recibe los XML de ingresos y gastos. Por eso, una factura emitida en Bizkaia genera dos documentos XML: el de TicketBAI estándar y el de Batuz.
Implicaciones para tu integración:
En Bizkaia tendrás campos
batuz*adicionales enmeta.ticketbai(batuzAccepted,batuzAcceptedWithErrors,batuzAcceptedZuzendu,batuzModel,batuzModelZuzendu).Existe un campo de entrada
batuzRentaIngresosenmain.ticketbaipara indicar el epígrafe de IRPF de la operación (obligatorio en algunos escenarios de Bizkaia).Si la factura se emitió originalmente sin Software Garante (papel, otro software no certificado) y se sube a Bizkaia para rectificarla, la información llega en un meta alternativo (
InvoiceMetaBatuzNoSG) en vez del estándar (InvoiceMetaTicketbai). Tu integración debe distinguir cuál de los dos viene.
En Araba y Gipuzkoa, los campos batuz* no aplican.
Campos de entrada: main.ticketbai
Son los únicos campos de TicketBAI que tu integración puede enviar en POST /invoices o PUT /invoices/{id}. El resto lo calcula el servidor.
Campo | Tipo | Cuándo se usa |
| enum | Cuando la operación está exenta de IVA, indicas el motivo según la clasificación oficial de las diputaciones forales. |
| enum | Cuando la operación no está sujeta a IVA, indicas el motivo. |
| enum | Solo en facturas rectificativas. Identifica el tipo de rectificativa. Ver Rectificativas para qué corresponde a cada |
| array de 1 elemento | Solo Bizkaia. |
Los códigos E1-E6, OT/RL/VT/IE y R1-R5 son los oficiales de las haciendas forales. Su significado funcional está en la documentación técnica enlazada al final de esta página, no en el código de FacturaDirecta. Antes de enviar uno, verifica en la fuente oficial que tu operación encaja en esa categoría.
Si tu integración no envía nada de esto, el servidor genera el XML con los valores por defecto que se hayan calculado a partir de los datos de la factura (régimen, líneas, contacto). Solo se rellenan estos campos cuando tienes una operación atípica que requiere indicarlo explícitamente.
Metadatos: meta.ticketbai
Tras guardar una factura definitiva (main.draft = false) en una empresa con TicketBAI activo, el servidor rellena meta.ticketbai con la información operativa. Es read-only: tu integración lee, no escribe.
Campos principales
Campo | Significado |
| Identificador TicketBAI de la factura. Se genera siguiendo el formato de la diputación correspondiente. |
| Entero ≥ 0. Posición de la factura en la cadena de TicketBAI de la empresa (ver Encadenamiento). |
|
|
| El servidor lo pone a |
|
|
| URL y datos del código QR que debe aparecer en la representación impresa. |
| XML de alta firmado y enviado a TicketBAI. |
| Referencia a la factura inmediatamente anterior en la cadena (ver siguiente sección). |
Campos exclusivos de Bizkaia (Batuz)
Campo | Significado |
|
|
|
|
|
|
| Modelo interno del XML Batuz de alta. No procesar como contrato estable. |
| XML de Batuz cuando la factura se emitió originalmente sin Software Garante. |
Campos de anulación y rectificación
Campo | Cuándo aparece |
| La factura ha sido anulada. Contiene su propio |
| La factura ha sido subsanada vía Zuzendu (correcciones a una factura previa sin emitir una rectificativa). |
Los campos xmlModel, batuzModel, batuzModelZuzendu contienen el modelo interno desde el que el servidor genera el XML. Sus claves no son parte del contrato público y pueden cambiar entre versiones. Si necesitas inspeccionar el XML, usa el campo xml (string) o xmlNoSG.
Encadenamiento
TicketBAI exige que cada factura referencie a la inmediatamente anterior emitida por la misma empresa, creando una cadena verificable de extremo a extremo. Es la pieza que da resistencia al sistema: no se puede modificar una factura intermedia sin romper la cadena posterior.
El servidor calcula automáticamente la referencia y la guarda en meta.ticketbai.encadenamientoFactura:
Campo | Significado |
| Serie de la factura previa (puede no estar si la previa no la tenía). |
| Número de la factura previa. |
| Fecha de emisión de la factura previa. |
| Valor de la firma electrónica de la factura previa. |
Tu integración no escribe estos campos. Pero si los lees (para una herramienta de auditoría o verificación), conviene saber:
El orden lo determina la expedición, no la creación. El campo
meta.expeditionTimestampde la factura marca el instante en que pasó de provisional a definitiva.meta.ticketbai.ordenEncadenamientote da el índice numérico dentro de la cadena de la empresa.
Envío y reintentos
El envío a TicketBAI (y a Batuz en Bizkaia) se inicia al guardar la factura como definitiva:
Se genera el XML.
Se firma con el certificado de la empresa.
Se envía a la diputación correspondiente.
Si la respuesta es OK,
meta.ticketbai.sentpasa atrue. En Bizkaia se actualiza tambiénbatuzAcceptedobatuzAcceptedWithErrors.Si la respuesta es error técnico (timeout, indisponibilidad del servicio), la factura queda con
sent: falsey entra en cola de reintentos con backoff exponencial.Pasadas 24 horas desde el primer error sin éxito, los reintentos automáticos cesan y la factura queda marcada como no enviada. Tu integración puede detectarlo monitorizando
mustBeSent: true+sent: falsedurante un periodo prolongado.
No hay webhooks específicos de TicketBAI. A diferencia de VeriFactu, que emite invoice.verifactu_sent, TicketBAI no genera eventos propios; tu integración debe leer meta.ticketbai cuando le interese conocer el estado.
Anulación
Cuando una factura se anula con PUT /invoices/{id} enviando main.voided = true, el servidor:
Genera el XML de anulación.
Lo firma y lo envía a la diputación (y a Batuz en Bizkaia).
Rellena
meta.ticketbai.voidedcon el resultado del envío.Emite el webhook
invoice.voided.
La factura no desaparece: queda en estado voided con meta.ticketbai.voided.sent = true cuando la anulación se ha confirmado. La anulación tiene su propia cola de reintentos.
Rectificativas
Las facturas rectificativas se crean con el CRUD normal de facturas (POST /invoices), enlazando con main.correctedInvoice a la factura original y rellenando main.ticketbai.claveTipoFacturaRectificativa con el código R1-R5 apropiado.
Hay un caso especial: cuando rectificas una factura simplificada desde Bizkaia con claveTipoFacturaRectificativa = "R5", el sistema usa un flujo distinto. Detalles, codificación de cada R# y ejemplos en la guía de Rectificativas.
Zuzendu (Bizkaia)
Zuzendu es el servicio de Bizkaia que permite subsanar una factura ya enviada sin emitir una rectificativa. El típico caso: un error tipográfico en el concepto o en una dirección, que no afecta a importes ni a la naturaleza de la operación.
Cuando una factura se subsana vía Zuzendu, el servidor:
Genera un XML de alta Zuzendu (con la corrección).
Lo envía a Batuz.
Rellena
meta.ticketbai.zuzenduAltacon elxmlModelyxmlcorrespondientes.Si Batuz acepta,
meta.ticketbai.batuzAcceptedZuzendupasa atrue.
Para facturas que se emitieron originalmente fuera de FacturaDirecta (sin Software Garante), el meta es distinto: InvoiceMetaBatuzNoSG en lugar de InvoiceMetaTicketbai. Tu integración debe comprobar la presencia de meta.batuzNoSG o similar para detectar este caso antes de procesar campos que solo existen en uno u otro.
Monitorizar el estado desde una integración
Como no hay webhooks específicos, el patrón recomendado para integraciones que necesitan saber si las facturas se han enviado correctamente es:
Tras crear o actualizar una factura, leer
meta.ticketbaide la respuesta o consultarla conGET /invoices/{id}.Si
mustBeSent: trueysent: false, programar un polling con backoff (por ejemplo, 1 min → 5 min → 30 min) hasta quesentpase atrueo se cumplan 24h.Para anulaciones: el mismo patrón sobre
meta.ticketbai.voided.En Bizkaia, además, comprobar
batuzAccepted/batuzAcceptedWithErrors.Para Zuzendu, comprobar
meta.ticketbai.zuzenduAltaybatuzAcceptedZuzendu.
Coexistencia con VeriFactu
Una factura emitida con TicketBAI no se envía también a VeriFactu: los dos regímenes son excluyentes y se determinan por la configuración fiscal de la empresa. En la práctica:
Empresa con domicilio fiscal en País Vasco → TicketBAI.
Empresa con domicilio fiscal en resto del Estado → VeriFactu (ver VeriFactu).
Si tu integración opera con empresas mixtas, no asumas el mismo flujo: en las páginas de factura tendrás meta.ticketbai rellenado en unas y meta.verifactu en otras.
Errores comunes
Enviar
claveTipoFacturaRectificativasin que la factura sea realmente rectificativa (no enlazada conmain.correctedInvoiceo no usando una serie de rectificativas). El XML se generará pero la diputación rechazará el envío en validación.Olvidar
batuzRentaIngresosen Bizkaia en operaciones donde es obligatorio. La diputación devuelve error de validación en el envío.Asumir que
meta.ticketbai.sent = truees inmediato trasPOST. Si la diputación está sobrecargada, puede tardar minutos; tu integración no debe bloquearse esperándolo.Procesar el contenido de
xmlModel(modelo interno) en lugar dexml(XML literal). El modelo interno no es contrato estable.
Referencias oficiales
Las haciendas forales publican la documentación técnica completa (esquemas XSD, códigos de error, validaciones) en sus webs:
Bizkaia (Batuz): www.batuz.eus
Para el significado funcional de los códigos (E1-E6, OT/RL/VT/IE, R1-R5) consulta siempre la documentación oficial: FacturaDirecta los acepta y los reenvía a la diputación, pero la autoridad sobre su semántica es la hacienda foral, no este sistema.