Ir al contenido principal

REST API: Sincronización de compras y ventas

Cómo obtener los cambios en facturas y albaranes de compra y en facturas de venta para mantener una copia sincronizada.

Mantén una copia sincronizada de las facturas y albaranes de compra y de las facturas de venta. Cada llamada devuelve lo que se ha creado, modificado y eliminado desde la anterior.

GET /integration/purchases/invoices/changes
GET /integration/purchases/deliveries/changes
GET /integration/sales/invoices/changes

Si lo que necesitas es traer los documentos nuevos y marcarlos como procesados, usa Recuperar datos para sistemas de facturación.


Antes de empezar

URL base: https://app.tspoonlab.com/recipes/api

Cabeceras

  • rememberme · obligatorio — Token de sesión que devuelve el login.

  • order · opcional — Id del centro de coste (Centros de coste). Por defecto, el centro activo del usuario.

Login — Devuelve el token en texto plano.

curl https://app.tspoonlab.com/recipes/api/login \
-d [email protected] \
-d password=XXXXXXX

Permisos — Los endpoints de compras necesitan permiso para ver pedidos de compra; el de ventas, permiso para ver ventas.

Fechas — Se devuelven en milisegundos desde 1970 (epoch).

Las respuestas pueden incluir otros campos además de los documentados. Usa solo los documentados.


Cómo funciona la sincronización

  1. Primera llamada sin cursor: devuelve todos los documentos en inserts. Para empezar desde un día concreto, envía changedSince.

  2. Mientras hasMore sea true, vuelve a llamar con el cursor recibido.

  3. Guarda el último cursor. En la siguiente sincronización, llama con él: solo recibirás lo que haya cambiado.

Guarda un cursor distinto para cada endpoint.

Parámetros comunes

  • cursor string · opcional — Cursor de la llamada anterior. Si se envía, se ignoran changedSince y $filter.

  • changedSince date · opcional — Cambios desde este día, en formato AAAA-MM-DD. No puede ser posterior a hoy.

  • $filter string · opcional — Filtro sobre los campos de cada endpoint (ver Filtro). Queda guardado en el cursor: solo se envía en la primera llamada.

  • rows integer · opcional — Cambios por página, de 1 a 100. Por defecto, 100.

  • includeInternal boolean · opcional — false excluye los proveedores o clientes de tipo interno. Por defecto, true.

includeInternal, onlyValidated, idVendor e idCustomer no se guardan en el cursor: envíalos con el mismo valor en todas las llamadas.

Respuesta

{
"inserts": [ … ],
"updates": [ … ],
"deletes": [
{ "id": "3515834441676562996102020009", "deletedAt": 1767268800000 }
],
"cursor": "MjAyNi0wMS0wMSAxMjowMDowMC4wfDM1MTU4MzQ0NDE2NzY1NjI5OTYxMDIwMjAwMDk",
"hasMore": false
}
  • inserts array — Documentos creados desde el cursor. En la primera carga, todos.

  • updates array — Documentos creados antes y modificados después. Cada documento aparece una sola vez, con su estado actual.

  • deletes array — Documentos eliminados: id string y deletedAt date.

  • cursor string — Para la siguiente llamada. Es null si la primera carga no devuelve nada.

  • hasMore boolean — true si hay más cambios disponibles.

A tener en cuenta

  • Los cambios de los últimos 5 minutos llegan en la siguiente llamada.

  • deletes no aplica filtros: ignora los id que no tengas.

  • Un documento que deja de cumplir el filtro no aparece en deletes.

  • Un mismo id puede venir en updates y en deletes de la misma página: aplica el más reciente comparando updatedAt y deletedAt.

  • Los cambios en los datos del proveedor o del cliente (nombre, NIF, cuentas…) no marcan sus documentos como modificados.

Filtro

Sintaxis OData: eq, ne, gt, ge, lt, le, in, and, or, not (…), paréntesis, year(), month() y contains().

  • Fechas: AAAA-MM-DD sin comillas. Admiten todos los operadores.

  • Ids: número sin comillas. Solo eq, ne e in.

  • Texto: entre comillas simples. Solo eq, ne, in y contains(). Distingue mayúsculas y acentos.

curl -G https://app.tspoonlab.com/recipes/api/integration/purchases/invoices/changes \
-H "rememberme: $TOKEN" \
--data-urlencode '$filter=year(date) eq 2026 and idVendor in (3515834441676562996102020004, 3515834441676562996102020005)'

Errores — Un cursor, changedSince o $filter no válido, o un rows fuera de rango, devuelve 400 con code, message y params.


Facturas de compra

GET /integration/purchases/invoices/changes

Parámetros de consulta — Los comunes, más:

  • onlyValidated boolean · opcional — true devuelve solo facturas validadas. Por defecto, false.

  • idVendor string · opcional — Solo las facturas de este proveedor.

Campos de $filter: date, dateAccounting (fecha), idVendor (id), invoiceNum, documentNum (texto).

Ejemplo

curl "https://app.tspoonlab.com/recipes/api/integration/purchases/invoices/changes?changedSince=2026-01-01" \
-H "rememberme: $TOKEN"

Respuesta — Cada factura de inserts y updates:

{
"id": "3515834441676562996102020001",
"invoiceNum": "F-2026-0042",
"documentNum": "000123",
"date": 1767225600000,
"dateAccounting": null,
"dateDue": 1769904000000,
"createdAt": 1767268800000,
"updatedAt": 1767268800000,
"idVendor": "3515834441676562996102020004",
"vendor": "Distribuciones García",
"codeVendor": "P001",
"accountVendor": "40000001",
"nif": "B12345678",
"inEuropeanUnion": false,
"inVies": false,
"country": "ES",
"paid": false,
"validated": true,
"locked": false,
"comment": null,
"codePaymentType": "TRANSF",
"base": 100.0,
"taxes": 10.0,
"total": 110.0,
"listTaxes": [
{ "id": "3515834441676562996102020006", "type": 0, "base": 100.0, "percent": 10.0, "total": 10.0 }
],
"listCostTypeTaxes": [ … ],
"listDeliveries": [ … ]
}
  • id string — Identificador de la factura.

  • invoiceNum string — Número de factura del proveedor.

  • documentNum string — Número de documento interno.

  • date, dateAccounting, dateDue date — Fecha de factura, fecha contable (si es null, usa date) y vencimiento.

  • createdAt, updatedAt date — Creación y última modificación.

  • idVendor, vendor, codeVendor, accountVendor, nif string — Proveedor: id, nombre, código, cuenta contable y NIF.

  • inEuropeanUnion, inVies boolean — Proveedor intracomunitario e inscrito en VIES.

  • country string — País del proveedor.

  • paid, validated, locked boolean — Pagada, validada y bloqueada.

  • comment string — Comentario.

  • codePaymentType string — Código de la forma de pago.

  • idCostTypeVendor, costTypeVendor, codeCostTypeVendor, accountCostTypeVendor, accountAuxCostTypeVendor string — Cuenta analítica por defecto del proveedor: id, nombre, código, cuenta contable y cuenta auxiliar.

  • idBusinessLine, businessLine, codeBusinessLine string — Línea de negocio.

  • idDocument, extDocument string — Documento adjunto: id y extensión.

  • base, taxes, total number — Base imponible, impuestos y total. total incluye la retención.

  • listTaxes array — Impuestos: id, type, base, percent y total. type: 0 IVA · 1 transporte · 2 descuento · 3 otros · 4 retención.

  • listCostTypeTaxes array — IVA por cuenta analítica, calculado con las líneas recibidas: id y descr de la cuenta (null si las líneas no tienen) y listTaxes (type, base, percent, total).

  • listDeliveries array — Albaranes de la factura, con los campos de Albaranes de compra (sin createdAt ni updatedAt).


Albaranes de compra

Solo albaranes recibidos.

GET /integration/purchases/deliveries/changes

Parámetros de consulta — Los comunes, más:

  • idVendor string · opcional — Solo los albaranes de este proveedor.

Campos de $filter: date, dateSent (fecha), idVendor (id), deliveryNum, deliveryFor (texto).

Ejemplo

curl "https://app.tspoonlab.com/recipes/api/integration/purchases/deliveries/changes?changedSince=2026-01-01" \
-H "rememberme: $TOKEN"

Respuesta — Cada albarán de inserts y updates:

{
"id": "3515834441676562996102020002",
"deliveryNum": "A-7781",
"deliveryFor": "PED-0153",
"date": 1767225600000,
"dateFormatted": "2026/01/01",
"dateSent": 1767139200000,
"dateSentFormatted": "2025/12/31",
"createdAt": 1767268800000,
"updatedAt": 1767268800000,
"idVendor": "3515834441676562996102020004",
"vendor": "Distribuciones García",
"locked": false,
"baseCalculated": 100.0,
"base": 100.0,
"taxes": 10.0,
"total": 110.0,
"listTaxes": [ … ],
"listDeliveries": [
{
"id": "3515834441676562996102020007",
"position": 0,
"idComponent": "3515834441676562996102020008",
"component": "Tomate pera",
"quantity": 20.0,
"unit": "kg",
"cost": 5.0,
"hasFormat": true,
"quantityFormat": 4.0,
"unitFormat": "caja 5 kg",
"costFormat": 25.0,
"iva": 10.0
}
],
"listSent": [ … ]
}
  • id string — Identificador del albarán.

  • deliveryNum string — Número de albarán.

  • deliveryFor string — Referencia del albarán, normalmente el número de pedido.

  • date date — Fecha de recepción; si no hay, la de envío. dateFormatted string — La misma, en AAAA/MM/DD.

  • dateSent date — Fecha de envío del pedido. dateSentFormatted string — La misma, en AAAA/MM/DD.

  • createdAt, updatedAt date — Creación y última modificación.

  • idVendor, vendor, codeVendor, accountVendor, nif string — Proveedor: id, nombre, código, cuenta contable y NIF.

  • vendorType, vendorTypeCode string, vendorTypeInternal boolean — Tipo de proveedor: nombre, código y si es interno.

  • locked boolean — Bloqueado.

  • sentBy, receivedBy string — Quién hizo el pedido y quién lo recibió.

  • idCostType, costType, codeCostType, accountCostType, accountAuxCostType string — Cuenta analítica del albarán. Si se imputa por línea, va en cada línea.

  • idBusinessLine, businessLine, codeBusinessLine string — Línea de negocio.

  • baseCalculated number — Base calculada con las líneas recibidas, con 5 decimales.

  • base, taxes, total number — Base, impuestos (incluye transporte, descuentos y otros) y total.

  • listTaxes array — Impuestos: id, type, base, percent y total. type: 0 IVA · 1 transporte · 2 descuento · 3 otros.

  • listDeliveries array — Líneas recibidas.

  • listSent array — Líneas del pedido enviado.

Cada línea recibida (listDeliveries):

  • id string — Identificador de la línea. position integer — Orden.

  • idComponent, component, codeComponent string — Producto: id, nombre y código.

  • codeVendorComponent string — Código del producto en el proveedor.

  • comment string — Comentario.

  • quantity number, idUnit, unit string — Cantidad en la unidad base del producto.

  • cost number — Coste por unidad base. Importe de la línea: quantity × cost.

  • hasFormat boolean — Si se compró en un formato (p. ej. cajas).

  • quantityFormat number, idUnitFormat, unitFormat string, costFormat number — Formato: cantidad, unidad y precio por formato. null si hasFormat es false.

  • idStore, store string — Almacén.

  • iva number — % de IVA.

  • idCostType, costType, codeCostType, accountCostType, accountAuxCostType string — Cuenta analítica de la línea.

  • idBusinessLine, businessLine, codeBusinessLine string — Línea de negocio de la línea.

  • listTypes array — Familias del producto: id y descr.

  • recibido boolean — Siempre true.

Cada línea del pedido enviado (listSent): los mismos campos de producto, comment y formato que la línea recibida, con quantity, idUnit y unit en la unidad de compra y cost como precio de compra.


Facturas de venta

GET /integration/sales/invoices/changes

Parámetros de consulta — Los comunes, más:

  • idCustomer string · opcional — Solo las facturas de este cliente.

Campos de $filter: date, dateAccounting, dateDue (fecha), idCustomer (id), invoiceNum, documentNum (texto).

Ejemplo

curl "https://app.tspoonlab.com/recipes/api/integration/sales/invoices/changes?changedSince=2026-01-01" \
-H "rememberme: $TOKEN"

Respuesta — Cada factura de inserts y updates:

{
"id": "3515834441676562996102020003",
"invoiceNum": "V-2026-0010",
"documentNum": "000045",
"date": 1767225600000,
"dateAccounting": null,
"dateDue": 1769904000000,
"createdAt": 1767268800000,
"updatedAt": 1767268800000,
"idCustomer": "3515834441676562996102020010",
"customer": "Hotel Mediterráneo",
"codeCustomer": "C015",
"accountCustomer": "43000015",
"nif": "A87654321",
"paid": false,
"locked": false,
"base": 500.0,
"taxes": 50.0,
"total": 550.0,
"listTaxes": [ … ],
"listCostTypeTaxes": [ … ],
"listDeliveries": [ … ]
}
  • id string — Identificador de la factura.

  • invoiceNum string — Número de factura.

  • documentNum string — Número de documento.

  • date, dateAccounting, dateDue date — Fecha de factura, fecha contable (si es null, usa date) y vencimiento.

  • createdAt, updatedAt date — Creación y última modificación.

  • idCustomer, customer, codeCustomer, accountCustomer, nif string — Cliente: id, nombre, código, cuenta contable y NIF.

  • paid, locked boolean — Cobrada y bloqueada.

  • comment string — Comentario.

  • codePaymentType string — Código de la forma de pago.

  • idCostTypeVendor, costTypeVendor, codeCostTypeVendor, accountCostTypeVendor, accountAuxCostTypeVendor string — Cuenta analítica por defecto del cliente: id, nombre, código, cuenta contable y cuenta auxiliar.

  • idDocument, extDocument string — Documento adjunto: id y extensión.

  • base, taxes, total number — Base imponible, impuestos y total.

  • listTaxes array — Impuestos: id, type, base, percent y total. type: 0 IVA · 1 transporte · 2 descuento · 3 otros.

  • listCostTypeTaxes array — IVA por cuenta analítica, calculado con las líneas enviadas: id y descr de la cuenta (null si las líneas no tienen) y listTaxes (type, base, percent, total).

  • listDeliveries array — Albaranes de venta de la factura.

Cada albarán de venta (listDeliveries):

  • id string — Identificador del albarán.

  • invoiceNum string — Número de albarán.

  • date date — Fecha del albarán.

  • idCustomer, customer, customerCode, nif string — Cliente: id, nombre, código y NIF.

  • address, cp, city string — Dirección, código postal y ciudad del cliente.

  • contact, phone, contactAux, phoneAux, mail, mailAux, mailCC, web string — Contactos del cliente.

  • customerType, customerTypeCode string, customerTypeInternal boolean — Tipo de cliente: nombre, código y si es interno.

  • base number — Base de las líneas enviadas.

  • listLines, listLinesPending array — Líneas enviadas y pendientes de enviar.

Cada línea (listLines, listLinesPending):

  • id string — Identificador de la línea. position integer — Orden dentro de la lista, desde 0.

  • idComponent, component, codeComponent string — Producto vendido.

  • idMenu, menu, codeMenu string — Agrupación vendida.

  • codeCustomerProduct string — Código de venta del producto para el cliente.

  • idCustomerGroup, customerGroup string — Grupo de productos.

  • comment string — Comentario. En líneas sin producto ni agrupación, el nombre del producto de venta.

  • sent boolean — Enviada.

  • quantity number, idUnit, unit string — Cantidad y unidad.

  • cost number — Precio de venta unitario sin IVA.

  • costRecipe number — Coste unitario de escandallo.

  • iva number — % de IVA.

  • listTypes array — Familias del producto: id y descr.

¿Necesitas ayuda? Escríbenos desde el chat de soporte, en la esquina inferior derecha.

¿Ha quedado contestada tu pregunta?