Registrar movimiento de stock
const url = 'https://api.posdata.so/public/v1/inventory/movements';const options = { method: 'POST', headers: { 'Idempotency-Key': 'example', Authorization: 'Bearer <token>', 'Content-Type': 'application/json' }, body: '{"product_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","warehouse_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","type":"in","quantity":1,"reason":"example","reference":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.posdata.so/public/v1/inventory/movements \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --header 'Idempotency-Key: example' \ --data '{ "product_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "warehouse_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "type": "in", "quantity": 1, "reason": "example", "reference": "example" }'Suma (in) o resta (out) stock de un producto sin variantes. Cada caja aplica el movimiento una sola vez, aunque haya vendido sin conexión mientras tanto. Los productos con variantes (VARIANT_STOCK_UNSUPPORTED) y los que se arman con receta (COMPOSITE_STOCK_UNSUPPORTED) todavía no se pueden mover por la API. El cambio llega a las cajas del negocio por su sincronización normal (en segundos si están en línea; si están sin conexión, al reconectarse).
Permiso requerido: inventory:write.
Autorización
Sección titulada «Autorización»Parámetros
Sección titulada «Parámetros»Parámetros de cabecera
Sección titulada «Parámetros de cabecera»Obligatorio en todo POST. Un valor único por operación (p. ej. un UUID); reutilízalo solo para reintentar la MISMA operación. Válido 24 h.
Cuerpo de la peticiónobligatorio
Sección titulada «Cuerpo de la peticiónobligatorio»object
Por defecto, la bodega predeterminada (o la única bodega activa).
in suma, out resta.
En la unidad base del producto.
Motivo visible en el historial. Por defecto “Movimiento vía API”.
Tu referencia (orden de compra, pedido…).
Respuestas
Sección titulada «Respuestas»Creado
Movimiento del libro de inventario (solo se agregan, nunca se editan).
object
Tipo de movimiento tal como lo registró la caja.
Cantidad en la unidad base del producto (puede ser fraccionaria).
Ejemplo
{ "object": "stock_movement"}Petición inválida (VALIDATION_ERROR, INVALID_JSON, INVALID_CURSOR).
object
object
Explicación en español, con el siguiente paso.
Campo que causó el error, si aplica.
Ejemplo
{ "error": { "code": "UNAUTHENTICATED" }}Sin API key válida (UNAUTHENTICATED, INVALID_API_KEY, API_KEY_REVOKED, API_KEY_EXPIRED, API_KEY_WRONG_ENVIRONMENT, ACCOUNT_INACTIVE).
object
object
Explicación en español, con el siguiente paso.
Campo que causó el error, si aplica.
Ejemplo
{ "error": { "code": "UNAUTHENTICATED" }}Sin permiso (PLAN_REQUIRED, INSUFFICIENT_SCOPE, BROWSER_REQUESTS_NOT_ALLOWED).
object
object
Explicación en español, con el siguiente paso.
Campo que causó el error, si aplica.
Ejemplo
{ "error": { "code": "UNAUTHENTICATED" }}Conflicto (CONFLICT, SKU_ALREADY_EXISTS, IDEMPOTENCY_IN_PROGRESS, NO_WAREHOUSE, DEVICES_OUTDATED).
object
object
Explicación en español, con el siguiente paso.
Campo que causó el error, si aplica.
Ejemplo
{ "error": { "code": "UNAUTHENTICATED" }}Regla de negocio o idempotencia (IDEMPOTENCY_KEY_REUSED, VARIANT_STOCK_UNSUPPORTED, COMPOSITE_STOCK_UNSUPPORTED).
object
object
Explicación en español, con el siguiente paso.
Campo que causó el error, si aplica.
Ejemplo
{ "error": { "code": "UNAUTHENTICATED" }}Límite de peticiones (RATE_LIMITED). Respeta Retry-After.
object
object
Explicación en español, con el siguiente paso.
Campo que causó el error, si aplica.
Ejemplo
{ "error": { "code": "UNAUTHENTICATED" }}Error interno (INTERNAL_ERROR). Reintenta y comparte el request_id si persiste.
object
object
Explicación en español, con el siguiente paso.
Campo que causó el error, si aplica.
Ejemplo
{ "error": { "code": "UNAUTHENTICATED" }}