This recipe covers setting up and configuring Wix Restaurants using the REST API, including menus, items, and ordering configuration.
Wix Restaurants uses a hierarchical structure:
Endpoint: POST https://www.wixapis.com/restaurants/menus-menu/v1/menus
Request Body:
Response:
Endpoint: POST https://www.wixapis.com/restaurants/menus-section/v1/sections
Request Body:
Repeat per section, incrementing sortOrder, or create them all at once with the bulk endpoint
in Step 7.
Endpoint: POST https://www.wixapis.com/restaurants/menus-item/v1/items
Request Body:
modifierGroups holds objects referencing existing modifier groups —
[{ "id": "<MODIFIER_GROUP_ID>" }]. Leave it empty until the groups exist (Step 5).
Endpoint: PATCH https://www.wixapis.com/restaurants/menus-section/v1/sections/{sectionId}
Each section update requires the latest section revision.
A modifier group (e.g. "Cooking Temperature", "Toppings") holds a set of individual choices and the selection rule that governs them. The choices are separate entities — a modifier group does not contain inline options. Creating a group therefore takes two calls, in this order:
id.Do both calls; a group created without step 1 comes back with an empty modifiers array and no
choices are saved.
Endpoint: POST https://www.wixapis.com/restaurants/item-modifiers/v1/modifiers
Only modifier.name is required.
The response returns the new modifier.id. Repeat per choice, collecting the IDs.
Endpoint: POST https://www.wixapis.com/restaurants/item-modifier-group/v1/modifier-groups
The request body's top-level field is modifierGroup. Sending modifier instead is rejected
with 400 modifierGroup must not be empty (violatedRule: REQUIRED_FIELD).
Required: modifierGroup and modifierGroup.name.
For a mandatory single-choice group (e.g. cooking temperature) use the same shape with
"rule": { "required": true, "minSelections": 1, "maxSelections": 1 }.
Field reference for modifierGroup:
| Field | Notes |
|---|---|
name | Required. The group's display name. |
modifiers[].id | ID of an existing item modifier from Step 5a — not a name. Up to 500. |
modifiers[].additionalChargeInfo.additionalCharge | That choice's surcharge, a decimal string ("2.00"). No currency field — the site currency is used. |
modifiers[].preSelected | Optional boolean; selects the choice by default. |
rule.required | Whether the customer must choose. Named required, not mandatory. |
rule.minSelections / rule.maxSelections | Integers bounding how many choices are allowed. |
There is no options field and no per-option price object.
A modifier group only reaches customers once an item references it. The item's modifierGroups
is an array of objects carrying an id, not bare ID strings.
Endpoint: PATCH https://www.wixapis.com/restaurants/menus-item/v1/items/{itemId}
To create modifier groups in bulk, use
POST https://www.wixapis.com/restaurants/menus/v1/bulk/modifier-groups/create and
POST https://www.wixapis.com/restaurants/menus/v1/bulk/modifiers/create; the per-entity body
shape is the same.
Attach section IDs to a menu. This call requires the latest menu revision.
Endpoint: PATCH https://www.wixapis.com/restaurants/menus-menu/v1/menus/{menuId}
For restaurant setup flows with many sections/items, use bulk endpoints:
POST https://www.wixapis.com/restaurants/menus-section/v1/bulk/sections/createPOST https://www.wixapis.com/restaurants/menus-item/v1/bulk/items/createPOST https://www.wixapis.com/restaurants/item-variants/v1/bulk/variants/createUse query APIs for retrieval and UI display flows.
POST https://www.wixapis.com/restaurants/menus-menu/v1/menus/queryPOST https://www.wixapis.com/restaurants/menus-section/v1/sections/queryPOST https://www.wixapis.com/restaurants/menus-item/v1/items/queryFor complex restaurant menus, use this order to avoid dependency issues:
itemIds.sectionIds.modifierGroups to attach the groups from step 2.Common dietary labels:
vegetarianvegangluten-freegluten-free-optiondairy-freenut-freespicychef-recommendation| Error | Cause | Solution |
|---|---|---|
MENU_NOT_FOUND | Invalid menu ID | Verify menu exists |
ITEM_NOT_FOUND | Invalid item ID | Verify item exists |
INVALID_PRICE | Negative price | Use positive amounts |
400 modifierGroup must not be empty | Request body wrapped the group in modifier instead of modifierGroup | Use modifierGroup as the top-level field (Step 5b) |
Group created but modifiers is [] | Choices were sent inline (e.g. an options array) instead of as item modifier IDs | Create item modifiers first, then reference their IDs in modifiers[].id (Step 5a → 5b) |
Last updated: 30 July 2026