Inventoryscentric REST API
All /api/v1/* routes require a per-hotel API key via Authorization: Bearer <key> or X-Api-Key.
Catalog & stock
GET
/api/v1/products — list products (?q, group, limit, offset)GET
/api/v1/products/:code — product + stock levelsPOST
/api/v1/products — create productGET
/api/v1/suppliersGET
/api/v1/warehousesGET
/api/v1/stock — (?warehouse, q, nonzero=1)GET
/api/v1/stock/summaryPurchasing
GET
/api/v1/purchase-ordersPOST
/api/v1/purchase-orders
{
"supplier_code": "1",
"warehouse_code": "ISLAND",
"lines": [{ "product_code": "DL-001", "qty": 10, "unit_cost": 23.5 }]
}POST
/api/v1/receipts — receive against PO → increments SOH
{
"purchase_order_number": "PO-00001",
"warehouse_code": "ISLAND",
"lines": [{ "product_code": "DL-001", "qty": 10, "unit_cost": 23.5 }]
}Issues / transfers
POST
/api/v1/issues — stores → bars/outlets
{
"from_warehouse_code": "ISLAND",
"to_warehouse_code": "MAINLAND",
"lines": [{ "product_code": "DL-001", "qty": 2 }]
}Stock counts (bar control)
For bar/outlet warehouses: expected = opening + issues_in − sales; variance = counted − expected.
POST
/api/v1/stock-countsPATCH
/api/v1/stock-counts/:number/linesPOST
/api/v1/stock-counts/:number/post — apply adjustmentsPMS sales
POST
/api/v1/sales — decrements outlet stock
{
"external_id": "pms-sale-123",
"outlet_code": "ISLAND",
"sale_date": "2026-11-05",
"lines": [{ "product_code": "DL-001", "qty": 1.5, "unit_price": 40 }]
}Health
GET
/api/health — no auth