Para desarrolladores

La API de Factuza

El mismo motor que usan la web y la app: huella encadenada SHA-256, numeración por serie, PDF con QR de cotejo y remisión a la AEAT.

Estado: preview para integradores. La API funciona y está probada, pero el plan Motor API todavía no se contrata desde la web. Si quieres integrarla, escríbenos a hola@factuza.com y te damos acceso al entorno de pruebas.

Esto no es una lista de intenciones: cada ejemplo de esta página se ejecuta en cada pasada de la suite (caso CU-K04). Si algo dejara de funcionar, la prueba se pone roja antes de que lo descubras tú.

1. Para quién es esto

Para software que ya gestiona un negocio —un taller, una clínica, una academia, un ERP vertical— y necesita que sus facturas cumplan VeriFactu sin reescribir la parte fiscal. Tu sistema sigue siendo el que manda; Factuza pone la numeración, la huella encadenada, el PDF y la remisión.

Lo que no es: una pasarela de firma ni un simple generador de PDF. Cada factura que emites por aquí nace con su registro de facturación, entra en la cadena de huellas y se remite a la Agencia Tributaria igual que si la hubieras emitido desde la web.

Una factura emitida no se borra. Entra en la cadena de huellas y ahí se queda. Lo que existe es anular y rectificar, que son dos operaciones distintas y las dos dejan rastro. Prueba en el entorno de pruebas antes de emitir de verdad.

2. Autenticación: la clave de API

Toda la API acepta dos credenciales: el token de una persona (lo que usan la web y la app) o una clave de API, que es la de una máquina. Para integrar, la tuya es la segunda.

Una clave se crea desde el área de clientes, con tu usuario de administrador, y viaja en una cabecera:

X-Api-Key: fzk_x8Kq2vN...

Tres reglas que conviene saber antes

La clave hereda los permisos de tu cuenta: sus emisores, su plan y su licencia. No puede emitir a nombre de un NIF que no sea el tuyo, y si tu licencia caduca deja de emitir igual que la web — pero sigue pudiendo consultar y descargar lo ya emitido, porque tus libros son tuyos.

3. Tu primera factura, paso a paso

Cinco llamadas. Todas con la misma cabecera y ninguna con token de usuario. El ejemplo usa el entorno de pruebas, donde nada cuenta ni se remite a la AEAT.

01¿Quién soy?

Antes de nada, con qué emisores puede trabajar tu clave. De aquí sale el NIF y el nombre que van en la factura: no los teclees, léelos.

curl https://func-factuza-test-obt1.azurewebsites.net/api/emisores \
  -H "X-Api-Key: $FACTUZA_CLAVE"

{ "emisores": [ { "emisorId": 2, "nif": "B87654323",
                 "nombreRazon": "Pruebas Automaticas SL" } ],
  "plan": "PYME", "tope": 1, "usados": 1, "disponibles": 0 }

02Tu serie

El número de factura lo pone el servidor, dentro de la misma transacción que la emite. Tú mandas el serieId, no el número: teclearlo desde fuera deja la correlatividad en manos de que nadie se equivoque, y un hueco en la numeración hay que justificarlo ante Hacienda.

curl https://func-factuza-test-obt1.azurewebsites.net/api/series \
  -H "X-Api-Key: $FACTUZA_CLAVE"

{ "series": [ { "serieId": 1, "codigo": "PRU", "activa": true,
                "siguienteNumero": "PRU-2026/0457" } ], "total": 1 }

03Emitir

El cuerpo mínimo de una factura normal (F1) con una sola base y un solo tipo. Para varias líneas o tratamientos especiales de IVA, usa POST /facturas/detallada.

curl -X POST https://func-factuza-test-obt1.azurewebsites.net/api/facturas \
  -H "X-Api-Key: $FACTUZA_CLAVE" \
  -H "Content-Type: application/json" \
  -d '{
    "nifEmisor": "B87654323",
    "nombreEmisor": "Pruebas Automaticas SL",
    "numSerieFactura": "",          // lo pone la serie
    "serieId": 1,
    "fechaExpedicion": "2026-08-23",
    "tipoFactura": "F1",
    "descripcion": "Primera factura por API",
    "nifDestinatario": "B12345674",
    "nombreDestinatario": "Cliente de pruebas SL",
    "baseImponible": 100,
    "tipoImpositivo": 21
  }'

Responde 201 —se ha creado un recurso, no es un 200— con el número que ha puesto la serie y la huella:

{ "facturaId": 457,
  "numSerieFactura": "PRU-2026/0457",
  "huella": "9F2A…64 caracteres en hexadecimal" }

Sin huella no es VeriFactu. Son 64 caracteres: el SHA-256 del registro, encadenado con el de la factura anterior.

04El PDF

Con su QR de cotejo, listo para mandárselo al cliente.

curl https://func-factuza-test-obt1.azurewebsites.net/api/facturas/457/pdf \
  -H "X-Api-Key: $FACTUZA_CLAVE" -o factura.pdf

05Cómo vas de consumo

Esta ruta la puede llamar una máquina, al revés que las de gestión de claves: negarte saber por dónde vas y luego cobrarte el exceso sería tenderte una trampa.

curl https://func-factuza-test-obt1.azurewebsites.net/api/claves-api/consumo \
  -H "X-Api-Key: $FACTUZA_CLAVE"

{ "desde": "2026-08-01…", "hasta": "2026-09-01…",
  "porEmisor": [ { "nif": "B87654323", "registros": 12,
                   "incluidos": 3000, "restantes": 2988,
                   "exceso": 0, "eurosDeExceso": 0 } ],
  "totalRegistros": 12, "peticionesPorMinuto": 120 }

4. Los cuatro flujos que importan

Emitir

POST /facturas para el caso simple, POST /facturas/detallada cuando hay varias líneas, descuentos, o tratamientos de IVA distintos del normal (exenta, inversión del sujeto pasivo, no sujeta por localización, suplido). Sin destinatario sale una simplificada (F2), que no da derecho a deducir el IVA a quien la recibe.

Anular y rectificar — no son lo mismo

Una factura ya cobrada no se anula. Es una regla del motor, no de la interfaz.

Gastos

POST /gastos da de alta un gasto deducible, que queda pendiente hasta que alguien lo da por bueno con POST /gastos/{id}/validar. Esa parada es deliberada: un gasto mal leído que entra solo en la contabilidad no se nota hasta que llega el trimestre.

Si tienes la foto o el PDF y no los datos, POST /ocr/analizar devuelve un borrador con lo que ha leído y una lista de en qué no se fía de sí mismo. Nunca crea el gasto: lo propone.

Exportación legal

GET /exportar/registros?desde=&hasta= devuelve los registros de facturación en el formato estandarizado del artículo 10 del RD 1007/2023: un XML por registro, la cadena de huellas en CSV y un manifiesto para poder recalcularlas y comprobar que nadie ha tocado nada. Es lo que hay que poder entregar en una inspección.

GET /exportar/gestoria es otra cosa distinta: el paquete cómodo para el asesor, con PDF y CSV.

5. Cuotas y límites

LímiteCuántoQué pasa al pasarse
Registros por emisor y mes 3.000 incluidos Nada se bloquea. El exceso se factura a 2 € por cada 1.000.
Peticiones por minuto 120 429 con cabecera Retry-After.

La asimetría es deliberada y vale la pena entenderla: un tope mensual que cortara la emisión dejaría a un obligado tributario sin poder cumplir la ley por un asunto comercial nuestro. Emitir una factura no es un capricho, tiene fecha. Así que el tope mensual avisa y se cobra.

El límite por minuto sí corta, y por un motivo distinto: un bucle roto en una integración no es la obligación legal de nadie — es una avería que, sin freno, se lleva por delante el servicio de los demás. El 429 además te avisa de que tienes un fallo.

6. Errores

CódigoQué significa
400El cuerpo no vale. El mensaje dice qué campo y por qué, en castellano.
401Sin credencial válida: falta la cabecera, la clave no existe o está revocada.
403Tu cuenta no puede hacer eso: rol insuficiente, licencia no vigente, o un emisor que no es tuyo.
404No existe — o no es tuyo. Pedir el recurso de otra cuenta responde igual que pedir uno que no existe, a propósito.
409Conflicto: ya existe, o el estado no permite la operación (anular una factura cobrada).
429Demasiadas peticiones por minuto. Espera lo que diga Retry-After.

Los errores traen un cuerpo JSON con error y, cuando ayuda, un detalle. Están escritos para que se entiendan sin conocer nuestras tripas: «No puedes emitir facturas a nombre de X. Tu cuenta emite como Y» dice qué pasa y cómo se arregla.

Lo más usado. Todas cuelgan de https://func-factuza-prod-obt1.azurewebsites.net/api en producción y de …-test-… en pruebas.

VerboRutaQué hace
get/emisoresCon qué emisores trabaja tu clave
get/seriesTus series y el siguiente número
post/facturasEmitir (base y tipo únicos)
post/facturas/detalladaEmitir con líneas y tratamientos de IVA
get/facturasListado, con filtros
get/facturas/{id}/pdfEl PDF con su QR
post/facturas/{id}/anularAnular (no borra)
post/facturas/{id}/rectificarRectificar (crea otra)
post/facturas/{id}/emailMandarla por correo
get/gastosGastos del periodo
post/gastosAlta de gasto (queda pendiente)
post/gastos/{id}/validarDarlo por bueno
post/ocr/analizarLeer una foto o un PDF (propone, no crea)
get/maestras/destinatariosTus clientes
get/resumenFacturado, trimestre y pendiente de cobro
get/modelos/{modelo}Borrador del 303, 130, 390…
get/exportar/registrosExportación legal del art. 10
get/claves-api/consumoTu consumo del mes

Hay más de sesenta rutas en total —presupuestos, recurrentes, cobros, series, usuarios—. Si echas en falta alguna, escríbenos y te decimos si existe.

8. Compromiso de versión