Skip to main content
These are explicit permissions: an integration only has them if the administrator checks them one by one in External integrations. Existing integrations do not receive them automatically.
  • Only physical products track inventory; services do not appear in stock and cannot be adjusted or transferred.
  • Everything is limited to the integration’s business: a branch, product or transfer from another business returns 404.
  • unit_cost is always the product’s cost (not the sale price). Adjustments and transfers are ready to be posted at cost from Process documents.
  • Writes accept the Idempotency-Key header. Always send it so you don’t duplicate an adjustment or a transfer when retrying.

Query stock

Query movements

  • type: in (inbound) or out (outbound). quantity is always positive.
  • source: adjustment, transfer, sale, purchase or null (older movements with no recorded source).
  • unit_cost can be null on movements prior to this version.

Query batches

Batches are sorted by expiration date. Each item:
days_to_expire is negative if the batch has already expired.

Alerts

Gathers low stock, batches about to expire and expired batches with stock in a single call (up to 500 of each type).
low_stock uses the stock format and the batches use the batches format.

Register an adjustment

Registers a shortage/shrinkage (out) or a surplus (in) and updates stock immediately. The movement stores the product’s unit cost at that moment.
201 response: the movement and the updated stock.
The adjustment does not validate available stock: a shortage greater than the stock leaves the product negative. Check stock first if your process requires it.
Errors

Transfers between branches

A transfer has three statuses:

Create a transfer

Creates the transfer in pending status. With "complete": true it also completes it in the same call.
201 response
items[].unit_cost is the product’s cost when the transfer was created, and total_cost is the sum of quantity × cost.
With complete: true, creating and completing is a single operation: if the transfer cannot be completed (for example, the stock changed), the response is an error and no transfer is left created. You can fix it and retry the same call.

Complete a transfer

The body is optional. It moves stock atomically: it deducts at the origin (only if there is still enough stock) and adds at the destination. It returns 200 with the transfer in completed status. A nonexistent or inactive cost center, or one with subcenters, returns 422 and the transfer is not completed. Since inventory accounts are balance sheet accounts, the center normally does not reach the journal entry; it only does if the company configured those accounts to accept a cost center. Product in the destination branch: it is looked up by SKU; if it does not exist, by barcode; if it does not exist either, a copy of the product is created at the destination (same SKU, name, category, unit, price and taxes) with stock 0 before adding the inbound quantity.

Cancel a transfer

No body. Only for pending transfers; it does not move stock. It returns 200 with the transfer in cancelled status. Transfer errors

Query transfers

The list is paginated (data + pagination) with the same format as the creation response. The detail returns a single object or 404 if it does not exist or belongs to another business.