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

# Upload Menu

`POST /menus`

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 — 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)
