Introduction

The Menu API allows you manage your Deliveroo menu from a third party system. This API consists of one webhook & six endpoint configurations:

The Menu Event Webhook allows you to receive notifications about the result of menu uploading, particularly about image issues.

πŸ“˜

Available in Suites:

  • Partner Platform
  • Retail Platform

Glossary

The Deliveroo Menu API consists of the following components:

Item: An item is a single element that a user selects when browsing through one of your sites menus on Deliveroo. For example, an item could be a sandwich, a cheesecake, or a pizza.

Modifiers: Modifiers are a variant option for a particular item on the menu. Modifiers present the option to let users customize their orders based on their preferences. For example, a modifier for a sandwich can be 'Extra Cheese', 'Gluten free bread', 'Mustard'.

Category: A category represents a logical grouping of items that make is easier for users to navigate your menu. For example, categories in your menus could be 'Appetizers', 'Mains', 'Desserts'. If you are running a promotion, you could also include a category called 'Specials', or 'Deal of the Day' as a category.

Menu: A menu groups together one or more categories to present a single complete view of your offerings to your users.

πŸ“˜

Menu Manager

Menu Manager lives in the Restaurant Hub which is a management tool for restaurants on Deliveroo platform. If your restaurant partner originally managed the menus through this tool you can pull this menu via the API instead of building the menu from scratch.

Why Connect?

Improve your customer experience by making your latest menu available instantly and impossible to order out-of-stock items.

  • A single view of inventory and Deliveroo menu management.
  • Automatically updates your Deliveroo menu to match your POS.
  • Reduces order errors and rejections - menu items always have the correct PLU/SKU.

Sequence Diagrams

Menu

A partner can upload a menu to Deliveroo as well as get a recently uploaded menu.

14591459
  1. The partner submits a menu to be updated.
  2. Deliveroo accepts the menu payload, performs a validation and starts asynchronous menu processing.
  3. Once the menu is processed and published the webhook to notify a partner is called.
  4. If the menu has been successfully uploaded the partner can download it from Deliveroo by using Get menu endpoint.

Managing unavailabilities

A partner can manage unavailable items.

14591459
  1. The partner retrieves unavailable items.
  2. The partner set unavailable items (multiple items can be set unavailable at once)
  3. The partner sets individual item unavailabilities.

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.

14591459
  1. The partner updates PLU to items mapping.

Updating your menu

See OAS specification for details.

πŸ“˜

Unchanged menus

In the case of the menu details to be uploaded are the same as the existing menu details, then a successful response is returned with the additional information of the result. The result will contain the value MATCH_EXISTING_MENU.

{
    "result": "MATCH_EXISTING_MENU"
}

The Menu event webhook will be delivered when menu processing is finished in Deliveroo. The webhook will be called for both successfull and failed uploads. For more details about the webhook see the OAS spec.

πŸ“˜

Delivery failure and retries

A successful webhook callback occurs when the server responds with an HTTP 2xx success range; any other HTTP status or a timeout will result in a retry.

Our servers will retry failed webhook callbacks applying exponential back-off delays and circuit breaking when failures are successive in a short amount of time.

When the circuit breaker is tripped, the total number of requests per minute is significantly reduced until the endpoint appears healthy again.

For menu events, we "give up" and discard the event callback after 30 minutes.

🚧

Note

Please notice that while every attempt is made to make callbacks in the order they occurred and in a timely manner, neither can be absolutely guaranteed. It is also possible to receive the same callback more than once.

πŸ“˜

Configuring a menu update webhook

You can configure Menu Event webhook URL through the Change Integrator's Menu Webhook endpoint.

You can retrieve the currently configured URL any time through the Get Integrator's Menu Webhook.

Examples

{
  "name": "site-234 menu",
  "menu": {
    "mealtimes": [
      {
        "id": "breakfast-menu",
        "name": {
          "en": "Breakfast menu"
        },
        "description": {
          "en": "Best breakfast menu in town! Everything on the menu is freshly made at the start of the day."
        },
        "seo_description": {
          "en": "Best breakfast menu in town!"
        },
        "image": {
          "url": ""
        },
        "category_ids": [
          "breakfast-bundle",
          "porridge",
          "drinks"
        ],
        "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"
              }
            ]
          }
        ]
      }
    ],
    "categories": [
      {
        "id": "porridge",
        "name": {
          "en": "Porridge πŸ₯£"
        },
        "description": {
          "en": "Freshly made porridge"
        },
        "item_ids": [
          "porridge_blueberries",
          "porridge_banana"
        ]
      },
      {
        "id": "drinks",
        "name": {
          "en": "Drinks β˜•οΈ"
        },
        "description": {},
        "item_ids": [
          "tea",
          "coffee",
          "orange_juice"
        ]
      },
      {
        "id": "breakfast-bundle",
        "name": {
          "en": "Breakfast bundle πŸ“¦"
        },
        "description": {},
        "item_ids": [
          "breakfast-bundle"
        ]
      }
    ],
    "items": [
      {
        "id": "porridge_blueberries",
        "name": {
          "en": "Porridge with blueberries"
        },
        "description": {
          "en": "Porridge with blueberries and cinnamon"
        },
        "price_info": {
          "price": 350,
          "overrides": [
            {
              "type": "ITEM",
              "id": "breakfast-bundle",
              "price": 0
            }
          ]
        },
        "plu": "porridge_blueberries123",
        "ian": "4006381333931",
        "image": {},
        "is_eligible_as_replacement": true,
        "is_eligible_for_substitution": true,
        "tax_rate": 20.0,
        "modifier_ids": [
          "extra_toppings"
        ],
        "allergies": [
          "milk"
        ],
        "classifications": [],
        "nutritional_info": {
          "energy_kcal": {
            "low": 123,
            "high": 456
          },
          "hfss": false
        },
        "contains_alcohol": false,
        "max_quantity": 2
      },
      {
        "id": "porridge_banana",
        "name": {
          "en": "Porridge with bananas"
        },
        "operational_name": "porridge-ban",
        "description": {
          "en": "Porridge with bananas and cinnamon"
        },
        "price_info": {
          "price": 350,
          "overrides": [
            {
              "type": "ITEM",
              "id": "breakfast-bundle",
              "price": 0
            }
          ]
        },
        "plu": "porridge_banana123",
        "ian": "4006381333932",
        "image": {},
        "is_eligible_as_replacement": false,
        "is_eligible_for_substitution": true,
        "tax_rate": 20.0,
        "modifier_ids": [
          "extra_toppings"
        ],
        "allergies": [
          "milk"
        ],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false,
        "max_quantity": 2
      },
      {
        "id": "peanut_butter",
        "name": {
          "en": "Peanut butter"
        },
        "operational_name": "peanut-butter",
        "description": {
          "en": "Crunchy peanut butter"
        },
        "price_info": {
          "price": 100,
          "overrides": []
        },
        "plu": "peanut_butter_123",
        "ian": "4006381333933",
        "image": {},
        "is_eligible_as_replacement": true,
        "is_eligible_for_substitution": false,
        "tax_rate": 20.0,
        "modifier_ids": [],
        "allergies": [
          "peanuts"
        ],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false,
        "max_quantity": 2
      },
      {
        "id": "granola",
        "name": {
          "en": "Granola"
        },
        "operational_name": "granola",
        "description": {
          "en": "Granola"
        },
        "price_info": {
          "price": 100,
          "overrides": []
        },
        "plu": "granola_123",
        "ian": "4006381333934",
        "image": {},
        "is_eligible_as_replacement": false,
        "is_eligible_for_substitution": false,
        "tax_rate": 20.0,
        "modifier_ids": [],
        "allergies": [],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false,
        "max_quantity": 2
      },
      {
        "id": "honey",
        "name": {
          "en": "Honey"
        },
        "operational_name": "honey",
        "description": {
          "en": "Honey"
        },
        "price_info": {
          "price": 0,
          "overrides": []
        },
        "plu": "honey_123",
        "ian": "4006381333935",
        "image": {},
        "is_eligible_as_replacement": false,
        "is_eligible_for_substitution": true,
        "tax_rate": 20.0,
        "modifier_ids": [],
        "allergies": [],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false
      },
      {
        "id": "tea",
        "name": {
          "en": "Tea"
        },
        "operational_name": "tea",
        "description": {},
        "price_info": {
          "price": 150,
          "overrides": [
            {
              "type": "ITEM",
              "id": "breakfast-bundle",
              "price": 0
            }
          ]
        },
        "plu": "tea_$23",
        "ian": "4006381333936",
        "image": {},
        "is_eligible_as_replacement": true,
        "is_eligible_for_substitution": true,
        "tax_rate": 20.0,
        "modifier_ids": [
          "choose_milk"
        ],
        "allergies": [],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false,
        "max_quantity": 4
      },
      {
        "id": "coffee",
        "name": {
          "en": "Coffee"
        },
        "operational_name": "coffee",
        "description": {},
        "price_info": {
          "price": 250,
          "overrides": [
            {
              "type": "ITEM",
              "id": "breakfast-bundle",
              "price": 0
            }
          ]
        },
        "plu": "coffee_$78",
        "ian": "4006381333937",
        "image": {},
        "is_eligible_as_replacement": true,
        "is_eligible_for_substitution": true,
        "tax_rate": 20.0,
        "modifier_ids": [
          "choose_milk"
        ],
        "allergies": [],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false,
        "max_quantity": 2
      },
      {
        "id": "no_milk",
        "name": {
          "en": "No milk"
        },
        "operational_name": "no-milk",
        "description": {
          "en": ""
        },
        "price_info": {
          "price": 0,
          "overrides": []
        },
        "plu": "no_milk_$49",
        "ian": "4006381333938",
        "image": {},
        "is_eligible_as_replacement": true,
        "is_eligible_for_substitution": true,
        "tax_rate": 20.0,
        "modifier_ids": [],
        "allergies": [],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false,
        "max_quantity": 2
      },
      {
        "id": "whole_milk",
        "name": {
          "en": "Whole milk"
        },
        "operational_name": "whole-milk",
        "description": {
          "en": ""
        },
        "price_info": {
          "price": 0,
          "overrides": []
        },
        "plu": "whole_milk_$39",
        "ian": "4006381333939",
        "image": {},
        "is_eligible_as_replacement": true,
        "is_eligible_for_substitution": true,
        "tax_rate": 20.0,
        "modifier_ids": [],
        "allergies": [],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false
      },
      {
        "id": "orange_juice",
        "name": {
          "en": "Orange juice"
        },
        "operational_name": "orange-juice",
        "description": {},
        "price_info": {
          "price": 250,
          "overrides": [
            {
              "type": "ITEM",
              "id": "breakfast-bundle",
              "price": 0
            }
          ]
        },
        "plu": "orange_juice_$69",
        "ian": "4006381333940",
        "image": {},
        "is_eligible_as_replacement": true,
        "is_eligible_for_substitution": true,
        "tax_rate": 20.0,
        "modifier_ids": [],
        "allergies": [],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false
      },
      {
        "id": "breakfast-bundle",
        "name": {
          "en": "Breakfast bundle"
        },
        "description": {
          "en": "Porridge with a drink of your choice."
        },
        "price_info": {
          "price": 450,
          "overrides": []
        },
        "plu": "breakfast_bundle123",
        "ian": "4006381333941",
        "image": {},
        "is_eligible_as_replacement": true,
        "is_eligible_for_substitution": true,
        "tax_rate": 20.0,
        "modifier_ids": [
          "choose_your_porridge",
          "choose_your_drink"
        ],
        "allergies": [],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false
      }
    ],
    "modifiers": [
      {
        "id": "extra_toppings",
        "name": {
          "en": "Choice of extra toppings 🍯"
        },
        "description": {
          "en": ""
        },
        "min_selection": 0,
        "max_selection": 3,
        "repeatable": false,
        "item_ids": [
          "honey",
          "peanut_butter",
          "granola"
        ]
      },
      {
        "id": "choose_milk",
        "name": {
          "en": "Choose milk"
        },
        "description": {
          "en": ""
        },
        "min_selection": 0,
        "max_selection": 1,
        "repeatable": true,
        "item_ids": [
          "no_milk",
          "whole_milk"
        ]
      },
      {
        "id": "choose_your_porridge",
        "name": {
          "en": "Choose your porridge"
        },
        "description": {
          "en": ""
        },
        "min_selection": 0,
        "max_selection": 1,
        "repeatable": true,
        "item_ids": [
          "porridge_blueberries",
          "porridge_banana"
        ]
      },
      {
        "id": "choose_your_drink",
        "name": {
          "en": "Choose your drink"
        },
        "description": {
          "en": ""
        },
        "min_selection": 0,
        "max_selection": 1,
        "repeatable": true,
        "item_ids": [
          "tea",
          "coffee",
          "orange_juice"
        ]
      }
    ]
  },
  "site_ids": [
    "site-234",
    "site-456"
  ]
}
{
  "event": "menu.upload_result",
  "body": {
    "menu_upload_result": {
      "http_status": 200,
      "brand_id": "brand-external-id",
      "menu_id": "1004",
      "site_ids": [
        "1004"
      ],
      "errors": {
        "processing": "",
        "images": [
          {
            "url": "https://.../image-url-with-unknown-format.jpg",
            "message": "cannot decode image to assess size requirements: image: unknown format"
          }
        ]
      }
    }
  }
}

Getting your menu

The Get Menu API allows you to retrieve the menu currently live. There 2 versions of the endpoint available to retrieve the menu: a by menu ID specified during API integration and b by the site to which the menu is assigned.

You can't GET a menu from the API without updating it first, but you can get the menu from Menu Manager first.

Examples

{
  "name": "site-234 menu",
  "menu": {
    "mealtimes": [
      {
        "id": "breakfast-menu",
        "name": {
          "en": "Breakfast menu"
        },
        "description": {
          "en": "Best breakfast menu in town! Everything on the menu is freshly made at the start of the day."
        },
        "seo_description": {
          "en": "Best breakfast menu in town!"
        },
        "image": {
          "url": ""
        },
        "category_ids": [
          "breakfast-bundle",
          "porridge",
          "drinks"
        ]
      }
    ],
    "categories": [
      {
        "id": "porridge",
        "name": {
          "en": "Porridge πŸ₯£"
        },
        "description": {
          "en": "Freshly made porridge"
        },
        "item_ids": [
          "porridge_blueberries",
          "porridge_banana"
        ]
      },
      {
        "id": "drinks",
        "name": {
          "en": "Drinks β˜•οΈ"
        },
        "description": {},
        "item_ids": [
          "tea",
          "coffee",
          "orange_juice"
        ]
      },
      {
        "id": "breakfast-bundle",
        "name": {
          "en": "Breakfast bundle πŸ“¦"
        },
        "description": {},
        "item_ids": [
          "breakfast-bundle"
        ]
      }
    ],
    "items": [
      {
        "id": "porridge_blueberries",
        "name": {
          "en": "Porridge with blueberries"
        },
        "description": {
          "en": "Porridge with blueberries and cinnamon"
        },
        "price_info": {
          "price": 350,
          "overrides": [
            {
              "type": "ITEM",
              "id": "breakfast-bundle",
              "price": 0
            }
          ]
        },
        "plu": "porridge_blueberries123",
        "ian": "4006381333931",
        "image": {},
        "is_eligible_as_replacement": true,
        "is_eligible_for_substitution": true,
        "tax_rate": 20.0,
        "modifier_ids": [
          "extra_toppings"
        ],
        "allergies": [
          "milk"
        ],
        "classifications": [],
        "nutritional_info": {
          "energy_kcal": {
            "low": 123,
            "high": 456
          },
          "hfss": false
        },
        "contains_alcohol": false
      },
      {
        "id": "porridge_banana",
        "name": {
          "en": "Porridge with bananas"
        },
        "operational_name": "porridge-ban",
        "description": {
          "en": "Porridge with bananas and cinnamon"
        },
        "price_info": {
          "price": 350,
          "overrides": [
            {
              "type": "ITEM",
              "id": "breakfast-bundle",
              "price": 0
            }
          ]
        },
        "plu": "porridge_banana123",
        "ian": "4006381333932",
        "image": {},
        "is_eligible_as_replacement": false,
        "is_eligible_for_substitution": false,
        "tax_rate": 20.0,
        "modifier_ids": [
          "extra_toppings"
        ],
        "allergies": [
          "milk"
        ],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false
      },
      {
        "id": "peanut_butter",
        "name": {
          "en": "Peanut butter"
        },
        "operational_name": "peanut-butter",
        "description": {
          "en": "Crunchy peanut butter"
        },
        "price_info": {
          "price": 100,
          "overrides": []
        },
        "plu": "peanut_butter_123",
        "ian": "4006381333933",
        "image": {},
        "is_eligible_as_replacement": true,
        "is_eligible_for_substitution": false,
        "tax_rate": 20.0,
        "modifier_ids": [],
        "allergies": [
          "peanuts"
        ],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false
      },
      {
        "id": "granola",
        "name": {
          "en": "Granola"
        },
        "operational_name": "granola",
        "description": {
          "en": "Granola"
        },
        "price_info": {
          "price": 100,
          "overrides": []
        },
        "plu": "granola_123",
        "ian": "4006381333934",
        "image": {},
        "is_eligible_as_replacement": false,
        "is_eligible_for_substitution": true,
        "tax_rate": 20.0,
        "modifier_ids": [],
        "allergies": [],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false
      },
      {
        "id": "honey",
        "name": {
          "en": "Honey"
        },
        "operational_name": "honey",
        "description": {
          "en": "Honey"
        },
        "price_info": {
          "price": 0,
          "overrides": []
        },
        "plu": "honey_123",
        "ian": "4006381333935",
        "image": {},
        "is_eligible_as_replacement": true,
        "is_eligible_for_substitution": true,
        "tax_rate": 20.0,
        "modifier_ids": [],
        "allergies": [],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false
      },
      {
        "id": "tea",
        "name": {
          "en": "Tea"
        },
        "operational_name": "tea",
        "description": {},
        "price_info": {
          "price": 150,
          "overrides": [
            {
              "type": "ITEM",
              "id": "breakfast-bundle",
              "price": 0
            }
          ]
        },
        "plu": "tea_$23",
        "ian": "4006381333936",
        "image": {},
        "is_eligible_as_replacement": true,
        "is_eligible_for_substitution": true,
        "tax_rate": 20.0,
        "modifier_ids": [
          "choose_milk"
        ],
        "allergies": [],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false
      },
      {
        "id": "coffee",
        "name": {
          "en": "Coffee"
        },
        "operational_name": "coffee",
        "description": {},
        "price_info": {
          "price": 250,
          "overrides": [
            {
              "type": "ITEM",
              "id": "breakfast-bundle",
              "price": 0
            }
          ]
        },
        "plu": "coffee_$78",
        "ian": "4006381333937",
        "image": {},
        "is_eligible_as_replacement": true,
        "is_eligible_for_substitution": true,
        "tax_rate": 20.0,
        "modifier_ids": [
          "choose_milk"
        ],
        "allergies": [],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false
      },
      {
        "id": "no_milk",
        "name": {
          "en": "No milk"
        },
        "operational_name": "no-milk",
        "description": {
          "en": ""
        },
        "price_info": {
          "price": 0,
          "overrides": []
        },
        "plu": "no_milk_$49",
        "ian": "4006381333938",
        "image": {},
        "is_eligible_as_replacement": true,
        "is_eligible_for_substitution": true,
        "tax_rate": 20.0,
        "modifier_ids": [],
        "allergies": [],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false
      },
      {
        "id": "whole_milk",
        "name": {
          "en": "Whole milk"
        },
        "operational_name": "whole-milk",
        "description": {
          "en": ""
        },
        "price_info": {
          "price": 0,
          "overrides": []
        },
        "plu": "whole_milk_$39",
        "ian": "4006381333939",
        "image": {},
        "is_eligible_as_replacement": true,
        "is_eligible_for_substitution": true,
        "tax_rate": 20.0,
        "modifier_ids": [],
        "allergies": [],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false
      },
      {
        "id": "orange_juice",
        "name": {
          "en": "Orange juice"
        },
        "operational_name": "orange-juice",
        "description": {},
        "price_info": {
          "price": 250,
          "overrides": [
            {
              "type": "ITEM",
              "id": "breakfast-bundle",
              "price": 0
            }
          ]
        },
        "plu": "orange_juice_$69",
        "ian": "4006381333940",
        "image": {},
        "is_eligible_as_replacement": true,
        "is_eligible_for_substitution": true,
        "tax_rate": 20.0,
        "modifier_ids": [],
        "allergies": [],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false
      },
      {
        "id": "breakfast-bundle",
        "name": {
          "en": "Breakfast bundle"
        },
        "description": {
          "en": "Porridge with a drink of your choice."
        },
        "price_info": {
          "price": 450,
          "overrides": []
        },
        "plu": "breakfast_bundle123",
        "ian": "4006381333941",
        "image": {},
        "is_eligible_as_replacement": true,
        "is_eligible_for_substitution": true,
        "tax_rate": 20.0,
        "modifier_ids": [
          "choose_your_porridge",
          "choose_your_drink"
        ],
        "allergies": [],
        "classifications": [],
        "nutritional_info": {},
        "contains_alcohol": false
      }
    ],
    "modifiers": [
      {
        "id": "extra_toppings",
        "name": {
          "en": "Choice of extra toppings 🍯"
        },
        "description": {
          "en": ""
        },
        "min_selection": 0,
        "max_selection": 3,
        "repeatable": false,
        "item_ids": [
          "honey",
          "peanut_butter",
          "granola"
        ]
      },
      {
        "id": "choose_milk",
        "name": {
          "en": "Choose milk"
        },
        "description": {
          "en": ""
        },
        "min_selection": 0,
        "max_selection": 1,
        "repeatable": true,
        "item_ids": [
          "no_milk",
          "whole_milk"
        ]
      },
      {
        "id": "choose_your_porridge",
        "name": {
          "en": "Choose your porridge"
        },
        "description": {
          "en": ""
        },
        "min_selection": 0,
        "max_selection": 1,
        "repeatable": true,
        "item_ids": [
          "porridge_blueberries",
          "porridge_banana"
        ]
      },
      {
        "id": "choose_your_drink",
        "name": {
          "en": "Choose your drink"
        },
        "description": {
          "en": ""
        },
        "min_selection": 0,
        "max_selection": 1,
        "repeatable": true,
        "item_ids": [
          "tea",
          "coffee",
          "orange_juice"
        ]
      }
    ]
  },
  "site_ids": [
    "site-234"
  ]
}

Managing unavailabilities

There are two sets of API endpoints available, depending on whether you update your menus via our API or the Menu Manager tooling. You'll notice the former accepts a "menu id" parameter to prepare a menu before going live, while the latter results in a realtime update.

πŸ“˜

  • The API was originally designed to enable full menu management (items and availability) via one integration.
  • However, it proved useful for partners to manage their menu via our Menu Manager graphical interface, while working on a backend integration to sync availability to our systems. We've extended our API to support this use case, and you'll see it elsewhere in the documentation denoted as our v1 API but with custom extensions supporting Menu Manager partners.

❗️

Problem

Why are my menu items staying unavailable the following day when I have updated them to be available? How can I be sure item stock levels (availability) are up to date in my Restaurant tablet (ROM) or in Hub.

Solution
Menu item stock levels (availability) in the Restaurant tablet (ROM) or in Hub should only be updated once the Restaurant is set to Open.

If you Open your restaurant after setting menu item availability for the day, we will not set everything back to available for the day.

Examples

{
  "unavailable_ids": [
    "orange_juice",
    "granola"
  ],
  "hidden_ids": [
    "whole_milk"
  ]
}
{
  "unavailable_ids": [
    "orange_juice",
    "granola"
  ],
  "hidden_ids": [
    "whole_milk"
  ]
}
{
  "item_unavailabilities": [
    {
      "item_id": "orange_juice",
      "status": "unavailable"
    },
    {
      "item_id": "granola",
      "status": "available"
    },
    {
      "item_id": "whole_milk",
      "status": "hidden"
    }
  ]
}

PLU mapping

See OAS specification for details.

Examples

[
  {
    "item_id": "1234",
    "plu": "1234-plu"
  },
  {
    "item_id": "5678",
    "plu": "5678-plu"
  }
]