Catalog
The structure of the restaurant menu: categories, products (dishes) and their composition — reading and syncing the catalog via the API.
The catalog is the structure of the restaurant’s menu: product groups (categories), the products themselves (dishes), and menus as sets of sections containing products. These endpoints let a partner read the catalog and sync it with an external system (POS, CRM, aggregator).
All requests require a Bearer token (see Authentication). restaurantId is a
numeric path parameter. General conventions on formats and errors are in
Conventions and Errors.
Base path: /api/core/admin/restaurants/{restaurantId}.
| Method | Path | Purpose |
|---|---|---|
GET | /productgroups | List product groups (categories) |
POST | /productgroups | Create a group |
PUT | /productgroups/{groupId} | Update a group |
DELETE | /productgroups/{groupId} | Delete a group |
GET | /products | List products (with filters and paging) |
POST | /products | Create a product |
PUT | /products/{productId} | Update a product |
DELETE | /products/{productId} | Delete a product |
GET | /menu | List the restaurant’s menus |
POST | /menu | Create a menu (with sections and products) |
PUT | /menu | Update menu order/visibility (array) |
GET | /menu/{menuId} | Get a menu by ID |
PUT | /menu/{menuId} | Update a menu |
DELETE | /menu/{menuId} | Delete a menu |
Product groups (categories)
A product group (VendorProductGroup) collects products into a category (e.g. “Starters”,
“Drinks”). A group defines display order and visibility and can carry default tax rates.
VendorProductGroup fields
| Field | Type | Description |
|---|---|---|
id | string? | Group identifier |
name | string? | Category name |
imageLocation | string? | URL/path to the category image |
sequence | integer | Display order |
visible | boolean | Category visibility |
productsCount | integer | Number of products in the group |
taxeRate | number? | Default tax rate (dine-in) |
takeawayTaxeRate | number? | Tax rate for takeaway |
deliveryTaxeRate | number? | Tax rate for delivery |
List groups
GET /productgroups
curl -G https://api.hostmeapp.com/api/core/admin/restaurants/123/productgroups \ -H "Authorization: Bearer $TOKEN"Create a group
POST /productgroups
Body — VendorProductGroup. Response — the created group.
curl -X POST https://api.hostmeapp.com/api/core/admin/restaurants/123/productgroups \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Starters", "sequence": 1, "visible": true }'Update a group
PUT /productgroups/{groupId}
| Parameter | In | Type |
|---|---|---|
restaurantId * | path | integer |
groupId * | path | string |
Body — VendorProductGroup. Response — the updated group.
Delete a group
DELETE /productgroups/{groupId}
| Parameter | In | Type |
|---|---|---|
restaurantId * | path | integer |
groupId * | path | string |
curl -X DELETE https://api.hostmeapp.com/api/core/admin/restaurants/123/productgroups/GROUP_ID \ -H "Authorization: Bearer $TOKEN"Products (dishes)
A product (VendorProduct) is a menu item: a dish or a drink. It carries per-channel prices
(dine-in/takeaway/delivery), a group reference, stock level, and links to modifiers and taxes.
VendorProduct fields
| Field | Type | Description |
|---|---|---|
id | string? | Product identifier |
productPLU | string? | SKU/barcode (PLU/barcode) |
name | string? | Name |
description | string? | Description |
visible | boolean | Product visibility |
imageLocation | string? | URL/path to the image |
price | number | Price (dine-in) |
takeawayPrice | number? | Takeaway price |
deliveryPrice | number? | Delivery price |
productType | string? | Product type on your POS side |
groupId | string? | Group (category) ID |
stockAmount | integer? | Stock level |
modifiers | array<string> | List of modifier and modifier-group IDs (see Modifiers & Taxes) |
taxIds | array<string> | List of applied tax IDs |
taxeRate | number? | Tax rate (dine-in) |
takeawayTaxeRate | number? | Tax rate for takeaway |
deliveryTaxeRate | number? | Tax rate for delivery |
Prices. price, takeawayPrice and deliveryPrice must be zero or more, have at most two decimal places
and be no more than 21474836.47. An empty takeawayPrice or deliveryPrice means price applies to that
channel. A create or update that breaks these rules is refused with 400 and the code invalid_price:
{ "message": "Takeaway price can have at most two decimal places: 1.999.", "code": "invalid_price" }The rules apply to every create and update, including one that only changes the stock or visibility: if the body carries a price saved before these rules, correct it in the same request.
List products
GET /products
Returns a page of products (ProductsPage). The items are VendorProductSummary: the same fields
as VendorProduct, but instead of the modifiers array a hasModifiers flag (boolean) is returned.
Parameters
| Parameter | In | Type | Description |
|---|---|---|---|
restaurantId * | path | integer | Restaurant identifier |
productGroup | query | string | Filter by group ID |
search | query | string | Search by name |
visible | query | boolean | Filter by visibility |
skip | query | integer | Paging offset |
take | query | integer | Page size |
ProductsPage response fields
| Field | Type | Description |
|---|---|---|
items | array<VendorProductSummary> | Products on the page |
total | integer | Total products matching the filter |
skip | integer | Applied offset |
take | integer | Applied page size |
curl -G https://api.hostmeapp.com/api/core/admin/restaurants/123/products \ -H "Authorization: Bearer $TOKEN" \ --data-urlencode "productGroup=GROUP_ID" \ --data-urlencode "visible=true" \ --data-urlencode "skip=0" \ --data-urlencode "take=50"Create a product
POST /products
Body — VendorProduct. Response — the created product.
curl -X POST https://api.hostmeapp.com/api/core/admin/restaurants/123/products \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Caesar with chicken", "groupId": "GROUP_ID", "price": 590, "takeawayPrice": 560, "visible": true, "productPLU": "1001", "taxIds": ["TAX_ID"] }'Update a product
PUT /products/{productId}
| Parameter | In | Type |
|---|---|---|
restaurantId * | path | integer |
productId * | path | string |
Body — VendorProduct. Response — the updated product.
curl -X PUT https://api.hostmeapp.com/api/core/admin/restaurants/123/products/PRODUCT_ID \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Caesar with chicken", "price": 620, "visible": true }'Delete a product
DELETE /products/{productId}
| Parameter | In | Type |
|---|---|---|
restaurantId * | path | integer |
productId * | path | string |
Menus and sections
A menu (VendorMenu) is a set of sections (VendorMenuSection), each containing products.
A restaurant can have several menus (e.g. main, bar, breakfast). The GET /menu endpoint
returns a lightweight list of menus (VendorMenuInfo); the detail endpoints by {menuId} return the full tree
with sections and products.
VendorMenuInfo fields (menu list)
| Field | Type | Description |
|---|---|---|
id | string? | Menu identifier |
name | string? | Menu name |
imageLocation | string? | URL/path to the image |
sequence | integer | Display order |
visible | boolean | Menu visibility |
productsCount | integer | Number of products in the menu |
menuUrl | string? | Public link to the menu |
VendorMenu fields (full menu)
| Field | Type | Description |
|---|---|---|
id | string? | Menu identifier |
name | string? | Name |
imageLocation | string? | URL/path to the image |
sequence | integer | Display order |
visible | boolean | Visibility |
sections | array<VendorMenuSection> | Menu sections |
Each section (VendorMenuSection) contains: name (string?), description (string?) and
products (array<VendorProduct>) — products in the format described above.
List menus
GET /menu
Returns an array of VendorMenuInfo.
curl -G https://api.hostmeapp.com/api/core/admin/restaurants/123/menu \ -H "Authorization: Bearer $TOKEN"Update the menu list
PUT /menu
Accepts an array of VendorMenuInfo — used for batch-updating the order (sequence)
and visibility (visible) of menus.
curl -X PUT https://api.hostmeapp.com/api/core/admin/restaurants/123/menu \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '[ { "id": "MENU_ID_1", "sequence": 1, "visible": true }, { "id": "MENU_ID_2", "sequence": 2, "visible": false } ]'The exact schema of the successful (200) response for this endpoint is not captured in the spec.
Create a menu
POST /menu
Body — VendorMenu (with sections and products). Response — the created menu.
curl -X POST https://api.hostmeapp.com/api/core/admin/restaurants/123/menu \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Breakfast", "sequence": 1, "visible": true, "sections": [ { "name": "Porridges", "description": "Served from 8:00 to 12:00", "products": [ { "name": "Porridge", "price": 250, "visible": true } ] } ] }'Get a menu
GET /menu/{menuId}
| Parameter | In | Type | Description |
|---|---|---|---|
restaurantId * | path | integer | Restaurant identifier |
menuId * | path | string | Menu identifier |
sections | query | string | Filter by sections |
Response — VendorMenu with the full tree of sections and products.
Update a menu
PUT /menu/{menuId}
| Parameter | In | Type |
|---|---|---|
restaurantId * | path | integer |
menuId * | path | string |
Body — VendorMenu. Response — the updated menu.
Delete a menu
DELETE /menu/{menuId}
| Parameter | In | Type |
|---|---|---|
restaurantId * | path | integer |
menuId * | path | string |
Related sections. For linking modifiers and taxes to products see Menu: Modifiers & Taxes. Stock and stop-list management — Menu: Inventory & Stop List.