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 generado y la mención "Factura verificable en la sede electrónica de la AEAT" en el documento entregado al cliente, obteniendo estos datos de vuelta a través de callbacks/webhooks.
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).
|
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.
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 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).
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.
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.
Cuerpo (JSON)
Respuesta exitosa (200 OK)
Cuerpo binario PDF con cabecera Content-Type: application/pdf.
Envía un código OTP al teléfono del representante para autorizar la firma.
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.
Cuerpo (JSON)
Respuesta exitosa (200 OK)
Errores
| HTTP | Cuándo ocurre |
|---|---|
| 400 | OTP incorrecto, expirado o ya consumido |
| 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)
Devuelve el estado y los datos de las Declaraciones Responsables (Modelos A y B) de la 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). Útil para imprimir el QR en la factura entregada al cliente.
Respuesta exitosa (200 OK)
La URL apunta a prewww2.aeat.es cuando la empresa está en aeat_env=TEST y a
www2.agenciatributaria.gob.es en PROD.
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.