Z-Bombilla API

Conecta tus sistemas, automatiza procesos y potencia tu logística con nuestra potente API REST.

Ver documentación

Endpoints 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

Amazon

Amazon

ZBombillaAPI

ZBombillaAPI

Prestashop

Prestashop

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 envioJson y 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

NombreTipoObligatorioDescripció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).
* Nota: normalmente envías 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.

Formato: recomendado enviar 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)

UsoCampos aceptados
Títuloname o title
Imagenimage o img
SKUsku o sku_id o sellerSKU
Cantidadqty o quantity o quantityOrdered
Precioprice o itemPriceAmount
Link productoidProduct + 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?.

Este parámetro es muy tolerante porque el servlet acepta varios formatos: JSON array directo, JSON string que contiene un array, o Base64 de cualquiera de los anteriores.

Formatos aceptados (según parseAlertasMarketplace())

TipoEjemploRecomendació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"
]
Fallback: si no se puede parsear, el servlet no rompe el UI: crea una lista con un único elemento con el texto bruto recibido.
Volver arriba

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}
Content-Type application/x-www-form-urlencoded

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 Código postal de destino.
largo, ancho, alto, peso parámetros repetibles 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=5

Ejemplo (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 isGood sea true antes 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 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}
Content-Type application/json

Parámetros del cuerpo (JSON)

Parámetro Tipo Obligatorio Descripción
agencia.nombreAgenciaCalculada string Nombre de la agencia calculada (obtenido desde "Calcular Envío").
agencia.precioPorte decimal 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 Nombre del destinatario.
envio.destinatario.direccion string 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 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 Listado de bultos. Debe incluir al menos uno.
envio.bultos[].largo decimal Largo en centímetros.
envio.bultos[].ancho decimal Ancho en centímetros.
envio.bultos[].alto decimal Alto en centímetros.
envio.bultos[].peso decimal 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:

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 = true antes 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

CabeceraValorObligatorio
AuthorizationBearer {accessToken}
Content-Typeapplication/json

Requisitos previos

  • El token debe pertenecer a un usuario válido.
  • La cuenta debe tener facturación activa (FacturacionUsuarioSettings.activo=true).
  • id_plantillasFactura debe existir y pertenecer al rol.

Body (JSON)

ParámetroTipoObligatorioDescripción
id_plantillasFactura int 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.
razonSocialstringNoRazón social del cliente.
cifstringNoCIF/NIF.
emailstringNoEmail.
telefonostringNoTeléfono.
direccionstringNoDirección.
codigoPostalstringNoCódigo postal.
poblacionstringNoPoblación.
provinciastringNoProvincia.
paisstringNo País ISO-2. Por defecto ES.
ivanumberNoIVA % cabecera. Por defecto 21.
irpfnumberNoIRPF % (puede ser 0).
renumberNoRecargo equivalencia % (puede ser 0).
formaPagostringNo 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.
observacionesstringNoObservaciones del documento.
commentstringNoComentario interno.
detalles array No Listado de líneas. Si no se envía, se crea el documento sin líneas.
detalles[].idintNoSolo en edición: id de línea existente.
detalles[].productostringNoReferencia / SKU (si vacío, se puede normalizar a -).
detalles[].descstringSí (si hay línea)Descripción.
detalles[].udsnumberNoUnidades (por defecto 1).
detalles[].precionumberNoPrecio neto (recomendado hasta 3 decimales).
detalles[].ivanumberNoIVA % de línea.
detalles[].dtonumberNoDescuento %.
detalles[].ordennumberNoOrden de línea (si no, por posición).
totalIvanumberNo Informativo. El sistema recalcula los totales.
baseImponiblenumberNo 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[].id se actualizan.
  • Las líneas sin id se crean.
  • Las líneas existentes que no se incluyan en detalles se 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 el rand se generan automáticamente al crear.
  • Se recomienda enviar precio con decimales (hasta 3) para minimizar redondeos.

GET /apiV2/documentos

Devuelve un listado paginado de documentos de facturación (según filtros).

Autenticación

CabeceraValorObligatorio
AuthorizationBearer {accessToken}

Query params

ParámetroTipoObligatorioDescripció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 tipo inválido si lo validas).
  • 500 Internal Server Error: error interno.
{
  "error": "Usuario no autenticado"
}

Notas

  • yearsAvailable está ordenado de más reciente a más antiguo.
  • Los campos total y fecha vienen 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

CabeceraValorObligatorio
AuthorizationBearer {accessToken}

Query params

ParámetroTipoObligatorioDescripció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 tipo invá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

CabeceraValorObligatorio
AuthorizationBearer {accessToken}

Query params

ParámetroTipoObligatorioDescripció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: tipo invá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

CabeceraValorObligatorio
AuthorizationBearer {accessToken}

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 FACTURA activas (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

  • totalImporte es 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

CabeceraValorObligatorio
AuthorizationBearer {accessToken}

Parámetros

ParámetroUbicaciónTipoObligatorioDescripción
id query int 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

CabeceraValorObligatorio
AuthorizationBearer {accessToken}

Parámetros

ParámetroUbicaciónTipoObligatorioDescripción
id query int 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

CabeceraValorObligatorio
AuthorizationBearer {accessToken}

Parámetros

ParámetroUbicaciónTipoObligatorioDescripción
id query int ID del documento a eliminar.

Validaciones (resumen)

  • El documento debe existir y pertenecer al rol del token.
  • Si el documento es de tipo FACTURA o RECTIFICACIONES:
    • No puede estar ?presentado? (según periodoFin en backend).
    • No puede haber documentos posteriores con numeración mayor en el mismo año/plantilla.

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.