Browse the docs

API reference

Inventory

Push stock counts and adjustments from the POS.

Push stock counts

PUT/v1/stores/{store_id}/inventory

Set 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 · pathrequired
  • Idempotency-Keystring · header

    Any 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_oftimestamp

    When your POS took this count. Always send it: Scanimart sales you had not booked by then are subtracted. Defaults to now.

  • itemsarray of objectrequired
    • barcodestringrequired
    • stockintegerrequired

      Units on the shelf according to your POS, at as_of.

    • namestring

      Required the first time Scanimart sees this barcode.

    • mrpdecimal string
    • pricedecimal string

      The store's selling price.

    • expiry_datedate
    • low_stock_thresholdinteger
    • brandstring
    • categorystring
    • subcategorystring
    • weightstring
    • descriptionstring
    • external_idstring

      Your SKU; echoed on order lines.

Returns · InventorySync

Show 15 fields
  • objectstring
  • iduuidrequired
  • kindenumrequired

    * inventory_push - inventory_push * inventory_adjust - inventory_adjust

    inventory_pushinventory_adjust
  • statusenumrequired

    * queued - queued * running - running * completed - completed * failed - failed

    queuedrunningcompletedfailed
  • store_idintegerrequired
  • as_oftimestampnullablerequired
  • receivedintegerrequired
  • createdintegerrequired
  • updatedintegerrequired
  • unchangedintegerrequired
  • error_countintegerrequired
  • errorsarray of objectrequired

    First 100 rejected rows: barcode, code, message.

  • adjusted_for_unbooked_salesobjectrequired

    Units subtracted per barcode for Scanimart sales you had not booked by as_of.

  • created_attimestamprequired
  • finished_attimestampnullablerequired

Errors: 400, in the standard error format.

Request
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"
      }
    ]
  }'
Response · 200
{
  "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

POST/v1/stores/{store_id}/inventory/adjustments

Move 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 · pathrequired
  • Idempotency-Keystring · header

    Any 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 objectrequired
    • barcodestringrequired
    • deltaintegerrequired

      Units to add (positive) or remove (negative).

    • reasonany
    • referencestring

      Your bill or GRN number.

Returns · InventorySync

Show 15 fields
  • objectstring
  • iduuidrequired
  • kindenumrequired

    * inventory_push - inventory_push * inventory_adjust - inventory_adjust

    inventory_pushinventory_adjust
  • statusenumrequired

    * queued - queued * running - running * completed - completed * failed - failed

    queuedrunningcompletedfailed
  • store_idintegerrequired
  • as_oftimestampnullablerequired
  • receivedintegerrequired
  • createdintegerrequired
  • updatedintegerrequired
  • unchangedintegerrequired
  • error_countintegerrequired
  • errorsarray of objectrequired

    First 100 rejected rows: barcode, code, message.

  • adjusted_for_unbooked_salesobjectrequired

    Units subtracted per barcode for Scanimart sales you had not booked by as_of.

  • created_attimestamprequired
  • finished_attimestampnullablerequired

Errors: 400, in the standard error format.

Request
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"
      }
    ]
  }'
Response · 200
{
  "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

GET/v1/stores/{store_id}/inventory

Stock as Scanimart sees it, with units reserved for paid online orders.

Parameters

  • store_idinteger · pathrequired
  • barcodestring · query
  • cursorstring · query

    Opaque cursor from a previous page's next_cursor.

  • limitinteger · query

    Page size, 1–100. Default 50.

Returns · InventoryList

Show 4 fields
  • objectstring
  • dataarray of objectrequired
    • objectstring
    • barcodestringnullablerequired
    • namestringnullablerequired
    • stockintegerrequired

      Units on the shelf.

    • reservedintegerrequired

      Units held for paid online orders not yet accepted.

    • availableintegerrequired

      stock − reserved: what can still be sold.

    • mrpdecimal stringnullablerequired
    • pricedecimal stringnullablerequired

      The store's selling price.

    • expiry_datedatenullablerequired
    • low_stock_thresholdintegerrequired
    • sourceenumnullablerequired

      * catalog - catalog * store_item - store_item

      catalogstore_item
    • external_idstringnullablerequired
  • has_morebooleanrequired
  • next_cursorstringnullablerequired

    Pass as cursor to get the next page.

Request
curl https://sandbox.api.scanimart.com/v1/stores/1042/inventory \
  -H "Authorization: Bearer $SCANIMART_KEY"
Response · 200
{
  "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

GET/v1/stores/{store_id}/inventory/syncs

Parameters

  • store_idinteger · pathrequired
  • limitinteger · query

    Page size, 1–100. Default 50.

Returns · InventorySyncList

Show 4 fields
  • objectstring
  • dataarray of objectrequired
    • objectstring
    • iduuidrequired
    • kindenumrequired

      * inventory_push - inventory_push * inventory_adjust - inventory_adjust

      inventory_pushinventory_adjust
    • statusenumrequired

      * queued - queued * running - running * completed - completed * failed - failed

      queuedrunningcompletedfailed
    • store_idintegerrequired
    • as_oftimestampnullablerequired
    • receivedintegerrequired
    • createdintegerrequired
    • updatedintegerrequired
    • unchangedintegerrequired
    • error_countintegerrequired
    • errorsarray of objectrequired

      First 100 rejected rows: barcode, code, message.

    • adjusted_for_unbooked_salesobjectrequired

      Units subtracted per barcode for Scanimart sales you had not booked by as_of.

    • created_attimestamprequired
    • finished_attimestampnullablerequired
  • has_morebooleanrequired
  • next_cursorstringnullablerequired

    Pass as cursor to get the next page.

Request
curl https://sandbox.api.scanimart.com/v1/stores/1042/inventory/syncs \
  -H "Authorization: Bearer $SCANIMART_KEY"
Response · 200
{
  "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

GET/v1/stores/{store_id}/inventory/syncs/{run_id}

Parameters

  • store_idinteger · pathrequired
  • run_iduuid · pathrequired

Returns · InventorySync

Show 15 fields
  • objectstring
  • iduuidrequired
  • kindenumrequired

    * inventory_push - inventory_push * inventory_adjust - inventory_adjust

    inventory_pushinventory_adjust
  • statusenumrequired

    * queued - queued * running - running * completed - completed * failed - failed

    queuedrunningcompletedfailed
  • store_idintegerrequired
  • as_oftimestampnullablerequired
  • receivedintegerrequired
  • createdintegerrequired
  • updatedintegerrequired
  • unchangedintegerrequired
  • error_countintegerrequired
  • errorsarray of objectrequired

    First 100 rejected rows: barcode, code, message.

  • adjusted_for_unbooked_salesobjectrequired

    Units subtracted per barcode for Scanimart sales you had not booked by as_of.

  • created_attimestamprequired
  • finished_attimestampnullablerequired

Errors: 404, in the standard error format.

Request
curl https://sandbox.api.scanimart.com/v1/stores/1042/inventory/syncs/3f1c9a2e-6b7d-4c1a-9f0e-2d8b5a7c4e10 \
  -H "Authorization: Bearer $SCANIMART_KEY"
Response · 200
{
  "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"
}