Documentación de Conexión API
Bienvenido a la especificación técnica de la API de **Digitaldocu Verifactu (Broker)**. Este middleware actúa como Componente de Facturación (CF) y centraliza las obligaciones normativas españolas del **Real Decreto 1007/2023 (Reglamento Verifactu)** y de la **Ley Crea y Crece**. Permite a cualquier software ERP o sistema de facturación principal (CPF) delegar la firma de facturas, el encadenamiento criptográfico, la generación de huellas, la remisión a la AEAT / SPFE, y la gestión de firmas de declaraciones responsables sin necesidad de implementar los protocolos complejos de forma nativa.
Características Principales de la Conexión
- Autenticación Simple: Uso de cabecera estándar con token API único por cliente.
- Protocolo no bloqueante: Recepción asíncrona de facturas con procesamiento en cola para respuesta inmediata y tolerancia a caídas de la AEAT.
- Onboarding Legal: Flujo digital automatizado para firmas de Declaración Responsable (Modelos A y B) integradas en Digitaldocu.
- Doble Remisión: Redirección simultánea y selectiva de registros a la AEAT y a la Solución Pública de Facturación Electrónica (Crea y Crece).
Arquitectura y Conexión de Actores
La normativa exige que todos los sistemas informáticos de facturación (SIF) garanticen la integridad, inmutabilidad y trazabilidad de los registros. En nuestra plataforma, esto se distribuye bajo un modelo de arquitectura dividida en tres actores principales:
1. Componente Principal de Facturación (CPF) — El ERP del Cliente
Es el sistema que interactúa con el usuario final. Al guardar o emitir una factura, el ERP debe realizar una llamada HTTP POST al Broker Verifactu.
Debe mostrar el código QR y la mención "Factura verificable en la sede electrónica de la AEAT" en el documento entregado al cliente,
tomándolos del bloque cotejo que devuelve el propio 202 de esa llamada
(o de GET /api/v1/invoices/{id}/cotejo). No hay que esperar al callback:
el art. 6.5.a del RD 1619/2012 cuelga el QR de la EXPEDICIÓN de la factura y sus cuatro datos
(NIF, número de serie y número, fecha, importe) son todos de la factura, no de la respuesta de la AEAT.
2. Componente de Facturación Central (CF) — El Broker
Recibe las solicitudes del ERP, encola los trabajos y procesa el encadenamiento de huellas SHA-256 en base a la última factura validada del cliente. Genera los documentos XML (SOAP de Verifactu o UBL de Crea y Crece), los firma digitalmente con el certificado de firma de la empresa y los envía a los servidores gubernamentales.
3. Receptor de la Factura (En Crea y Crece)
Las facturas del emisor se suben a la Solución Pública de Facturación Electrónica (SPFE). El receptor puede recibir la notificación de forma directa, y conectarse a la API del Broker para enviar el acuse de recibo o cambios en el estado de cobro/pago.
Autenticación
Todas las solicitudes dirigidas a los endpoints de la API deben autenticarse obligatoriamente mediante una cabecera personalizada en la petición HTTP. La clave es única por cliente, la genera siempre el servidor del Broker y opera en modo servicio: identifica a la empresa ante la API, pero no da acceso al panel de administración (el panel tiene su propio login de usuario, reservado al equipo del Broker).
Estructura de la Cabecera de Autenticación
Debe incluir la siguiente cabecera HTTP en todas las peticiones:
X-API-Key: su-token-api-unico-de-empresa
Nota: Las llamadas que no incluyan la cabecera recibirán un código de estado HTTP 401 Unauthorized.
Si la API Key es errónea, se responderá con un código HTTP 403 Forbidden.
Ciclo de vida de la API Key
- Se entrega una única vez, al dar de alta la empresa o al regenerarla (
POST /api/v1/companies/{id}/regenerate-key, sólo administración). - El Broker no almacena el valor en claro (sólo su hash SHA-256): si se pierde, no se puede recuperar — debe regenerarse.
- Los listados de administración muestran únicamente una pista (
api_key_hint, p. ej.ddv_a1b2…f9z4). - Regenerar la clave revoca la anterior en el acto: planifique el cambio con el cliente.
Envío de Factura Verifactu (REST JSON)
Este es el canal más sencillo para ERPs. El sistema recibe un JSON estructurado con la información comercial básica, encola el trabajo de forma inmediata y devuelve un identificador de seguimiento. El broker se encargará de transformar los campos, aplicar las huellas y enviarlo asíncronamente a la AEAT.
Parámetros de Solicitud (JSON Body)
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| series | string | Opcional | La serie de la factura (e.g. "F2026"). Puede ser una cadena vacía para series principales. |
| number | string | Obligatorio | El número correlativo de factura dentro de la serie (e.g. "4921"). |
| date | string | Obligatorio | Fecha de expedición en formato ISO YYYY-MM-DD (e.g. "2026-06-07"). |
| amount | float | Obligatorio | Importe total de la factura en euros, impuestos incluidos (e.g. 121.00). |
| tax | float | Obligatorio | Desglose del importe total de IVA aplicado en la factura (e.g. 21.00). |
| type | string | Obligatorio | El tipo de registro. Valores permitidos:
F1 (Factura ordinaria),
F2 (Factura simplificada / ticket),
ANUL (Anulación de factura previa).
|
Respuesta exitosa (202 Accepted)
El 202 ya autoriza a expedir la factura con su QR: el art. 6.5.a del
RD 1619/2012 (redacción del RD 1007/2023) cuelga el QR de la EXPEDICIÓN, y sus cuatro datos son
todos de la factura. Lo devuelven igual las tres rutas de ingesta
(/invoices, /invoices/xml y /invoices/{id}/subsanar).
- Cómo hay que imprimirlo. Las dos leyendas son obligatorias (la inferior admite
como alternativa "VERI*FACTU"), con letra "bien visible, similar a la del resto de datos"; el
QR va CUADRADO, entre
tamano_mm_minytamano_mm_max, nivel de correcciónM, normaISO/IEC 18004:2015. registro.generado: falseno es un error. La huella encadenada se calcula al componer el lote, después del202. Si tu política de impresión exige el registro previo, espera algenerado: truedeGET /api/v1/invoices/{id}/registro. El QR nunca implica registro.cotejoesnullcuando la empresa no tiene Verifactu contratado, y{"aplica": false, "motivo": "..."}cuando no hay QR que imprimir (untype: "ANUL"no se expide como factura).warningslleva los avisos NO bloqueantes. Presta atención aBROKER-SERIE-VACIA: si envíasseries: "", el registro se remite conNumSerieFactura=/número(con barra), y ese es el identificador con el que la AEAT guarda la factura y el que lleva el QR.
Estado de remisión y aviso de incidencia (art. 16.4)
El artículo 16.4 de la Orden HAC/1177/2024 obliga al sistema informático a avisar de que se ha producido una incidencia que ha impedido la remisión de todos los registros de facturación generados, indicando cuántos faltan por remitir, y a mantener ese aviso visible «mientras quede alguno de estos por remitir».
El Broker calcula ese dato y lo pone aquí a su disposición con su propia API Key. Mostrarlo al usuario es responsabilidad de su ERP — igual que la impresión del código QR: el Broker no tiene pantalla delante de nadie. Es el mismo reparto que declaran las Declaraciones Responsables de los dos componentes.
Cadencia: una petición por minuto. Nada de lo que devuelve esta ruta cambia más
rápido — el reloj del artículo 16.2 es de 60 s y la caducidad del certificado se relee cada 12 h.
Por encima de 120 peticiones por minuto y empresa, la respuesta es 429 con
Retry-After: 60.
Caducidad del certificado de firma
El bloque certificado de GET /api/v1/status dice cuándo caduca el
certificado de firma de esa empresa y cuántos días quedan. Viaja ahí, y no en un
webhook, porque la caducidad es un suceso de la empresa: el webhook de cambio de
estado se dispara por factura y nunca podría contarla. Es el único suceso seguro y con fecha
conocida de todo el sistema: pasa cada 1-2 años y, el día que pasa, falla el mTLS, las facturas
entran en reintentos y unas 8 horas después se para la cola entera de esa empresa.
El Broker NO avisa a nadie. Este bloque enuncia un hecho —caduca tal día, quedan N, o no hay certificado, o no se puede usar— y ahí acaba su responsabilidad: no manda un correo, ni un SMS, ni sabe si el cliente está enterado. Convertir ese hecho en un aviso a una persona es responsabilidad de su ERP, exactamente igual que el aviso de incidencia del artículo 16.4 y que la impresión del código QR: el Broker no tiene pantalla delante de nadie. Leerlo al revés —«el Broker ya avisa»— es exactamente cómo se llega al día de la caducidad sin que nadie haya hecho nada.
estadoya viene resuelto, con siete valores posibles:ok,avisoycritico(bandas por días restantes),caducado,sin_certificado(no hay ninguno instalado: no es lo mismo que «no lo hemos mirado»),sin_revisar(instalado, caducidad todavía sin leer) eilegible(instalado y el Broker no puede usarlo: el fichero no está, o no se puede abrir).avisonombra la ventana, no un aviso cursado. Es la misma palabra que usan el panel y el registro de incidencias del Broker para la banda de los 90 días. Que el estado seaavisono significa que se haya avisado a nadie: significa que toca avisar.caducidad_leida_eles cuándo leyó el Broker el fichero .p12 para sacar esa fecha — no cuándo se atendió nada. Sivigilancia_atrasadaestrue, esa lectura tiene más de dos vueltas del vigilante y los campos de este bloque no se están refrescando: escálelo.umbral_aviso_diasyumbral_critico_diasviajan en la respuesta para que no haya que duplicar la regla: son los mismos que aplican el panel y/health/deep, y los decide el operador por entorno.dias_restanteses negativo si ya caducó, y trunca hacia abajo (30 días y 6 horas son 30). Para contar los días transcurridos desde una caducidad no vale-dias_restantes: usedias_caducado, que vale0el mismo día en que caducó.mensajeestá redactado en castellano y listo para mostrar, y su consecuencia se ajusta al entorno: una cuenta de pruebas (incidencia.remite_a_aeat: false) nunca lee que su cola se vaya a parar, porque todavía no remite nada.- No devuelve el subject ni el issuer del certificado: el de un certificado de representante lleva el nombre y el DNI de una persona física, y no aportan nada a la única decisión que sostiene este bloque.
activa: falseconpendientes > 0no es un problema. El artículo 16.2 obliga a esperar entre envíos (inicialmente 60 s, el que indique la AEAT después), así que tener cola es el funcionamiento normal. Elavisolo explica.avisoesnullcuando no queda ningún registro por remitir: es exactamente la condición con la que el art. 16.4 deja de exigir la visualización.remite_a_aeat: falsesignifica que la cuenta está en entorno de pruebas y sus registros NO viajan a la AEAT. Nunca se declara incidencia en ese caso: sería una manifestación de contingencia falsa.- El mismo bloque
incidenciaviaja dentro de la respuesta deGET /api/v1/invoices/{id}, para que el aviso llegue sin añadir una llamada más. - Sólo devuelve datos de la empresa a la que pertenece la API Key. Sin cabecera,
401; con una clave que no resuelve a ninguna empresa,403.
Envío de Factura Verifactu (Facturae XML)
Si su ERP ya genera facturas electrónicas firmadas o sin firmar en el formato estándar del Ministerio de Industria (**Facturae 3.2.x**), puede enviar el archivo XML crudo directamente. El Broker lo parsea, comprueba sus datos y procesa el registro Verifactu de forma equivalente.
Subsanación de un registro emitido
Un registro ya emitido no se modifica ([SW] §9.1.2: "permanecerá inalterado"): se
crea un eslabón nuevo que lo subsana. La respuesta es el mismo 202 de arriba, con su
bloque cotejo.
Cambio de contrato: si la subsanación mueve ImporteTotal o
CuotaTotal, la respuesta es 422 con
BROKER-SUBSANACION-IMPORTES, sea cual sea el estado del original — antes era
solo un aviso. Con el QR entregado desde el 202, el papel ya está en la calle también
cuando el original está PENDING, PENDING_RETRY o REJECTED, y
una subsanación que cambia el importe invalida una factura ya entregada. El uso legítimo del flag
forzar_importes_subsanacion: true es el alta por rechazo (S,X): el registro previo fue
rechazado y la AEAT no llegó a tener la clave, así que no hay papel válido que invalidar.
Envío de Facturas Crea y Crece
Para empresas obligadas a operar bajo la ley **Crea y Crece**, la API permite enviar los datos de la factura en JSON (que el broker convertirá a XML UBL 2.1 estándar) o bien enviar directamente el documento XML UBL listo para la Solución Pública de Facturación Electrónica (SPFE).
Campos Adicionales del payload JSON
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| copy_indicator | integer | Opcional | Indica el canal de copia. Utilice 1 para factura original emitida y 0 para copias informativas. (Por defecto: 1) |
Registro de Estados de Pago (Crea y Crece)
La ley Crea y Crece obliga a reportar los estados de cobro y pago de las facturas emitidas para controlar la morosidad comercial. Los actores (proveedor o cliente) deben notificar al Broker los cambios de estado correspondientes.
Parámetros del Estado de Pago
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| invoice_id | integer | Obligatorio | ID interno de la factura Crea y Crece que ha cambiado de estado de pago. |
| status_type | string | Obligatorio | El tipo de estado de cobro/pago. Valores válidos:
PAID (Cobrada/Pagada completamente),
REJECTED (Factura rechazada por el destinatario),
DUE_DATE (Fecha de vencimiento alcanzada sin cobro).
|
| event_date | string | Obligatorio | Fecha en formato ISO YYYY-MM-DD en la que se produjo la transacción de pago o el rechazo. |
Callback URL (Webhooks)
Dado que el procesamiento del Broker es asíncrono y en cola, no bloquea al ERP durante la llamada al endpoint. El broker enviará un **HTTP POST** con los resultados finales de validación (AEAT y SPFE) a la `callback_url` configurada para el cliente.
Esquema de Notificación del Webhook (POST)
Su servidor de callback en el ERP recibirá peticiones con el siguiente cuerpo JSON:
Importante: Su endpoint de callback debe responder con un código HTTP 200 OK o 204 No Content para confirmar la recepción del evento.
El callback no lleva el QR. El QR se entrega en el 202 de ingesta
(bloque cotejo) y se puede volver a pedir en cualquier momento con
GET /api/v1/invoices/{id}/cotejo: sus cuatro datos son de la FACTURA y ninguno
viene de la respuesta de la AEAT, así que no hay que esperar a este webhook para imprimir.
El Broker reintentará hasta 3 veces el envío si se producen fallos de red.
Crea y Crece — Endpoints avanzados
Endpoints especializados para integraciones avanzadas con la Solución Pública de Facturación Electrónica (SPFE): pre-validación schematron EN 16931 sin persistencia, envío estructurado con mapeo automático a UBL 2.1, ingesta de Facturae 3.2.x y un canal síncrono que devuelve directamente el CSV de aceptación.
Pre-validación del XML UBL contra el conjunto de reglas schematron EN 16931 (perfil CIUS-FACE-B2G). No persiste nada en base de datos
ni encola trabajos. Útil para que el ERP detecte errores estructurales antes de emitir.
Cabeceras
| Cabecera | Valor |
|---|---|
| Content-Type | application/xml |
No requiere X-API-Key (endpoint de utilidad pública: no lee ni escribe dato alguno de ninguna empresa).
Sí tiene badén, porque cada llamada arranca Saxon: máximo 512 KiB de cuerpo (413 si se pasa)
y 30 validaciones por minuto e IP (429 con Retry-After).
Cuerpo
Respuesta exitosa (200 OK)
Errores
| HTTP | Cuándo ocurre |
|---|---|
| 400 | XML mal formado o vacío |
| 415 | Content-Type distinto de application/xml |
Recibe una factura en JSON estructurado siguiendo el modelo Invoice del broker, la transforma a UBL 2.1, ejecuta schematron EN 16931
y encola el trabajo de envío a la SPFE.
Cabeceras
| Cabecera | Valor |
|---|---|
| X-API-Key | Clave de empresa (obligatorio) |
| Content-Type | application/json |
| X-Skip-Validation | true para omitir schematron (opcional) |
Cuerpo (JSON)
Respuesta exitosa (202 Accepted)
Errores
| HTTP | Cuándo ocurre |
|---|---|
| 401 | Falta cabecera X-API-Key |
| 403 | API Key inválida |
| 409 | Duplicado (mismo unique_code) |
| 422 | Validación schematron EN 16931 falló (incluye findings en el cuerpo) |
Acepta un documento Facturae 3.2.x directamente. El broker realiza el mapeo a UBL 2.1, lanza la validación schematron y encola el envío.
Cabeceras
| Cabecera | Valor |
|---|---|
| X-API-Key | Clave de empresa (obligatorio) |
| Content-Type | application/xml |
Cuerpo
XML Facturae 3.2.x crudo (sin firmar o firmado XAdES).
Respuesta exitosa (202 Accepted)
Errores
| HTTP | Cuándo ocurre |
|---|---|
| 400 | Facturae mal formado o no soportado |
| 409 | Duplicado |
| 422 | Validación EN 16931 falló tras el mapeo |
Canal síncrono: ejecuta validación, transmisión a SPFE y devuelve directamente en la respuesta HTTP el CSV de aceptación y el código de respuesta. Útil para flujos interactivos donde no se quiere consumir el callback.
Cabeceras
| Cabecera | Valor |
|---|---|
| X-API-Key | Clave de empresa (obligatorio) |
| Content-Type | application/json |
Cuerpo (JSON)
Mismo modelo Invoice que /invoices/structured.
Respuesta exitosa (200 OK)
Errores
| HTTP | Cuándo ocurre |
|---|---|
| 422 | Validación schematron falló (no se transmite) |
| 502 | Transporte SOAP a SPFE falló (red, timeout o servicio caído) |
Incidencias y contingencia SPFE
El artículo 5.6 del RD 238/2026 permite declarar una incidencia técnica con la SPFE que abre una ventana de subsanación de 4 días durante la cual los reintentos se reanchorian al momento de la subsanación.
Marca la subsanación de la incidencia técnica, reanclando la ventana de 4 días y reagendando todas las facturas y pagos en estado
PENDING_RETRY. Puede aplicarse a una empresa concreta o de forma global a todas.
Cabeceras
| Cabecera | Valor |
|---|---|
| X-Admin-Token | Si está configurado DASHBOARD_TOKEN (obligatorio en ese caso) |
| Content-Type | application/json |
Cuerpo (JSON)
Respuesta exitosa (200 OK)
Errores
| HTTP | Cuándo ocurre |
|---|---|
| 401 | Falta X-Admin-Token cuando es obligatorio |
| 404 | company_id no encontrado |
Autorizaciones (Apoderamiento / Colaboración Social)
Gestión de las autorizaciones vigentes que permiten al broker actuar en nombre del obligado tributario, ya sea bajo régimen de apoderamiento (representación) o de colaboración social (acuerdo AEAT).
Upsert de la autorización vigente para una empresa. Si ya existe una autorización del mismo tipo, se sustituye.
Cabeceras
| Cabecera | Valor |
|---|---|
| X-Admin-Token | Obligatorio |
| Content-Type | application/json |
Cuerpo (JSON)
kind admite APODERAMIENTO o COLABORACION_SOCIAL. scope es CSV con uno o varios de
VERIFACTU, CREAYCRECE_OUT, CREAYCRECE_IN.
Respuesta exitosa (200 OK)
Devuelve la autorización vigente de la empresa. Responde 404 si no existe.
Cabeceras
| Cabecera | Valor |
|---|---|
| X-API-Key | Obligatorio — la clave de esa empresa. Alternativa: X-Admin-Token (operador del bróker). |
Acotado a la empresa de la ruta: sin credencial responde 401, y con la clave de otra empresa 403.
Respuesta exitosa (200 OK)
Errores
| HTTP | Cuándo ocurre |
|---|---|
| 404 | Empresa sin autorización vigente |
Marca la autorización vigente como revocada (cese de la representación).
Cabeceras
| Cabecera | Valor |
|---|---|
| X-Admin-Token | Obligatorio |
Respuesta exitosa (200 OK)
Flujo de firma de apoderamiento
Proceso digital en tres pasos para generar y firmar el documento de apoderamiento con OTP por SMS y firma manuscrita en imagen. Al completarse, se emite automáticamente la Authorization correspondiente.
Genera el PDF borrador del documento de apoderamiento para revisión del representante.
Cabeceras
| Cabecera | Valor |
|---|---|
| X-API-Key | Obligatorio — la clave de esa empresa. Alternativa: X-Admin-Token (operador del bróker). |
Acotado a la empresa de la ruta: sin credencial responde 401, y con la clave de otra empresa 403.
Cuerpo (JSON)
Respuesta exitosa (200 OK)
Cuerpo binario PDF con cabecera Content-Type: application/pdf.
Emite un código OTP para autorizar la firma del apoderamiento.
Aviso: este canal todavía NO tiene pasarela de SMS. El código se
genera pero no sale del servidor, así que la respuesta devuelve
"sent": false y "estado_envio": "SIMULADO" — antes devolvía
"sent": true, que era falso. En un despliegue de producción
(APP_ENV=prod) este endpoint responde 503 diciéndolo, en vez
de fingir un envío. El código sólo se puede recuperar con
DEBUG_RETURN_OTP=true en un entorno de desarrollo.
El destino no lo elige quien llama: el código sale siempre al móvil
del representante registrado en la ficha de la empresa (dr_phone). El
phone del cuerpo se usa sólo para cotejar; si no coincide con el
registrado, la respuesta es 400 y no se envía nada. Si la empresa no tiene
móvil registrado, también 400. Ritmo acotado: un código cada 30 s y como
mucho 5 por hora y empresa (429 al pasarse).
Cabeceras
| Cabecera | Valor |
|---|---|
| X-API-Key | Obligatorio — la clave de esa empresa. Alternativa: X-Admin-Token (operador del bróker). |
Acotado a la empresa de la ruta: sin credencial responde 401, y con la clave de otra empresa 403.
Cuerpo (JSON)
Respuesta exitosa (200 OK)
otp_code solo se devuelve cuando la variable de entorno DEBUG_RETURN_OTP=true. En producción nunca viaja en la respuesta.
Verifica el OTP, aplica la firma manuscrita al PDF y emite la autorización en BD.
Cabeceras
| Cabecera | Valor |
|---|---|
| X-API-Key | Obligatorio — la clave de esa empresa. Alternativa: X-Admin-Token (operador del bróker). |
Acotado a la empresa de la ruta: sin credencial responde 401, y con la clave de otra empresa 403.
Cuerpo (JSON)
Respuesta exitosa (200 OK)
Errores
| HTTP | Cuándo ocurre |
|---|---|
| 400 | OTP incorrecto, expirado o ya consumido |
| 429 | Cinco OTP fallidos seguidos: el código queda invalidado, hay que pedir uno nuevo |
| 404 | No existe borrador previo para la empresa |
Gestión de empresas (CRUD)
Operaciones administrativas sobre el catálogo de empresas registradas en el broker. Todas las operaciones de escritura requieren
X-Admin-Token.
Lista todas las empresas registradas. Todas las operaciones de este bloque (lecturas incluidas) requieren credencial de administración (sesión del panel o X-Admin-Token); las API keys nunca aparecen en claro, sólo su pista api_key_hint.
Respuesta exitosa (200 OK)
Alta o upsert (por NIF) de empresa. Si el NIF ya existe se actualizan sus campos.
Cabeceras
| Cabecera | Valor |
|---|---|
| X-Admin-Token | Obligatorio |
| Content-Type | application/json |
Cuerpo (JSON)
Respuesta exitosa (200 OK)
La api_key la genera el servidor y sólo aparece en la respuesta del alta (o de
POST /api/v1/companies/{company_id}/regenerate-key). Guárdela en ese momento: el Broker no la
almacena en claro y no puede volver a mostrarla.
Actualiza la ficha por ID. Soporta cambio de NIF: si el NIF cambia, el broker migra automáticamente todos los unique_code
de las facturas Crea y Crece asociadas para preservar la trazabilidad.
Cabeceras
| Cabecera | Valor |
|---|---|
| X-Admin-Token | Obligatorio |
| Content-Type | application/json |
Cuerpo (JSON)
Mismo modelo CompanyConfig que el endpoint POST /companies.
Respuesta exitosa (200 OK)
Errores
| HTTP | Cuándo ocurre |
|---|---|
| 404 | company_id no encontrado |
| 409 | El nuevo NIF ya está en uso por otra empresa |
Sube el certificado de firma de la empresa en formato PKCS#12 (.p12 / .pfx).
Cabeceras
| Cabecera | Valor |
|---|---|
| X-Admin-Token | Obligatorio |
| Content-Type | multipart/form-data |
Cuerpo (multipart)
| Campo | Tipo | Descripción |
|---|---|---|
| file | file | Archivo binario .p12 o .pfx |
| password | string | Contraseña del PKCS#12 |
Respuesta exitosa (200 OK)
Estado y texto de las Declaraciones Responsables (Modelos A y B) de una empresa.
Es un endpoint de administración del bróker, no de integración:
exige X-Admin-Token y una API key de empresa no sirve.
Si lo que necesitas es la declaración responsable del componente para
mostrarla dentro de tu sistema (artículo 15.3 de la Orden HAC/1177/2024), usa
GET /api/v1/declaracion, que va con tu propia
X-API-Key.
Cabeceras
| Cabecera | Obligatoriedad | Descripción |
|---|---|---|
X-Admin-Token | Obligatorio | Token de administración del bróker. |
Respuesta exitosa (200 OK)
modelo_X_text es el documento que se emitió: si la
declaración ya se mandó a firmar, se recompone con la versión y la fecha de
aquel día, no con las de hoy. Mientras no se haya emitido ninguna,
modelo_X_text_es_borrador vale true y el texto es un
borrador. modelo_X_ampara_version_actual en false
significa que la declaración firmada no cubre la versión que el bróker está
declarando a la AEAT (artículo 13.2 del Real Decreto 1007/2023): hay que
reemitirla.
La declaración responsable del componente de facturación, con tu
X-API-Key. Existe para que puedas mostrarla dentro de tu sistema
informático «de manera legible e individualizada […] y accesible por el usuario
de forma rápida, fácil e intuitiva», que es lo que exige el artículo 15.3 de la
Orden HAC/1177/2024. Devuelve sólo lo de tu empresa.
Respuesta exitosa (200 OK)
Cotejo AEAT y monitorización
Endpoints de consulta para imprimir el QR de cotejo en la factura, inspeccionar los XML SOAP enviados / recibidos, leer la cola y los logs de auditoría, y verificar la integridad de la cadena de huellas SHA-256.
Devuelve la URL pública de cotejo AEAT y el QR PNG (codificado en data URI). Es el MISMO bloque que
ya viene en el 202 de ingesta: se puede pedir en cualquier momento y
no exige que la factura esté validada.
Respuesta exitosa (200 OK)
- La URL apunta a
prewww2.aeat.esconaeat_env=TESTy awww2.agenciatributaria.gob.esenPROD. La ruta es/wlpl/TIKE-CONT/ValidarQRy los parámetros sonnif,numserie,fecha(DD-MM-AAAA) eimporte(2 decimales). numserieesserie/número— el mismoNumSerieFacturacon el que se remite el registro. Si emites sin serie lleva barra inicial (/4921) y el202te lo avisa conBROKER-SERIE-VACIA.aeat_registrado: falsesignifica «expedida, todavía no confirmada por la AEAT». El QR es válido igual: nunca implica registro.csvsigue vacío hasta que la AEAT registre.aplica: false+motivocuando NO hay QR que imprimir: un registro de anulación (type: "ANUL") no se expide como factura, y una empresa enaeat_env=MOCKsobre un despliegue de producción no tiene cotejo de demo servible.anulada: trueavisa de que existe un registro de anulación de esa clave: el cotejo de la AEAT responderá «no consta» (resultado01, que engloba las anuladas) aunqueaeat_registradoseatrue.demo: trueavisa de que esa URL NO es de la AEAT: es el cotejo simulado del propio bróker (aeat_env=MOCK).
¿Existe ya el registro de facturación (la huella encadenada) de esta factura? Sin
red y sin AEAT. En el 202 todavía no existe: la huella y
FechaHoraHusoGenRegistro se calculan al componer el lote.
El contrato: el 202 te autoriza a expedir la factura con su QR; si tu
política de impresión exige el registro previo, espera al generado: true de aquí.
A diferencia del cotejo, este endpoint NO resuelve linaje: responde por ESTE id.
Lista facturas. Acepta el parámetro opcional ?company_id=N para filtrar.
Respuesta exitosa (200 OK)
Detalle completo de una factura.
Cabeceras
| Cabecera | Valor |
|---|---|
| X-API-Key | Obligatorio |
Respuesta exitosa (200 OK)
Devuelve el XML SOAP enviado a la AEAT para esta factura. Cabecera Content-Type: application/xml.
Devuelve el XML SOAP de respuesta recibido de la AEAT.
Event log / auditoría de la empresa indicada.
Respuesta exitosa (200 OK)
Contadores actuales de la cola de procesamiento.
Respuesta exitosa (200 OK)
Lanza una auditoría de integridad de la cadena de huellas SHA-256 de las facturas de la empresa. Detecta saltos, huellas rotas o registros faltantes.
Cabeceras
| Cabecera | Valor |
|---|---|
| X-Admin-Token | Obligatorio |
Respuesta exitosa (200 OK)
status puede tomar los valores healthy, warning, broken o no_data.
Cuando healthy=false, details[] describe los huecos o discrepancias encontradas.