Browse the docs

Operate

SDKs and Postman

Official Node.js and Python libraries, and a Postman collection for every endpoint.

Official libraries wrap the API for Node.js and Python: they pick the right host from your key, send idempotency keys on every write, page through lists for you, retry what is safe to retry, and verify webhook signatures. Both are held to the same OpenAPI description as this reference: a test in each fails if the API gains an endpoint the library does not have, and the Node types are generated from it.

Both are open source under the MIT License, so you can ship them inside your own software, closed source included. Calling the API with them is governed by the Terms of API use.

Node.js

Shell
npm install @scanimart/connect
Node.js
import { Scanimart } from "@scanimart/connect";

const scanimart = new Scanimart(process.env.SCANIMART_KEY);

const { company } = await scanimart.ping();

for await (const order of scanimart.orders.list(1042, { status: "PENDING" })) {
  await scanimart.orders.accept(1042, order.id, { fulfilment_mode: "STORE_STAFF", external_id: "BILL-20391" });
}

Node 18.17 or newer; no dependencies. TypeScript types are included.

Python

Shell
pip install scanimart-connect
Python
import os
import scanimart

client = scanimart.Client(os.environ["SCANIMART_KEY"])

print(client.ping()["company"]["name"])

for order in client.orders.list(1042, status="PENDING"):
    client.orders.accept(1042, order["id"], fulfilment_mode="STORE_STAFF", external_id="BILL-20391")

Python 3.9 or newer; no dependencies beyond the standard library.

Verifying webhooks

Node.js
const event = scanimart.webhooks.constructEvent(rawBody, req.get("Scanimart-Signature"), secret);
Python
event = scanimart.webhooks.construct_event(raw_body, request.headers["Scanimart-Signature"], secret)

Both throw if the signature does not match or the timestamp is more than five minutes old, and return the parsed event otherwise. Pass the raw request body, not re-serialised JSON.

Errors

A failed call raises an error carrying the API's code, message, HTTP status and request id (requestId in Node, request_id in Python):

Node.js
try {
  await scanimart.orders.accept(storeId, orderId);
} catch (err) {
  if (err.code === "order_not_in_required_state") {
    // Someone else got there first.
  } else throw err;
}
Python
try:
    client.orders.accept(store_id, order_id)
except scanimart.ScanimartError as err:
    if err.code != "order_not_in_required_state":
        raise

Network failures, 429 and 5xx answers are retried automatically — twice by default, with backoff — but only for calls that are safe to repeat: reads, and writes carrying an idempotency key. The SDKs send one with every write the API accepts one for, and reuse it across the retries, so a retried write never happens twice. Pass your own (idempotencyKey / idempotency_key) when the action has to survive your process restarting.

Lists

Lists return a page you can read, or iterate for every item across pages:

Node.js
const page = await scanimart.sales.list(1042, { since: "2026-10-08T00:00:00+05:30" });
console.log(page.data.length, page.has_more);

for await (const sale of scanimart.sales.list(1042, { since: "2026-10-08T00:00:00+05:30" })) {
  await pos.book(sale);
}
Python
for sale in client.sales.list(1042, since="2026-10-08T00:00:00+05:30"):
    pos.book(sale)

Postman

Download the Postman collection. It has every endpoint, in the order an integration meets them: check your key, find your test store, place, accept, pick, pack and deliver a test order, sync stock, book the sale and manage webhook endpoints — each request checking its answer and passing ids to the next.

Import it, set the api_key variable to a test key, set up your sandbox in the dashboard, and run the whole collection. Scanimart runs the same collection against a sandbox server on every change to the API, so it is known to work.

Other languages

There is no official library for .NET, Java or PHP yet. The OpenAPI description works with any OpenAPI 3.1 generator, and the webhooks guide has everything needed to verify signatures by hand.