Browse the docs
API reference
Inventory
Push stock counts and adjustments from the POS.
Push stock counts
/v1/stores/{store_id}/inventorySet the shelf count for up to 1,000 barcodes. Your POS owns the count; Scanimart subtracts the units in its own sales that you had not booked by as_of (see adjusted_for_unbooked_sales), so a count taken before you booked a Scanimart sale never puts sold stock back on the shelf.
Up to 200 items are applied immediately (200). Larger pushes are queued (202): poll GET …/inventory/syncs/{id}. Unknown barcodes need name; rows that fail are listed in errors and the rest still apply.
Parameters
store_idinteger · pathrequiredIdempotency-Keystring · headerAny unique string (a UUID is ideal). Retrying with the same key returns the first result instead of acting twice. Kept for 24 hours.
Request body
as_oftimestampWhen your POS took this count. Always send it: Scanimart sales you had not booked by then are subtracted. Defaults to now.
itemsarray of objectrequiredbarcodestringrequiredstockintegerrequiredUnits on the shelf according to your POS, at
as_of.namestringRequired the first time Scanimart sees this barcode.
mrpdecimal stringpricedecimal stringThe store's selling price.
expiry_datedatelow_stock_thresholdintegerbrandstringcategorystringsubcategorystringweightstringdescriptionstringexternal_idstringYour SKU; echoed on order lines.
Returns · InventorySync
Show 15 fields
objectstringiduuidrequiredkindenumrequired*
inventory_push- inventory_push *inventory_adjust- inventory_adjustinventory_pushinventory_adjuststatusenumrequired*
queued- queued *running- running *completed- completed *failed- failedqueuedrunningcompletedfailedstore_idintegerrequiredas_oftimestampnullablerequiredreceivedintegerrequiredcreatedintegerrequiredupdatedintegerrequiredunchangedintegerrequirederror_countintegerrequirederrorsarray of objectrequiredFirst 100 rejected rows: barcode, code, message.
adjusted_for_unbooked_salesobjectrequiredUnits subtracted per barcode for Scanimart sales you had not booked by
as_of.created_attimestamprequiredfinished_attimestampnullablerequired
Errors: 400, in the standard error format.
curl -X PUT https://sandbox.api.scanimart.com/v1/stores/1042/inventory \
-H "Authorization: Bearer $SCANIMART_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"as_of": "2026-10-08T10:15:00+05:30",
"items": [
{
"barcode": "8901725181222",
"stock": 2,
"name": "Aashirvaad Atta 5kg",
"mrp": "249.00",
"price": "249.00",
"expiry_date": "2026-12-31",
"low_stock_threshold": 1,
"brand": "string",
"category": "string",
"subcategory": "string",
"weight": "string",
"description": "Billing server",
"external_id": "BILL-20391"
}
]
}'{
"object": "inventory_sync",
"id": "ORDER-1A2B3C4D5E",
"kind": "inventory_push",
"status": "queued",
"store_id": 1042,
"as_of": "2026-10-08T10:15:00+05:30",
"received": 1,
"created": 1,
"updated": 1,
"unchanged": 1,
"error_count": 1,
"errors": [
{}
],
"adjusted_for_unbooked_sales": {},
"created_at": "2026-10-08T10:15:00+05:30",
"finished_at": "2026-10-08T10:15:00+05:30"
}Adjust stock
/v1/stores/{store_id}/inventory/adjustmentsMove stock by a delta per barcode -- a counter sale (−2), a delivery received (+24). Never takes stock below zero. Send an Idempotency-Key: an adjustment applied twice is a wrong shelf count.
Parameters
store_idinteger · pathrequiredIdempotency-Keystring · headerAny unique string (a UUID is ideal). Retrying with the same key returns the first result instead of acting twice. Kept for 24 hours.
Request body
adjustmentsarray of objectrequiredbarcodestringrequireddeltaintegerrequiredUnits to add (positive) or remove (negative).
reasonanyreferencestringYour bill or GRN number.
Returns · InventorySync
Show 15 fields
objectstringiduuidrequiredkindenumrequired*
inventory_push- inventory_push *inventory_adjust- inventory_adjustinventory_pushinventory_adjuststatusenumrequired*
queued- queued *running- running *completed- completed *failed- failedqueuedrunningcompletedfailedstore_idintegerrequiredas_oftimestampnullablerequiredreceivedintegerrequiredcreatedintegerrequiredupdatedintegerrequiredunchangedintegerrequirederror_countintegerrequirederrorsarray of objectrequiredFirst 100 rejected rows: barcode, code, message.
adjusted_for_unbooked_salesobjectrequiredUnits subtracted per barcode for Scanimart sales you had not booked by
as_of.created_attimestamprequiredfinished_attimestampnullablerequired
Errors: 400, in the standard error format.
curl -X POST https://sandbox.api.scanimart.com/v1/stores/1042/inventory/adjustments \
-H "Authorization: Bearer $SCANIMART_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"adjustments": [
{
"barcode": "8901725181222",
"delta": 1,
"reason": "other",
"reference": "string"
}
]
}'{
"object": "inventory_sync",
"id": "ORDER-1A2B3C4D5E",
"kind": "inventory_push",
"status": "queued",
"store_id": 1042,
"as_of": "2026-10-08T10:15:00+05:30",
"received": 1,
"created": 1,
"updated": 1,
"unchanged": 1,
"error_count": 1,
"errors": [
{}
],
"adjusted_for_unbooked_sales": {},
"created_at": "2026-10-08T10:15:00+05:30",
"finished_at": "2026-10-08T10:15:00+05:30"
}List stock
/v1/stores/{store_id}/inventoryStock as Scanimart sees it, with units reserved for paid online orders.
Parameters
store_idinteger · pathrequiredbarcodestring · querycursorstring · queryOpaque cursor from a previous page's
next_cursor.limitinteger · queryPage size, 1–100. Default 50.
Returns · InventoryList
Show 4 fields
objectstringdataarray of objectrequiredobjectstringbarcodestringnullablerequirednamestringnullablerequiredstockintegerrequiredUnits on the shelf.
reservedintegerrequiredUnits held for paid online orders not yet accepted.
availableintegerrequiredstock − reserved: what can still be sold.
mrpdecimal stringnullablerequiredpricedecimal stringnullablerequiredThe store's selling price.
expiry_datedatenullablerequiredlow_stock_thresholdintegerrequiredsourceenumnullablerequired*
catalog- catalog *store_item- store_itemcatalogstore_itemexternal_idstringnullablerequired
has_morebooleanrequirednext_cursorstringnullablerequiredPass as
cursorto get the next page.
curl https://sandbox.api.scanimart.com/v1/stores/1042/inventory \
-H "Authorization: Bearer $SCANIMART_KEY"{
"object": "list",
"data": [
{
"object": "inventory_item",
"barcode": "8901725181222",
"name": "Aashirvaad Atta 5kg",
"stock": 2,
"reserved": 1,
"available": 1,
"mrp": "249.00",
"price": "249.00",
"expiry_date": "2026-12-31",
"low_stock_threshold": 1,
"source": "catalog",
"external_id": "BILL-20391"
}
],
"has_more": false,
"next_cursor": null
}List recent stock pushes
/v1/stores/{store_id}/inventory/syncsParameters
store_idinteger · pathrequiredlimitinteger · queryPage size, 1–100. Default 50.
Returns · InventorySyncList
Show 4 fields
objectstringdataarray of objectrequiredobjectstringiduuidrequiredkindenumrequired*
inventory_push- inventory_push *inventory_adjust- inventory_adjustinventory_pushinventory_adjuststatusenumrequired*
queued- queued *running- running *completed- completed *failed- failedqueuedrunningcompletedfailedstore_idintegerrequiredas_oftimestampnullablerequiredreceivedintegerrequiredcreatedintegerrequiredupdatedintegerrequiredunchangedintegerrequirederror_countintegerrequirederrorsarray of objectrequiredFirst 100 rejected rows: barcode, code, message.
adjusted_for_unbooked_salesobjectrequiredUnits subtracted per barcode for Scanimart sales you had not booked by
as_of.created_attimestamprequiredfinished_attimestampnullablerequired
has_morebooleanrequirednext_cursorstringnullablerequiredPass as
cursorto get the next page.
curl https://sandbox.api.scanimart.com/v1/stores/1042/inventory/syncs \
-H "Authorization: Bearer $SCANIMART_KEY"{
"object": "list",
"data": [
{
"object": "inventory_sync",
"id": "ORDER-1A2B3C4D5E",
"kind": "inventory_push",
"status": "queued",
"store_id": 1042,
"as_of": "2026-10-08T10:15:00+05:30",
"received": 1,
"created": 1,
"updated": 1,
"unchanged": 1,
"error_count": 1,
"errors": [
{}
],
"adjusted_for_unbooked_sales": {},
"created_at": "2026-10-08T10:15:00+05:30",
"finished_at": "2026-10-08T10:15:00+05:30"
}
],
"has_more": false,
"next_cursor": null
}Get a stock push
/v1/stores/{store_id}/inventory/syncs/{run_id}Parameters
store_idinteger · pathrequiredrun_iduuid · pathrequired
Returns · InventorySync
Show 15 fields
objectstringiduuidrequiredkindenumrequired*
inventory_push- inventory_push *inventory_adjust- inventory_adjustinventory_pushinventory_adjuststatusenumrequired*
queued- queued *running- running *completed- completed *failed- failedqueuedrunningcompletedfailedstore_idintegerrequiredas_oftimestampnullablerequiredreceivedintegerrequiredcreatedintegerrequiredupdatedintegerrequiredunchangedintegerrequirederror_countintegerrequirederrorsarray of objectrequiredFirst 100 rejected rows: barcode, code, message.
adjusted_for_unbooked_salesobjectrequiredUnits subtracted per barcode for Scanimart sales you had not booked by
as_of.created_attimestamprequiredfinished_attimestampnullablerequired
Errors: 404, in the standard error format.
curl https://sandbox.api.scanimart.com/v1/stores/1042/inventory/syncs/3f1c9a2e-6b7d-4c1a-9f0e-2d8b5a7c4e10 \
-H "Authorization: Bearer $SCANIMART_KEY"{
"object": "inventory_sync",
"id": "ORDER-1A2B3C4D5E",
"kind": "inventory_push",
"status": "queued",
"store_id": 1042,
"as_of": "2026-10-08T10:15:00+05:30",
"received": 1,
"created": 1,
"updated": 1,
"unchanged": 1,
"error_count": 1,
"errors": [
{}
],
"adjusted_for_unbooked_sales": {},
"created_at": "2026-10-08T10:15:00+05:30",
"finished_at": "2026-10-08T10:15:00+05:30"
}