Para desenvolvedores

A API de Factuza

O mesmo motor que usan a web e a app: pegada encadeada SHA-256, numeración por serie, PDF con QR de comprobación e remisión á AEAT.

Estado: preview para integradores. A API funciona e está probada, pero o plan Motor API aínda non se contrata desde a web. Se a queres integrar, escríbenos a hola@factuza.com e dámosche acceso ao contorno de probas.

Isto non é unha lista de intencións: cada exemplo desta páxina execútase en cada pasada da batería de probas (caso CU-K04). Se algo deixase de funcionar, a proba ponse vermella antes de que o descubras ti.

1. Para quen é isto

Para software que xa xestiona un negocio —un taller, unha clínica, unha academia, un ERP vertical— e precisa que as súas facturas cumpran VeriFactu sen reescribir a parte fiscal. O teu sistema segue sendo o que manda; Factuza pon a numeración, a pegada encadeada, o PDF e a remisión.

O que non é: unha pasarela de sinatura nin un simple xerador de PDF. Cada factura que emites por aquí nace co seu rexistro de facturación, entra na cadea de pegadas e remítese á Axencia Tributaria igual que se a emitises desde a web.

Unha factura emitida non se borra. Entra na cadea de pegadas e alí queda. O que existe é anular e rectificar, que son dúas operacións distintas e as dúas deixan rastro. Proba no contorno de probas antes de emitir de verdade.

2. Autenticación: a clave de API

Toda a API acepta dúas credenciais: o testemuño dunha persoa (o que usan a web e a app) ou unha clave de API, que é a dunha máquina. Para integrar, a túa é a segunda.

Unha clave créase desde a área de clientes, co teu usuario de administrador, e viaxa nunha cabeceira:

X-Api-Key: fzk_x8Kq2vN...

Tres regras que convén saber antes

A clave herda os permisos da túa conta: os seus emisores, o seu plan e a súa licenza. Non pode emitir a nome dun NIF que non sexa o teu, e se a túa licenza caduca deixa de emitir igual que a web — pero segue podendo consultar e descargar o xa emitido, porque os teus libros son teus.

3. A túa primeira factura, paso a paso

Cinco chamadas. Todas coa mesma cabeceira e ningunha con testemuño de usuario. O exemplo usa o contorno de probas, onde nada conta nin se remite á AEAT.

01Quen son?

Antes de nada, con que emisores pode traballar a túa clave. De aquí sae o NIF e o nome que van na factura: non os tecleés, léeos.

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 }

02A túa serie

O número de factura ponno o servidor, dentro da mesma transacción que a emite. Ti mandas o serieId, non o número: teclealo desde fóra deixa a correlatividade en mans de que ninguén se equivoque, e un oco na numeración hai que xustificalo ante Facenda.

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

O corpo mínimo dunha factura normal (F1) cunha soa base e un só tipo. Para varias liñas ou tratamentos especiais de IVE, 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 —creouse un recurso, non é un 200— co número que puxo a serie e a pegada:

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

Sen pegada non é VeriFactu. Son 64 caracteres: o SHA-256 do rexistro, encadeado co da factura anterior.

04O PDF

Co seu QR de comprobación, listo para mandarllo ao cliente.

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

05Como vas de consumo

Esta ruta si a pode chamar unha máquina, ao revés que as de xestión de claves: negarche saber por onde vas e logo cobrarche o exceso sería tenderche unha 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. Os catro fluxos que importan

Emitir

POST /facturas para o caso simple, POST /facturas/detallada cando hai varias liñas, descontos, ou tratamentos de IVE distintos do normal (exenta, inversión do suxeito pasivo, non suxeita por localización, suplido). Sen destinatario sae unha simplificada (F2), que non dá dereito a deducir o IVE a quen a recibe.

Anular e rectificar — non son o mesmo

Unha factura xa cobrada non se anula. É unha regra do motor, non da interface.

Gastos

POST /gastos dá de alta un gasto deducible, que queda pendente ata que alguén o dá por bo con POST /gastos/{id}/validar. Esa parada é deliberada: un gasto mal lido que entra só na contabilidade non se nota ata que chega o trimestre.

Se tes a foto ou o PDF e non os datos, POST /ocr/analizar devolve un borrador co que leu e unha lista de en que non se fía de si mesmo. Nunca crea o gasto: propono.

Exportación legal

GET /exportar/registros?desde=&hasta= devolve os rexistros de facturación no formato estandarizado do artigo 10 do RD 1007/2023: un XML por rexistro, a cadea de pegadas en CSV e un manifesto para poder recalculalas e comprobar que ninguén tocou nada. É o que hai que poder entregar nunha inspección.

GET /exportar/gestoria é outra cousa distinta: o paquete cómodo para o asesor, con PDF e CSV.

5. Cotas e límites

LímiteCantoQue pasa ao pasarse
Rexistros por emisor e mes 3.000 incluídos Nada se bloquea. O exceso factúrase a 2 € por cada 1.000.
Peticións por minuto 120 429 con cabeceira Retry-After.

A asimetría é deliberada e paga a pena entendela: un tope mensual que cortase a emisión deixaría a un obrigado tributario sen poder cumprir a lei por un asunto comercial noso. Emitir unha factura non é un capricho, ten data. Así que o tope mensual avisa e cóbrase.

O límite por minuto si corta, e por un motivo distinto: un bucle roto nunha integración non é a obriga legal de ninguén — é unha avaría que, sen freo, leva por diante o servizo dos demais. O 429 ademais avísate de que tes un fallo.

6. Erros

CódigoQue significa
400O corpo non vale. A mensaxe di que campo e por que, en castelán.
401Sen credencial válida: falta a cabeceira, a clave non existe ou está revogada.
403A túa conta non pode facer iso: rol insuficiente, licenza non vixente, ou un emisor que non é teu.
404Non existe — ou non é teu. Pedir o recurso doutra conta responde igual que pedir un que non existe, a propósito.
409Conflito: xa existe, ou o estado non permite a operación (anular unha factura cobrada).
429Demasiadas peticións por minuto. Agarda o que diga Retry-After.

Os erros traen un corpo JSON con error e, cando axuda, un detalle. Están escritos para que se entendan sen coñecer as nosas tripas: «No puedes emitir facturas a nombre de X. Tu cuenta emite como Y» di que pasa e como se arranxa.

O máis usado. Todas colgan de https://func-factuza-prod-obt1.azurewebsites.net/api en produción e de …-test-… en probas.

VerboRutaQue fai
get/emisoresCon que emisores traballa a túa clave
get/seriesAs túas series e o número seguinte
post/facturasEmitir (base e tipo únicos)
post/facturas/detalladaEmitir con liñas e tratamentos de IVE
get/facturasListaxe, con filtros
get/facturas/{id}/pdfO PDF co seu QR
post/facturas/{id}/anularAnular (non borra)
post/facturas/{id}/rectificarRectificar (crea outra)
post/facturas/{id}/emailMandala por correo
get/gastosGastos do período
post/gastosAlta de gasto (queda pendente)
post/gastos/{id}/validarDalo por bo
post/ocr/analizarLer unha foto ou un PDF (propón, non crea)
get/maestras/destinatariosOs teus clientes
get/resumenFacturado, trimestre e pendente de cobro
get/modelos/{modelo}Borrador do 303, 130, 390…
get/exportar/registrosExportación legal do art. 10
get/claves-api/consumoO teu consumo do mes

Hai máis de sesenta rutas en total —orzamentos, recorrentes, cobros, series, usuarios—. Se botas en falta algunha, escríbenos e dicímosche se existe.

8. Compromiso de versión