Partner API
Jul 14, 2026 4:05 PM

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}.

MethodPathPurpose
GET/productgroupsList product groups (categories)
POST/productgroupsCreate a group
PUT/productgroups/{groupId}Update a group
DELETE/productgroups/{groupId}Delete a group
GET/productsList products (with filters and paging)
POST/productsCreate a product
PUT/products/{productId}Update a product
DELETE/products/{productId}Delete a product
GET/menuList the restaurant’s menus
POST/menuCreate a menu (with sections and products)
PUT/menuUpdate 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

FieldTypeDescription
idstring?Group identifier
namestring?Category name
imageLocationstring?URL/path to the category image
sequenceintegerDisplay order
visiblebooleanCategory visibility
productsCountintegerNumber of products in the group
taxeRatenumber?Default tax rate (dine-in)
takeawayTaxeRatenumber?Tax rate for takeaway
deliveryTaxeRatenumber?Tax rate for delivery

List groups

GET /productgroups

Terminal window
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.

Terminal window
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}

ParameterInType
restaurantId *pathinteger
groupId *pathstring

Body — VendorProductGroup. Response — the updated group.

Delete a group

DELETE /productgroups/{groupId}

ParameterInType
restaurantId *pathinteger
groupId *pathstring
Terminal window
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

FieldTypeDescription
idstring?Product identifier
productPLUstring?SKU/barcode (PLU/barcode)
namestring?Name
descriptionstring?Description
visiblebooleanProduct visibility
imageLocationstring?URL/path to the image
pricenumberPrice (dine-in)
takeawayPricenumber?Takeaway price
deliveryPricenumber?Delivery price
productTypestring?Product type on your POS side
groupIdstring?Group (category) ID
stockAmountinteger?Stock level
modifiersarray<string>List of modifier and modifier-group IDs (see Modifiers & Taxes)
taxIdsarray<string>List of applied tax IDs
taxeRatenumber?Tax rate (dine-in)
takeawayTaxeRatenumber?Tax rate for takeaway
deliveryTaxeRatenumber?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

ParameterInTypeDescription
restaurantId *pathintegerRestaurant identifier
productGroupquerystringFilter by group ID
searchquerystringSearch by name
visiblequerybooleanFilter by visibility
skipqueryintegerPaging offset
takequeryintegerPage size

ProductsPage response fields

FieldTypeDescription
itemsarray<VendorProductSummary>Products on the page
totalintegerTotal products matching the filter
skipintegerApplied offset
takeintegerApplied page size
Terminal window
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.

Terminal window
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}

ParameterInType
restaurantId *pathinteger
productId *pathstring

Body — VendorProduct. Response — the updated product.

Terminal window
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}

ParameterInType
restaurantId *pathinteger
productId *pathstring

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)

FieldTypeDescription
idstring?Menu identifier
namestring?Menu name
imageLocationstring?URL/path to the image
sequenceintegerDisplay order
visiblebooleanMenu visibility
productsCountintegerNumber of products in the menu
menuUrlstring?Public link to the menu

VendorMenu fields (full menu)

FieldTypeDescription
idstring?Menu identifier
namestring?Name
imageLocationstring?URL/path to the image
sequenceintegerDisplay order
visiblebooleanVisibility
sectionsarray<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.

Terminal window
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.

Terminal window
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.

Terminal window
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}

ParameterInTypeDescription
restaurantId *pathintegerRestaurant identifier
menuId *pathstringMenu identifier
sectionsquerystringFilter by sections

Response — VendorMenu with the full tree of sections and products.

Update a menu

PUT /menu/{menuId}

ParameterInType
restaurantId *pathinteger
menuId *pathstring

Body — VendorMenu. Response — the updated menu.

Delete a menu

DELETE /menu/{menuId}

ParameterInType
restaurantId *pathinteger
menuId *pathstring

Related sections. For linking modifiers and taxes to products see Menu: Modifiers & Taxes. Stock and stop-list management — Menu: Inventory & Stop List.