---
title: "Upload Menu"
method: POST
path: "/menus"
tags: ["Menu API Order Platform Webhooks"]
---

# Upload Menu

`POST /menus`

## Request

- Base URL: `https://order_platform_url`
- URL: `https://order_platform_url/menus`
- Auth: none declared

The Upload Menu endpoint is designed to allow external food aggregators, online ordering platforms, etc... to recieve a new menu or existing menu updates for stores. This functionality is essential for keeping store menus up to date, including items, categories, prices, and availability. When a call is made to this endpoint, the entire menu for a specific store or stores should be overwritten with the new menu data provided in the request, replacing any existing menu configurations.

The menu payload has the following structure.
![alt text](https://files.readme.io/c93007f-191adb23-10d4-4098-895b-1cde7d2452fc.png)

## Request body

- Menu
  - `id` string, required: Unique identifier for the menu, provided by GrubTech.
  - `name` MultiLingualText, required: Provides content for a string displayed to users in multiple languages.
    - `translations` Translations, required: A mapping from locale code to the translated text in each locale. One translation will be provided. It's upto the order platform provider to use the locale based text information accordingly. Locale codes will specify both language and country codes. The supported language codes are: “en-us”,“ar-ae”,“en-gb” and “el-gr”
  - `description` MultiLingualText: Provides content for a string displayed to users in multiple languages.
    - `translations` Translations, required: A mapping from locale code to the translated text in each locale. One translation will be provided. It's upto the order platform provider to use the locale based text information accordingly. Locale codes will specify both language and country codes. The supported language codes are: “en-us”,“ar-ae”,“en-gb” and “el-gr”
  - `imageUrl` string, required: URL pointing to an image of the item. <br/> Image Specifications: <br/> - File size less than 2MB. <br/> - Image format in JPEG, PNG. <br/> - Resolution for the images will be 800 x 800 px.
  - `currencyCode` string, required: Applicable currency code for the menu. According to [ISO-4217](https://www.xe.com/iso4217.php)
  - `storeIds` string[], required: Unique identifiers for each location for which the menu should be updated.
  - `externalData` string: (optional) Free-form text field reserved for the api consumer to use, e.g. for POS integrations
  - `items` Item[], required: List of items belongs to the store. This list contains both menu items and modifiers
    - `id` string, required: Unique id for the item.
    - `gtInternalId` string: Unique id for the item across Grubtech Platform.
    - `name` MultiLingualText, required: Provides content for a string displayed to users in multiple languages.
      - `translations` Translations, required: A mapping from locale code to the translated text in each locale. One translation will be provided. It's upto the order platform provider to use the locale based text information accordingly. Locale codes will specify both language and country codes. The supported language codes are: “en-us”,“ar-ae”,“en-gb” and “el-gr”
    - `description` MultiLingualText, required: Provides content for a string displayed to users in multiple languages.
      - `translations` Translations, required: A mapping from locale code to the translated text in each locale. One translation will be provided. It's upto the order platform provider to use the locale based text information accordingly. Locale codes will specify both language and country codes. The supported language codes are: “en-us”,“ar-ae”,“en-gb” and “el-gr”
    - `classifications` Classification[], required
    - `allergens` Allergen[]
      - `code` string: Unique allergen code on Grubtech Platfrom.
      - `name` MultiLingualText: Provides content for a string displayed to users in multiple languages.
        - `translations` Translations, required: A mapping from locale code to the translated text in each locale. One translation will be provided. It's upto the order platform provider to use the locale based text information accordingly. Locale codes will specify both language and country codes. The supported language codes are: “en-us”,“ar-ae”,“en-gb” and “el-gr”
    - `imageUrl` string: (optional) URL pointing to an image of it. <br/>Image requirements: <br/>- File size must be less than 2MB. <br/>- Optimal resolution for the images will be 800x800 px. <br/>- Image must be in JPEG, PNG.
    - `priceInfo` PriceInfo, required: Specifies the price to charge for ordering the item. Price should always be integer value (never decimals) because the price is set in lowest denomination (e.g., cents for US currency, not dollars).Price should always be set even if price is 0.
      - `price` integer, required: Value of the price
    - `externalData` string: (optional) Free-form text field reserved for the api consumer to use.
    - `modifierGroups` string[], required: List of modifier groups
    - `quantityInfo` QuantityInfo, required: Constrains the quantities in which the item can be ordered.
      - `maxPermitted` integer: Maximum permitted value
      - `minPermitted` integer: Minimum permitted value. This cannot exceed the maximum permitted value
    - `type` 'ITEM' | 'MODIFIER', required: Type of the item.
    - `nutritionalInfo` NutritionalInfo: This object retains all nutritional information for items and modifiers.
      - `energyInfo` EnergyInfo
        - `amount` string: Holds the calorie count for the respective item or modifier.
        - `unit` string: Specifies the unit of measurement for the calorie count. Currently, only KCAL is supported.
      - `salt` Salt
        - `amount` number: Holds the salt content for the respective item or modifier.
        - `unit` string: Specifies the unit of measurement for the salt.
      - `caffeine` Caffeine
        - `amount` number: Holds the caffeine content for the respective item or modifier.
        - `unit` string: Specifies the unit of measurement for the caffeine.
      - `sodium` Sodium
        - `amount` number: Holds the sodium content for the respective item or modifier.
        - `unit` string: Specifies the unit of measurement for the sodium.
    - `unavailableStoreIds` string[], required: This indicates the unavailability of an item for selected stores.
    - `tags` string[]: (optional) List of tags
  - `modifierGroups` ModifierGroup[], required: List of modifier groups belongs to the store
    - `id` string, required: Unique id attribute of the modifier group
    - `gtInternalId` string: Unique id for the modifier group across Grubtech Platform.
    - `name` MultiLingualText, required: Provides content for a string displayed to users in multiple languages.
      - `translations` Translations, required: A mapping from locale code to the translated text in each locale. One translation will be provided. It's upto the order platform provider to use the locale based text information accordingly. Locale codes will specify both language and country codes. The supported language codes are: “en-us”,“ar-ae”,“en-gb” and “el-gr”
    - `quantityInfo` QuantityInfo, required: Constrains the quantities in which the item can be ordered.
      - `maxPermitted` integer: Maximum permitted value
      - `minPermitted` integer: Minimum permitted value. This cannot exceed the maximum permitted value
    - `modifiers` string[], required: A list of ids of the modifiers, which are part of this modifier group
    - `tags` string[]: (optional) List of tags
  - `categories` Category[], required: List of menu categories belongs to the store
    - `id` string, required: A unique identifying string for the category, provided by the restaurant
    - `gtInternalId` string: Unique id for the category across Grubtech Platform.
    - `background` CategoryBackground, required: Defines the background of an item. Ex- Image or solid color
      - `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: Provides content for a string displayed to users in multiple languages.
      - `translations` Translations, required: A mapping from locale code to the translated text in each locale. One translation will be provided. It's upto the order platform provider to use the locale based text information accordingly. Locale codes will specify both language and country codes. The supported language codes are: “en-us”,“ar-ae”,“en-gb” and “el-gr”
    - `description` MultiLingualText: Provides content for a string displayed to users in multiple languages.
      - `translations` Translations, required: A mapping from locale code to the translated text in each locale. One translation will be provided. It's upto the order platform provider to use the locale based text information accordingly. Locale codes will specify both language and country codes. The supported language codes are: “en-us”,“ar-ae”,“en-gb” and “el-gr”
    - `servingHours` ServingHours[], required
      - `dayOfWeek` 'MONDAY' | 'TUESDAY' | 'WEDNESDAY' | 'THURSDAY' | 'FRIDAY' | 'SATURDAY' | 'SUNDAY', required: Days of the week
      - `timePeriods` TimePeriod[], required: The continuous time spans which the items are available
        - `start` string, required: The time at which the menu becomes available, in 24-hour HH:MM format, e.g. “08:30”, “23:00”
        - `end` string, required: The time at which the menu ceases to be available, in 24-hour HH:MM format, e.g. “08:30”, “23:00”
    - `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”
  - `tags` string[], required: (optional) List of tags

## Response `200`

Successful response OK

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

## Other responses

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

---

[API](https://skmtc.dev/grubtech/apis/menu-api-order-platform-webhooks.md) - [All operations](https://skmtc.dev/grubtech/apis/menu-api-order-platform-webhooks/llms.txt) - [OpenAPI document](https://skmtc.dev/grubtech/apis/menu-api-order-platform-webhooks/revisions/6a7071e735fc?raw)
