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
Primera llamada sin
cursor: devuelve todos los documentos eninserts. Para empezar desde un día concreto, envíachangedSince.Mientras
hasMoreseatrue, vuelve a llamar con elcursorrecibido.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
cursorstring · opcional — Cursor de la llamada anterior. Si se envía, se ignoranchangedSincey$filter.changedSincedate · opcional — Cambios desde este día, en formatoAAAA-MM-DD. No puede ser posterior a hoy.$filterstring · opcional — Filtro sobre los campos de cada endpoint (ver Filtro). Queda guardado en el cursor: solo se envía en la primera llamada.rowsinteger · opcional — Cambios por página, de 1 a 100. Por defecto, 100.includeInternalboolean · opcional —falseexcluye 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
}insertsarray — Documentos creados desde el cursor. En la primera carga, todos.updatesarray — Documentos creados antes y modificados después. Cada documento aparece una sola vez, con su estado actual.deletesarray — Documentos eliminados:idstring ydeletedAtdate.cursorstring — Para la siguiente llamada. Esnullsi la primera carga no devuelve nada.hasMoreboolean —truesi hay más cambios disponibles.
A tener en cuenta
Los cambios de los últimos 5 minutos llegan en la siguiente llamada.
deletesno aplica filtros: ignora losidque no tengas.Un documento que deja de cumplir el filtro no aparece en
deletes.Un mismo
idpuede venir enupdatesy endeletesde la misma página: aplica el más reciente comparandoupdatedAtydeletedAt.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-DDsin comillas. Admiten todos los operadores.Ids: número sin comillas. Solo
eq,neein.Texto: entre comillas simples. Solo
eq,ne,inycontains(). 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:
onlyValidatedboolean · opcional —truedevuelve solo facturas validadas. Por defecto,false.idVendorstring · 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": [ … ]
}idstring — Identificador de la factura.invoiceNumstring — Número de factura del proveedor.documentNumstring — Número de documento interno.date,dateAccounting,dateDuedate — Fecha de factura, fecha contable (si esnull, usadate) y vencimiento.createdAt,updatedAtdate — Creación y última modificación.idVendor,vendor,codeVendor,accountVendor,nifstring — Proveedor: id, nombre, código, cuenta contable y NIF.inEuropeanUnion,inViesboolean — Proveedor intracomunitario e inscrito en VIES.countrystring — País del proveedor.paid,validated,lockedboolean — Pagada, validada y bloqueada.commentstring — Comentario.codePaymentTypestring — Código de la forma de pago.idCostTypeVendor,costTypeVendor,codeCostTypeVendor,accountCostTypeVendor,accountAuxCostTypeVendorstring — Cuenta analítica por defecto del proveedor: id, nombre, código, cuenta contable y cuenta auxiliar.idBusinessLine,businessLine,codeBusinessLinestring — Línea de negocio.idDocument,extDocumentstring — Documento adjunto: id y extensión.base,taxes,totalnumber — Base imponible, impuestos y total.totalincluye la retención.listTaxesarray — Impuestos:id,type,base,percentytotal.type:0IVA ·1transporte ·2descuento ·3otros ·4retención.listCostTypeTaxesarray — IVA por cuenta analítica, calculado con las líneas recibidas:idydescrde la cuenta (nullsi las líneas no tienen) ylistTaxes(type,base,percent,total).listDeliveriesarray — Albaranes de la factura, con los campos de Albaranes de compra (sincreatedAtniupdatedAt).
Albaranes de compra
Solo albaranes recibidos.
GET /integration/purchases/deliveries/changes
Parámetros de consulta — Los comunes, más:
idVendorstring · 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": [ … ]
}idstring — Identificador del albarán.deliveryNumstring — Número de albarán.deliveryForstring — Referencia del albarán, normalmente el número de pedido.datedate — Fecha de recepción; si no hay, la de envío.dateFormattedstring — La misma, enAAAA/MM/DD.dateSentdate — Fecha de envío del pedido.dateSentFormattedstring — La misma, enAAAA/MM/DD.createdAt,updatedAtdate — Creación y última modificación.idVendor,vendor,codeVendor,accountVendor,nifstring — Proveedor: id, nombre, código, cuenta contable y NIF.vendorType,vendorTypeCodestring,vendorTypeInternalboolean — Tipo de proveedor: nombre, código y si es interno.lockedboolean — Bloqueado.sentBy,receivedBystring — Quién hizo el pedido y quién lo recibió.idCostType,costType,codeCostType,accountCostType,accountAuxCostTypestring — Cuenta analítica del albarán. Si se imputa por línea, va en cada línea.idBusinessLine,businessLine,codeBusinessLinestring — Línea de negocio.baseCalculatednumber — Base calculada con las líneas recibidas, con 5 decimales.base,taxes,totalnumber — Base, impuestos (incluye transporte, descuentos y otros) y total.listTaxesarray — Impuestos:id,type,base,percentytotal.type:0IVA ·1transporte ·2descuento ·3otros.listDeliveriesarray — Líneas recibidas.listSentarray — Líneas del pedido enviado.
Cada línea recibida (listDeliveries):
idstring — Identificador de la línea.positioninteger — Orden.idComponent,component,codeComponentstring — Producto: id, nombre y código.codeVendorComponentstring — Código del producto en el proveedor.commentstring — Comentario.quantitynumber,idUnit,unitstring — Cantidad en la unidad base del producto.costnumber — Coste por unidad base. Importe de la línea:quantity×cost.hasFormatboolean — Si se compró en un formato (p. ej. cajas).quantityFormatnumber,idUnitFormat,unitFormatstring,costFormatnumber — Formato: cantidad, unidad y precio por formato.nullsihasFormatesfalse.idStore,storestring — Almacén.ivanumber — % de IVA.idCostType,costType,codeCostType,accountCostType,accountAuxCostTypestring — Cuenta analítica de la línea.idBusinessLine,businessLine,codeBusinessLinestring — Línea de negocio de la línea.listTypesarray — Familias del producto:idydescr.recibidoboolean — Siempretrue.
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:
idCustomerstring · 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": [ … ]
}idstring — Identificador de la factura.invoiceNumstring — Número de factura.documentNumstring — Número de documento.date,dateAccounting,dateDuedate — Fecha de factura, fecha contable (si esnull, usadate) y vencimiento.createdAt,updatedAtdate — Creación y última modificación.idCustomer,customer,codeCustomer,accountCustomer,nifstring — Cliente: id, nombre, código, cuenta contable y NIF.paid,lockedboolean — Cobrada y bloqueada.commentstring — Comentario.codePaymentTypestring — Código de la forma de pago.idCostTypeVendor,costTypeVendor,codeCostTypeVendor,accountCostTypeVendor,accountAuxCostTypeVendorstring — Cuenta analítica por defecto del cliente: id, nombre, código, cuenta contable y cuenta auxiliar.idDocument,extDocumentstring — Documento adjunto: id y extensión.base,taxes,totalnumber — Base imponible, impuestos y total.listTaxesarray — Impuestos:id,type,base,percentytotal.type:0IVA ·1transporte ·2descuento ·3otros.listCostTypeTaxesarray — IVA por cuenta analítica, calculado con las líneas enviadas:idydescrde la cuenta (nullsi las líneas no tienen) ylistTaxes(type,base,percent,total).listDeliveriesarray — Albaranes de venta de la factura.
Cada albarán de venta (listDeliveries):
idstring — Identificador del albarán.invoiceNumstring — Número de albarán.datedate — Fecha del albarán.idCustomer,customer,customerCode,nifstring — Cliente: id, nombre, código y NIF.address,cp,citystring — Dirección, código postal y ciudad del cliente.contact,phone,contactAux,phoneAux,mail,mailAux,mailCC,webstring — Contactos del cliente.customerType,customerTypeCodestring,customerTypeInternalboolean — Tipo de cliente: nombre, código y si es interno.basenumber — Base de las líneas enviadas.listLines,listLinesPendingarray — Líneas enviadas y pendientes de enviar.
Cada línea (listLines, listLinesPending):
idstring — Identificador de la línea.positioninteger — Orden dentro de la lista, desde 0.idComponent,component,codeComponentstring — Producto vendido.idMenu,menu,codeMenustring — Agrupación vendida.codeCustomerProductstring — Código de venta del producto para el cliente.idCustomerGroup,customerGroupstring — Grupo de productos.commentstring — Comentario. En líneas sin producto ni agrupación, el nombre del producto de venta.sentboolean — Enviada.quantitynumber,idUnit,unitstring — Cantidad y unidad.costnumber — Precio de venta unitario sin IVA.costRecipenumber — Coste unitario de escandallo.ivanumber — % de IVA.listTypesarray — Familias del producto:idydescr.
¿Necesitas ayuda? Escríbenos desde el chat de soporte, en la esquina inferior derecha.
