Z-Bombilla API
Conecta tus sistemas, automatiza procesos y potencia tu logística con nuestra potente API REST.
Ver documentaciónEndpoints principales
Consulta rápida a los servicios clave de la API REST
Crear envío
POST /api/envios
Crea un nuevo envío proporcionando remitente, destinatario y bultos.
Consultar envío
GET /api/envios/{id}
Consulta el estado y detalles de un envío existente.
Tarifas disponibles
POST /api/tarifas
Consulta tarifas para un envío antes de confirmarlo.
Autenticación
Accede a la API de forma segura mediante token
Para utilizar la API necesitas un token de acceso.
Solicítalo a través de nuestro equipo de soporte.
Authorization: Bearer {tu_token}
Integraciones disponibles
Compatible con los principales marketplaces y ERPs
POST /nuevoEnvio ? Pasarela de creación de envío
Abre Shipping con datos precargados (envío + destinatario + bultos) y, opcionalmente, productos y alertas del pedido.
Resumen
- Tipo:
application/x-www-form-urlencoded(form POST) - Acción: Shipping decodifica
envioJsony muestra el formulario con datos precargados. - Opcional:
itemsJson: productos (para pintar tabla ?Productos Marketplace?).alertasMarketplace: lista de avisos (para pintar el bloque de alertas).accessToken: auto-login / autorización (si aplica).order_id: id de pedido del marketplace (ej. Woo) para asociar tracking.combined: indica modo combinado (0/1).
Parámetros
| Nombre | Tipo | Obligatorio | Descripción |
|---|---|---|---|
envioJson |
string (Base64 JSON) | Sí* | Base64 del JSON de EnvioV3DTO (UTF-8). Es el payload principal. |
idExpedicion |
number | No | Si se envía, Shipping cargará una expedición existente y precargará el formulario (modo ?editar/duplicar?). |
marketplaceName |
string | No | Nombre del marketplace para rotular el bloque de productos (ej. WooCommerce). |
itemsJson |
string (Base64 JSON) | No | Lista de productos/líneas del pedido. Se usa para rellenar window.marketplaceItems. Ver detalle |
alertasMarketplace |
string (JSON o Base64 JSON) | No | Lista de alertas del pedido (se pinta arriba como lista). Ver detalle |
order_id |
string | No | ID pedido del marketplace (Woo lo usa para volver tracking). |
combined |
0/1 | No | Si 1, Shipping pinta productos por pedido (modo combinado). |
accessToken |
string | No | Token para auto-login / autorización. (Ej. plugin Woo lo manda si está configurado). |
envioJson. Si envías idExpedicion puede no ser necesario envioJson (dependiendo del flujo).
Cómo construir envioJson
Es el JSON de tu EnvioV3DTO codificado en Base64 (UTF-8). En tu UI se genera así al ?Modificar envío actual?:
const codificado = btoa(unescape(encodeURIComponent(JSON.stringify(envio))));
Ejemplo de JSON (antes de Base64)
{
"refEnvio":"WC-12345",
"tipoPortes":"Pagados",
"valorTotal":59.90,
"destinatario":{
"nombre":"Cliente SL",
"direccion":"Calle Falsa 123",
"numero":"1",
"codigoPostal":"28001",
"poblacion":"Madrid",
"provincia":"Madrid",
"pais":{"isoCode":"ES"},
"telefono":"600000000",
"email":"cliente@email.com",
"observaciones":""
},
"olBultos":[{"largo":30,"ancho":20,"alto":10,"peso":1.2}]
}
itemsJson - productos del pedido
Si envías itemsJson, Shipping podrá pintar el bloque Productos Marketplace (tabla).
Este JSON termina en window.marketplaceItems y se renderiza con lógica flexible:
usa name/title, image/img, sku/sellerSKU, qty/quantity, price/itemPriceAmount.
itemsJson como Base64 de un JSON array (UTF-8).En modo combinado, Shipping también soporta
window.marketplaceCombinedOrders (otros pedidos).
Campos detectados por el frontend (según tu JS)
| Uso | Campos aceptados |
|---|---|
| Título | name o title |
| Imagen | image o img |
| SKU | sku o sku_id o sellerSKU |
| Cantidad | qty o quantity o quantityOrdered |
| Precio | price o itemPriceAmount |
| Link producto | idProduct + linkProduct (si existen, se muestra link) |
| Fila ?gastos envío? | isShippingFee = true + name + price |
Ejemplo JSON (antes de Base64)
[
{"name":"Producto 1","sku":"REF1","qty":2,"price":8.264,"image":"https://tuweb/img1.jpg"},
{"isShippingFee":true,"name":"Gastos de envío","price":4.95}
]
Volver arriba
alertasMarketplace - alertas del pedido
Si envías alertasMarketplace, Shipping lo convierte a List<String> y lo pinta como una lista:
?Alertas del pedido?.
Formatos aceptados (según parseAlertasMarketplace())
| Tipo | Ejemplo | Recomendación |
|---|---|---|
| JSON array | ["? Este pedido ya consta como ENVIADO (TRK: 1234567890).",
"? El pedido NO está listo para enviarse porque su estado actual es ?En espera? (wc-on-hold)."] |
? Mejor opción si controlas el body |
| JSON string con array dentro | "[\"? Este pedido ya consta como ENVIADO (TRK: 1234567890).\",\"...\"]" |
Evitar si puedes (solo compatibilidad) |
| Base64 del JSON array | WyJGYWx0YSB0ZWxlZm9ubyIsICJEaXJlY2Npw7NuLi4uIl0= |
? Recomendado si mandas form-urlencoded |
Ejemplo JSON (antes de Base64)
[
"? Este pedido ya consta como ENVIADO (TRK: 1234567890).",
"? El pedido NO está listo para enviarse porque su estado actual es ?En espera? (wc-on-hold).",
"Pedido marcado como urgente"
]
POST /envio/calcularEnvio
Calcula las tarifas disponibles para un posible envío, según país de destino, código postal, valor de la mercancía y los bultos indicados.
Autenticación
| Cabecera | Valor | Obligatorio |
|---|---|---|
Authorization |
Bearer {accessToken} |
Sí |
Content-Type |
application/x-www-form-urlencoded |
Sí |
Parámetros del cuerpo (form-data / x-www-form-urlencoded)
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
tipoPortes |
string | No | Valores posibles: Pagados (por defecto), Contrareembolso. |
valorMercancia |
decimal | Condicional | Opcional si el país es ES, obligatorio y mayor que 0 para otros países. |
paisCliente |
string | No | Código ISO (ej. ES) o ID del país. Por defecto: ES. |
codigoPostal |
string | Sí | Código postal de destino. |
largo, ancho, alto, peso
|
parámetros repetibles | Sí |
Los bultos se envían repitiendo la misma clave en
application/x-www-form-urlencoded (o form-data).Cada posición forma un bulto: largo[0] con ancho[0] con alto[0] con peso[0].Importante: las listas deben tener el mismo número de valores (mismo nº de bultos). Ejemplo (1 bulto): largo=20&ancho=30&alto=40&peso=5Ejemplo (2 bultos):
largo=20&ancho=30&alto=40&peso=5&
largo=25&ancho=35&alto=45&peso=7
|
Respuesta esperada (HTTP 200)
Una lista de agencias con tarifas calculadas:
[
{
"nombreAgenciaCalculada": "CorreosExpress",
"precioPorte": 4.52,
"precioSeguro": 100.00,
"precioReembolso": 0.00,
"precioTotal": 4.52,
"isGood": true,
"errors": []
}
]
Detalles importantes
- precioSeguro: no representa un coste, sino el importe máximo cubierto en caso de pérdida o rotura.
- isGood: indica si la agencia puede calcular un precio válido con éxito.
Errores posibles (HTTP 400)
Si hay errores en los parámetros, se devuelve un JSON con la lista de errores detectados:
{
"errores": [
"codigoPostal es obligatorio",
"valorMercancia debe ser mayor que 0 para envíos fuera de España",
"Debe especificar al menos un bulto (largo, ancho, alto, peso)"
]
}
Notas adicionales
- Este endpoint solo calcula tarifas. No guarda ni registra el envío.
- Se recomienda validar que
isGoodseatrueantes de usar la tarifa.
GET /codigoPostalLookup
Obtiene la información de una población a partir del código postal. Devuelve datos como la población y la provincia asociadas.
Parámetros de la URL
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
codigoPostal |
string | Sí | Código postal del que se desea obtener la población y provincia. |
Ejemplo de uso
Se puede llamar directamente mediante una URL como:
https://shipping.z-bombilla.com/codigoPostalLookup?codigoPostal=03500
Respuesta esperada (HTTP 200)
Un array de objetos JSON con la información encontrada. Si no hay resultados, se devuelve un array vacío [].
[
{
"poblacion": "Benidorm",
"codigoPostal": "03501",
"provincia": "Alicante"
}
]
Notas adicionales
- Este endpoint no requiere autenticación.
- Devuelve siempre un array JSON, aunque no se encuentren resultados.
POST /api/envio/doEnvio
Genera el envío definitivo, crea el número de seguimiento y devuelve las etiquetas en base64 listas para imprimir.
Autenticación
| Cabecera | Valor | Obligatorio |
|---|---|---|
Authorization |
Bearer {accessToken} |
Sí |
Content-Type |
application/json |
Sí |
Parámetros del cuerpo (JSON)
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
agencia.nombreAgenciaCalculada |
string | Sí | Nombre de la agencia calculada (obtenido desde "Calcular Envío"). |
agencia.precioPorte |
decimal | Sí | Precio confirmado del porte (obtenido desde "Calcular Envío"). |
envio.tipoPortes |
string | No | Pagados (por defecto) o Contrareembolso. |
envio.refEnvio |
string | No | Referencia interna del envío (opcional). Ejemplo el número de pedido. |
envio.descripcionEnvio |
string | Condicional | Obligatoria si el destino es internacional y la agencia es UPS. Describe el contenido. Ejemplo de la categoría del producto: "Papel Secamanos" |
envio.destinatario.nombre |
string | Sí | Nombre del destinatario. |
envio.destinatario.direccion |
string | Sí | Dirección del destinatario. |
envio.destinatario.numero |
string | No | Número de dirección (opcional). |
envio.destinatario.paisISO |
string | No | Código ISO del país. Por defecto ES. |
envio.destinatario.provincia |
string | No | Provincia del destinatario. No se tendrá en cuenta para envíos a España. Obtenemos la provincia del código Postal. |
envio.destinatario.poblacion |
string | No | Población del destinatario. |
envio.destinatario.codigoPostal |
string | Sí | Código postal del destinatario. |
envio.destinatario.telefono |
string | No | Teléfono de contacto. |
envio.destinatario.email |
string | No | Email de contacto. |
envio.destinatario.observaciones |
string | No | Observaciones adicionales. |
envio.bultos[] |
array | Sí | Listado de bultos. Debe incluir al menos uno. |
envio.bultos[].largo |
decimal | Sí | Largo en centímetros. |
envio.bultos[].ancho |
decimal | Sí | Ancho en centímetros. |
envio.bultos[].alto |
decimal | Sí | Alto en centímetros. |
envio.bultos[].peso |
decimal | Sí | Peso en kilogramos. |
envio.valorMercancia |
decimal | Condicional | Obligatorio si el país no es ES (debe ser mayor que 0). |
envio.envioConRetorno |
boolean | No | Indica si el envío debe ser con recogida del retorno. Solo Envialia, MRW, CorreosExpress. |
Respuesta esperada (HTTP 200)
Devuelve un objeto JSON con el número de seguimiento y las etiquetas generadas:
{
"numSeguimiento": "1234567890",
"olEtiquetas": [
"Base64Etiqueta1",
"Base64Etiqueta2"
]
}
Prueba rápida de las etiquetas
Dispones de un panel web para visualizar y probar el resultado de este endpoint.
Puedes copiar el JSON de respuesta (numSeguimiento y olEtiquetas)
y pegarlo directamente en:
- URL del panel de prueba: https://shipping.z-bombilla.com/envio/testVerEtiqueta
Desde ahí podrás ver, abrir o descargar las etiquetas generadas en formato PDF.
Errores posibles
- 400 Bad Request: Si falta algún campo obligatorio o hay validaciones fallidas.
- 401 Unauthorized: Si el token no es válido o no se proporciona.
{
"error": "Falta campo obligatorio: envio.destinatario.nombre"
}
Notas adicionales
- El número de seguimiento se genera automáticamente tras completar el envío.
- Las etiquetas vienen codificadas en Base64 listas para imprimir o generar PDF.
- Se recomienda verificar que la agencia tenga
isGood = trueantes de hacer la solicitud.
POST /apiV2/documentos/facturas
Crea un documento de facturación remoto (Factura / Rectificativa / etc. según la plantilla).
Devuelve id, rand y referencia.
Autenticación
| Cabecera | Valor | Obligatorio |
|---|---|---|
Authorization | Bearer {accessToken} | Sí |
Content-Type | application/json | Sí |
Requisitos previos
- El token debe pertenecer a un usuario válido.
- La cuenta debe tener facturación activa (
FacturacionUsuarioSettings.activo=true). id_plantillasFacturadebe existir y pertenecer al rol.
Body (JSON)
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
id_plantillasFactura |
int | Sí | ID de la plantilla. Determina numeración, tipo y validaciones. |
fecha |
string | No | Fecha ISO YYYY-MM-DD. Si no se envía, se usa hoy. |
razonSocial | string | No | Razón social del cliente. |
cif | string | No | CIF/NIF. |
email | string | No | Email. |
telefono | string | No | Teléfono. |
direccion | string | No | Dirección. |
codigoPostal | string | No | Código postal. |
poblacion | string | No | Población. |
provincia | string | No | Provincia. |
pais | string | No | País ISO-2. Por defecto ES. |
iva | number | No | IVA % cabecera. Por defecto 21. |
irpf | number | No | IRPF % (puede ser 0). |
re | number | No | Recargo equivalencia % (puede ser 0). |
formaPago | string | No | Texto libre. Si no existe, el sistema puede crearlo automáticamente (según reglas del rol). |
ch_pagado |
boolean | No |
true = pendiente (NO pagado). false = pagado. Si no se envía, se asume false. |
observaciones | string | No | Observaciones del documento. |
comment | string | No | Comentario interno. |
detalles |
array | No | Listado de líneas. Si no se envía, se crea el documento sin líneas. |
detalles[].id | int | No | Solo en edición: id de línea existente. |
detalles[].producto | string | No | Referencia / SKU (si vacío, se puede normalizar a -). |
detalles[].desc | string | Sí (si hay línea) | Descripción. |
detalles[].uds | number | No | Unidades (por defecto 1). |
detalles[].precio | number | No | Precio neto (recomendado hasta 3 decimales). |
detalles[].iva | number | No | IVA % de línea. |
detalles[].dto | number | No | Descuento %. |
detalles[].orden | number | No | Orden de línea (si no, por posición). |
totalIva | number | No | Informativo. El sistema recalcula los totales. |
baseImponible | number | No | Informativo. El sistema recalcula los totales. |
Respuesta esperada (HTTP 200)
{
"success": true,
"id": 123,
"rand": 123456789,
"referencia": "INV-ES-00001",
"fecha": "2026-01-01",
"url": "https://finanzas.z-bombilla.com/...",
"total": 121,
"iva": 21,
"neto": 100,
"irpf": 0,
"re": 0,
"message": "Documento creado correctamente."
}
PUT /apiV2/documentos/facturas?id={id}
Edita un documento existente. El id va como query param.
Notas de edición de líneas
- Las líneas con
detalles[].idse actualizan. - Las líneas sin
idse crean. - Las líneas existentes que no se incluyan en
detallesse eliminan.
Errores posibles
- 400 Bad Request: validaciones fallidas (plantilla, campos requeridos, etc.).
- 401 Unauthorized: token ausente o inválido.
- 403 Forbidden: facturación no activa.
- 404 Not Found: documento no encontrado o no pertenece al rol.
- 500 Internal Server Error: error interno.
{
"success": false,
"error": "Falta campo obligatorio: id_plantillasFactura"
}
Notas adicionales
- La numeración (
referencia) y elrandse generan automáticamente al crear. - Se recomienda enviar
preciocon decimales (hasta 3) para minimizar redondeos.
GET /apiV2/documentos
Devuelve un listado paginado de documentos de facturación (según filtros).
Autenticación
| Cabecera | Valor | Obligatorio |
|---|---|---|
Authorization | Bearer {accessToken} | Sí |
Query params
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
tipo |
string | No |
todos (por defecto) o un valor de Plantilla.TipoDocumento.
Ejemplo: FACTURA, RECTIFICACIONES.
|
idPlantillasFactura |
int | No | Filtra por plantilla concreta. Si no se envía, se usan todas las plantillas del tipo/rol. |
q |
string | No | Búsqueda por texto libre (cliente, email, cif?). Si incluye números, se intenta filtrar también por referencia. |
pagado |
boolean | No | true o false. |
year |
int | No | Año del documento (ej. 2026). |
importeMin |
number | No | Importe mínimo del total del documento. |
importeMax |
number | No | Importe máximo del total del documento. |
pageNumber |
int | No | Página (por defecto 1). |
pageSize |
int | No | Tamaño de página (por defecto 50). Recomendado máximo 100. |
orderField |
string | No |
Campo de ordenación permitido (según backend):
id, fecha, referencia, razonSocial,
chPagado, totalGrossAmount.
|
orderDir |
string | No | ASC o DESC (por defecto ASC si no es DESC). |
Respuesta (HTTP 200)
Devuelve filas, total y años disponibles para el conjunto actual (tipo/plantilla).
{
"rows": [
{
"id": 123,
"pagado": false,
"numero": "INV-ES-00001",
"fecha": "01/01/2026",
"cliente": "Cliente SL",
"total": "121,00 ?",
"comment": "Revisar",
"rand": 123456789
}
],
"total": 1,
"yearsAvailable": [2026, 2025, 2024]
}
Errores posibles
- 401 Unauthorized: token ausente o inválido.
- 403 Forbidden: facturación no activa.
- 400 Bad Request: parámetros inválidos (por ejemplo
tipoinválido si lo validas). - 500 Internal Server Error: error interno.
{
"error": "Usuario no autenticado"
}
Notas
yearsAvailableestá ordenado de más reciente a más antiguo.- Los campos
totalyfechavienen formateados (human friendly). Para cálculos, usa los endpoints de detalle / export si los añades.
GET /apiV2/documentos/years
Devuelve los años disponibles para el conjunto actual de documentos (según tipo y/o idPlantillasFactura).
Autenticación
| Cabecera | Valor | Obligatorio |
|---|---|---|
Authorization | Bearer {accessToken} | Sí |
Query params
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
tipo |
string | No |
todos (por defecto) o un valor de Plantilla.TipoDocumento.
Ej: FACTURA, RECTIFICACIONES.
|
idPlantillasFactura |
int | No | Si se envía, devuelve los años disponibles solo para esa plantilla. Si no, devuelve los años del conjunto por tipo/rol. |
Respuesta (HTTP 200)
Lista de años ordenados de más reciente a más antiguo.
{
"yearsAvailable": [2026, 2025, 2024]
}
Errores posibles
- 401 Unauthorized: token ausente o inválido.
- 403 Forbidden: facturación no activa.
- 400 Bad Request: parámetros inválidos (por ejemplo
tipoinválido si lo validas). - 500 Internal Server Error: error interno.
{
"error": "Usuario no autenticado"
}
Notas
- Útil para construir selectores de año en integraciones/ERP.
- Si no hay documentos, puede devolver el año actual como fallback (según implementación).
GET /apiV2/documentos/plantillas
Devuelve las plantillas disponibles (activas) para el rol. Puede filtrar por tipo.
Autenticación
| Cabecera | Valor | Obligatorio |
|---|---|---|
Authorization | Bearer {accessToken} | Sí |
Query params
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
tipo |
string | No |
todos (por defecto) o un valor de Plantilla.TipoDocumento.
Ej: FACTURA, RECTIFICACIONES.
|
Respuesta (HTTP 200)
Devuelve un array con id y nombre de cada plantilla.
{
"success": true,
"rows": [
{ "id": 12, "nombre": "Factura Nacional" },
{ "id": 13, "nombre": "Factura UE" }
]
}
Errores posibles
- 401 Unauthorized: token ausente o inválido.
- 403 Forbidden: facturación no activa.
- 400 Bad Request:
tipoinválido (si lo validas en backend). - 500 Internal Server Error: error interno.
{
"error": "Usuario no autenticado"
}
Notas
- Útil para construir selectores de plantilla en integraciones.
- Si no se envía
tipo, devuelve todas las plantillas activas del rol.
GET /apiV2/documentos/pendientes/summary
Devuelve un resumen de documentos pendientes (contador y suma de importes) para el rol del token.
Autenticación
| Cabecera | Valor | Obligatorio |
|---|---|---|
Authorization | Bearer {accessToken} | Sí |
Descripción
- El resumen se calcula sobre documentos del rol que cumplan la condición de ?pendiente? según la lógica de tu backend.
- El tipo de documento incluido suele limitarse a plantillas de tipo
FACTURAactivas (según tu query interna).
Respuesta (HTTP 200)
{
"count": 5,
"totalImporte": 1234.56
}
Errores posibles
- 401 Unauthorized: token ausente o inválido.
- 403 Forbidden: facturación no activa.
- 500 Internal Server Error: error interno.
{
"error": "Cuenta de facturación no activa"
}
Notas
totalImportees un número (no formateado). Útil para dashboards y KPIs.
POST /apiV2/documentos/togglePagado
Alterna el estado de pagado de un documento (true/false) dentro del rol del token.
Autenticación
| Cabecera | Valor | Obligatorio |
|---|---|---|
Authorization | Bearer {accessToken} | Sí |
Parámetros
| Parámetro | Ubicación | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id |
query | int | Sí | ID del documento (Factura) a modificar. |
Respuesta (HTTP 200)
{
"success": true,
"pagado": true
}
Errores posibles
- 400 Bad Request: ID inválido o ausente.
- 401 Unauthorized: token ausente o inválido.
- 403 Forbidden: facturación no activa.
- 404 Not Found: documento no encontrado o fuera del rol.
- 500 Internal Server Error: error interno.
{
"error": "Factura no encontrada"
}
Notas
- Este endpoint hace ?toggle?: si estaba pagado pasa a pendiente y viceversa.
- Se registra acción en el log del sistema.
POST /apiV2/documentos/updateComment
Actualiza el comentario interno (comment) de un documento dentro del rol del token.
Autenticación
| Cabecera | Valor | Obligatorio |
|---|---|---|
Authorization | Bearer {accessToken} | Sí |
Parámetros
| Parámetro | Ubicación | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id |
query | int | Sí | ID del documento. |
comment |
query | string | No | Nuevo comentario (texto libre). Si no se envía o viene vacío, se guarda vacío/null según implementación. |
Respuesta (HTTP 200)
{
"success": true
}
Errores posibles
- 400 Bad Request: ID inválido o ausente.
- 401 Unauthorized: token ausente o inválido.
- 403 Forbidden: facturación no activa.
- 404 Not Found: documento no encontrado o fuera del rol.
- 500 Internal Server Error: error interno.
{
"error": "Factura no encontrada"
}
Notas
- Se registra acción en el log del sistema.
- El comentario es interno (no necesariamente visible al cliente final).
POST /apiV2/documentos/delete
Elimina un documento si cumple las validaciones (rol, presentado, numeración posterior, etc.).
Autenticación
| Cabecera | Valor | Obligatorio |
|---|---|---|
Authorization | Bearer {accessToken} | Sí |
Parámetros
| Parámetro | Ubicación | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
id |
query | int | Sí | ID del documento a eliminar. |
Validaciones (resumen)
- El documento debe existir y pertenecer al rol del token.
- Si el documento es de tipo
FACTURAoRECTIFICACIONES:- No puede estar ?presentado? (según
periodoFinen backend). - No puede haber documentos posteriores con numeración mayor en el mismo año/plantilla.
- No puede estar ?presentado? (según
Respuesta (HTTP 200)
{
"success": true
}
Errores posibles
- 400 Bad Request: ID inválido o ausente.
- 401 Unauthorized: token ausente o inválido.
- 403 Forbidden: facturación no activa.
- 404 Not Found: documento no encontrado o fuera del rol.
- 409 Conflict: No se puede eliminar por reglas de negocio (presentado o hay numeración posterior).
- 500 Internal Server Error: error interno.
Ejemplo de error 409
{
"error": "No se puede eliminar esta factura porque existen facturas con numeración posterior en 2026."
}
Notas
- Se registra acción en el log del sistema cuando la eliminación es correcta.
- Este endpoint elimina también las líneas asociadas al documento.