The API, on one page
Two calls to be live. One bearer key (create it in your workspace under API keys). Batches are safe to retry — duplicate event_ids are ignored. Machine-readable spec: openapi.json.
1 · Describe the warehouse (once)
Three numbers. Aisles accept a range ('A-J') or a list ('A,B,C').
curl -X PUT http://localhost:3000/api/v1/layout \
-H "Authorization: Bearer hm_live_..." \
-H "Content-Type: application/json" \
-d '{"aisles":"A-J","baysPerAisle":20,"levelsPerBay":4}'2 · Send pick events (whenever)
Each event needs a bin OR a sku. qty defaults to 1, at defaults to now. Up to 5,000 per batch.
curl -X POST http://localhost:3000/api/v1/picks \
-H "Authorization: Bearer hm_live_..." \
-H "Content-Type: application/json" \
-d '{"events":[
{"event_id":"o-1001-1","bin":"B-12-3","qty":5,"at":"2026-07-19T09:30:00Z"},
{"event_id":"o-1001-2","sku":"SKU-778","qty":2}
]}'
# → {"ok":true,"accepted":2,"deduplicated":0,"rejected":0}Optional · SKU→bin map
Lets events arrive with only a SKU. Upload once (or via CSV in the dashboard).
curl -X POST http://localhost:3000/api/v1/itembins \
-H "Authorization: Bearer hm_live_..." \
-H "Content-Type: application/json" \
-d '{"map":[{"sku":"SKU-778","bin":"B-12-3"}]}'Optional · Read the heat back
For your own dashboards. window is 1d–365d.
curl "http://localhost:3000/api/v1/heatmap?window=30d" \
-H "Authorization: Bearer hm_live_..."
# → { layout, totals, bins:[{code,aisle,bay,level,weight,units,topSku}], insights }Embed the live map
One script tag (find your embed token under Share & embed). Read-only.
<script src="http://localhost:3000/widget.js" data-token="YOUR_EMBED_TOKEN" data-height="480"></script>
Good to know
- Rate limit: 120 requests/minute per key (batch your events).
- Errors are JSON:
{ error: "plain English" }with 400/401/422/429 statuses. - We store bin codes, SKUs and counts — no prices, no customer names.
- No-code option: set a nightly CSV pull URL in Settings and skip the API entirely.