Endpoints and scopes
| Request | Scope |
|---|---|
PATCH /places/{place_id}/menu/state |
inventory:write |
POST /places/{place_id}/inventory Coming soon |
inventory:write |
Why a separate path
Customers get upset when they order something that ran out. So state is kept apart from structure. A state update is fast, skips image work and item comparison, and reaches the app within seconds.
Menu state
PATCH /places/{place_id}/menu/state with inventory:write.
aurmap PATCH /v1/places/plc_9q3w7e/menu/state '{"as_of":"2026-10-14T18:00:00Z","sold_out":{"items":[],"sizes":[{"item_id":"orange-juice","size_id":"l"}],"options":[{"group_id":"extras","option_id":"cheese"}]},"prices":{"items":[],"sizes":[{"item_id":"chicken-burger","size_id":"l","price_minor":3100}],"options":[]}}'{ "place_id": "plc_9q3w7e", "version": 43, "prev_version": 42, "kind": "state", "hash": "a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1", "status": "applied" }| Field | Description |
|---|---|
as_of |
the time of this state in your system; required |
paused |
true stops ordering from the whole menu; the place stays visible |
sold_out |
items[] item ids, sizes[] of item_id and size_id, options[] of group_id and option_id |
prices |
temporary prices over the menu: items[] of item_id and price_minor, sizes[] of item_id, size_id and price_minor, options[] of group_id, option_id and price_minor |
Each key replaces whole
- Each of
paused,sold_outandpricesthat you send replaces the stored value whole. - A key you do not send stays as it is.
- So send the full sold-out list every time. When one more item runs out, send the old list plus the new item.
- To clear every temporary price, send
"prices": { "items": [], "sizes": [], "options": [] }.
In the example above, is the kunafa still sold out? No: sold_out.items was sent empty, so it is available again. Send "items": ["kunafa"] to keep it sold out.
Ordering
We keep the as_of of the last state update per place. A request older than that is ignored whole, and we answer 200 with "status": "ignored". That way a late network request can never bring a sold-out item back.
{ "place_id": "plc_9q3w7e", "version": 43, "kind": "state", "hash": "a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1", "status": "ignored" }Versions
A state update is a version like any other: it moves version and hash, and you receive menu.changed with "kind": "state". When the merchant changes state from their AurMap account, such as a pause or a sold-out item, you receive the same event so you can mirror it.
await aurmap('PATCH', '/v1/places/plc_9q3w7e/menu/state', {
as_of: new Date().toISOString(),
sold_out: { items: ['kunafa'], sizes: [], options: [] },
});aurmap('PATCH', '/v1/places/plc_9q3w7e/menu/state', [
'as_of' => gmdate('Y-m-d\TH:i:s\Z'),
'sold_out' => ['items' => ['kunafa'], 'sizes' => [], 'options' => []],
]);Send state the moment it changes at the merchant, not on a timer. The limit is 120 calls a minute per place.
Menus have no counted quantities yet, and no sold-out or temporary price with an end time. Send the new state when something changes.
Shop stock Coming soon
POST /places/{place_id}/inventory with inventory:write.
aurmap POST /v1/places/plc_store01/inventory '{"as_of":"2026-10-14T12:20:00Z","variants":[{"variant_id":"tshirt-basic-m","mode":"set","quantity":11},{"sku":"TS-L-BLK","mode":"set","quantity":4}]}'{ "applied": 2, "ignored": [] }mode: setsets the quantity as given, and is preferred.mode: adjustadds or subtracts.- Name the variant by
variant_idorsku. - Your system is the source of truth for stock. AurMap holds a quantity only while the customer pays, up to 15 minutes, and releases it if the order is not completed. When the order completes, send the new count from your system.
Opening hours
The merchant sets the place’s opening hours in their AurMap account. Your menu’s schedules decide what can be ordered within those hours. To pause the whole place, use pause ordering.