Menu feed

FoodMenuFeed Definition

message FoodMenuFeed {
  repeated MenuComponent data = 1;
}
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;
    // ...
  }
}
// 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.
message Menu {
  // An opaque string from a partner which uniquely identifies the Menu within
  // the partner feed.
  // Required.
  string menu_id = 1;

  // 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.
  repeated string merchant_ids = 2;

  // 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;

  // Disclaimer to be shown to the user for the menu. For example, nutritional
  // information disclosure and allergen disclosure.
  // Optional.
  Disclaimer disclaimer = 5;

  // IDs of items contained within this menu. Expects first-level menu items
  // only.
  // Optional.
  repeated string menu_item_ids = 6;

  // IDs of sections contained within this menu. Expects first-level menu
  // sections only.
  // Optional.
  repeated string menu_section_ids = 7;

  // 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 = 8;

  // ...
}
// 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 {
  // An opaque string from an partner which uniquely identifies the MenuSection
  // within the partner feed.
  // Required.
  string menu_section_id = 1;

  // The name that can identify the MenuSection when a user is browsing the
  // menu.
  // Required.
  TextField display_name = 2;

  // 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.
  repeated string menu_item_ids = 6;

  // Child MenuSections (sub-sections) that correspond to this MenuSection
  // entity.
  // Optional.
  repeated string menu_section_ids = 7;

  // ...

  // ...

  // ...

  // The IDs of merchants which this MenuSection is available at. These should
  // be a strict subset of the merchants specified in the Menu entity to which
  // this MenuSection belongs.
  //
  // Leaving this fields unset, or setting this to the empty or null,
  // is interpreted to mean that no restrict is intended and that the
  // MenuSection is available at all locations where the containing Menu entity
  // is available.
  //
  // This is typically used within chain menus, where the majority of the menu
  // is the same across locations but there are slight variations of certain
  // sections of items within a subset of the locations.
  // Optional.
  repeated string merchant_id_restricts = 11;

  // ...

  // ...
}
// Represents a single food or drink item offered by a Food establishment.
message MenuItem {
  // An opaque string from an partner which uniquely identifies the MenuItem
  // within the partner feed.
  // Required.
  string menu_item_id = 1;

  // The name that can identify the MenuItem when a user is browsing the menu.
  // Required.
  TextField display_name = 2;

  // 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.
    repeated string menu_item_option_ids = 1;
  }

  // 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;

  // ...

  // ...
}
// 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 {
  // An opaque string from an partner which uniquely identifies the
  // MenuItemOption within the partner feed.
  // Required.
  string menu_item_option_id = 9;

  // Option property and value e.g. Size: Small.
  // Required.
  MenuItemOptionProperty value = 2;

  // ...

  // ...

  // Available offers to purchase this menu item option.
  // Required.
  OfferSet offer_set = 4;

  // Attributes about this menu item option.
  // Optional.
  MenuItemAttributes item_attributes = 5;

  // ...

  // ...
}
// Describes attributes about a particular menu item or option.
message MenuItemAttributes {
  // Number of servings available in a given menu item.
  // Optional.
  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 {
  // List of possible offers.
  // Required.
  repeated Offer offers = 1;
}

Offer Definition

// Represents pricing and availability information for MenuItems and
// MenuItemOptions.
message Offer {
  // Monetary value of the menu item/option on sale. Can be 0 to represent free.
  // Required.
  google.type.Money price = 1;

  // ...

  // ...

  // ...

  // ...

  // ...

  // The IDs of merchants which this Offer is available at. These should
  // be a strict subset of the merchants specified in the Menu entity to which
  // this MenuSection belongs.
  //
  // Leaving this fields unset, or setting this to the empty or null,
  // is interpreted to mean that no restrict is intended and that the
  // Offer is available at all locations where the containing Menu entity
  // is available.
  //
  // This is typically used within chain menus, where prices of menu items may
  // vary slightly across regions/branches while menu items are the same.
  // Optional.
  repeated string merchant_id_restricts = 6;
}

Disclaimer Definition

// Partner provided disclaimer shown to the user. Contains a text disclaimer
// along with an optional URL for more information.
// Some example include: associated medical risks/warnings, any additional
// fees/gratutity, etc.
message Disclaimer {
  // Body of the disclaimer text to be shown to the user.
  // Required.
  TextField text = 1;

  // URL containing more information about the disclaimer.
  // Optional.
  string uri = 2;
}

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.
  repeated google.type.LocalizedText text = 1;
}

Image Definition

// Represents an image associated with a menu entity.
message Image {
  // URL containing the raw pixels of the image.
  // Required.
  string uri = 1;
}
// 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 = 1;

  // Required.
  oneof value {
    // A well-defined value for the option property. Currently only expected
    // if the property_type is PIZZA_SIDE.
    PropertyValue property_val = 2;

    // A free-form text for the value of the property. Expected for
    // property_type OPTION and SIZE.
    TextField text_val = 3;
  }
}