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_costis 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-Keyheader. Always send it so you don’t duplicate an adjustment or a transfer when retrying.
Query stock
Query movements
type:in(inbound) orout(outbound).quantityis always positive.source:adjustment,transfer,sale,purchaseornull(older movements with no recorded source).unit_costcan benullon 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
low_stock uses the stock format and the batches use the batches format.
Register an adjustment
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.
Transfers between branches
A transfer has three statuses:Create a transfer
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.
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
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.