---
updatedAt: 2026-05-28T10:59:52.000Z
---

# Update PLU (Price Look-Up) to Menu Item mapping

Menu items are stored in our platform and can be identified by their ID, which is provided by the restaurant partner. When a restaurant is integrated with our POS APIs, an additional ID is used to identify the same item the customer is ordering on the restaurant partner POS systems. These IDs are sometimes referred as "sku", "external_id", or "plu": this - plu is what we call those identifiers that must find a match on the restaurant's POS system. Our menus APIs can be used to upload an entire menu, including their PLU codes. This API, however, is meant to be the way partners can provide and update that mapping between an item and its PLU code.


# OpenAPI definition

```json
{
  "openapi": "3.1.0",
  "info": {
    "title": "Menu API",
    "version": "1.0"
  },
  "x-readme": {
    "explorer-enabled": false
  },
  "servers": [
    {
      "url": "https://api.developers.deliveroo.com/menu",
      "description": "Production API"
    },
    {
      "url": "https://api-sandbox.developers.deliveroo.com/menu",
      "description": "Sandbox"
    }
  ],
  "paths": {
    "/v1/brands/{brand_id}/menus/{id}": {
      "parameters": [
        {
          "name": "brand_id",
          "in": "path",
          "description": "The unique identifier for the brand (Deliveroo's integration team will provide this).",
          "schema": {
            "type": "string"
          },
          "required": true
        },
        {
          "name": "id",
          "in": "path",
          "description": "The unique identifier for the menu for the given \"brand\" context.",
          "schema": {
            "type": "string"
          },
          "required": true
        }
      ],
      "put": {
        "tags": [
          "v1"
        ],
        "summary": "Upload menu",
        "description": "With the Upload Menu API you can:\n\n1. Create a new menu in Deliveroo.\n2. Update an existing menu using the same menu ID that was sent when the menu was created.\n3. Assign multiple sites to the same menu.\nUse the Upload menu API if you wish to create menus or update existing menus to let users see the most updated status of your menus and offerings. Reduce the chances of poor customer experience due to orders being placed against an outdated menu by updating outdated menus in real time without any manual intervention.\n\nThis endpoint is rate limited at 1 request per minute per site. Additionally, for menus with payloads over 5 MB, there is also a limit of 10 requests per 10 seconds per entire integration partner.\n\nThe request size limit is 10 MB. However, to make sure you can successfully GET your menus, you should keep your requests no larger than 9 MB as the GET response payload size can be larger than the menu you sent through PUT. In general for large menus we recommend using the new Catalogue API (the documentation is coming soon).\n",
        "requestBody": {
          "content": {
            "application/json": {
              "example": {
                "name": "site-234 menu",
                "menu": {
                  "categories": [
                    {
                      "description": {
                        "en": "Freshly made porridge"
                      },
                      "id": "porridge",
                      "item_ids": [
                        "porridge_blueberries",
                        "porridge_banana"
                      ],
                      "name": {
                        "en": "Porridge 🥣"
                      }
                    },
                    {
                      "description": {},
                      "id": "drinks",
                      "item_ids": [
                        "tea",
                        "coffee",
                        "orange_juice"
                      ],
                      "name": {
                        "en": "Drinks ☕️"
                      }
                    },
                    {
                      "description": {},
                      "id": "breakfast-bundle",
                      "item_ids": [
                        "breakfast-bundle"
                      ],
                      "name": {
                        "en": "Breakfast bundle 📦"
                      }
                    }
                  ],
                  "items": [
                    {
                      "allergies": [],
                      "classifications": [],
                      "contains_alcohol": false,
                      "description": {},
                      "diets": [],
                      "external_data": "",
                      "highlights": [],
                      "barcodes": [
                        "725272730706",
                        "9780201379624",
                        "4605664000050"
                      ],
                      "id": "orange_juice",
                      "image": {},
                      "is_eligible_as_replacement": true,
                      "is_eligible_for_substitution": true,
                      "is_meal_card_not_eligible": false,
                      "max_quantity": null,
                      "modifier_ids": [],
                      "name": {
                        "en": "Orange juice"
                      },
                      "nutritional_info": {},
                      "operational_name": "orange-juice",
                      "plu": "orange_juice_$69",
                      "price_info": {
                        "overrides": [
                          {
                            "id": "breakfast-bundle",
                            "price": 0,
                            "type": "ITEM"
                          }
                        ],
                        "fees": [
                          {
                            "type": "DEPOSIT_FEE",
                            "amount": 15
                          }
                        ],
                        "price": 250
                      },
                      "tax_rate": "20",
                      "type": "ITEM"
                    },
                    {
                      "allergies": [],
                      "classifications": [],
                      "contains_alcohol": false,
                      "description": {
                        "en": "Porridge with a drink of your choice."
                      },
                      "diets": [],
                      "external_data": "",
                      "highlights": [],
                      "barcodes": [
                        "5012345678900",
                        "3014260115531"
                      ],
                      "id": "breakfast-bundle",
                      "image": {},
                      "is_eligible_as_replacement": true,
                      "is_eligible_for_substitution": true,
                      "is_meal_card_not_eligible": false,
                      "max_quantity": null,
                      "modifier_ids": [
                        "choose_your_porridge",
                        "choose_your_drink"
                      ],
                      "name": {
                        "en": "Breakfast bundle"
                      },
                      "nutritional_info": {},
                      "operational_name": "Breakfast bundle",
                      "plu": "breakfast_bundle123",
                      "price_info": {
                        "overrides": [],
                        "fees": [],
                        "price": 450
                      },
                      "tax_rate": "20",
                      "type": "ITEM"
                    },
                    {
                      "allergies": [
                        "milk"
                      ],
                      "classifications": [],
                      "contains_alcohol": false,
                      "description": {
                        "en": "Porridge with blueberries and cinnamon"
                      },
                      "diets": [],
                      "external_data": "",
                      "highlights": [
                        "in_store_price"
                      ],
                      "barcodes": [
                        "50123452"
                      ],
                      "id": "porridge_blueberries",
                      "image": {},
                      "is_eligible_as_replacement": true,
                      "is_eligible_for_substitution": true,
                      "is_meal_card_not_eligible": false,
                      "max_quantity": 2,
                      "modifier_ids": [
                        "extra_toppings"
                      ],
                      "name": {
                        "en": "Porridge with blueberries"
                      },
                      "nutritional_info": {
                        "energy_kcal": {
                          "low": 190,
                          "high": 220,
                          "per_100g": {
                            "low": 146,
                            "high": 169
                          }
                        },
                        "energy_kj": {
                          "low": 795,
                          "high": 920,
                          "per_100g": {
                            "low": 611,
                            "high": 707
                          }
                        },
                        "hfss": false,
                        "ingredients": {
                          "en": "Oats (61%), Water, Blueberries (5%), Salt"
                        },
                        "macronutrients": {
                          "measurement_unit": "g",
                          "fat": {
                            "value": 3.5,
                            "unit": "g"
                          },
                          "fat_of_which_saturates": {
                            "value": 0.5,
                            "unit": "g"
                          },
                          "carbohydrates": {
                            "value": 28,
                            "unit": "g"
                          },
                          "carbohydrates_of_which_sugars": {
                            "value": 6,
                            "unit": "g"
                          },
                          "fibre": {
                            "value": 3,
                            "unit": "g"
                          },
                          "protein": {
                            "value": 5,
                            "unit": "g"
                          },
                          "salt": {
                            "value": 0.1,
                            "unit": "g"
                          }
                        }
                      },
                      "nutritional_info_serving": {
                        "energy_kcal": {
                          "low": 247,
                          "high": 286
                        },
                        "energy_kj": {
                          "low": 1034,
                          "high": 1196
                        },
                        "macronutrients": {
                          "description": {
                            "en": "Per bowl (130g)"
                          },
                          "fat": {
                            "value": 4.6,
                            "unit": "g"
                          },
                          "fat_of_which_saturates": {
                            "value": 0.7,
                            "unit": "g"
                          },
                          "carbohydrates": {
                            "value": 36.4,
                            "unit": "g"
                          },
                          "carbohydrates_of_which_sugars": {
                            "value": 7.8,
                            "unit": "g"
                          },
                          "fibre": {
                            "value": 3.9,
                            "unit": "g"
                          },
                          "protein": {
                            "value": 6.5,
                            "unit": "g"
                          },
                          "salt": {
                            "value": 0.13,
                            "unit": "g"
                          }
                        }
                      },
                      "operational_name": "Porridge with blueberries",
                      "plu": "porridge_blueberries123",
                      "price_info": {
                        "overrides": [
                          {
                            "id": "breakfast-bundle",
                            "price": 0,
                            "type": "ITEM"
                          }
                        ],
                        "fees": [],
                        "price": 350
                      },
                      "tax_rate": "20",
                      "type": "ITEM"
                    },
                    {
                      "allergies": [],
                      "classifications": [],
                      "contains_alcohol": false,
                      "description": {
                        "en": ""
                      },
                      "diets": [],
                      "external_data": "",
                      "highlights": [],
                      "barcodes": [
                        "799439112766"
                      ],
                      "id": "whole_milk",
                      "image": {},
                      "is_eligible_as_replacement": true,
                      "is_eligible_for_substitution": true,
                      "is_meal_card_not_eligible": false,
                      "max_quantity": null,
                      "modifier_ids": [],
                      "name": {
                        "en": "Whole milk"
                      },
                      "nutritional_info": {},
                      "operational_name": "whole-milk",
                      "plu": "whole_milk_$39",
                      "price_info": {
                        "overrides": [],
                        "fees": [],
                        "price": 0
                      },
                      "tax_rate": "20",
                      "type": "CHOICE"
                    },
                    {
                      "allergies": [],
                      "classifications": [],
                      "contains_alcohol": false,
                      "description": {},
                      "diets": [],
                      "external_data": "",
                      "highlights": [],
                      "barcodes": [
                        "5024121099847"
                      ],
                      "id": "coffee",
                      "image": {},
                      "is_eligible_as_replacement": true,
                      "is_eligible_for_substitution": true,
                      "is_meal_card_not_eligible": false,
                      "max_quantity": 2,
                      "modifier_ids": [
                        "choose_milk"
                      ],
                      "name": {
                        "en": "Coffee"
                      },
                      "nutritional_info": {},
                      "operational_name": "coffee",
                      "plu": "coffee_$78",
                      "price_info": {
                        "overrides": [
                          {
                            "id": "breakfast-bundle",
                            "price": 0,
                            "type": "ITEM"
                          }
                        ],
                        "fees": [],
                        "price": 250
                      },
                      "tax_rate": "20",
                      "type": "ITEM"
                    },
                    {
                      "allergies": [],
                      "classifications": [],
                      "contains_alcohol": false,
                      "description": {},
                      "diets": [],
                      "external_data": "",
                      "highlights": [],
                      "barcodes": [
                        "0799439112766"
                      ],
                      "id": "tea",
                      "image": {},
                      "is_eligible_as_replacement": true,
                      "is_eligible_for_substitution": true,
                      "is_meal_card_not_eligible": false,
                      "max_quantity": 4,
                      "modifier_ids": [
                        "choose_milk"
                      ],
                      "name": {
                        "en": "Tea"
                      },
                      "nutritional_info": {},
                      "operational_name": "tea",
                      "plu": "tea_$23",
                      "price_info": {
                        "overrides": [
                          {
                            "id": "breakfast-bundle",
                            "price": 0,
                            "type": "ITEM"
                          }
                        ],
                        "fees": [],
                        "price": 150
                      },
                      "tax_rate": "20",
                      "type": "ITEM"
                    },
                    {
                      "allergies": [
                        "peanuts"
                      ],
                      "classifications": [],
                      "contains_alcohol": false,
                      "description": {
                        "en": "Crunchy peanut butter"
                      },
                      "diets": [],
                      "external_data": "",
                      "highlights": [],
                      "barcodes": [
                        "5024121519116"
                      ],
                      "id": "peanut_butter",
                      "image": {},
                      "is_eligible_as_replacement": true,
                      "is_eligible_for_substitution": false,
                      "is_meal_card_not_eligible": false,
                      "max_quantity": 2,
                      "modifier_ids": [],
                      "name": {
                        "en": "Peanut butter"
                      },
                      "nutritional_info": {},
                      "operational_name": "peanut-butter",
                      "plu": "peanut_butter_123",
                      "price_info": {
                        "overrides": [],
                        "fees": [],
                        "price": 100
                      },
                      "tax_rate": "20",
                      "type": "CHOICE"
                    },
                    {
                      "allergies": [],
                      "classifications": [],
                      "contains_alcohol": false,
                      "description": {
                        "en": "Granola"
                      },
                      "diets": [],
                      "external_data": "",
                      "highlights": [],
                      "barcodes": [
                        "1234567890128"
                      ],
                      "id": "granola",
                      "image": {},
                      "is_eligible_as_replacement": false,
                      "is_eligible_for_substitution": false,
                      "is_meal_card_not_eligible": false,
                      "max_quantity": 2,
                      "modifier_ids": [],
                      "name": {
                        "en": "Granola"
                      },
                      "nutritional_info": {},
                      "operational_name": "granola",
                      "plu": "granola_123",
                      "price_info": {
                        "overrides": [],
                        "fees": [],
                        "price": 100
                      },
                      "tax_rate": "20",
                      "type": "CHOICE"
                    },
                    {
                      "allergies": [],
                      "classifications": [],
                      "contains_alcohol": false,
                      "description": {
                        "en": ""
                      },
                      "diets": [],
                      "external_data": "",
                      "highlights": [],
                      "barcodes": [
                        "5060040253731"
                      ],
                      "id": "no_milk",
                      "image": {},
                      "is_eligible_as_replacement": true,
                      "is_eligible_for_substitution": true,
                      "is_meal_card_not_eligible": false,
                      "max_quantity": 2,
                      "modifier_ids": [],
                      "name": {
                        "en": "No milk"
                      },
                      "nutritional_info": {},
                      "operational_name": "no-milk",
                      "plu": "no_milk_$49",
                      "price_info": {
                        "overrides": [],
                        "fees": [],
                        "price": 0
                      },
                      "tax_rate": "20",
                      "type": "CHOICE"
                    },
                    {
                      "allergies": [],
                      "classifications": [],
                      "contains_alcohol": false,
                      "description": {
                        "en": "Honey"
                      },
                      "diets": [],
                      "external_data": "",
                      "highlights": [],
                      "barcodes": [
                        "3560070323067"
                      ],
                      "id": "honey",
                      "image": {},
                      "is_eligible_as_replacement": false,
                      "is_eligible_for_substitution": true,
                      "is_meal_card_not_eligible": false,
                      "max_quantity": null,
                      "modifier_ids": [],
                      "name": {
                        "en": "Honey"
                      },
                      "nutritional_info": {},
                      "operational_name": "honey",
                      "plu": "honey_123",
                      "price_info": {
                        "overrides": [],
                        "fees": [],
                        "price": 0
                      },
                      "tax_rate": "20",
                      "type": "CHOICE"
                    },
                    {
                      "allergies": [
                        "milk"
                      ],
                      "classifications": [],
                      "contains_alcohol": false,
                      "description": {
                        "en": "Porridge with bananas and cinnamon"
                      },
                      "diets": [],
                      "external_data": "",
                      "highlights": [],
                      "barcodes": [
                        "5000168036755"
                      ],
                      "id": "porridge_banana",
                      "image": {},
                      "is_eligible_as_replacement": false,
                      "is_eligible_for_substitution": true,
                      "is_meal_card_not_eligible": false,
                      "max_quantity": 2,
                      "modifier_ids": [
                        "extra_toppings"
                      ],
                      "name": {
                        "en": "Porridge with bananas"
                      },
                      "nutritional_info": {},
                      "operational_name": "porridge-ban",
                      "plu": "porridge_banana123",
                      "price_info": {
                        "overrides": [
                          {
                            "id": "breakfast-bundle",
                            "price": 0,
                            "type": "ITEM"
                          }
                        ],
                        "fees": [],
                        "price": 350
                      },
                      "tax_rate": "20",
                      "type": "ITEM"
                    }
                  ],
                  "mealtimes": [
                    {
                      "category_ids": [
                        "breakfast-bundle",
                        "porridge",
                        "drinks"
                      ],
                      "description": {
                        "en": "Best breakfast menu in town! Everything on the menu is freshly made at the start of the day."
                      },
                      "id": "breakfast-menu",
                      "image": {
                        "url": ""
                      },
                      "name": {
                        "en": "Breakfast menu"
                      },
                      "schedule": [
                        {
                          "day_of_week": 0,
                          "time_periods": [
                            {
                              "start": "00:00:00",
                              "end": "10:29:00"
                            }
                          ]
                        },
                        {
                          "day_of_week": 1,
                          "time_periods": [
                            {
                              "start": "00:00:00",
                              "end": "10:29:00"
                            }
                          ]
                        },
                        {
                          "day_of_week": 2,
                          "time_periods": [
                            {
                              "start": "00:00:00",
                              "end": "10:29:00"
                            }
                          ]
                        },
                        {
                          "day_of_week": 3,
                          "time_periods": [
                            {
                              "start": "00:00:00",
                              "end": "10:29:00"
                            }
                          ]
                        },
                        {
                          "day_of_week": 4,
                          "time_periods": [
                            {
                              "start": "00:00:00",
                              "end": "10:29:00"
                            }
                          ]
                        },
                        {
                          "day_of_week": 5,
                          "time_periods": [
                            {
                              "start": "00:00:00",
                              "end": "10:29:00"
                            }
                          ]
                        },
                        {
                          "day_of_week": 6,
                          "time_periods": [
                            {
                              "start": "00:00:00",
                              "end": "10:29:00"
                            }
                          ]
                        }
                      ],
                      "seo_description": null
                    }
                  ],
                  "modifiers": [
                    {
                      "description": {
                        "en": ""
                      },
                      "id": "choose_milk",
                      "item_ids": [
                        "no_milk",
                        "whole_milk"
                      ],
                      "max_selection": 1,
                      "min_selection": 0,
                      "name": {
                        "en": "Choose milk"
                      },
                      "repeatable": true
                    },
                    {
                      "description": {
                        "en": ""
                      },
                      "id": "choose_your_porridge",
                      "item_ids": [
                        "porridge_blueberries",
                        "porridge_banana"
                      ],
                      "max_selection": 1,
                      "min_selection": 0,
                      "name": {
                        "en": "Choose your porridge"
                      },
                      "repeatable": true
                    },
                    {
                      "description": {
                        "en": ""
                      },
                      "id": "choose_your_drink",
                      "item_ids": [
                        "tea",
                        "coffee",
                        "orange_juice"
                      ],
                      "max_selection": 1,
                      "min_selection": 0,
                      "name": {
                        "en": "Choose your drink"
                      },
                      "repeatable": true
                    },
                    {
                      "description": {
                        "en": ""
                      },
                      "id": "extra_toppings",
                      "item_ids": [
                        "honey",
                        "peanut_butter",
                        "granola"
                      ],
                      "max_selection": 3,
                      "min_selection": 0,
                      "name": {
                        "en": "Choice of extra toppings 🍯"
                      },
                      "repeatable": false
                    }
                  ],
                  "experience": "aisles"
                },
                "site_ids": [
                  "site-234",
                  "site-456"
                ]
              },
              "schema": {
                "description": "Request body for publishing a menu. Deliberately not composed from SiteMenu: that schema is also a GET response and marks `name` as required, which this endpoint ignores (the menu name comes from the URL path).\nAlso the shape of the document uploaded to the presigned URL from PUT /v3/brands/{brand_id}/menus/{id}, which has no request body of its own.",
                "type": "object",
                "required": [
                  "menu",
                  "site_ids"
                ],
                "properties": {
                  "menu": {
                    "type": "object",
                    "description": "Menu object",
                    "required": [
                      "mealtimes",
                      "categories",
                      "items"
                    ],
                    "properties": {
                      "mealtimes": {
                        "description": "List of mealtimes. A mealtime act as a wrapper around a group of categories enabling them to be displayed during specified time periods.\n",
                        "type": "array",
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "name",
                            "image",
                            "schedule",
                            "category_ids"
                          ],
                          "properties": {
                            "id": {
                              "description": "Unique identifier for the mealtime.",
                              "maxLength": 255,
                              "type": "string"
                            },
                            "name": {
                              "allOf": [
                                {
                                  "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/mealtimes/items/properties/seo_description"
                                },
                                {
                                  "description": "Translated name of the mealtime."
                                }
                              ]
                            },
                            "description": {
                              "allOf": [
                                {
                                  "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/mealtimes/items/properties/seo_description"
                                },
                                {
                                  "description": "Translated description of the mealtime. You need to send the language code as supported in Deliveroo. For a list of supported languages and corresponding language codes, refer to the 'Language Codes section below'.\n"
                                }
                              ]
                            },
                            "seo_description": {
                              "type": "object",
                              "additionalProperties": {
                                "type": "string"
                              },
                              "example": {
                                "en": "English text",
                                "it": "Italian text"
                              }
                            },
                            "image": {
                              "allOf": [
                                {
                                  "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/items/items/properties/image/allOf/0"
                                },
                                {
                                  "description": "Object for mealtime images.\nContains a URL for the image. See mealtime images.\nAccepted formats: JPEG, PNG, at least 1920x1080 pixels, 16:9 aspect ratio.\n"
                                }
                              ]
                            },
                            "category_ids": {
                              "type": "array",
                              "description": "IDs of the categories inside the mealtime.",
                              "items": {
                                "type": "string"
                              }
                            },
                            "schedule": {
                              "description": "Schedule describes the operational hours of the menu. See mealtime schedule.",
                              "type": "array",
                              "items": {
                                "type": "object",
                                "required": [
                                  "day_of_week",
                                  "time_periods"
                                ],
                                "properties": {
                                  "day_of_week": {
                                    "description": "DayOfWeek is the day of the week on which these hours will be applied. Accepted values are 0 through 6, where 0 is Monday and 6 is Sunday.",
                                    "type": "integer",
                                    "format": "int32",
                                    "enum": [
                                      0,
                                      1,
                                      2,
                                      3,
                                      4,
                                      5,
                                      6
                                    ]
                                  },
                                  "time_periods": {
                                    "description": "TimePeriods are the time spans during which the menu is available.",
                                    "type": "array",
                                    "items": {
                                      "type": "object",
                                      "required": [
                                        "start",
                                        "end"
                                      ],
                                      "properties": {
                                        "start": {
                                          "description": "Start time at which the menu becomes available, in 24-hour HH:MM format, e.g. “08:30”, “23:00”. The start time reflects an abstract date and time that is not tied to a specific time and place (for example, breakfast starts on weekdays at 9:00 A.M.). See schedule rules\n",
                                          "type": "string"
                                        },
                                        "end": {
                                          "description": "End the time at which the menu ceases to be available, in 24-hour HH:MM format, e.g. “08:30”, “23:00”.\n",
                                          "type": "string"
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      },
                      "categories": {
                        "description": "List of categories. There's a limit of 100 categories per menu. If you get over the limit, you'll get \"the length must be between 1 and 100\" request error.\n",
                        "type": "array",
                        "minItems": 1,
                        "maxItems": 100,
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "name",
                            "item_ids"
                          ],
                          "properties": {
                            "id": {
                              "description": "Unique identifier for the category.",
                              "maxLength": 255,
                              "type": "string"
                            },
                            "name": {
                              "allOf": [
                                {
                                  "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/mealtimes/items/properties/seo_description"
                                },
                                {
                                  "description": "Translated name of the category. Length: 3-120."
                                }
                              ]
                            },
                            "description": {
                              "allOf": [
                                {
                                  "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/mealtimes/items/properties/seo_description"
                                },
                                {
                                  "description": "Translated description of the category. You need to send the language code as supported in Deliveroo. For a list of supported languages and corresponding language codes, refer to the 'Language Codes section below'. Length: 0-255\n"
                                }
                              ]
                            },
                            "item_ids": {
                              "type": "array",
                              "description": "IDs of the items inside the category.",
                              "items": {
                                "type": "string"
                              }
                            }
                          }
                        }
                      },
                      "items": {
                        "description": "List of items. There's a limit of 5000 items per menu. If you get over the limit, you'll get \"the length must be between 1 and 5000\" request error.\n",
                        "type": "array",
                        "minLength": 1,
                        "maxLength": 5000,
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "price_info"
                          ],
                          "properties": {
                            "id": {
                              "description": "Unique identifier for the item.",
                              "maxLength": 255,
                              "type": "string"
                            },
                            "inherit_from": {
                              "description": "Authoring sugar. The `id` of another item in the same payload whose\nfields this item inherits. Use this when a bundle's CHOICE child is\nthe same product as an existing standalone ITEM, restricted to a\nsubset of its modifiers (e.g. only the \"Medium\" size).\n\nConstraints (enforced server-side):\n  * The referenced parent must exist in the same payload and be\n    explicitly typed `ITEM` (a missing or non-`ITEM` type is\n    rejected). Chains (a parent that itself uses `inherit_from`)\n    are rejected.\n  * This item must be used inside a bundle — i.e. referenced from a\n    modifier whose `type` is `bundle-item` — and must not appear in\n    any category's `item_ids`.\n  * If `type` is set on this item it must be `CHOICE`; otherwise it\n    defaults to `CHOICE`.\n  * This item's modifiers may only narrow the parent's: every\n    choice offered through this item's `modifier_ids` must also be\n    offered by the parent (compared at the choice / modifier\n    `item_ids` level, so a narrower size modifier with a different\n    id is allowed as long as it introduces no new choice).\n\nAll fields are inherited from the parent. The only fields this\nitem may set are:\n  * `modifier_ids` — a subset of the parent's modifiers;\n  * `price_info.overrides` — context-specific price overrides.\n\nThe base price (`price_info.price`) and every other field (`name`,\n`tax_rate`, `operational_name`, `image`, etc.) are inherited and\nmust NOT be set on this item; doing so is rejected with a 400.\n\nThis field is partner-facing only and is expanded server-side; it\nis never forwarded to downstream systems.\n",
                              "type": "string",
                              "maxLength": 255
                            },
                            "name": {
                              "allOf": [
                                {
                                  "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/mealtimes/items/properties/seo_description"
                                },
                                {
                                  "description": "Translated name of the item. Length: 2-120. Required for normal items; inherited from the parent (and must not be set) when `inherit_from` is used.\n"
                                }
                              ]
                            },
                            "description": {
                              "allOf": [
                                {
                                  "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/mealtimes/items/properties/seo_description"
                                },
                                {
                                  "description": "Translated description of the item. You need to send the language code as supported in Deliveroo. For a list of supported languages and corresponding language codes, refer to the 'Language Codes section below'. Length: 0-500.\n"
                                }
                              ]
                            },
                            "operational_name": {
                              "type": "string",
                              "description": "Operational name the restaurant uses in-house for the item.",
                              "maxLength": 255
                            },
                            "price_info": {
                              "description": "Price information for the item. Allows context specific overrides.",
                              "type": "object",
                              "required": [
                                "price"
                              ],
                              "properties": {
                                "price": {
                                  "description": "Positive integer or zero Price in minor units of the currency, eg. pennies for GBP, or cents for EUR.",
                                  "type": "integer",
                                  "format": "int64",
                                  "minimum": 0
                                },
                                "overrides": {
                                  "description": "Price overrides for the item in different contexts.",
                                  "type": "array",
                                  "items": {
                                    "type": "object",
                                    "properties": {
                                      "type": {
                                        "description": "Type of the context where the price is overridden.",
                                        "type": "string",
                                        "enum": [
                                          "ITEM",
                                          "MODIFIER",
                                          "PICKUP_ITEM",
                                          "PICKUP_MODIFIER"
                                        ]
                                      },
                                      "id": {
                                        "description": "Unique identifier for the context.",
                                        "type": "string"
                                      },
                                      "price": {
                                        "description": "Price in minor units of the currency, eg. pennies for GBP, or cents for EUR. positive integer or zero\n",
                                        "minimum": 0,
                                        "type": "integer",
                                        "format": "int64"
                                      }
                                    }
                                  },
                                  "maxItems": 100
                                },
                                "fees": {
                                  "description": "Fees applied to the item other than the Price",
                                  "type": "array",
                                  "items": {
                                    "type": "object",
                                    "properties": {
                                      "type": {
                                        "description": "Type of the extra Fees applied on the item",
                                        "type": "string",
                                        "enum": [
                                          "DEPOSIT_FEE"
                                        ]
                                      },
                                      "amount": {
                                        "description": "Price in minor units of the currency, eg. pennies for GBP, or cents for EUR. positive integer or zero\n",
                                        "minimum": 0,
                                        "type": "integer",
                                        "format": "int64"
                                      }
                                    }
                                  }
                                }
                              }
                            },
                            "plu": {
                              "description": "PLU (price lookup code) for the item. This field is Mandatory if the menu linked to pos integrated site.\n",
                              "type": "string",
                              "maxLength": 255
                            },
                            "ian": {
                              "description": "IAN is the International Article Number provided by the partner, deprecated by `barcodes`.",
                              "type": "string",
                              "deprecated": true
                            },
                            "barcodes": {
                              "description": "The barcodes for this item, accepted in the following formats: EAN-8, UPC-A, EAN-12, EAN-13, GTIN-14. The first barcode in this list will be considered the primary barcode with regards to SKU derivation. Note that all barcodes in this field should correspond to the appropriate pack size. For example, a barcode for a  singular item should not be added to the barcodes for a 6-pack of the same item.\n",
                              "type": "array",
                              "maxItems": 10,
                              "items": {
                                "type": "string"
                              }
                            },
                            "image": {
                              "allOf": [
                                {
                                  "type": "object",
                                  "properties": {
                                    "url": {
                                      "type": "string"
                                    }
                                  }
                                },
                                {
                                  "description": "Object containing the item images.\nURL for the image (not included in GET Menu v2 response). Accepted formats: JPEG, PNG, at least 1920x1080 pixels, 16:9 aspect ratio.\n"
                                }
                              ]
                            },
                            "is_eligible_as_replacement": {
                              "description": "Describes whether this item can be used as replacement during a substitution (relevant to grocery partners only, default true).\n",
                              "type": "boolean",
                              "default": true
                            },
                            "is_eligible_for_substitution": {
                              "description": "Describes whether this item can be substituted if it's out of stock (relevant to grocery partners only, default true).\n",
                              "type": "boolean",
                              "default": true
                            },
                            "is_returnable": {
                              "description": "If marked yes, customers are able to return this item to store. This is only applicable to an item of type `ITEM`; if set to true on an item of type `CHOICE` the update is rejected. (default false).\n",
                              "type": "boolean",
                              "default": false
                            },
                            "is_meal_card_not_eligible": {
                              "description": "Indicates that the product is not eligible for meal card payments.",
                              "type": "boolean",
                              "default": false
                            },
                            "tax_rate": {
                              "type": "string",
                              "format": "double",
                              "minimum": 0,
                              "maximum": 100,
                              "description": "Tax rate percentage (from 0-100) for the item.\nAccepted tax_rates by country:\nAE: 0.0, 5.0\nBE: 0.0, 6.0, 12.0, 21.0\nFR: 0.0, 2.1, 5.5, 10.0, 20.0\nHK: 0.0\nIE: 0.0, 9.0, 13.5, 23.0\nIT: 0.0, 4.0, 5.0, 10.0, 22.0\nKW: 0.0\nSG: 0.0, 9.0\nGB: 0.0, 5.0, 12.5, 20.0\nQA: 0.0\nRequired for normal items; inherited from the parent (and must not\nbe set) when `inherit_from` is used.\n"
                            },
                            "modifier_ids": {
                              "description": "Modifiers associated with the item.",
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            "allergies": {
                              "description": "Item's allergy information. Permitted strings listed in the 'Item allergens' section above. Empty array means \"allergy information unavailable.\n",
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            "classifications": {
                              "description": "Item's classifications information. Permitted strings listed in the 'Item classifications information' in Menu guidelines section.\n",
                              "type": "array",
                              "items": {
                                "type": "string",
                                "enum": [
                                  "early_stage_infant_formula",
                                  "pharmaceuticals_aspirin",
                                  "pharmaceuticals_ibuprofen",
                                  "pharmaceuticals_paracetamol",
                                  "alcohol_product",
                                  "vape_product",
                                  "tobacco_product",
                                  "cbd_product",
                                  "non_muslim",
                                  "less_healthy_foods"
                                ]
                              }
                            },
                            "diets": {
                              "description": "Item's dietary information. Permitted strings listed in the 'Item dietary information' section above.\n",
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            "nutritional_info": {
                              "allOf": [
                                {
                                  "type": "object",
                                  "description": "Item-level nutritional information for the entire item as sold.\nFor per-serving values use `nutritional_info_serving` instead.\n\n**Energy (`energy_kcal` / `energy_kj`)** supports total values (`low`/`high`) and, when\n`macronutrients.measurement_unit` is set, per-100 sub-fields:\n- `\"g\"` → populate `per_100g` (per 100g range).\n- `\"ml\"` → populate `per_100ml` (per 100ml range).\n- `\"total\"` or omitted → only `low`/`high` are used.\n\n**Relational constraints:**\n- `energy_kcal.low` must be <= `energy_kcal.high`.\n- `energy_kj.low` must be <= `energy_kj.high`.\n",
                                  "properties": {
                                    "energy_kcal": {
                                      "type": "object",
                                      "description": "Energy in kilocalories (kcal). Set `low` = `high` for a fixed value; use a range for variable items.\nOptionally include `per_100g` or `per_100ml` depending on `macronutrients.measurement_unit`.\n",
                                      "properties": {
                                        "low": {
                                          "description": "Lower bound of total energy in kcal. Must be >= 0 and <= high.",
                                          "type": "integer",
                                          "format": "int64",
                                          "minimum": 0
                                        },
                                        "high": {
                                          "description": "Upper bound of total energy in kcal. Must be >= 0 and >= low.",
                                          "type": "integer",
                                          "format": "int64",
                                          "minimum": 0
                                        },
                                        "per_100g": {
                                          "type": "object",
                                          "description": "Energy per 100g in kcal. Only used when `macronutrients.measurement_unit` is `\"g\"`.",
                                          "properties": {
                                            "low": {
                                              "description": "Lower bound in kcal per 100g. Must be >= 0 and <= high.",
                                              "type": "integer",
                                              "format": "int64",
                                              "minimum": 0
                                            },
                                            "high": {
                                              "description": "Upper bound in kcal per 100g. Must be >= 0 and >= low.",
                                              "type": "integer",
                                              "format": "int64",
                                              "minimum": 0
                                            }
                                          }
                                        },
                                        "per_100ml": {
                                          "type": "object",
                                          "description": "Energy per 100ml in kcal. Only used when `macronutrients.measurement_unit` is `\"ml\"`.",
                                          "properties": {
                                            "low": {
                                              "description": "Lower bound in kcal per 100ml. Must be >= 0 and <= high.",
                                              "type": "integer",
                                              "format": "int64",
                                              "minimum": 0
                                            },
                                            "high": {
                                              "description": "Upper bound in kcal per 100ml. Must be >= 0 and >= low.",
                                              "type": "integer",
                                              "format": "int64",
                                              "minimum": 0
                                            }
                                          }
                                        }
                                      }
                                    },
                                    "energy_kj": {
                                      "type": "object",
                                      "description": "Energy in kilojoules (kJ). Set `low` = `high` for a fixed value; use a range for variable items.\nNote: 1 kcal ≈ 4.184 kJ.\nOptionally include `per_100g` or `per_100ml` depending on `macronutrients.measurement_unit`.\n",
                                      "properties": {
                                        "low": {
                                          "description": "Lower bound of total energy in kJ. Must be >= 0 and <= high.",
                                          "type": "integer",
                                          "format": "int64",
                                          "minimum": 0
                                        },
                                        "high": {
                                          "description": "Upper bound of total energy in kJ. Must be >= 0 and >= low.",
                                          "type": "integer",
                                          "format": "int64",
                                          "minimum": 0
                                        },
                                        "per_100g": {
                                          "type": "object",
                                          "description": "Energy per 100g in kJ. Only used when `macronutrients.measurement_unit` is `\"g\"`.",
                                          "properties": {
                                            "low": {
                                              "description": "Lower bound in kJ per 100g. Must be >= 0 and <= high.",
                                              "type": "integer",
                                              "format": "int64",
                                              "minimum": 0
                                            },
                                            "high": {
                                              "description": "Upper bound in kJ per 100g. Must be >= 0 and >= low.",
                                              "type": "integer",
                                              "format": "int64",
                                              "minimum": 0
                                            }
                                          }
                                        },
                                        "per_100ml": {
                                          "type": "object",
                                          "description": "Energy per 100ml in kJ. Only used when `macronutrients.measurement_unit` is `\"ml\"`.",
                                          "properties": {
                                            "low": {
                                              "description": "Lower bound in kJ per 100ml. Must be >= 0 and <= high.",
                                              "type": "integer",
                                              "format": "int64",
                                              "minimum": 0
                                            },
                                            "high": {
                                              "description": "Upper bound in kJ per 100ml. Must be >= 0 and >= low.",
                                              "type": "integer",
                                              "format": "int64",
                                              "minimum": 0
                                            }
                                          }
                                        }
                                      }
                                    },
                                    "hfss": {
                                      "description": "Describes whether the item is considered high in saturated fat, salt and sugar (HFSS), according to the Department of Health’s Nutrient Profiling Model (relevant to some grocery partners in England and Wales only). Set this to true to mark this item as HFSS.\n",
                                      "type": "boolean"
                                    },
                                    "ingredients": {
                                      "allOf": [
                                        {
                                          "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/mealtimes/items/properties/seo_description"
                                        },
                                        {
                                          "description": "List of ingredients in the item, as a translated text map (language code → string).\nSupports `<b>` HTML tags — text wrapped in `<b>...</b>` will be displayed as **bold** to consumers.\nExample: `\"Oats (61%), Water, <b>Blueberries</b> (5%), Salt\"` renders \"Blueberries\" in bold.\n"
                                        }
                                      ]
                                    },
                                    "macronutrients": {
                                      "type": "object",
                                      "description": "Macronutrient breakdown for the item. Each nutrient is expressed as a `{ value, unit }` object.\n\n`measurement_unit` controls how the energy `per_100g` / `per_100ml` sub-fields on\n`energy_kcal` and `energy_kj` are interpreted (only relevant on `nutritional_info`,\nnot on `nutritional_info_serving`):\n- `\"g\"` — values are per 100g; populate `energy_kcal.per_100g` / `energy_kj.per_100g`.\n- `\"ml\"` — values are per 100ml; populate `energy_kcal.per_100ml` / `energy_kj.per_100ml`.\n- `\"total\"` — only total energy values (`low`/`high`) are used; no per-100 energy applies.\n",
                                      "properties": {
                                        "measurement_unit": {
                                          "description": "Reference unit for per-100 energy values. Accepted: `\"g\"`, `\"ml\"`, `\"total\"`.\n",
                                          "type": "string",
                                          "enum": [
                                            "g",
                                            "ml",
                                            "total"
                                          ]
                                        },
                                        "protein": {
                                          "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/items/items/properties/nutritional_info/allOf/0/properties/macronutrients/properties/fat"
                                        },
                                        "fat": {
                                          "type": "object",
                                          "description": "A single macronutrient measurement. `value` must always be provided (even when zero).\n`unit` is either `\"g\"` (grams) or `\"mg\"` (milligrams).\n",
                                          "required": [
                                            "value"
                                          ],
                                          "properties": {
                                            "value": {
                                              "description": "Amount of the nutrient. Must be >= 0.",
                                              "type": "number",
                                              "format": "float",
                                              "minimum": 0
                                            },
                                            "unit": {
                                              "description": "Unit of measurement. Accepted values [\"g\", \"mg\"].",
                                              "type": "string",
                                              "enum": [
                                                "g",
                                                "mg"
                                              ]
                                            }
                                          }
                                        },
                                        "fat_of_which_saturates": {
                                          "allOf": [
                                            {
                                              "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/items/items/properties/nutritional_info/allOf/0/properties/macronutrients/properties/fat"
                                            },
                                            {
                                              "description": "Saturated fat. When provided alongside `fat`, value must be <= `fat.value`."
                                            }
                                          ]
                                        },
                                        "carbohydrates": {
                                          "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/items/items/properties/nutritional_info/allOf/0/properties/macronutrients/properties/fat"
                                        },
                                        "carbohydrates_of_which_sugars": {
                                          "allOf": [
                                            {
                                              "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/items/items/properties/nutritional_info/allOf/0/properties/macronutrients/properties/fat"
                                            },
                                            {
                                              "description": "Of which sugars. When provided alongside `carbohydrates`, value must be <= `carbohydrates.value`."
                                            }
                                          ]
                                        },
                                        "fibre": {
                                          "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/items/items/properties/nutritional_info/allOf/0/properties/macronutrients/properties/fat"
                                        },
                                        "salt": {
                                          "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/items/items/properties/nutritional_info/allOf/0/properties/macronutrients/properties/fat"
                                        }
                                      }
                                    }
                                  }
                                },
                                {
                                  "description": "Item-level nutritional information. Supports `energy_kcal`, `energy_kj` (with optional\n`per_100g`/`per_100ml` sub-fields governed by `macronutrients.measurement_unit`),\n`hfss`, `ingredients`, `macronutrients`.\n"
                                }
                              ]
                            },
                            "nutritional_info_serving": {
                              "allOf": [
                                {
                                  "type": "object",
                                  "description": "Per-serving nutritional breakdown for the item. Uses the same fields as `NutritionInfo`, but with\none key restriction: **for `energy_kcal` and `energy_kj`, only `low` and `high` (total per serving)\nare accepted — `per_100g` and `per_100ml` are ignored for serving data**.\n\n**Relational constraints:**\n- `energy_kcal.low` must be <= `energy_kcal.high`.\n- `energy_kj.low` must be <= `energy_kj.high`.\n",
                                  "properties": {
                                    "energy_kcal": {
                                      "type": "object",
                                      "description": "Energy per serving in kilocalories (kcal). Only `low` and `high` are valid here;\n`per_100g` and `per_100ml` are not applicable for serving data.\nSet `low` = `high` for a fixed value; use a range for variable/customisable items.\n",
                                      "properties": {
                                        "low": {
                                          "description": "Lower bound of energy per serving in kcal. Must be >= 0 and <= high.",
                                          "type": "integer",
                                          "format": "int64",
                                          "minimum": 0
                                        },
                                        "high": {
                                          "description": "Upper bound of energy per serving in kcal. Must be >= 0 and >= low.",
                                          "type": "integer",
                                          "format": "int64",
                                          "minimum": 0
                                        }
                                      }
                                    },
                                    "energy_kj": {
                                      "type": "object",
                                      "description": "Energy per serving in kilojoules (kJ). Only `low` and `high` are valid here;\n`per_100g` and `per_100ml` are not applicable for serving data.\nNote: 1 kcal ≈ 4.184 kJ.\n",
                                      "properties": {
                                        "low": {
                                          "description": "Lower bound of energy per serving in kJ. Must be >= 0 and <= high.",
                                          "type": "integer",
                                          "format": "int64",
                                          "minimum": 0
                                        },
                                        "high": {
                                          "description": "Upper bound of energy per serving in kJ. Must be >= 0 and >= low.",
                                          "type": "integer",
                                          "format": "int64",
                                          "minimum": 0
                                        }
                                      }
                                    },
                                    "macronutrients": {
                                      "allOf": [
                                        {
                                          "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/items/items/properties/nutritional_info/allOf/0/properties/macronutrients"
                                        },
                                        {
                                          "type": "object",
                                          "properties": {
                                            "description": {
                                              "allOf": [
                                                {
                                                  "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/mealtimes/items/properties/seo_description"
                                                },
                                                {
                                                  "description": "Serving description used as a label for these values (e.g. `\"Per Rasher\"`, `\"Per bowl (130g)\"`).\nProvided as a translated text map (language code → string).\n"
                                                }
                                              ]
                                            }
                                          }
                                        }
                                      ]
                                    }
                                  }
                                },
                                {
                                  "description": "Per-serving nutritional breakdown. Same fields as `nutritional_info`, but energy\n(`energy_kcal`/`energy_kj`) only accepts `low` and `high` — `per_100g` and\n`per_100ml` are not applicable here.\n"
                                }
                              ]
                            },
                            "contains_alcohol": {
                              "description": "Describes if the item contains an age restricted item requiring an ID check eg alcohol, tobacco. Required for normal items; inherited from the parent (and must not be set) when `inherit_from` is used.\n",
                              "type": "boolean"
                            },
                            "max_quantity": {
                              "description": "Maximum quantity of the item the consumer can order.",
                              "type": "integer",
                              "format": "int64",
                              "minimum": 0
                            },
                            "external_data": {
                              "description": "Free-form text field reserved for the site's use. It's added to order data in Picking API webhook calls.",
                              "type": "string",
                              "maxLength": 1000
                            },
                            "highlights": {
                              "description": "Highlights information. This is for partners to control some of the visual attributes of an item card and apply some \"highlight\" behaviour.\nAvailable labels:\n\"in_store_price\" - to signal to a customer that a given item is matching the price in restaurant/store.\n\"suitable_for_gifting\" - to signal to a customer that a given item is suitable for gifting.\n",
                              "type": "array",
                              "items": {
                                "type": "string",
                                "enum": [
                                  "in_store_price"
                                ]
                              }
                            },
                            "type": {
                              "description": "Type of the item in menu.\n  An item of type \"ITEM\" is something that can be sold by itself.\n  An item of type \"CHOICE\" is typically something like an option in a modifier group, something that can't be sold by itself - often used to do add-ons or customisations.\n  An item of type \"BUNDLE\" is a group of items that may or may not have a discount.\nFor example \"Salad\" would be \"ITEM\", \"choose your size\" - modifier, \"Small\" or \"Large\" would be a CHOICE\" and Meal deal for one would be a \"BUNDLE\".\n",
                              "type": "string",
                              "enum": [
                                "CHOICE",
                                "ITEM",
                                "BUNDLE"
                              ]
                            },
                            "party_size": {
                              "description": "This field represents the number of people the item is intended for. Validation rules vary by item type: - ITEM: must be between 2 and 99 - BUNDLE: must be between 1 and 99 - CHOICE: must be between 1 and 99\n",
                              "type": "integer",
                              "format": "int32",
                              "minimum": 1,
                              "maximum": 99
                            },
                            "display_price_per_unit": {
                              "type": "object",
                              "description": "Product price per unit value displayed to consumers.\n\nFor example:\n1. display_price_per_unit = {\"value\": 10, \"unit\": \"ml\"} - product_volume will be used to determine price per 10ml shown to consumer. product_weight (if provided) will be ignored.\n2. display_price_per_unit = {\"value\": 100, \"unit\": \"g\"} - product_weight will be used to determine price per 100g shown to consumer. product_volume (if provided) will be ignored.\n\nAllowed unit values are: g, kg, ml, cl, l\n",
                              "properties": {
                                "value": {
                                  "type": "integer",
                                  "format": "int64",
                                  "description": "The denominator value for price per unit calculation (e.g., 10 for \"per 10ml\", 100 for \"per 100g\").",
                                  "example": 100
                                },
                                "unit": {
                                  "type": "string",
                                  "description": "The unit of measurement for the price per unit display.",
                                  "enum": [
                                    "g",
                                    "kg",
                                    "ml",
                                    "cl",
                                    "l"
                                  ],
                                  "example": "g"
                                }
                              }
                            },
                            "product_weight": {
                              "type": "object",
                              "description": "Product weight, excluding packaging. For solid products sold in liquid, specify the drained weight.",
                              "properties": {
                                "value": {
                                  "type": "number",
                                  "format": "float",
                                  "description": "The weight value.",
                                  "example": 200
                                },
                                "unit": {
                                  "type": "string",
                                  "description": "The unit of weight measurement.",
                                  "enum": [
                                    "kg",
                                    "g",
                                    "mg"
                                  ],
                                  "example": "g"
                                }
                              }
                            },
                            "product_volume": {
                              "type": "object",
                              "description": "Product volume, excluding packaging. Typically used for liquids.",
                              "properties": {
                                "value": {
                                  "type": "number",
                                  "format": "float",
                                  "description": "The volume value.",
                                  "example": 500
                                },
                                "unit": {
                                  "type": "string",
                                  "description": "The unit of volume measurement.",
                                  "enum": [
                                    "ml",
                                    "cl",
                                    "l"
                                  ],
                                  "example": "ml"
                                }
                              }
                            },
                            "pack_details": {
                              "type": "object",
                              "description": "Size and volume information for items in the pack.",
                              "properties": {
                                "counts_per_pack": {
                                  "type": "integer",
                                  "format": "int64",
                                  "description": "Number of items per pack.",
                                  "example": 6
                                },
                                "product_size": {
                                  "allOf": [
                                    {
                                      "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/mealtimes/items/properties/seo_description"
                                    },
                                    {
                                      "description": "Per item size information (e.g., \"XL\", \"Large\")."
                                    }
                                  ]
                                },
                                "product_weight": {
                                  "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/items/items/properties/product_weight"
                                },
                                "product_volume": {
                                  "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/items/items/properties/product_volume"
                                }
                              }
                            },
                            "safety_information": {
                              "allOf": [
                                {
                                  "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/mealtimes/items/properties/seo_description"
                                },
                                {
                                  "description": "Safety information for the product (by language). Maximum length of 500 characters."
                                }
                              ],
                              "example": {
                                "en": "Keep out of reach of children."
                              }
                            }
                          }
                        }
                      },
                      "modifiers": {
                        "description": "List of modifiers.",
                        "type": "array",
                        "items": {
                          "type": "object",
                          "required": [
                            "id",
                            "name"
                          ],
                          "properties": {
                            "id": {
                              "description": "Unique identifier for the modifier.",
                              "maxLength": 255,
                              "type": "string"
                            },
                            "name": {
                              "allOf": [
                                {
                                  "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/mealtimes/items/properties/seo_description"
                                },
                                {
                                  "description": "Translated name of the modifier. You need to send the language code as supported in Deliveroo. For a list of supported languages and corresponding language codes, refer to the 'Language Codes section below'. Length: 1-250.\n"
                                }
                              ]
                            },
                            "description": {
                              "allOf": [
                                {
                                  "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/requestBody/content/application~1json/schema/properties/menu/properties/mealtimes/items/properties/seo_description"
                                },
                                {
                                  "description": "Translated description of the modifier. Length: 0-500."
                                }
                              ]
                            },
                            "min_selection": {
                              "description": "Minimum number of items the consumer can choose from the modifier.",
                              "type": "integer",
                              "format": "int64"
                            },
                            "max_selection": {
                              "description": "Maximum number of items the consumer can choose from the modifier.",
                              "type": "integer",
                              "format": "int64"
                            },
                            "repeatable": {
                              "description": "Describes whether a consumer can choose the same item inside a modifier group multiple times.",
                              "type": "boolean"
                            },
                            "item_ids": {
                              "description": "IDs of the items inside the modifier.",
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            },
                            "type": {
                              "description": "Describes the type of modification:\n  \"up-sell-existing-items\" is for an existing main menu item sold alongside a main item, e.g coca-cola\n  \"remove-ingredient\" is for removing an ingredient from an item, e.g remove egg\n  \"add-ingredient\" is for adding an additional ingredient to an item, e.g add tomatoes\n  \"cooking-instruction\" is for cooking instructions on how to prepare the item, e.g medium rare\n  \"size-modification\" is for choosing item size, e.g small\n  \"product-variation\" is for product variations, e.g. brioche bun or gluten free\n  \"gift-wrap\" is for items requires gift wrapping\n  \"bundle-item\" is for existing menu items sold as part of a bundle.          \n  \"add-separate-condiment\" is for adding a separate condiment to the item, e.g. ketchup sachet.\n",
                              "type": "string",
                              "enum": [
                                "up-sell-existing-items",
                                "remove-ingredient",
                                "add-ingredient",
                                "cooking-instruction",
                                "size-modification",
                                "product-variation",
                                "gift-wrap",
                                "bundle-item",
                                "add-separate-condiment"
                              ]
                            }
                          }
                        }
                      },
                      "experience": {
                        "description": "Setting the experience allows grocery partners to customize menu processing and presentation for a more tailored consumer experience. This is an optional field. If omitted, menus will be treated in standard way. Available values:\n  \"aisles\" - The UI menu presentation is driven by Deliveroo's consumer taxonomy, automatically assigning categories to items.\n",
                        "type": "string",
                        "enum": [
                          "aisles"
                        ]
                      }
                    }
                  },
                  "site_ids": {
                    "description": "IDs of the sites the menu should be published to.",
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "pos_name": {
                    "description": "The POS system the merchant actually runs, applied to every site in site_ids - upload sites on different POS systems separately. Name the system behind the site, not yourself: your own name as a stand-in for a POS you cannot see tells us nothing we did not already know, and costs us the one thing this field is for. Leave it out rather than guess.\n\nOptional free text, up to 128 characters rather than bytes; trimmed and NFC-normalised before storage. Over-length and other rejected values are reported rather than refused - see below - so the limit never fails an upload.\n\nRejecting the value never changes what happens to the menu itself: it is accepted or refused on its own merits, and the reason for the pos_name comes back in the non-fatal `warnings` array (`too_long`, `empty`, `control_character`, `line_separator`, `zero_width_or_bidi`, `replacement_character`). `replacement_character` means the request was mis-encoded, so check its encoding rather than the name. `control_character`, `line_separator` and `zero_width_or_bidi` all mean the value carried something invisible or line-breaking, usually from a copy-paste: send it as plain single-line text. On the v3 large-menu upload the same warning appears in `details.warnings` on GET /v3/brands/{brand_id}/jobs/{job_id}.\n\nThree things we ask of you:\n\n1. Treat it as a dynamic value: send a menu update when a site changes POS system, otherwise the value we hold goes stale.\n\n2. If the name you are reporting is a white-labelled version of your own platform rather than an independent POS system, mark it with the suffix `_WL` - that exact token, at the end. It tells us the name is a rebadge of your platform rather than an independent POS, which we have no other way to know. We store the value verbatim, suffix included, and it counts toward the 128 characters.\n\n3. Omitting the field leaves the stored value unchanged; an empty string is rejected rather than clearing it. Where two overlapping uploads disagree for the same site, the last write wins.",
                    "type": "string",
                    "example": "Toast"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "description": "200 response for publishing a menu. Extends StatusResponse with warnings, which only the menu PUT can produce.",
                  "allOf": [
                    {
                      "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}~1plus/post/responses/200/content/application~1json/schema"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "warnings": {
                          "description": "Non-fatal problems with an otherwise accepted request. The request stands; the listed values were ignored. Absent when there are none.",
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "bad_request",
                    "message": "{\"items\":{\"0\":{\"description\":{\"en\":\"the length must be no more than 500\"}}}}"
                  }
                },
                "schema": {
                  "$ref": "#/paths/~1v3~1brands~1{brand_id}~1jobs/post/responses/400/content/application~1json/schema"
                }
              }
            }
          },
          "404": {
            "description": "Not found",
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "not_found",
                    "message": "resource not found"
                  }
                },
                "schema": {
                  "$ref": "#/paths/~1v3~1brands~1{brand_id}~1jobs/post/responses/400/content/application~1json/schema"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "conflict",
                    "message": "conflict"
                  }
                },
                "schema": {
                  "$ref": "#/paths/~1v3~1brands~1{brand_id}~1jobs/post/responses/400/content/application~1json/schema"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable entity",
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "unprocessable_entity",
                    "message": "unprocessable entity"
                  }
                },
                "schema": {
                  "$ref": "#/paths/~1v3~1brands~1{brand_id}~1jobs/post/responses/400/content/application~1json/schema"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests",
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "too_many_requests",
                    "message": "too many requests"
                  }
                },
                "schema": {
                  "$ref": "#/paths/~1v3~1brands~1{brand_id}~1jobs/post/responses/400/content/application~1json/schema"
                }
              }
            }
          },
          "500": {
            "$ref": "#/paths/~1v3~1brands~1{brand_id}~1jobs/post/responses/500"
          },
          "503": {
            "description": "Internal server error",
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "service_unavailable",
                    "message": "service unavailable"
                  }
                },
                "schema": {
                  "$ref": "#/paths/~1v3~1brands~1{brand_id}~1jobs/post/responses/400/content/application~1json/schema"
                }
              }
            }
          },
          "default": {
            "$ref": "#/paths/~1v3~1brands~1{brand_id}~1jobs/post/responses/500"
          }
        }
      }
    },
    "/v1/brands/{brand_id}/menus/{id}/plus": {
      "parameters": [
        {
          "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/parameters/0"
        },
        {
          "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/parameters/1"
        }
      ],
      "post": {
        "tags": [
          "v1"
        ],
        "summary": "Update PLU (Price Look-Up) to Menu Item mapping",
        "description": "Menu items are stored in our platform and can be identified by their ID, which is provided by the restaurant partner. When a restaurant is integrated with our POS APIs, an additional ID is used to identify the same item the customer is ordering on the restaurant partner POS systems. These IDs are sometimes referred as \"sku\", \"external_id\", or \"plu\": this - plu is what we call those identifiers that must find a match on the restaurant's POS system. Our menus APIs can be used to upload an entire menu, including their PLU codes. This API, however, is meant to be the way partners can provide and update that mapping between an item and its PLU code.\n",
        "requestBody": {
          "description": "The request body must contain an array of JSON objects representing the mapping between an item and its plu.\n",
          "content": {
            "application/json": {
              "example": [
                {
                  "item_id": "1234",
                  "plu": "1234-plu"
                },
                {
                  "item_id": "5678",
                  "plu": "5678-plu"
                }
              ],
              "schema": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "item_id": {
                      "description": "The unique identifier of an existing item within the menu identified by the resource.\n",
                      "type": "string"
                    },
                    "plu": {
                      "description": "The PLU (Price Look-Up) that identifies the item and its price in the external system.\n",
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "status": "OK"
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string"
                    },
                    "result": {
                      "type": "string",
                      "enum": [
                        "MATCH_EXISTING_MENU"
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "bad_request",
                    "message": "{\"items\":{\"0\":{\"description\":{\"en\":\"the length must be no more than 500\"}}}}"
                  }
                },
                "schema": {
                  "$ref": "#/paths/~1v3~1brands~1{brand_id}~1jobs/post/responses/400/content/application~1json/schema"
                }
              }
            }
          },
          "401": {
            "$ref": "#/paths/~1v3~1brands~1{brand_id}~1jobs/post/responses/401"
          },
          "404": {
            "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/responses/404"
          },
          "409": {
            "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/responses/409"
          },
          "429": {
            "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/put/responses/429"
          },
          "500": {
            "$ref": "#/paths/~1v3~1brands~1{brand_id}~1jobs/post/responses/500"
          },
          "default": {
            "$ref": "#/paths/~1v3~1brands~1{brand_id}~1jobs/post/responses/500"
          }
        }
      }
    },
    "/v3/brands/{brand_id}/jobs": {
      "post": {
        "tags": [
          "v3 (for large menu uploads)"
        ],
        "summary": "Publish Menu",
        "description": "Initiates menu processing and publication. The request body must specify the action and parameters as described. Currently there's only one action to publish the menu that is \"publish_menu_to_live\". After creating a job, poll the GET /jobs/{job_id} endpoint to check the status.\n",
        "parameters": [
          {
            "$ref": "#/paths/~1v1~1brands~1{brand_id}~1menus~1{id}/parameters/0"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "action": {
                    "type": "string",
                    "enum": [
                      "publish_menu_to_live"
                    ],
                    "description": "The action to perform"
                  },
                  "params": {
                    "type": "object",
                    "properties": {
                      "menu_id": {
                        "type": "string",
                        "description": "The external ID of the menu to publish"
                      },
                      "version": {
                        "type": "string",
                        "description": "Optional version to publish. If not provided, the latest version will be used."
                      }
                    },
                    "required": [
                      "menu_id"
                    ]
                  }
                },
                "required": [
                  "action",
                  "params"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Job created successfully",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "job_id": {
                      "type": "string",
                      "description": "The unique identifier for the created job. Use this to poll for status."
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "new",
                        "in_progress",
                        "success",
                        "failed"
                      ],
                      "description": "Status of a menu processing job:\n- `new`: Job has been created and is waiting to be processed\n- `in_progress`: Job is currently being processed\n- `success`: Job completed successfully\n- `failed`: Job failed during processing\n"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad request",
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "bad_request",
                    "message": "bad request"
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "message": {
                          "type": "string"
                        },
                        "code": {
                          "type": "string",
                          "enum": [
                            "bad_request",
                            "not_found",
                            "500",
                            "service_unavailable",
                            "unprocessable_entity",
                            "too_many_requests",
                            "conflict",
                            "unauthorized"
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "The provided API key and API token is invalid or disabled.",
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "unauthorized",
                    "message": "Unauthenticated"
                  }
                },
                "schema": {
                  "$ref": "#/paths/~1v3~1brands~1{brand_id}~1jobs/post/responses/400/content/application~1json/schema"
                }
              }
            }
          },
          "404": {
            "description": "Not found",
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "not_found",
                    "message": "menu not found"
                  }
                },
                "schema": {
                  "$ref": "#/paths/~1v3~1brands~1{brand_id}~1jobs/post/responses/400/content/application~1json/schema"
                }
              }
            }
          },
          "500": {
            "description": "Something went wrong on our end. You’ll have to try again later once we’ve fixed it.",
            "content": {
              "application/json": {
                "example": {
                  "error": {
                    "code": "500",
                    "message": "internal server error"
                  }
                },
                "schema": {
                  "$ref": "#/paths/~1v3~1brands~1{brand_id}~1jobs/post/responses/400/content/application~1json/schema"
                }
              }
            }
          },
          "default": {
            "$ref": "#/paths/~1v3~1brands~1{brand_id}~1jobs/post/responses/500"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "OAuth2-Production": {
        "type": "oauth2",
        "description": "OAuth for Production",
        "flows": {
          "clientCredentials": {
            "tokenUrl": "https://auth.developers.deliveroo.com/oauth2/token",
            "scopes": {}
          }
        }
      }
    }
  },
  "security": [
    {
      "OAuth2-Production": []
    }
  ]
}
```