TPV y punto de venta

VeriFactu en tu TPV, sin rehacer la caja

Tickets y facturas simplificadas a buen ritmo, con el QR listo para imprimir y un envío diferido que absorbe las horas punta. Esto es lo que tienes que saber para integrarlo.

Qué cambia en un TPV con VeriFactu

Cada factura simplificada que emite tu TPV, el ticket de caja en la mayoría de comercios, genera un registro de facturación. Ese registro lleva una huella, se encadena con el anterior y se envía a la AEAT. Tu caja sigue calculando importes, impuestos y numeración como hasta ahora: lo nuevo es el registro y lo que tiene que aparecer en el ticket.

Con KubiFACTU, tu TPV envía los datos de la venta en JSON y recibe el registro ya generado, su estado y el QR. No hay XML que construir ni firmas que gestionar.

Lo que tiene que llevar el ticket

El ticket, impreso o digital, debe entregarse con un QR de cotejo que permita al cliente verificar que la factura se ha remitido a la AEAT. Según la documentación de la API:

  • Junto al QR debe aparecer la frase «Factura verificable en la sede electrónica de la AEAT» o «VERI*FACTU», con un tipo de letra y un tamaño visibles, similares a los del resto de datos.
  • El QR debe medir entre 30×30 y 40×40 milímetros.

El QR lo genera KubiFACTU. En la respuesta recibes qr_value (la URL que codifica) y qr_image_url (la imagen PNG), así que tu TPV solo tiene que imprimirlo en el ticket. Si la AEAT rechaza el registro, ambos campos llegan a null.

Ventas seguidas: el límite de la AEAT y el envío diferido

La AEAT limita cuántas solicitudes puede enviar cada obligado tributario. Por defecto, el límite es de una solicitud cada 60 segundos por CIF. La respuesta de la API te indica cuánto esperar antes de enviar otra (next_request_waiting_time y next_request_datetime).

Si tu cliente emite más de una factura por minuto, usa el envío diferido:

  1. Tu TPV envía la venta a /api/invoices/deferred, con la misma petición de siempre más una callback_url.
  2. KubiFACTU genera al momento los datos que necesitas, como el QR, para que puedas imprimir el ticket.
  3. El registro espera el margen que marca la AEAT, se envía, y el resultado llega a tu servidor por callback. Puede ser aceptado, aceptado con errores o rechazado.

Si el comercio no emite a ese ritmo, es más sencillo el envío normal: la AEAT responde en el momento, sin esperas ni callbacks.

Del ticket a la factura completa

Un ticket es una factura simplificada: invoice_type_key F2 y sin destinatario. Si el cliente pide después una factura con sus datos, se emite una factura en sustitución de la simplificada (F3), que indica en substituted_invoices cuál sustituye.

Los dos casos están como ejemplos de petición.

Si algo falla

  • Fallo de conexión con VeriFactu. Si la respuesta trae "vf_post_status": "failure" (timeout, error del servidor, falta de respuesta o un error de validación básica), no modifiques el registro ni generes otro de la misma factura. Reenvíalo con el endpoint de reenvío: se envía de nuevo sin regenerarlo, con la misma huella y el mismo encadenamiento.
  • La AEAT rechaza el registro. Se emite una subsanación con registro previo rechazado (correction_key S y previous_rejection_key X).
  • La AEAT lo acepta con errores. Se emite una subsanación ordinaria (correction_key S).

La subsanación solo se usa cuando la AEAT ha rechazado o aceptado con errores el registro de forma explícita. Los dos casos tienen su ejemplo.

Varias cajas y varias tiendas

Los registros se encadenan por separado dentro de cada SIF, el sistema informático de facturación, y para cada empresa. Hay una cadena por cada pareja de SIF y empresa emisora. Una empresa con varias tiendas puede dar un SIF a cada establecimiento para que su trazabilidad se trate por separado, aunque no es obligatorio. El encadenamiento lo calcula KubiFACTU.

Cómo se integra

  1. Regístrate en el entorno de pruebas, da de alta una empresa y copia su API-KEY.
  2. Envía una factura simplificada siguiendo el inicio rápido.
  3. Imprime el QR y la frase en tu ticket.
  4. Prueba el envío diferido y los fallos.
  5. Pasa a producción cuando todo encaje. Ten en cuenta que producción empieza de cero: las API-KEY y los SIF son nuevos.

Si tienes dudas sobre las fechas, mira los plazos de VeriFactu. Y si tu TPV también vende a comercios de Euskadi, el equivalente para las haciendas forales está en TicketBAI para TPV, con KubiBAI.

Ejemplos

Las peticiones de un TPV

La factura simplificada y el envío diferido, tal y como los usarías en una caja.

Factura simplificada (F2)

Factura simplificada de 242,00 €: 200,00 € de base más IVA del 21 %, sin destinatario.

  • invoice_type_key con el valor F2: factura simplificada y facturas sin identificación del destinatario (artículo 6.1.d del RD 1619/2012).
  • No se incluye recipients: no hay destinatario que identificar.
Ver este ejemplo en la documentación (abre en nueva pestaña)
POST /api/invoices
{  "sif_id": "9db0bca1-187e-4cf4-b87c-96f2044008d7",  "invoice_type_key": "F2",  "sender_data": {    "company_name": "Empresa emisora de ejemplo",    "tax_id_number": "J27290840"  },  "full_invoice_number": "2026-000010",  "fiscal_year": 2026,  "issue_date": "2026-01-03",  "operation_description": "Factura simplificada por entrega de mercancías.",  "total_quota": 42.00,  "total_amount": 242.00,  "tax_breakdown": [    {      "tax_type_key": "01",      "vat_tax_regime_key": "01",      "operation_type_key": "S1",      "tax_base": 200.00,      "tax_rate": 21.00,      "tax_quota": 42.00    }  ]}

Factura ordinaria en diferido

La misma factura de 121,00 €, enviada en modo diferido: no esperas la respuesta de la AEAT, te la comunicamos a tu servidor.

  • La petición va a /api/invoices/deferred en lugar de /api/invoices.
  • callback_url es la URL de tu servidor a la que se envía el resultado.
  • Es el modo pensado para emitir muchas facturas seguidas, como en un TPV.
Ver este ejemplo en la documentación (abre en nueva pestaña)
POST /api/invoices/deferred
{  "callback_url": "https://www.miservidor.com/kubifactu/callbacks/invoiceresult", // URL que apunta a tu servidor  "sif_id": "9db0bca1-187e-4cf4-b87c-96f2044008d7",  "invoice_type_key": "F1", // Factura (art. 6, 7.2 y 7.3 del RD 1619/2012)  "sender_data": {    "company_name": "Empresa emisora de ejemplo",    "tax_id_number": "J27290840"  },  "recipients": [    {      "company_name": "Empresa receptora de ejemplo",      "tax_id_number": "B99014037"    }  ],  "full_invoice_number": "2026-000001",  "fiscal_year": 2026,  "issue_date": "2026-01-01",  "operation_description": "Factura ordinaria por entrega de mercancías.",  "total_quota": 21.00,  "total_amount": 121.00,  "tax_breakdown": [    {      "tax_type_key": "01", // Impuesto sobre el Valor Añadido (IVA)      "vat_tax_regime_key": "01", // Operación de régimen general      "operation_type_key": "S1", // Operación Sujeta y No exenta - Sin inversión del sujeto pasivo      "tax_base": 100.00,      "tax_rate": 21.00,      "tax_quota": 21.00    }  ]}

Dudas habituales

Preguntas sobre VeriFactu en el TPV

¿Qué tiene que llevar el ticket con VeriFactu?

Un QR de cotejo de entre 30×30 y 40×40 milímetros y, junto a él, la frase «Factura verificable en la sede electrónica de la AEAT» o «VERI*FACTU», con un tipo de letra y un tamaño visibles, similares a los del resto de datos. KubiFACTU genera el QR y te devuelve su URL y su imagen.

¿Cuántas ventas por minuto admite?

La AEAT limita por defecto a una solicitud cada 60 segundos por CIF. Si tu cliente emite más de una factura por minuto, usa el envío diferido: se generan los datos del ticket al momento y el registro se envía respetando el margen de la AEAT, con aviso por callback.

¿Qué pasa si la AEAT no responde?

Un fallo técnico no es un rechazo. No hay que modificar el registro ni generar otro de la misma factura: se reenvía el mismo registro sin regenerarlo, con la misma huella y el mismo encadenamiento.

¿Puedo emitir la factura completa después del ticket?

Sí. El ticket es una factura simplificada y la factura completa se emite como una factura en sustitución de simplificada, que indica cuál sustituye.

¿Cada tienda o cada caja necesita su propio SIF?

No es obligatorio. Los registros se encadenan por separado dentro de cada SIF y para cada empresa, y una empresa con varias tiendas puede dar un SIF a cada establecimiento si quiere tratar su trazabilidad por separado.

¿Para cuándo tiene que estar adaptado mi TPV?

Según la AEAT, antes del 1 de enero de 2027 para quien presenta el Impuesto sobre Sociedades y antes del 1 de julio de 2027 para el resto de obligados.

Empieza hoy

Envía tu primer registro a VeriFactu

Regístrate en el entorno de pruebas, sigue el inicio rápido y envía tu primer registro. Cuando todo encaje, das de alta producción.