---
title: "Upload Menu"
method: PUT
path: "/menus"
tags: ["Menu API Grubtech Endpoints"]
---

# Upload Menu

`PUT /menus`

The Upload Menu endpoint on the Grubtech platform allows the creation of a menu for a specific store. This endpoint is designed to handle complex menu structures and ensures that all menu items, categories, and modifiers are uploaded and properly configured for integration with Grubtech's POS application. 

 - **Menu Creation:** This endpoint facilitates the creation and structuring of a restaurant's menu on Grubtech's platform.

- **Store-Specific Menus:** The menu being uploaded is associated with a specific store, ensuring that each store can have a distinct menu if needed.

- **Supports Nested Modifiers:** For POS systems that support nested modifiers (i.e., modifiers within modifiers), this endpoint allows for the inclusion of those nested structures within the menu payload. Nested modifiers allow for hierarchical grouping, where a modifier can have additional sub-options. To properly configure nested modifiers, refer to the step-by-step process outlined in [POS Platforms Supporting Nested Modifiers](https://docs.grubtech.io/docs/menu-integration-1). Ensure that the payload follows the correct format to nest these modifiers.

## Request body

- Menu
  - `id` string, required — Unique identifier for the menu, provided by Grubtech.
  - `name` MultiLingualText, required — Content for a string displayed to users in multiple languages <br/> Supported laguages (Locale ids) <br/> * en-us :- English (United States) <br/> * ar-ae :- Arabic (United Arab Emirates)
    - `translations` Translations, required — A mapping from locale code to the translated text in each locale. One translation must be provided. e.g. "en-us", "ar-ae"
  - `description` MultiLingualText — Content for a string displayed to users in multiple languages <br/> Supported laguages (Locale ids) <br/> * en-us :- English (United States) <br/> * ar-ae :- Arabic (United Arab Emirates)
    - `translations` Translations, required — A mapping from locale code to the translated text in each locale. One translation must be provided. e.g. "en-us", "ar-ae"
  - `imageUrl` string — (optional) URL pointing to an image of the item. <br/>Image requirements <br/>- File size must be less than 10MB. <br/>- Image must be in GIF, JFIF, PJPEG, JPG, PJPG, PNG, WEBP <br/>- Minimum resolution for the images will be 200x200 px and maximum resolution will be 4000x4000
  - `currencyCode` string, required — Applicable currency code for the menu. According to ISO-4217
  - `storeId` string, required — Unique identifier for the location in which the menu was created or updated. This ID will be provided by either Grubtech or the aggregator.
  - `externalData` string — (optional) Free-form text field reserved for the api consumer to use, e.g. for POS integrations.
  - `items` MenuItem[], required — List of items in the menu.
    - `id` string, required — Unique ID for the item, provided by Grubtech
    - `sku` string — Stock keeping unit ID for the menu item, provided by GrubTech.
    - `barcodes` string[] — Barcodes for the menu item, provided by GrubTech.
    - `name` MultiLingualText, required — Content for a string displayed to users in multiple languages <br/> Supported laguages (Locale ids) <br/> * en-us :- English (United States) <br/> * ar-ae :- Arabic (United Arab Emirates)
      - `translations` Translations, required — A mapping from locale code to the translated text in each locale. One translation must be provided. e.g. "en-us", "ar-ae"
    - `description` MultiLingualText, required — Content for a string displayed to users in multiple languages <br/> Supported laguages (Locale ids) <br/> * en-us :- English (United States) <br/> * ar-ae :- Arabic (United Arab Emirates)
      - `translations` Translations, required — A mapping from locale code to the translated text in each locale. One translation must be provided. e.g. "en-us", "ar-ae"
    - `brandName` string — Commercial brand name for the specific item
    - `classifications` string, required — Clasification of an item.
    - `imageUrl` string — (optional) URL pointing to an image of the item. <br/>Image requirements <br/>- File size must be less than 10MB. <br/>- Image must be in GIF, JFIF, PJPEG, JPG, PJPG, PNG, WEBP <br/>- Minimum resolution for the images will be 200x200 px and maximum resolution will be 4000x4000
    - `unitPrice` integer — Specifies the unit price to charge for ordering the item. Price should always be an integer value (never decimals) because the price is set in the lowest denomination (e.g., cents for US currency, not dollars). Price should always be set even if the price is 0.
    - `discountedPrice` integer — Specifies the price after the discount for the ordering item. Price should always be an integer value (never decimals) because the price is set in the lowest denomination (e.g., cents for US currency, not dollars). Price should always be set even if the price is 0.
    - `externalData` string — (optional) Free-form text field reserved for the api consumer to use.
    - `quantityInfo` QuantityInfo, required — Details related to available quantity in stock for the specific item
      - `amount` integer — Available quantity for sales for a specific item
      - `measureUnit` string — Mesuring unit of the item
      - `itemSize` string — Product selling size of the item
    - `type` 'ITEM', required — item type
    - `availability` 'AVAILABLE' | 'UNAVAILABLE' | 'HIDDEN', required — Availability types for an item
    - `tags` string[] — (optional) List of tags if the user needs to add any other additional information
  - `categories` Category[], required — List of categories in the menu.
    - `id` string, required — A unique identifying string for the category is provided by Grubtech.
    - `background` CategoryBackground, required — Defines the background of an item. Ex- Image or solid colour
      - `type` 'IMAGE' | 'SOLID_COLOR', required — Item background type
      - `value` string, required — Item background for an item. Ex- if the type is IMAGE, then the value will be an URI else color code
    - `name` MultiLingualText, required — Content for a string displayed to users in multiple languages <br/> Supported laguages (Locale ids) <br/> * en-us :- English (United States) <br/> * ar-ae :- Arabic (United Arab Emirates)
      - `translations` Translations, required — A mapping from locale code to the translated text in each locale. One translation must be provided. e.g. "en-us", "ar-ae"
    - `description` MultiLingualText — Content for a string displayed to users in multiple languages <br/> Supported laguages (Locale ids) <br/> * en-us :- English (United States) <br/> * ar-ae :- Arabic (United Arab Emirates)
      - `translations` Translations, required — A mapping from locale code to the translated text in each locale. One translation must be provided. e.g. "en-us", "ar-ae"
    - `items` string[], required — List of IDs of the top-level menu items available for sale within the category - all items must be of type “ITEM”
  - `latestNotificationId` string, required — Unique identifier for the latest menu update notification
  - `lastUpdatedAt` string, required — The time the menu updated, represented in ISO 8601 format.

## Response `200`

Successful response OK

- MenuResponse — Response object of the successful menu publish
  - `id` string, required — Unique id for the request.
  - `externalReferenceId` string, required — Grubtech unique id for the request

## Other responses

- `400` — Bad request
- `500` — Internal server error

---

[API](https://skmtc.net/grubtech/apis/grubtech-auth-server.md) · [All operations](https://skmtc.net/grubtech/apis/grubtech-auth-server/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/grubtech/grubtech-auth-server/revisions/21688b6dcb69/schema)
