← Home · openapi.yaml

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 levels
POST /api/v1/products — create product
GET /api/v1/suppliers
GET /api/v1/warehouses
GET /api/v1/stock — (?warehouse, q, nonzero=1)
GET /api/v1/stock/summary

Purchasing

GET /api/v1/purchase-orders
POST /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-counts
PATCH /api/v1/stock-counts/:number/lines
POST /api/v1/stock-counts/:number/post — apply adjustments

PMS 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