Browse the docs
API reference
Sales and events
Book every Scanimart sale, and catch up on missed events.
List completed sales
/v1/stores/{store_id}/salesEvery Scanimart sale at the store -- delivered online orders and paid in-store Scan & Go -- oldest first, for booking into your POS. The same sales arrive as sale.completed webhooks; this is the pull fallback. Covers the last 30 days.
Parameters
store_idinteger · pathrequiredcursorstring · queryOpaque cursor from a previous page's
next_cursor.limitinteger · queryPage size, 1–100. Default 50.
sincestring · queryISO 8601.
Returns · SaleList
Show 4 fields
objectstringdataarray of objectrequiredobjectstringidstringrequiredThe Scanimart order id this sale came from.
event_idstringrequiredThe sale.completed event id; use it to acknowledge.
external_idstringnullablerequiredstore_idintegerrequiredchannelenumrequired*
SCANIMART_ONLINE- SCANIMART_ONLINE *SCANIMART_INSTORE- SCANIMART_INSTORESCANIMART_ONLINESCANIMART_INSTOREsold_attimestamprequiredtotal_amountdecimal stringrequireddelivery_feedecimal stringnullablerequiredpaymentobjectrequiredstatusstringrequiredpaidbooleanrequiredmethodstringnullablerequired
linesarray of objectrequiredbarcodestringnullablerequirednamestringnullablerequiredquantityintegerrequiredfree_quantityintegernullablerequiredUnits of
quantitygiven free by a buy-X-get-Y offer.unit_pricedecimal stringnullablerequiredPer paid unit, tax-inclusive.
mrpdecimal stringnullablerequiredline_totaldecimal stringrequiredsourceenumnullablerequired*
catalog- catalog *store_item- store_item *misc- misccatalogstore_itemmiscexternal_idstringnullablerequiredYour id for this item, if you sent one.
has_morebooleanrequirednext_cursorstringnullablerequiredPass as
cursorto get the next page.
curl https://sandbox.api.scanimart.com/v1/stores/1042/sales \
-H "Authorization: Bearer $SCANIMART_KEY"{
"object": "list",
"data": [
{
"object": "sale",
"id": "ORDER-1A2B3C4D5E",
"event_id": "evt_8f14e45fceea167a5a36dedd4bea2543",
"external_id": "BILL-20391",
"store_id": 1042,
"channel": "SCANIMART_ONLINE",
"sold_at": "2026-10-08T10:15:00+05:30",
"total_amount": "249.00",
"delivery_fee": "249.00",
"payment": {
"status": "string",
"paid": true,
"method": "string"
},
"lines": [
{
"barcode": "8901725181222",
"name": "Aashirvaad Atta 5kg",
"quantity": 2,
"free_quantity": 2,
"unit_price": "249.00",
"mrp": "249.00",
"line_total": "249.00",
"source": "catalog",
"external_id": "BILL-20391"
}
]
}
],
"has_more": false,
"next_cursor": null
}Acknowledge booked sales
/v1/stores/{store_id}/sales/ackFor integrations that pull sales instead of receiving webhooks: tell Scanimart which sales you have booked, so stock you push afterwards is not adjusted for them. A 2xx to a sale.completed webhook does this automatically.
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
event_idsarray of stringrequiredevent_ids from GET …/sales that you have booked.
Returns · SaleAck
Show 3 fields
objectstringacknowledgedarray of stringrequiredThe event ids now booked.
unknownarray of stringrequiredIds that are not sale.completed events at this store since it connected you. Nothing was done with them.
curl -X POST https://sandbox.api.scanimart.com/v1/stores/1042/sales/ack \
-H "Authorization: Bearer $SCANIMART_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"event_ids": [
"string"
]
}'{
"object": "sale_ack",
"acknowledged": [
"string"
],
"unknown": [
"string"
]
}List events
/v1/eventsOrder events at your connected stores, oldest first -- the same bodies webhooks carry. Use it to recover anything your endpoint missed. Covers the last 30 days.
Parameters
store_idinteger · querycursorstring · queryOpaque cursor from a previous page's
next_cursor.limitinteger · queryPage size, 1–100. Default 50.
sincestring · queryISO 8601.
typeenum · querydelivery.courier_assigneddelivery.courier_bookeddelivery.faileddelivery.rider_changedorder.acceptedorder.cancelledorder.deliveredorder.fulfilment_changedorder.out_for_deliveryorder.packedorder.payment_failedorder.payment_recoveredorder.picking_startedorder.placedsale.completedsale.exit_verified
Returns · EventList
Show 4 fields
objectstringdataarray of objectrequiredidstringrequiredUnique; dedupe on it. Deliveries are at-least-once.
objectstringtypeenumrequired*
order.placed- order.placed *order.accepted- order.accepted *order.cancelled- order.cancelled *order.payment_failed- order.payment_failed *order.payment_recovered- order.payment_recovered *order.picking_started- order.picking_started *order.packed- order.packed *order.out_for_delivery- order.out_for_delivery *order.delivered- order.delivered *sale.completed- sale.completed *sale.exit_verified- sale.exit_verified *order.fulfilment_changed- order.fulfilment_changed *delivery.courier_booked- delivery.courier_booked *delivery.courier_assigned- delivery.courier_assigned *delivery.rider_changed- delivery.rider_changed *delivery.failed- delivery.failed *store.connected- store.connected *store.disconnected- store.disconnected *ping- pingorder.placedorder.acceptedorder.cancelledorder.payment_failedorder.payment_recoveredorder.picking_startedorder.packedorder.out_for_deliveryorder.deliveredsale.completedsale.exit_verifiedorder.fulfilment_changeddelivery.courier_bookeddelivery.courier_assigneddelivery.rider_changeddelivery.failedstore.connectedstore.disconnectedpingapi_versionstringrequiredmodeenumrequired*
live- live *test- testlivetestcreated_attimestamprequiredstore_idintegernullablerequireddataanyrequiredorder,actor, and per typeprevious_status,reason,channel,sale.
has_morebooleanrequirednext_cursorstringnullablerequiredPass as
cursorto get the next page.
curl https://sandbox.api.scanimart.com/v1/events \
-H "Authorization: Bearer $SCANIMART_KEY"{
"object": "list",
"data": [
{
"id": "ORDER-1A2B3C4D5E",
"object": "event",
"type": "order.placed",
"api_version": "string",
"mode": "live",
"created_at": "2026-10-08T10:15:00+05:30",
"store_id": 1042,
"data": null
}
],
"has_more": false,
"next_cursor": null
}