API
Movements
Returns a log of stock changes, so you can fetch only what changed since your last check instead of re-downloading everything.
Endpoint
GET https://vintrhall.com/api/v1/movements
curl -H "Authorization: Bearer vh_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
"https://vintrhall.com/api/v1/movements?since=2026-07-10T00:00:00Z"
Query parameters
| Parameter | Description |
|---|---|
since | Required. ISO 8601 timestamp. Return only movements posted at or after this time. |
cursor | Pagination cursor from a previous response. |
limit | Page size, default 100, maximum 200. |
Response
{
"items": [
{
"id": "mv_01h...",
"kind": "scan_sort",
"sku": "TSH-BLK-M",
"qtyDelta": 5,
"warehouse": "WH1",
"location": "A/3/2/1",
"postedAt": "2026-07-11T07:12:00.000Z"
}
],
"nextCursor": null
}
kind is one of:
| Kind | Meaning |
|---|---|
receipt_in | Stock received into a location. |
scan_sort | Stock added to a location during scanning. |
scan_undo | A previous scan was undone. |
stocktake_plus | A count found more stock than expected. |
stocktake_minus | A count found less stock than expected. |
To keep your own system in sync, store the highest postedAt you have processed and pass it as since on the next request. This way you only fetch what changed. Because since has second-level granularity, re-running a request from the last processed postedAt can return a movement you already have, so deduplicate incoming items by id.