Set up a location
Create a venue, a store inside it and a register in that store, and point the register at the store's stockroom so its sales reduce the right stock.
Every sale, stock count and report in iotoms belongs to a location. In this guide you create the three levels of the location tree, in order: a venue (a site or branch), a store (a selling point inside the venue) and a register (the till or device that rings up sales). See Concepts for how they fit together.
At the end you will have a venue ID, a store ID and a register ID that later calls (sales, reports) can use, plus the ID of the store's stockroom.
Before you start you need a token and the merchant's tenant code. See Authentication.
A new merchant already has one of each
Every new iotoms merchant starts with a "Default Venue", a "Default Store" and a "Default Register". List them in Step 1 before you create anything. The Default Store has no stockroom of its own and the Default Register has none set, so sales on it come out of the merchant's default warehouse. To keep stock per store, create your own store and register as below.
Step 1 — Check what already exists
Look before you create, so you do not add a second venue for a branch the merchant already set up.
curl 'https://beta.iotoms.com/api/v1/catalog/business/venues?page=0&size=20' \
-H 'X-TenantID: <tenant-code>' \
-H 'Authorization: Bearer <token>'data.content[].idanddata.content[].name: the existing venues, sorted by name.queryfilters by text.sizemust be between 1 and 100.
You can list stores and registers in the same way with
List stores (filter by venueId) and
List registers (filter by storeId).
Endpoint: List venues
Step 2 — Create the venue
A venue is the top of the tree; every store hangs off one.
curl -X POST 'https://beta.iotoms.com/api/v1/catalog/business/venues' \
-H 'X-TenantID: <tenant-code>' \
-H 'Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{
"name": "Downtown branch",
"status": "ACTIVE"
}'The server answers 201 Created with the venue itself. It does not wrap it in the usual envelope:
{
"id": 3,
"name": "Downtown branch",
"status": "ACTIVE",
"modifiedTime": "2026-10-18T09:30:00Z"
}id: the venue ID. Venue, store and register IDs are whole numbers.- Venue names must be unique within the merchant. A duplicate name returns 409.
- You do not send
modifiedTime. iotoms sets it.
Endpoint: Create a venue
Step 3 — Create the store
A store is where selling happens, and it owns a stockroom.
curl -X POST 'https://beta.iotoms.com/api/v1/catalog/business/stores' \
-H 'X-TenantID: <tenant-code>' \
-H 'Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{
"name": "Main counter",
"venueId": 3,
"storeType": "FLAGSHIP",
"status": "ACTIVE"
}'venueIdis theidfrom Step 2. An unknown venue returns 404.storeTypeis a short label of your choice. It is required.- Store names must be unique within the merchant. A duplicate name returns 409.
The response (201, no envelope) gives you:
id: the store ID, for example7.venue: the venue the store belongs to.
When the store is created, iotoms also creates a stockroom for it. A stockroom is an inventory location named after the store, for example "Main counter (Store)". Its stock is what the store sells from. You need its ID in the next step.
Endpoint: Create a store
Step 4 — Find the store's stockroom
The register needs to know which stockroom to take stock from when it sells.
curl 'https://beta.iotoms.com/api/v1/inventory/locations?locationType=STORE' \
-H 'X-TenantID: <tenant-code>' \
-H 'Authorization: Bearer <token>'data is a plain list. Pick the entry whose storeId equals your store ID:
id: the stockroom ID (a UUID), for example5b0f6c1e-2d8a-4f3b-9e71-0c4d2a6b8f13.locationName,locationCode(for exampleSTORE-7) andisActive.
Endpoint: List inventory locations
Step 5 — Create the register
The register rings up sales. Linking it to the stockroom makes every sale on it reduce that stockroom's stock.
curl -X POST 'https://beta.iotoms.com/api/v1/catalog/business/registers' \
-H 'X-TenantID: <tenant-code>' \
-H 'Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
-d '{
"name": "Till 1",
"storeId": 7,
"fromTime": "2026-10-18T09:00:00Z",
"type": "POS",
"status": "ACTIVE",
"inventoryLocationId": "5b0f6c1e-2d8a-4f3b-9e71-0c4d2a6b8f13"
}'storeIdis the store ID from Step 3.fromTimeis when the register comes into use. Send a full date and time with a time zone.typeisPOSfor a fixed till andVANfor a van-sales device.inventoryLocationIdis the stockroom ID from Step 4. It must be an active stockroom.
The response (201, no envelope) gives you id, the register ID (for example 11),
and echoes inventoryLocationId.
Don't skip the stockroom
inventoryLocationId is optional, but a register without one takes its sales from the
merchant's default warehouse, not from its own store. iotoms flags these registers for the
merchant to fix. Set it when you create the register.
Register limit
The number of active registers depends on the merchant's plan. If the plan is full, the call
returns 409 with a message asking to upgrade. Creating the register as INACTIVE does
not count towards the limit.
Endpoint: Create a register
Step 6 — Confirm the setup
Read the register back to check that it is linked to the right store and stockroom.
curl 'https://beta.iotoms.com/api/v1/catalog/business/registers/11' \
-H 'X-TenantID: <tenant-code>' \
-H 'Authorization: Bearer <token>'Check store.id, store.venue.id and inventoryLocationId. Keep the register ID and store ID.
You will send them with every sale.
Endpoint: Get a register