Documentación Finanzas

Facturas, documentos y estados: endpoints, parámetros y ejemplos listos para usar.

POST

/apiV2/documentos/facturas Crear factura / documento

Crea un documento de facturación remoto (Factura, Rectificativa, etc. según plantilla). Devuelve id, rand y referencia.

Resumen

Auth: Bearer Content-Type: application/json Salida: id, rand, referencia
Tip: el campo id_plantillasFactura controla numeración, tipo y validaciones.

Autenticación

CabeceraValorOblig.
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ámetro Tipo Oblig. Descripció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 la fecha del día.
razonSocialstringNoRazón social del cliente.
cifstringNoCIF/NIF.
emailstringNoEmail.
telefonostringNoTeléfono.
direccionstringNoDirección.
codigoPostalstringNoCódigo postal.
poblacionstringNoPoblación.
provinciastringNoProvincia.
paisstringNoPaís ISO-2. Por defecto ES.
ivanumberNoIVA % cabecera. Por defecto 21.
irpfnumberNoIRPF % (puede ser 0).
renumberNoRecargo 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.
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, puede normalizar a -).
detalles[].descstringSí*Descripción (obligatoria si hay línea).
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).
totalIvanumberNoInformativo. El sistema recalcula los totales.
baseImponiblenumberNoInformativo. El sistema recalcula los totales.
* Importante: si envías detalles, cada línea debe tener al menos desc.

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} Editar documento existente

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/facturas/ultimaFecha Última fecha de factura

Devuelve la fecha (y referencia) de la última factura emitida en una plantilla + año. Úsala ANTES de crear una factura nueva (POST /apiV2/documentos/facturas) para comprobar de antemano si la fecha que vas a enviar sería aceptada: por numeración correlativa, Finanzas rechaza cualquier factura nueva cuya fecha sea anterior a la última ya emitida en esa misma plantilla+año (HTTP 400, ver sección "Crear/Editar Facturas"). Esta consulta no sustituye esa validación — es solo una comprobación de antemano para evitar intentos que ya sabes que van a fallar.

Autenticación

CabeceraValorOblig.
AuthorizationBearer {accessToken}

Query params

ParámetroTipoOblig.Descripción
idPlantillasFactura int Plantilla (serie) sobre la que quieres comprobar la numeración. Es el id que devuelve GET /apiV2/documentos/plantillas, el mismo que usarías al crear la factura. Si tu cuenta usa el motor V2 ese id es el de la plantilla V2, no el legacyId; la consulta resuelve la serie completa por su cuenta.
year int No Año de la factura que vas a crear (por defecto, el año actual). La correlatividad es siempre dentro del mismo año.

Respuesta (HTTP 200) — con facturas previas

{
  "success": true,
  "tieneFacturas": true,
  "fecha": "2026-08-31",
  "referencia": 118
}

Respuesta (HTTP 200) — sin facturas todavía en esa plantilla+año

{
  "success": true,
  "tieneFacturas": false
}

Cómo usarla

  • Si tieneFacturas es false: cualquier fecha de hoy hacia atrás es válida (sujeto también a la regla general de no facturar en el futuro).
  • Si tieneFacturas es true: tu nueva factura debe tener fecha >= fecha (la de esta respuesta). Si va a ser anterior, el POST la rechazará — resuelve la fecha antes de intentarlo.

Errores posibles

  • 400 Bad Request: falta idPlantillasFactura.
  • 401 Unauthorized: token ausente o inválido.
  • 403 Forbidden: facturación no activa.
  • 500 Internal Server Error: error interno.
{
  "error": "Falta idPlantillasFactura"
}

Notas

  • La numeración es por plantilla+año, compartida entre todos los documentos que uses en esa serie — no es exclusiva de un cliente o envío concreto.
  • Es la misma comprobación que usa internamente Shipping antes de lanzar la facturación automática de envíos, para avisar de un posible rechazo antes de esperar a que termine el proceso.
GET

/apiV2/documentos Listado paginado de documentos

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

Autenticación

CabeceraValorOblig.
AuthorizationBearer {accessToken}

Resumen

Filtro: tipo, plantilla, year, pagado? Paginación: pageNumber / pageSize Orden: orderField / orderDir

Query params

Parámetro Tipo Oblig. Descripción
tipo string No todos (por defecto) o un valor de Plantilla.TipoDocumento. Ej: 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.
pagadobooleanNotrue o false.
yearintNoAño del documento (ej. 2026).
importeMinnumberNoImporte mínimo del total del documento.
importeMaxnumberNoImporte máximo del total del documento.
pageNumberintNoPágina (por defecto 1).
pageSizeintNoTamaño de página (por defecto 50). Recomendado máximo 100.
orderField string No Campo de ordenación permitido: id, fecha, referencia, razonSocial, chPagado, totalGrossAmount.
orderDirstringNoASC 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.
  • 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).
GET

/apiV2/documentos/years Años disponibles

Devuelve los años disponibles para el conjunto actual de documentos (según tipo y/o idPlantillasFactura).

Autenticación

CabeceraValorOblig.
AuthorizationBearer {accessToken}

Query params

ParámetroTipoOblig.Descripción
tipo string No todos (por defecto) o un valor de Plantilla.TipoDocumento (ej: FACTURA).
idPlantillasFactura int No Si se envía, devuelve los años disponibles solo para esa plantilla.

Respuesta (HTTP 200)

{
  "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.
  • 500 Internal Server Error: error interno.
{
  "error": "Usuario no autenticado"
}

Notas

  • Útil para construir selectores de año en integraciones/ERP.
GET

/apiV2/documentos/plantillas Plantillas disponibles

Devuelve las plantillas activas disponibles para el rol. Puede filtrar por tipo.

Autenticación

CabeceraValorOblig.
AuthorizationBearer {accessToken}

Query params

ParámetroTipoOblig.Descripción
tipo string No todos (por defecto) o un valor de Plantilla.TipoDocumento (ej: FACTURA).

Respuesta (HTTP 200)

{
  "success": true,
  "rows": [
    { "id": 12, "nombre": "Factura Nacional", "legacyId": 61 },
    { "id": 13, "nombre": "Factura UE", "legacyId": null }
  ]
}

Qué id devuelve: motor legacy vs motor V2

Cada cuenta usa uno de los dos motores de plantillas, y el id que devuelve este endpoint es siempre el que hay que enviar como idPlantillasFactura en el resto de endpoints (crear factura, última fecha, listado, años). No hace falta que sepas en qué motor estás: usa el id de aquí y ya está.

  • Motor legacy: el id es el de la plantilla clásica. El campo legacyId no aparece.
  • Motor V2: el id es el de la plantilla V2, y legacyId trae la plantilla clásica equivalente, o null si esa plantilla V2 se creó ya en V2 y no tiene equivalente.

El legacyId es informativo: sirve para casar documentos antiguos, emitidos antes de la migración, que solo llevan ese identificador. Una serie puede tener documentos guardados de las dos formas, así que cualquier consulta por serie (numeración, años, listado) tiene en cuenta las dos — no hace falta que hagas dos llamadas.

Errores posibles

  • 401 Unauthorized: token ausente o inválido.
  • 403 Forbidden: facturación no activa.
  • 400 Bad Request: tipo inválido.
  • 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 Pendientes: resumen

Devuelve un resumen de documentos pendientes (contador y suma de importes) para el rol del token.

Autenticación

CabeceraValorOblig.
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 backend.
  • Suele limitarse a plantillas de tipo FACTURA activas (según implementación).

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 numérico (no formateado). Útil para dashboards/KPIs.
POST

/apiV2/documentos/togglePagado Cambiar estado pagado

Alterna el estado pagado (true/false) de un documento dentro del rol del token.

Resumen

Auth: Bearer Parámetro: id (query) Acción: toggle pagado/pendiente
Comportamiento: si estaba pagado ? pasa a pendiente; si estaba pendiente ? pasa a pagado.

Autenticación

CabeceraValorOblig.
Authorization Bearer {accessToken}

Parámetros

Parámetro Ubicación Tipo Oblig. Descripció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

  • Se registra la acción en el log del sistema.
POST

/apiV2/documentos/updateComment Actualizar comentario

Actualiza el comentario interno (comment) de un documento dentro del rol del token.

Resumen

Auth: Bearer Parámetros: id, comment (query) Uso: notas internas / seguimiento
Nota: el comentario es interno (no necesariamente visible al cliente final).

Autenticación

CabeceraValorOblig.
Authorization Bearer {accessToken}

Parámetros

Parámetro Ubicación Tipo Oblig. Descripció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 la acción en el log del sistema.
POST

/apiV2/documentos/delete Eliminar documento

Elimina un documento si cumple las validaciones (rol, presentado, numeración posterior, etc.).

Resumen

Auth: Bearer Parámetro: id (query) Acción: borra cabecera + líneas
Atención: puede devolver 409 Conflict si aplica reglas de negocio (presentado o numeración posterior).

Autenticación

CabeceraValorOblig.
Authorization Bearer {accessToken}

Parámetros

Parámetro Ubicación Tipo Oblig. Descripció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 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 la acción en el log del sistema cuando la eliminación es correcta.
  • Este endpoint elimina también las líneas asociadas al documento.