Page Summary
-
The Menu feed spec is defined in protobuffer format but recommends uploading feeds in JSON format.
-
The FoodMenuFeed contains repeated MenuComponents, which can represent a Menu, MenuSection, MenuItem, or MenuItemOption.
-
A Menu represents the top-level catalog of food items and can apply to one or multiple merchants.
-
MenuSections group items on a menu, while MenuItems represent single food or drink items.
-
MenuItemOptions describe choices a user must make for an item, often with associated pricing in an OfferSet.
Definitions
FoodMenuFeed Definition
message FoodMenuFeed { repeated MenuComponent data = 1 ; }
MenuComponent Definition
message MenuComponent { oneof type { food.menu.v1.Menu menu = 1 ; food.menu.v1.MenuSection section = 2 ; food.menu.v1.MenuItem item = 3 ; food.menu.v1.MenuItemOption option = 4 ; } }
Menu Definition
// Top-level catalog of food items offered by a Food establishment. Menu // contains a list of merchant ids and the menu that apply to those merchants. // A Menu can be used to represent single merchant with the menu, or multiple // merchants (typically chain restaurants) with the menus. // (-- LINT.IfChange --) message Menu { option features. ( pb.java ) . nest_in_file_class = YES ; // An opaque string from a partner which uniquely identifies the Menu within // the partner feed. // Required.; // The merchants to whom the menu apply. // Note: This field is repeated so chain restaurants can share the same menu // across multiple locations, each of which is a separate merchant. // Required.; // The name that can identify the Menu when a user is browsing the menu. // Optional. TextField display_name = 3 ; // The default language code associated with the text labels contained in the // menu. Expects BCP-47 language code, such as "en-US" or "sr-Latn". // // For more information, see // http://www.unicode.org/reports/tr35/#Unicode_locale_identifier. // Optional. string language = 4 ; // IDs of items contained within this menu. Expects first-level menu items // only. // Optional.; // IDs of sections contained within this menu. Expects first-level menu // sections only. // Optional.; // Timestamp when this Menu or any of its contents was last updated by the // restaurant; i.e. a date to be associated with the phrase “accurate as of // date”. // Optional. google.protobuf.Timestamp last_merchant_update_time = ; }
MenuSection Definition
// A menu section is a grouping of items on a menu. Separate MenuSections are // usually created for each logical grouping of items on a menu. For example, // meal course type (Appetizer, Main, Dessert) and food categories (Burgers, // Drinks) are typical sections. message MenuSection { option features. ( pb.java ) . nest_in_file_class = YES ; // An opaque string from a partner that uniquely identifies the MenuSection // within the partner feed. // Required.; // The name that can identify the MenuSection when a user is browsing the // menu. // Required.; // A description of the menu section. // Optional. TextField description = 3 ; // Image(s) of the menu section. // Optional. repeated Image images = 4 ; // IDs of MenuItem entities that correspond to this MenuSection entity. A // section is expected to have at least 1 item if it does not contain any // sub-sections. // Optional.; // Child MenuSections (sub-sections) that correspond to this MenuSection // entity. // Optional.; }
MenuItem Definition
// Represents a single food or drink item offered by a Food establishment. message MenuItem { option features. ( pb.java ) . nest_in_file_class = YES ; // An opaque string from a partner that uniquely identifies the MenuItem // within the partner feed. // Required.; // The name that can identify the MenuItem when a user is browsing the menu. // Required.; // A description of the menu item. // Optional. TextField description = 3 ; // Image(s) of the menu item. // Optional. repeated Image images = 4 ; // Container that specifies a list of options available on an item. message MenuItemOptionSet { // IDs of menu item options that are applicable to this menu item. // Required.; } // The menu item must either have a price, or a set of menu item options. // Required. oneof pricing { // Available offers to purchase this food item. OfferSet offer_set = 6 ; // Available options for this menu item. MenuItemOptionSet menu_item_option_set = 7 ; } // Attributes about this menu item. // Optional. MenuItemAttributes item_attributes = 8 ; }
MenuItemOption Definition
// Describes choices that a user would be required to make when selecting a // dish / combo. The user must select an option, otherwise the order is // considered invalid (e.g. the user must choose small, medium, or large for a // pizza). message MenuItemOption { option features. ( pb.java ) . nest_in_file_class = YES ; // An opaque string from a partner that uniquely identifies the // MenuItemOption within the partner feed. // Required.; // Option property and value e.g. Size: Small. // Required.; // Available offers to purchase this menu item option. // Required.; // Attributes about this menu item option. // Optional. MenuItemAttributes item_attributes = 5 ; }
MenuItemAttributes Definition
// Describes attributes about a particular menu item or option. message MenuItemAttributes { // Number of servings available in a given menu item. // Optional. int32 number_of_servings = 1 ; // Describes all the nutritional information of the item, e.g. calories, fat // content. // Optional. NutritionInformation nutrition_information = 2 ; // The dietary restrictions that this menu item complies with. // Optional. repeated DietaryRestriction suitable_diets = 3 ; // Additives of this menu item. // Optional. repeated Additive additive = 4 ; // Allergens of this menu item. // Optional. repeated Allergen allergen = 5 ; // Packaging and recycling information of this menu item. // Optional. DepositInfo packaging_deposit_info = 6 ; }
OfferSet Definition
// Container for a list of offers available on a menu item / option. // Only one offer should be applicable/valid at one particular time. // For example, a drink can have 2 offers where one is applicable in the morning // while the other is applicable in the evening during happy hours. message OfferSet { option features. ( pb.java ) . nest_in_file_class = YES ; // List of possible offers. // Required.; }
Offer Definition
// Represents pricing and availability information for MenuItems and // MenuItemOptions. message Offer { option features. ( pb.java ) . nest_in_file_class = YES ; // Monetary value of the menu item/option on sale. // Required. // Note that nanos are 1e-9 of a unit. // To display $1.00 set currency_code='USD', units=1 and nanos=0. // To display $9.99 set currency_code='USD', units=9 and nanos=900000000. // To display $0.01 set currency_code='USD', units=0 and nanos=10000000. // Valid inputs are // Valid currency code units >0, nanos >0: // price {currency_code: 'USD’, units: 100, nanos: 1000000} // Valid currency code units >0, no nanos specified: // price {currency_code: 'USD’, units: 100} // Valid currency code, no units specified, nanos>0: // price {currency_code: 'USD’, nanos: 1000000} // Empty Price proto (will show no price in the UI): // price {} // The following cases are invalid and will result in no price being shown in // the menu: // Price with only currency code: // price {currency_code: 'USD’} // Price with currency code and unit = 0 and nano = 0: // price {currency_code: 'USD’, units: 0, nanos: 0} // The following cases are invalid and will result in the menu item being // dropped: // Price with no currency code but with unit or nanos or both: // price {units: 100, nanos: 1000000} // price {units: 100} // price {nanos: 1000000} // Price with invalid currency code but with unit or nanos or both: // price {currency_code: 'gXYZ’, units: 100, nanos: 1000000} // price {currency_code: 'gXYZ’, units: 100} // price {currency_code: 'gXYZ’, nanos: 1000000} // Price with currency code but invalid units or nanos // price {currency_code: 'USD’, units: 100, nanos: -100} // price {currency_code: 'USD’, units: -100, nanos: 100}; }
TextField Definition
// A text payload that contains one or more localized values. message TextField { // Per-locale text values. // // If there is only one desired locale support, then the language_code within // each text is not required to be set and the language will be inferred from // the default language of the menu. // // If there are multiple texts across different locales, then the // language_code must be set for each text. The first text in the list is // considered the preferred representation. // Required.; }
Image Definition
// Represents an image associated with a menu entity. message Image { // URL containing the raw pixels of the image. // Required.; }
MenuItemOptionProperty Definition
// Describes the property of a menu item option and its value. message MenuItemOptionProperty { // Types of property that the option is for. enum PropertyType { // Do not use. The property type is not explicitly specified. UNKNOWN_PROPERTY_TYPE = 0 ; // A generic menu item option property, which is not one of the more // specific types below. Use this if the property is not of type // SIZE or PIZZA_SIDE. OPTION = 1 ; // Denotes the menu item option property of size (e.g. small, medium, or // large). SIZE = 2 ; // Property specific to pizzas. For example: this MenuItemOption is only // valid for a portion/whole pizza, such as mushroom toppings on the left // side, right side, or whole pizza). PIZZA_SIDE = 3 ; } // Well-defined values for the option property. enum PropertyValue { // Do not use. The property value is not explicitly specified. UNKNOWN_PROPERTY_VALUE = 0 ; // The MenuItemOption applies only to the left side of a pizza. PIZZA_SIDE_LEFT = 1 ; // The MenuItemOption applies only to the right side of a pizza. PIZZA_SIDE_RIGHT = 2 ; // The MenuItemOption applies to the entire pizza. PIZZA_SIDE_WHOLE = 3 ; } // The type of this option property. // Required. PropertyType property_type = ; // Required. oneof value { // A well-defined value for the option property. Currently only expected // if the property_type is PIZZA_SIDE.; // A free-form text for the value of the property. Expected for // property_type OPTION and SIZE.; } }
NutritionInformation Definition
// Describes all the nutritional measurements of a MenuItem or add-on. message NutritionInformation { // Describes a single nutritional measurement of the serving of food. message NutritionValue { // Describes a closed range for the nutrition value. E.g. "100-150 cal" message Range { // The minimum amount of nutrition value. // Required. double min = ; // The maximum amount of nutrition value. // Required. double max = ; } // Required oneof. oneof value { // A single number representing the amount of nutritional value.; // A range representing the amount of nutritional value. Range range = 3 ; } // The unit associated with the amount as specified from the partner. We // will validate the feed so that the unit for each type of nutrition value // is expected for that type of value. For example, only ENERGY_CALORIES // and ENERGY_KILOJOULES are expected on energy property of // NutritionalInformation. // Required. NutritionValueUnit unit = ; } // The amount of nutritional energy of the serving of food. Can be defined // in Calories or kilojoules. // Optional. NutritionValue energy = 1 ; // The amount of sodium content, measured in grams or milligrams. // Optional. NutritionValue sodium_content = 2 ; // The number of servings the nutrition value applies to. // Optional.; // Nutrition information in free text. For example "Contains preservatives". // Optional. TextField description = 4 ; }
DietaryRestriction Definition
// Indicates a dietary restriction or guideline adhered to during // food preparation. enum DietaryRestriction { // Do not use. The dietary restriction is not explicitly specified. DIET_UNSPECIFIED = 0 ; DIET_DIABETIC = 1 ; DIET_GLUTEN_FREE = 2 ; DIET_HALAL = 3 ; DIET_HINDU = 4 ; DIET_KOSHER = 5 ; DIET_LOW_CALORIE = 6 ; DIET_LOW_FAT = 7 ; DIET_LOW_LACTOSE = 8 ; DIET_LOW_SALT = 9 ; DIET_VEGAN = 10 ; DIET_VEGETARIAN = 11 ; }
Additive Definition
// Additive shown to the user on the MenuItem. An additive preserves or enhances // the quality of the food. message Additive { // Descriptive text of the additive, e.g. "preservatives". // Required.; // Whether the MenuItem contains, may contain, or is free from this additive. // Defaults to contains. // Optional. ContainmentLevelCode containment_level_code = 2 ; }
Allergen Definition
// Allergen shown to the user on the MenuItem. An allergen relates to qualities // of food that causes allergic reactions. message Allergen { // Type of allergen. // Required. AllergenTypeCode allergen_type_code = ; // Whether the MenuItem contains, may contain, or is free from this allergen. // Defaults to contains. // Optional. ContainmentLevelCode containment_level_code = 2 ; }
AllergenTypeCode Definition
// Allergen type derived from GS1: http://gs1.org/voc/AllergenTypeCode enum AllergenTypeCode { // Do not use. The allergen type code is not explicitly specified. ALLERGEN_TYPE_CODE_UNSPECIFIED = 0 ; ALLERGEN_TYPE_CODE_ALMONDS = 1 ; ALLERGEN_TYPE_CODE_ALPHA_ISOMETHYL_IONONE = 2 ; ALLERGEN_TYPE_CODE_ALCOHOL = 3 ; ALLERGEN_TYPE_CODE_AMYL_CINNAMAL = 4 ; ALLERGEN_TYPE_CODE_ANISE_ALCOHOL = 5 ; ALLERGEN_TYPE_CODE_BARLEY = 6 ; ALLERGEN_TYPE_CODE_BENZYL_ALCOHOL = 7 ; ALLERGEN_TYPE_CODE_BENZYL_BENZOATE = 8 ; ALLERGEN_TYPE_CODE_BENZYL_CINNAMATE = 9 ; ALLERGEN_TYPE_CODE_BENZYL_SALICYLATE = 10 ; ALLERGEN_TYPE_CODE_BRAZIL_NUTS = 11 ; ALLERGEN_TYPE_CODE_BUTYLPHENYL_METHYLPROPIONATE = 12 ; ALLERGEN_TYPE_CODE_CARROTS = 13 ; ALLERGEN_TYPE_CODE_CASHEW_NUTS = 14 ; ALLERGEN_TYPE_CODE_CELERY = 15 ; ALLERGEN_TYPE_CODE_CEREALS_CONTAINING_GLUTEN = 16 ; ALLERGEN_TYPE_CODE_CINNAMAL = 17 ; ALLERGEN_TYPE_CODE_CINNAMYL_ALCOHOL = 18 ; ALLERGEN_TYPE_CODE_CITRAL = 19 ; ALLERGEN_TYPE_CODE_CITRONELLOL = 20 ; ALLERGEN_TYPE_CODE_COCOA = 21 ; ALLERGEN_TYPE_CODE_CORIANDER = 22 ; ALLERGEN_TYPE_CODE_CORN = 23 ; ALLERGEN_TYPE_CODE_COUMARIN = 24 ; ALLERGEN_TYPE_CODE_CRUSTACEANS = 25 ; ALLERGEN_TYPE_CODE_EGGS = 26 ; ALLERGEN_TYPE_CODE_EUGENOL = 27 ; ALLERGEN_TYPE_CODE_EVERNIA_FURFURACEA = 28 ; ALLERGEN_TYPE_CODE_EVERNIA_PRUNASTRI = 29 ; ALLERGEN_TYPE_CODE_FARNESOL = 30 ; ALLERGEN_TYPE_CODE_FISH = 31 ; ALLERGEN_TYPE_CODE_GERANIOL = 32 ; ALLERGEN_TYPE_CODE_GLUTEN = 33 ; ALLERGEN_TYPE_CODE_HAZELNUTS = 34 ; ALLERGEN_TYPE_CODE_HEXYL_CINNAMAL = 35 ; ALLERGEN_TYPE_CODE_HYDROXYCITRONELLAL = 36 ; ALLERGEN_TYPE_CODE_HYDROXYISOHEXYL_3_CYCLOHEXENE_CARBOXALDEHYDE_ISOEUGENOL_LIMONENE_LINAL = 37 [ features.enforce_naming_style = STYLE_LEGACY ]; ALLERGEN_TYPE_CODE_KAMUT = 38 ; ALLERGEN_TYPE_CODE_LACTOSE = 39 ; ALLERGEN_TYPE_CODE_LUPINE = 40 ; ALLERGEN_TYPE_CODE_MACADAMIA_NUTS = 41 ; ALLERGEN_TYPE_CODE_METHYL_2_OCTYNOATE = 42 [ features.enforce_naming_style = STYLE_LEGACY ]; ALLERGEN_TYPE_CODE_MILK = 43 ; ALLERGEN_TYPE_CODE_MOLLUSCS = 44 ; ALLERGEN_TYPE_CODE_MUSTARD = 45 ; ALLERGEN_TYPE_CODE_NO_DECLARED_ALLERGENS = 46 ; ALLERGEN_TYPE_CODE_OAT = 47 ; ALLERGEN_TYPE_CODE_PEANUTS = 48 ; ALLERGEN_TYPE_CODE_PEAS = 49 ; ALLERGEN_TYPE_CODE_PECAN_NUTS = 50 ; ALLERGEN_TYPE_CODE_PISTACHIOS = 51 ; ALLERGEN_TYPE_CODE_POD_FRUITS = 52 ; ALLERGEN_TYPE_CODE_QUEENSLAND_NUTS = 53 ; ALLERGEN_TYPE_CODE_RYE = 54 ; ALLERGEN_TYPE_CODE_SESAME_SEEDS = 55 ; ALLERGEN_TYPE_CODE_SOYBEANS = 56 ; ALLERGEN_TYPE_CODE_SPELT = 57 ; ALLERGEN_TYPE_CODE_SULPHUR_DIOXIDE = 58 ; ALLERGEN_TYPE_CODE_TREE_NUTS = 59 ; ALLERGEN_TYPE_CODE_TREE_NUT_TRACES = 60 ; ALLERGEN_TYPE_CODE_WALNUTS = 61 ; ALLERGEN_TYPE_CODE_WHEAT = 62 ; }
ContainmentLevelCode Definition
// Indicates the level of containment a food item has of a certain attribute, // such as allergens or additives. enum ContainmentLevelCode { // Do not use. The containment level code is not explicitly specified. CONTAINMENT_LEVEL_CODE_UNSPECIFIED = 0 ; CONTAINMENT_LEVEL_CODE_CONTAINS = 1 ; CONTAINMENT_LEVEL_CODE_DOES_NOT_CONTAIN = 2 ; CONTAINMENT_LEVEL_CODE_MAY_CONTAIN = 3 ; }
DepositInfo Definition
// Partner provided deposit info to instruct the user how to deposit a food item // or bottle and the value of such deposit. message DepositInfo { // The deposit strategy to employ, e.g. "reusable". // Optional. DepositCode deposit_code = 1 ; // Value refunded for depositing the item properly. // Optional.; }
Menu Feed samples
Menu Feed
{ "data" : [ { "menu" : { "menu_id" : "menu1" , "merchant_ids" : [ "dining-1" ], "display_name" : { "text" : [ { "text" : "Menu" , "language_code" : "en-US" } ] }, "language" : "en-US" , "menu_section_ids" : [ "appetizers" , "dinner" ], "last_merchant_update_time" : { "seconds" : 1692825444 } } }, { "section" : { "menu_section_id" : "appetizers" , "display_name" : { "text" : [ { "text" : "Lunch Appetizers" , "language_code" : "en-US" } ] }, "menu_item_ids" : [ "breadsticks-sauce" ] } }, { "section" : { "menu_section_id" : "dinner" , "display_name" : { "text" : [ { "text" : "Dinner" , "language_code" : "en-US" } ] }, "menu_item_ids" : [ "meatballs" ] } }, { "item" : { "menu_item_id" : "breadsticks-sauce" , "display_name" : { "text" : [ { "text" : "Bread Sticks & Sauce" , "language_code" : "en-US" } ] }, "description" : { "text" : [ { "text" : "Breakfast basket w/ side of tomato sauce (size 6 or 12)" , "language_code" : "en-US" } ] }, "images" : [ { "uri" : "http://www.example.com/photos/breadsticks.jpg" }, { "uri" : "http://www.example.com/photos/sauce.jpg" } ], "menu_item_option_set" : { "menu_item_option_ids" : [ "breadstick-sm" , "breadstick-lg" ] } } }, { "item" : { "menu_item_id" : "meatballs" , "display_name" : { "text" : [ { "text" : "Grandma Grace's Meatballs" , "language_code" : "en-US" } ] }, "description" : { "text" : [ { "text" : "Two 40x beef with pork tomato sauce, coarse grated cheese" , "language_code" : "en-US" } ] }, "images" : [ { "uri" : "http://www.example.com/photos/meatballs.jpg" }, { "uri" : "http://www.example.com/photos/meatballs2.jpg" } ], "offer_set" : { "offers" : [ { "price" : { "currency_code" : "USD" , "units" : 1 , "nanos" : 750000000 } } ] } } }, { "option" : { "menu_item_option_id" : "breadstick-sm" , "value" : { "property_type" : "SIZE" , "text_val" : { "text" : [ { "text" : "Small" , "language_code" : "en-US" } ] } }, "offer_set" : { "offers" : [ { "price" : { "currency_code" : "USD" , "units" : 8 , "nanos" : 0 } } ] } } }, { "option" : { "menu_item_option_id" : "breadstick-lg" , "value" : { "property_type" : "SIZE" , "text_val" : { "text" : [ { "text" : "Large" , "language_code" : "en-US" } ] } }, "offer_set" : { "offers" : [ { "price" : { "currency_code" : "USD" , "units" : 11 , "nanos" : 0 } } ] } } } ] }
Menu with unicode
This feed contains examples of non-ASCII characters in a menu data feed. The first menu item has non-ASCII characters provided as it is. The second menu item has non-ASCII characters represented in hexadecimal UTF-8 notation. Both are valid options on how to include non-ASCII characters in the menu feeds. The recommended way is to include the non-ASCII characters as-is.
{ "data" : [ { "menu" : { "menu_id" : "menu2" , "merchant_ids" : [ "dining-2" ], "display_name" : { "text" : [ { "text" : "Menu" , "language_code" : "en-FR" } ] }, "language" : "en-FR" , "menu_section_ids" : [ "salad" ], "last_merchant_update_time" : { "seconds" : 1692902166 } } }, { "section" : { "menu_section_id" : "salad" , "display_name" : { "text" : [ { "text" : "Salade" , "language_code" : "en-FR" } ] }, "menu_item_ids" : [ "cesar" , "nicoise" ] } }, { "item" : { "menu_item_id" : "cesar" , "display_name" : { "text" : [ { "text" : "Salade César" , "language_code" : "en-FR" } ] }, "description" : { "text" : [ { "text" : "Classique délicieux, croustillant grâce à ses croûtons et gourmande grâce à sa tendre volaille." , "language_code" : "en-FR" } ] }, "offer_set" : { "offers" : [ { "price" : { "currency_code" : "EUR" , "units" : 9 , "nanos" : 450000000 } } ] } } }, { "item" : { "menu_item_id" : "nicoise" , "display_name" : { "text" : [ { "text" : "Salade Ni\u00e7oise" , "language_code" : "en-FR" } ] }, "description" : { "text" : [ { "text" : "Salade fran\u00e7aise d\u00e9licieuse et nourrissante" , "language_code" : "en-FR" } ] }, "offer_set" : { "offers" : [ { "price" : { "currency_code" : "EUR" , "units" : 10 , "nanos" : 800000000 } } ] } } } ] }
Descriptor file
{ "generation_timestamp" : 1692998244 , "name" : "google.food_menu" , "data_file" : [ "menu_1692825444_0001.json" , "menu_1692902166_0002.json" ] }

