ERP, software de gestión y SaaS

TicketBAI para ERP y SaaS: tu numeración, tus clientes, nuestra conexión con Hacienda

Tu ERP sigue emitiendo las facturas. KubiBAI genera el XML de cada hacienda foral, lo firma, lo envía y te devuelve el resultado. Esto es lo que te toca a ti y lo que no.

Tu ERP sigue mandando

Adaptar un ERP a TicketBAI no tiene por qué significar meter dentro del producto la firma, los XML de tres haciendas y el encadenamiento. Con KubiBAI, tu software conserva sus clientes, sus líneas, sus precios y su numeración. Cuando emite una factura, la manda en JSON a una API REST y recibe de vuelta el resultado de la hacienda foral, el identificador TBAI y el QR para la factura.

Es el mismo planteamiento para un ERP clásico, un software de gestión sectorial o un SaaS que factura por cuenta de muchas empresas. Lo que cambia es cuántas empresas gestionas, y de eso va el apartado «Una API key por empresa».

Qué te toca a ti y qué no

Te toca a ti:

  • Decidir cuándo se emite una factura y con qué numeración.
  • Montar el JSON con los datos de la factura: emisor, destinatarios, conceptos y desglose fiscal.
  • Guardar lo que devuelve KubiBAI, sobre todo el signature_value y el identificador de la factura, y mostrar su estado a tu usuario.

Te quitas de encima:

  • Generar el XML TicketBAI, con la estructura que pide cada hacienda, a partir de un único formato JSON.
  • Firmarlo. KubiBAI firma con su certificado de Software Garante, o con el tuyo si eres titular de uno.
  • El encadenamiento con la factura anterior, si activas el encadenamiento automático de la empresa. Es opcional y se activa desde el panel web.
  • El envío a Araba, Bizkaia o Gipuzkoa y la gestión de su respuesta.

Una API key por empresa

KubiBAI trabaja con dos credenciales. La API key de usuario (X-Qbikode-UserApiKey) es la tuya, como intermediario, y sirve para dar de alta empresas y consultar la configuración. Cada empresa o profesional recibe además su propia API key (X-Qbikode-ClientApiKey), con la que se emiten sus facturas.

El alta es una llamada a POST /clientcompanies con el territorio, el NIF, el nombre o la razón social y si es persona física. La respuesta incluye la API key de esa empresa. Si tu software factura por muchos clientes, el alta se puede automatizar desde tu propio proceso de alta de empresas, y cada una opera con su credencial.

Los detalles, con los campos obligatorios, están en la guía de empresas y credenciales.

Las autorizaciones de representación

Cuando KubiBAI actúa por vía telemática en nombre de una empresa, esa empresa tiene que firmar una autorización de representación. Se carga por empresa de tres maneras: desde el panel, con una petición multipart/form-data o con una petición JSON con el archivo en Base64 (PDF, JPG o PNG).

Dos cosas conviene saber antes de diseñar el flujo:

  • No hace falta en Araba ni si eres titular de Software Garante.
  • Un 200 al subir el documento confirma que se ha recibido, no que se haya validado. Mientras está pendiente de validación, las operaciones que la requieren no se pueden hacer, y KubiBAI te avisa cuando se aprueba o se rechaza.

Más detalle en la guía de autorizaciones.

Facturas ordinarias, rectificativas y anulaciones

La mayoría del tráfico de un ERP son facturas completas, pero hay que cubrir los casos que se salen del camino feliz:

  • Rectificativas. Por sustitución (rectificative_type_code: "S") la nueva factura lleva los importes correctos y la base y la cuota originales; por diferencias (I) solo registra la diferencia. Se indica el motivo, de R1 a R5, y qué factura se corrige.
  • Anulaciones. Son un registro adicional de TicketBAI: invalidan la factura a efectos fiscales sin borrarla, y su número no se reutiliza.
  • Correcciones sin cambiar el total. En Araba y Gipuzkoa, Zuzendu permite corregir datos del emisor, del destinatario o de los conceptos. Si cambia el precio final, toca una rectificativa.

Todos tienen su JSON en los ejemplos de la API.

Lo que cambia según el territorio

Los tres territorios comparten formato, pero no reglas. Algunas diferencias que se notan al integrar:

  • Los conceptos (concepts) son obligatorios en Araba y Gipuzkoa y pueden omitirse en Bizkaia, salvo que generes también FacturaE.
  • En Bizkaia, las comunidades de bienes, las sociedades civiles y las comunidades de propietarios se tramitan por el modelo 140 y envían los datos de renta en income_data_items.
  • El LROE es propio de Bizkaia. Con él puedes enviar gastos (modelo 140), facturas recibidas (modelo 240) y operaciones de bienes, siempre que seas titular de Software Garante y uses tu propio certificado.
  • Zuzendu existe en Araba y Gipuzkoa, pero no en Bizkaia.

Para el contexto fiscal de Bizkaia, tienes la guía de BATUZ, TicketBAI y LROE.

Clientes extranjeros y administraciones públicas

Un destinatario extranjero se identifica con other_id_country_code, other_id_type y other_id_card_id en lugar de un NIF. Para facturar a una administración pública, generate_facturae: true genera en la misma petición la factura TicketBAI y el XML FacturaE 3.2.1, con los centros DIR3 del destinatario. KubiBAI no envía el FacturaE a FACe: la entrega la gestionas tú.

Síncrono o asíncrono

Si tu ERP emite en lote, de noche o por muchas empresas, no tiene por qué esperar a la hacienda en cada llamada. Con async_mode en lite o full, la petición vuelve enseguida y el resultado te llega por webhook o lo consultas por el estado de la factura. Con none, recibes el resultado en la propia respuesta.

Del entorno de pruebas a producción

Las facturas del entorno de pruebas se envían a los servidores de pruebas de TicketBAI, así que validas el flujo completo, con firma y respuesta de la hacienda, sin datos reales. Cuando todo encaja, cambias la URL base (de wstests.kubibai.com a kws.kubibai.net) y usas las credenciales de producción.

Cómo se integra

  1. Pide acceso al entorno de pruebas con tu API key de usuario.
  2. Da de alta una empresa por territorio y copia su API key.
  3. Carga la autorización de representación si la empresa la necesita.
  4. Envía una factura básica y sigue con los casos que te toquen.
  5. Revisa el flujo de errores y reenvíos, y pasa a producción.

Si tus clientes están también en territorio común, KubiFACTU resuelve lo mismo para la AEAT: VeriFactu para ERP.

Ejemplos

Dos peticiones típicas de un ERP

Una factura ordinaria y una rectificativa por sustitución, con lo que cambia en cada una resaltado.

Factura básica

Una factura ordinaria de 121,00 € de una empresa de Gipuzkoa: un servicio de 100,00 € con IVA del 21 %, a otra empresa.

  • sender_data identifica al emisor por su NIF y su territorio; tienen que coincidir con la empresa de la X-Qbikode-ClientApiKey.
  • local_subject_not_exempt_items lleva el desglose del IVA: base, tax_rate (2100 es el 21 %) y cuota.
  • previous_invoice_data encadena con la factura anterior; puedes omitirlo si activas el encadenamiento automático desde el panel web.
  • Los importes van en céntimos: total_amount: 12100 son 121,00 €.
Ver este ejemplo en la documentación (abre en nueva pestaña)
POST /invoicing/invoices
{  "sender_data": {    "sender_ticketbai_territory_id": "dded8ad1-0574-4ee4-b4f7-36687cba73b9",    "sender_is_individual": false,    "sender_full_name": "Empresa Ejemplo S.L.",    "sender_id_card_number": "B12345674"  },  "recipients": [    {      "tax_id_number": "B76543214",      "full_name": "Cliente Ejemplo S.A.",      "postal_code": "20004",      "address": "Avenida de la Libertad 1"    }  ],  "invoice_data": {    "fiscal_year": 2026,    "series_code": "A",    "invoice_number": "2026-002",    "invoice_datetime": "2026-07-22 10:30:00",    "description": "Servicio de consultoría",    "total_amount": 12100,    "vat_keys": [      {        "transaction_of_tax_significance_code": "01"      }    ],    "concepts": [      {        "description": "Servicio de consultoría",        "quantity": 100,        "unit_price": 10000000000,        "total_price": 12100      }    ],    "local_subject_not_exempt_items": [      {        "vat_not_exempt_type": "S1",        "vat_breakdown_items": [          {            "taxable_amount": 10000,            "tax_rate": 2100,            "tax_quota": 2100          }        ]      }    ]  },  "previous_invoice_data": {    "signature_value": "firma-ficticia-factura-2026-001",    "series_code": "A",    "invoice_number": "2026-001",    "invoice_date": "2026-07-21"  }}

Rectificativa por sustitución

Corrige el precio de una factura: la base debió ser de 80,00 € y no de 100,00 €. La nueva factura trae los importes correctos.

  • rectificative_type_code: "S" indica que los importes correctos sustituyen a los originales.
  • rectified_base_amount y rectified_quota llevan la base y la cuota originales; el desglose y total_amount, los nuevos.
  • replaced_rectified_invoices identifica la factura que se corrige, y previous_invoice_data la anterior de la cadena. Son cosas distintas.
Ver este ejemplo en la documentación (abre en nueva pestaña)
POST /invoicing/invoices
{  "sender_data": {    "sender_ticketbai_territory_id": "dded8ad1-0574-4ee4-b4f7-36687cba73b9",    "sender_is_individual": false,    "sender_full_name": "Empresa Ejemplo S.L.",    "sender_id_card_number": "B12345674"  },  "recipients": [    {      "tax_id_number": "B76543214",      "full_name": "Cliente Ejemplo S.A.",      "postal_code": "20004",      "address": "Avenida de la Libertad 1"    }  ],  "invoice_data": {    "fiscal_year": 2026,    "series_code": "A",    "invoice_number": "2026-006",    "invoice_datetime": "2026-07-22 12:30:00",    "rectificative_reason_code": "R4",    "rectificative_type_code": "S",    "rectified_base_amount": 10000,    "rectified_quota": 2100,    "replaced_rectified_invoices": [      {        "series_code": "A",        "invoice_number": "2026-002",        "invoice_date": "2026-07-22"      }    ],    "description": "Corrección del precio del servicio de consultoría",    "total_amount": 9680,    "vat_keys": [      {        "transaction_of_tax_significance_code": "01"      }    ],    "concepts": [      {        "description": "Servicio de consultoría",        "quantity": 100,        "unit_price": 8000000000,        "total_price": 9680      }    ],    "local_subject_not_exempt_items": [      {        "vat_not_exempt_type": "S1",        "vat_breakdown_items": [          {            "taxable_amount": 8000,            "tax_rate": 2100,            "tax_quota": 1680          }        ]      }    ]  },  "previous_invoice_data": {    "signature_value": "firma-ficticia-factura-2026-005",    "series_code": "A",    "invoice_number": "2026-005",    "invoice_date": "2026-07-22"  }}

Dudas habituales

Preguntas sobre TicketBAI en el ERP

¿Tengo que cambiar la numeración de mis facturas?

No. Tu ERP sigue siendo el sistema principal y conserva sus clientes, líneas, precios y numeración: en cada petición envías la serie y el número de la factura (series_code e invoice_number).

¿Necesito un certificado digital por cada empresa cliente?

No para emitir facturas. KubiBAI las firma con su certificado de Software Garante, y la empresa emisora no tiene que configurar ningún certificado en KubiBAI. Si eres titular de Software Garante, puedes usar el tuyo.

¿Cómo doy de alta a una empresa cliente?

Con tu API key de usuario, llamando a POST /clientcompanies con el territorio, el NIF, el nombre o la razón social y si es persona física. La respuesta incluye la API key de esa empresa, que usarás en sus facturas. También puedes hacerlo desde el panel.

¿Cuándo hace falta la autorización de representación?

Cuando KubiBAI actúa por vía telemática en nombre de una empresa. No se exige en Araba ni si eres titular de Software Garante. Se carga desde el panel o por API, y hasta que se valida no pueden hacerse las operaciones que la requieren.

¿Cuándo rectifico y cuándo uso Zuzendu?

Si el cambio altera el importe total, se emite una factura rectificativa, por sustitución o por diferencias. Si solo corriges datos del emisor, del destinatario o de los conceptos sin cambiar el total, en Araba y Gipuzkoa puedes usar Zuzendu. En Bizkaia no está disponible.

Mi software factura en varios territorios, ¿qué cambia?

KubiBAI genera el XML que requiere cada hacienda a partir del mismo formato JSON, pero algunas reglas del cuerpo cambian según el territorio: por ejemplo, los conceptos son obligatorios en Araba y Gipuzkoa y pueden omitirse en Bizkaia.

¿Puedo probar antes de pasar a producción?

Sí. Las facturas del entorno de pruebas se remiten a los servidores de pruebas de TicketBAI, así que validas el flujo completo sin datos reales. Para pasar a producción cambias la URL base y las credenciales.

Empieza hoy

Conecta tu software con TicketBAI

Pídenos acceso al entorno de pruebas, integra con la documentación y pasa a producción cuando todo encaje.