{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://raw.githubusercontent.com/api-evangelist/grubhub/main/json-schema/grubhub-posnormalizedmenu-schema.json",
  "title": "PosNormalizedMenu",
  "x-generated": "2026-09-17",
  "x-method": "derived",
  "x-source": "openapi/grubhub-menu-openapi.yml#/components/schemas/PosNormalizedMenu",
  "required": [
    "menu_info"
  ],
  "type": "object",
  "properties": {
    "menu_info": {
      "$ref": "#/$defs/MenuInfo"
    },
    "tax_rates": {
      "type": "array",
      "description": "Information about the tax rates for this menu.",
      "items": {
        "$ref": "#/$defs/TaxRate"
      }
    },
    "repeating_schedules": {
      "type": "array",
      "description": "A list of the weekly schedules during which menu items may be made available. Typical usages include Breakfast, Lunch, Dinner, Weekend Brunch, etc.",
      "items": {
        "$ref": "#/$defs/RepeatingSchedule"
      }
    },
    "menu_sections": {
      "type": "array",
      "description": "The categories on a normalized menu - such as appetizers, breakfast, or drinks - including the menu items that these sections contain.",
      "items": {
        "$ref": "#/$defs/MenuSection"
      }
    },
    "items": {
      "type": "array",
      "description": "Information about all of the individual menu items that can be ordered as part of this menu.",
      "items": {
        "$ref": "#/$defs/Item"
      }
    },
    "modifier_prompts": {
      "type": "array",
      "description": "A list of top-level modifier categories, which can contain multiple modifier options.",
      "items": {
        "$ref": "#/$defs/ModifierPrompt"
      }
    },
    "modifier_lists": {
      "type": "array",
      "description": "A list of the modifier lists included with this menu in any modifier prompt.",
      "items": {
        "$ref": "#/$defs/ModifierList"
      }
    },
    "modifiers": {
      "type": "array",
      "description": "A list of selectable options within a modifier prompt that changes a menu item. That change may include price and calorie variations, and may be affected by size selections. This list will include all possible modifiers, regardless of the prompts or menu items that they are associated with.",
      "items": {
        "$ref": "#/$defs/Modifier"
      }
    },
    "size_prompts": {
      "type": "array",
      "description": "Information about item sizing, including display text and pricing.",
      "items": {
        "$ref": "#/$defs/SizePrompt"
      }
    },
    "sizes": {
      "type": "array",
      "description": "The sizes for all items in this menu.",
      "items": {
        "$ref": "#/$defs/Size"
      }
    },
    "availability_ranges": {
      "type": "array",
      "description": "A list of the times during which seasonal menu items can be available.",
      "items": {
        "$ref": "#/$defs/AvailabilityRange"
      }
    },
    "availability_overrides": {
      "type": "array",
      "description": "A list of the times during which items, modifiers or menu sections are not available for ordering.",
      "items": {
        "$ref": "#/$defs/AvailabilityOverride"
      }
    }
  },
  "description": "The normalized menu.",
  "$defs": {
    "AvailabilityOverride": {
      "required": [
        "end_date",
        "external_id",
        "name",
        "override_type",
        "start_date"
      ],
      "type": "object",
      "properties": {
        "external_id": {
          "type": "string",
          "description": "A user-configured identifier for this object within the menu. External IDs must be unique across all menu entities of this type. Any availability override that shares this `external_id` will be overwritten."
        },
        "name": {
          "type": "string",
          "description": "The display name for this availability override, which will be shown internally and externally."
        },
        "start_date": {
          "type": "string",
          "description": "The date and time when this override begins.",
          "format": "date-time"
        },
        "end_date": {
          "type": "string",
          "description": "The date and time when this override ends.",
          "format": "date-time"
        },
        "override_type": {
          "type": "string",
          "description": "The type of availability override, [AVAILABLE, UNAVAILABLE].",
          "enum": [
            "AVAILABLE",
            "UNAVAILABLE"
          ]
        }
      },
      "description": "Definitions of time range during which item or modifier is not available."
    },
    "AvailabilityRange": {
      "required": [
        "external_id",
        "name",
        "start_date"
      ],
      "type": "object",
      "properties": {
        "external_id": {
          "type": "string",
          "description": "A user-configured identifier for this object within the menu. External IDs must be unique across all menu entities of this type. Any availability range that shares this `external_id` will be overwritten."
        },
        "name": {
          "type": "string",
          "description": "The display name for this availability, which will be shown internally and externally."
        },
        "start_date": {
          "type": "string",
          "description": "The date and time when this override begins.",
          "format": "date-time"
        },
        "end_date": {
          "type": "string",
          "description": "The date and time when this override ends.",
          "format": "date-time"
        }
      },
      "description": "Definitions of time ranges during a year when one or more menu items may be available."
    },
    "Dimensions": {
      "type": "object",
      "properties": {
        "depth_in_inches": {
          "type": "number",
          "description": "Depth of an item in inches.",
          "format": "float"
        },
        "width_in_inches": {
          "type": "number",
          "description": "Width of an item in inches.",
          "format": "float"
        },
        "height_in_inches": {
          "type": "number",
          "description": "Height of an item in inches.",
          "format": "float"
        }
      },
      "description": "The dimensions of the item, width/height/depth."
    },
    "Item": {
      "required": [
        "external_id",
        "name"
      ],
      "type": "object",
      "properties": {
        "external_id": {
          "type": "string",
          "description": "The merchant-set ID for this menu item, which can be used to link it in the `PosNormalizedMenu`."
        },
        "name": {
          "type": "string",
          "description": "The display name of the menu item."
        },
        "internal_name": {
          "type": "string",
          "description": "An internal reference name for this menu item. It will not be displayed on the Grubhub ordering platform."
        },
        "description": {
          "type": "string",
          "description": "A diner-facing description of this menu item that displays on the Grubhub ordering apps."
        },
        "price": {
          "type": "number",
          "description": "The cost of this item in cents before taxes and fees. Every menu item must have either a `price` or a `size_prompt` value.",
          "format": "double"
        },
        "tax_rate": {
          "type": "string",
          "description": "The `external_id` value of the tax rate that applies to this menu item. Note:  All applicable tax rates must first be defined in the menu-level tax_rates array (with rates formatted as decimals, e.g., 2.5% as 0.025). Reference the corresponding external_id here if this tax rate differs."
        },
        "tax_category": {
          "$ref": "#/$defs/TaxCategory"
        },
        "miscellaneous_taxes": {
          "type": "array",
          "description": "A list of `external_id` values that indicate additional tax rates that apply to this menu item.",
          "items": {
            "type": "string",
            "description": "A list of `external_id` values that indicate additional tax rates that apply to this menu item."
          }
        },
        "flexible_tax_fields": {
          "type": "object",
          "additionalProperties": {
            "type": "string",
            "description": "Flexible fields can be used to include unique rules for an item, for example bottle deposit or cup fees. These rules, including bottle deposit and cup fees, may require additional activation in the Grubhub system. Contact your Grubhub representative for further information. This is a map of flexible fields associated with this item whose values are Strings.<br /><br />Allowed entries are:<br /><br />   'SERVING_METHOD': \"BTL-GLASS\", \"BTL-PLASTIC\", \"CANNED\", or \"CUP\". <br/>   'PREMISIS_CONSUMPTION': \"ON\", \"OFF\".",
            "example": "{\"SERVING_METHOD\":\"BTL-GLASS\"}"
          },
          "description": "Flexible fields can be used to include unique rules for an item, for example bottle deposit or cup fees. These rules, including bottle deposit and cup fees, may require additional activation in the Grubhub system. Contact your Grubhub representative for further information. This is a map of flexible fields associated with this item whose values are Strings.<br /><br />Allowed entries are:<br /><br />   'SERVING_METHOD': \"BTL-GLASS\", \"BTL-PLASTIC\", \"CANNED\", or \"CUP\". <br/>   'PREMISIS_CONSUMPTION': \"ON\", \"OFF\".",
          "example": {
            "SERVING_METHOD": "BTL-GLASS"
          }
        },
        "flexible_tax_numeric_fields": {
          "type": "object",
          "additionalProperties": {
            "type": "number",
            "description": "Flexible fields can be used to include unique rules for an item, for example bottle deposit or cup fees. These rules, including bottle deposit and cup fees, may require additional activation in the Grubhub system. Contact your Grubhub representative for further information. This is a map of flexible fields associated with this item whose values are numeric.<br /><br />Allowed entries are:<br /><br />   'VOLUME': <volume in fluid oz. eg. '16.0'> <br />   'NUMBER_OF_UNITS': <number of units, eg. '6' for a six pack> .",
            "format": "double"
          },
          "description": "Flexible fields can be used to include unique rules for an item, for example bottle deposit or cup fees. These rules, including bottle deposit and cup fees, may require additional activation in the Grubhub system. Contact your Grubhub representative for further information. This is a map of flexible fields associated with this item whose values are numeric.<br /><br />Allowed entries are:<br /><br />   'VOLUME': <volume in fluid oz. eg. '16.0'> <br />   'NUMBER_OF_UNITS': <number of units, eg. '6' for a six pack> .",
          "example": {
            "VOLUME": 1,
            "NUMBER_OF_UNIT": 1
          }
        },
        "size_prompt": {
          "type": "string",
          "description": "The `external_id` value of the size prompt and options that apply to this menu item. Every menu item must have either a `price` or a `size_prompt` value."
        },
        "modifier_prompts": {
          "type": "array",
          "description": "A list of `external_id` values for the modifier prompts that apply to this menu item.",
          "items": {
            "type": "string",
            "description": "A list of `external_id` values for the modifier prompts that apply to this menu item."
          }
        },
        "schedule_ids": {
          "type": "array",
          "description": "A list of `external_id` values for `PosNormalizedRepeatingSchedule` schedules that indicate when this menu item is available during the week.",
          "items": {
            "type": "string",
            "description": "A list of `external_id` values for `PosNormalizedRepeatingSchedule` schedules that indicate when this menu item is available during the week."
          }
        },
        "tags": {
          "type": "array",
          "description": "A list of indicators that flag this menu item for special delivery handling, regulatory treatment, or to indicate specific properties of the food - spicy, kosher, etc. - for the diner.",
          "items": {
            "$ref": "#/$defs/Tag"
          }
        },
        "minimum_serving_size": {
          "type": "integer",
          "description": "The minimum serving size that can be ordered of this item.",
          "format": "int32"
        },
        "maximum_serving_size": {
          "type": "integer",
          "description": "The maximum serving size that can be ordered of this item. This value must be greater than `minimum_serving_size.`",
          "format": "int32"
        },
        "lead_time_seconds": {
          "type": "integer",
          "description": "The required minimum time this item needs to be prepared.",
          "format": "int64"
        },
        "minimum_order_quantity": {
          "type": "integer",
          "description": "Default minimum quantity that can be ordered of this item.",
          "format": "int32"
        },
        "maximum_order_quantity": {
          "type": "integer",
          "description": "The maximum quantity of this item that can be ordered in standard orders. This value must be greater than `minimum_order_quantity`.",
          "format": "int32"
        },
        "calorie_count": {
          "type": "string",
          "description": "How many calories is this item? Can be an integer, an integer with a '+' or '-' prepended, or a range of integers."
        },
        "media": {
          "$ref": "#/$defs/PosNormalizedMenuMedia"
        },
        "metadata": {
          "type": "string",
          "description": "User-configured text stored with and returned as part of this object. This text is not used by the Grubhub system; it is solely for the POS user's purposes. Character limit is restricted to 2560 characters. A validation error will be returned if this limit is exceeded."
        },
        "availability_ranges": {
          "type": "array",
          "description": "A list of `external_id` values for `PosNormalizedAvailabilityRanges` objects that indicate the date ranges when this menu item will be available for ordering.",
          "items": {
            "type": "string",
            "description": "A list of `external_id` values for `PosNormalizedAvailabilityRanges` objects that indicate the date ranges when this menu item will be available for ordering."
          }
        },
        "allowable_order_types": {
          "uniqueItems": true,
          "type": "array",
          "description": "The set of order types that can use this item. If the value is null or empty, the item will default to being \"STANDARD\"",
          "items": {
            "type": "string",
            "enum": [
              "STANDARD",
              "CATERING",
              "GROUP"
            ]
          }
        },
        "availability_override": {
          "type": "string",
          "description": "The `external_id` value for `availability_overrides` object that indicate the date ranges when this menu item will not be available for ordering."
        },
        "gtin": {
          "type": "string",
          "description": "The Global Trade Number Identification Number (GTIN) is for manufactured items only. This is assigned by the manufacturer (barcode on the back of the product packaging) to uniquely identify your item and used by Grubhub to optimize your menu.<br /><br />In North America, use the 12 digit UPC number (unless the product is a book in which case you'd use the ISBN). The complete list of GTIN number types is as follows:<br /><br />    UPC (in North America / GTIN-12) - 12-digit number<br />    EAN (in Europe / GTIN-13) - 13-digit number<br />    JAN (in Japan / GTIN-13) - 8 or 13-digit number<br />    ISBN (for books) - 13-digit number (convert ISBN-10 to ISBN-13). If you have both, include only the 13-digit number.<br />    ITF-14 (for multipacks / GTIN-14) - 14-digit number<br /><br />Only provide a GTIN if you are sure it is correct, other wise leave it blank. An incorrect GTIN can cause menu ingestion to fail."
        },
        "dimensions": {
          "$ref": "#/$defs/Dimensions"
        },
        "weight_in_pounds": {
          "type": "number",
          "description": "The weight of the item in pounds.",
          "format": "float"
        },
        "location_in_store": {
          "type": "string",
          "description": "The location of the item in the store."
        },
        "serving_size": {
          "type": "integer",
          "description": "The number of expected servings for each quantity of this item.",
          "format": "int32"
        },
        "measured_price": {
          "$ref": "#/$defs/MeasuredPrice"
        },
        "fulfillment_type_settings": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/$defs/NormalizedItemFulfillmentTypeSettings"
          },
          "description": "OrderServiceType-specific configurations for this menu item. All keys should be strings representing order-service types (valid options include \"STANDARD_DELIVERY\", \"STANDARD_PICKUP\", \"CATERING_DELIVERY\", and \"GROUP_DELIVERY\". All values should be of type NormalizedItemFulfillmentTypeSettings."
        }
      },
      "description": "Information about a single menu item included in a PosNormalizedMenu ingestion process."
    },
    "MeasuredPrice": {
      "type": "object",
      "properties": {
        "measurement_unit_for_pricing": {
          "type": "string",
          "description": "The measurement unit used to measure the item. This should be used only for items whose price depends on quantity sold. These are also referred as weighted items"
        },
        "estimated_units_per_item_for_pricing": {
          "type": "number",
          "description": "Estimated units per unit of item. This value will be used to calculate estimated price for total number of units. The unit of measurement used will be measurement_unit_for_pricing. This should be used only for items whose price depends on quantity. These are also referred as weighted items "
        }
      },
      "description": "The values for items whose price depends on the quantity sold. Also referred as weighted items."
    },
    "MenuInfo": {
      "required": [
        "currency"
      ],
      "type": "object",
      "properties": {
        "currency": {
          "type": "string",
          "description": "The currency in which this merchant's prices are valued in."
        },
        "sections": {
          "type": "array",
          "description": "An array of the `external_id` strings for the sections within this menu.",
          "items": {
            "type": "string",
            "description": "An array of the `external_id` strings for the sections within this menu."
          }
        },
        "header_media": {
          "$ref": "#/$defs/PosNormalizedMenuMedia"
        },
        "logo_media": {
          "$ref": "#/$defs/PosNormalizedMenuMedia"
        },
        "search_media": {
          "$ref": "#/$defs/PosNormalizedMenuMedia"
        }
      },
      "description": "The top-level information about a menu in the PosNormalizedMenu format, including default currency, images, and sections."
    },
    "MenuSection": {
      "required": [
        "external_id",
        "name"
      ],
      "type": "object",
      "properties": {
        "external_id": {
          "type": "string",
          "description": "The merchant-set ID for this schedule, which can be used to link it in the `PosNormalizedMenu`."
        },
        "name": {
          "type": "string",
          "description": "The display name of this menu section."
        },
        "internal_name": {
          "type": "string",
          "description": "An internal reference name for this section. It will not be displayed on the Grubhub ordering platform."
        },
        "description": {
          "type": "string",
          "description": "A human-readable description of what this section contains that can be displayed on either the Grubhub ordering apps or the POS system."
        },
        "items": {
          "type": "array",
          "description": "A list of the `external_id` values of the menu items that will be listed under this section.",
          "items": {
            "type": "string",
            "description": "A list of the `external_id` values of the menu items that will be listed under this section."
          }
        },
        "availability_ranges": {
          "type": "array",
          "description": "A list of the `external_id` values of the `PosNormalizedAvailabilityRanges` that define when the menu items within this section can be ordered.",
          "items": {
            "type": "string",
            "description": "A list of the `external_id` values of the `PosNormalizedAvailabilityRanges` that define when the menu items within this section can be ordered."
          }
        },
        "schedule_ids": {
          "type": "array",
          "description": "A list of `external_id` values for `PosNormalizedRepeatingSchedule` schedules that indicate when this menu item is available during the week.",
          "items": {
            "type": "string",
            "description": "A list of `external_id` values for `PosNormalizedRepeatingSchedule` schedules that indicate when this menu item is available during the week."
          }
        },
        "availability_override": {
          "type": "string",
          "description": "The `external_id` value for `availability_overrides` object that indicate the date ranges when this menu section will not be available for ordering."
        },
        "media": {
          "$ref": "#/$defs/PosNormalizedMenuMedia"
        },
        "subsections": {
          "type": "array",
          "description": "A list of subsections associated with this section.",
          "items": {
            "type": "string",
            "description": "A list of subsections associated with this section."
          }
        },
        "tax_category": {
          "$ref": "#/$defs/TaxCategory"
        }
      },
      "description": "A category of the menu - such as appetizers, breakfast, or drinks - including the menu items that these sections contain."
    },
    "Modifier": {
      "required": [
        "default_price",
        "external_id",
        "name"
      ],
      "type": "object",
      "properties": {
        "external_id": {
          "type": "string",
          "description": "The merchant-set ID for this modifier, which can be used to link it in the `PosNormalizedMenu`."
        },
        "name": {
          "type": "string",
          "description": "The display name of the modifier."
        },
        "internal_name": {
          "type": "string",
          "description": "Optional. If present, name displayed on Grubhub menu management tools"
        },
        "description": {
          "type": "string",
          "description": "The description displayed to the diner."
        },
        "calorie_count": {
          "type": "string",
          "description": "The calorie content for this modifier."
        },
        "default_price": {
          "type": "number",
          "description": "Default price of the modifier. Applies if the item has no sizes or if there is no modifier `sized_price` for the size selected."
        },
        "tags": {
          "type": "array",
          "description": "A list of indicators that flag this modifier for special delivery handling, regulatory treatment, or to indicate specific properties of the food - spicy, kosher, etc. - for the diner. Modifier tags can differ from menu item tags as they can add ingredients, i.e. a modifier that adds cheese could make a menu item no longer vegan and add dairy.",
          "items": {
            "$ref": "#/$defs/Tag"
          }
        },
        "tax_rate": {
          "type": "string",
          "description": "The `external_id` value of the tax rate that applies to this modifier if that rate differs from the overall menu or the specific menu item rate."
        },
        "tax_category": {
          "$ref": "#/$defs/TaxCategory"
        },
        "flexible_tax_fields": {
          "type": "object",
          "additionalProperties": {
            "type": "string",
            "description": "Flexible fields can be used to include unique rules for an item, for example bottle deposit or cup fees. These rules, including bottle deposit and cup fees, may require additional activation in the Grubhub system. Contact your Grubhub representative for further information. This is a map of flexible fields associated with this item whose values are Strings.<br /><br />Allowed entries are:<br /><br />   'SERVING_METHOD': \"BTL-GLASS\", \"BTL-PLASTIC\", \"CANNED\", or \"CUP\". <br/>   'PREMISIS_CONSUMPTION: \"ON\", \"OFF\"."
          },
          "description": "Flexible fields can be used to include unique rules for an item, for example bottle deposit or cup fees. These rules, including bottle deposit and cup fees, may require additional activation in the Grubhub system. Contact your Grubhub representative for further information. This is a map of flexible fields associated with this item whose values are Strings.<br /><br />Allowed entries are:<br /><br />   'SERVING_METHOD': \"BTL-GLASS\", \"BTL-PLASTIC\", \"CANNED\", or \"CUP\". <br/>   'PREMISIS_CONSUMPTION: \"ON\", \"OFF\"."
        },
        "flexible_tax_numeric_fields": {
          "type": "object",
          "additionalProperties": {
            "type": "number",
            "description": "Flexible fields can be used to include unique rules for an item, for example bottle deposit or cup fees. These rules, including bottle deposit and cup fees, may require additional activation in the Grubhub system. Contact your Grubhub representative for further information. This is a map of flexible fields associated with this item whose values are numeric.<br /><br />Allowed entries are:<br /><br />   'VOLUME': <volume in fluid oz. eg. '16.0'> <br />   'NUMBER_OF_UNITS': <number of units, eg. '6' for a six pack> .",
            "format": "double"
          },
          "description": "Flexible fields can be used to include unique rules for an item, for example bottle deposit or cup fees. These rules, including bottle deposit and cup fees, may require additional activation in the Grubhub system. Contact your Grubhub representative for further information. This is a map of flexible fields associated with this item whose values are numeric.<br /><br />Allowed entries are:<br /><br />   'VOLUME': <volume in fluid oz. eg. '16.0'> <br />   'NUMBER_OF_UNITS': <number of units, eg. '6' for a six pack> ."
        },
        "miscellaneous_taxes": {
          "type": "array",
          "description": "A list of `external_id` values that indicate additional tax rates that apply to this modifier selection.",
          "items": {
            "type": "string",
            "description": "A list of `external_id` values that indicate additional tax rates that apply to this modifier selection."
          }
        },
        "media": {
          "$ref": "#/$defs/PosNormalizedMenuMedia"
        },
        "sized_prices": {
          "type": "array",
          "description": "Optional. An ordered list of sized prices for this modifier, i.e., the modifier price depends on the Size selected for the Item.",
          "items": {
            "$ref": "#/$defs/SizedPrice"
          }
        },
        "submodifiers": {
          "type": "array",
          "description": "A list of `external_id` values for the modifier prompts that are available on this individual modifier option. In enhanced menus, modifiers can recurse up to six levels deep.",
          "items": {
            "type": "string",
            "description": "A list of `external_id` values for the modifier prompts that are available on this individual modifier option. In enhanced menus, modifiers can recurse up to six levels deep."
          }
        },
        "metadata": {
          "type": "string",
          "description": "User-configured text stored with and returned as part of this object. This text is not used by the Grubhub system; it is solely for the POS user's purposes. Character limit is restricted to 2560 characters. A validation error will be returned if this limit is exceeded."
        },
        "schedule_ids": {
          "type": "array",
          "description": "A list of `external_id` values for `PosNormalizedRepeatingSchedule` schedules that indicate when this modifier is available during the week. This can differ from the schedules for the menu item itself, though the modifier will only be available during the times when both schedules are active.",
          "items": {
            "type": "string",
            "description": "A list of `external_id` values for `PosNormalizedRepeatingSchedule` schedules that indicate when this modifier is available during the week. This can differ from the schedules for the menu item itself, though the modifier will only be available during the times when both schedules are active."
          }
        },
        "availability_ranges": {
          "type": "array",
          "description": "A list of `external_id` values for `PosNormalizedAvailabiltyRanges` objects that indicate the date ranges when this menu item will be available for ordering. This can differ from the availability range for the menu item itself, though the modifier will only be available during the times when both ranges are active.",
          "items": {
            "type": "string",
            "description": "A list of `external_id` values for `PosNormalizedAvailabiltyRanges` objects that indicate the date ranges when this menu item will be available for ordering. This can differ from the availability range for the menu item itself, though the modifier will only be available during the times when both ranges are active."
          }
        },
        "availability_override": {
          "type": "string",
          "description": "The `external_id` value for `availability_overrides` object that indicate the date ranges when this modifier will not be available for ordering."
        },
        "fulfillment_type_settings": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/$defs/NormalizedModifierFulfillmentTypeSettings"
          },
          "description": "OrderServiceType-specific configurations for this modifier. All keys should be strings representing order-service types (valid options include \"STANDARD_DELIVERY\", \"STANDARD_PICKUP\", \"CATERING_DELIVERY\", and \"GROUP_DELIVERY\". All values should be of type NormalizedModifierFulfillmentTypeSettings."
        }
      },
      "description": "A selectable option within a modifier prompt that changes a menu item. That change may include price and calorie variations, and may be affected by size selections."
    },
    "ModifierList": {
      "required": [
        "external_id",
        "name"
      ],
      "type": "object",
      "properties": {
        "external_id": {
          "type": "string",
          "description": "A user-configured identifier for this object within the menu. External IDs must be unique across all menu entities of this type. Any modifier list that shares this `external_id` will be overwritten."
        },
        "name": {
          "type": "string",
          "description": "The display name for this list of modifiers."
        },
        "modifiers": {
          "type": "array",
          "description": "The `external_id` values of the `PosNormalizedModifier` objects referenced by this list.",
          "items": {
            "type": "string",
            "description": "The `external_id` values of the `PosNormalizedModifier` objects referenced by this list."
          }
        }
      },
      "description": "A list of modifiers included within a modifier prompt."
    },
    "ModifierPrompt": {
      "required": [
        "external_id",
        "modifier_list",
        "name"
      ],
      "type": "object",
      "properties": {
        "external_id": {
          "type": "string",
          "description": "A user-configured identifier for this object within the menu. External IDs must be unique across all menu entities of this type. Any modifier prompt that shares this `external_id` will be overwritten."
        },
        "name": {
          "type": "string",
          "description": "The text given to the diner to prompt then to select from a list of modifier options."
        },
        "internal_name": {
          "type": "string",
          "description": "A name displayed on Grubhub menu management tools instead of the display name."
        },
        "modifier_list": {
          "type": "string",
          "description": "An `external_id` reference to a PosNormalizedModifierList. This is the list of modifier options valid as answers to this prompt."
        },
        "default_selection_model": {
          "$ref": "#/$defs/ModifierPromptSelectionSettings"
        },
        "modifier_prompt_quantity_settings": {
          "$ref": "#/$defs/ModifierPromptQuantitySettings"
        },
        "modifier_quantity_settings": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/$defs/ModifierQuantitySettings"
          },
          "description": "Quantity information for a single modifier within this prompt."
        },
        "defaulted_modifiers": {
          "uniqueItems": true,
          "type": "array",
          "description": "The modifiers, if any, that are selected by default for this prompt.",
          "items": {
            "type": "string",
            "description": "The modifiers, if any, that are selected by default for this prompt."
          }
        },
        "modifier_prompt_free_settings": {
          "$ref": "#/$defs/ModifierPromptFreeSettings"
        }
      },
      "description": "In a normalized menu, a question posed to a diner about what additional options they would like with their food; for example, toppings on a pizza or soup options in a lunch special. Each modifier prompts has one or more modifiers that a diner can select. Modifier prompts can apply to multiple menu items."
    },
    "ModifierPromptFreeSettings": {
      "type": "object",
      "properties": {
        "free_modifiers": {
          "minimum": 0,
          "type": "integer",
          "format": "int32"
        }
      },
      "description": "Free settings for modifier prompts."
    },
    "ModifierPromptQuantitySettings": {
      "type": "object",
      "properties": {
        "minimum_units": {
          "type": "integer",
          "description": "The total minimum quantity that must be selected across all modifiers in a prompt.",
          "format": "int32"
        },
        "maximum_units": {
          "type": "integer",
          "description": "The total maximum quantity that can be selected across all modifiers in a prompt. *DO NOT use -1 as an integer for unlimited quantity. Instead use a high number, ie 99.*",
          "format": "int32"
        }
      },
      "description": "The total minimum and maximum quantities that can be added for all modifier options in this prompt."
    },
    "ModifierPromptSelectionSettings": {
      "type": "object",
      "properties": {
        "minimum_quantity": {
          "type": "integer",
          "description": "The minimum number of unique options that the diner can select for this prompt. Use 0 to set no minimum.",
          "format": "int32"
        },
        "maximum_quantity": {
          "type": "integer",
          "description": "The maximum number of unique options that the diner can select for this prompt. *DO NOT use -1 as an integer for unlimited quantity. Instead use a high number, ie 99.*",
          "format": "int32"
        }
      },
      "description": "The minimum and maximum number of unique modifier options that can be selected within a prompt."
    },
    "ModifierQuantitySettings": {
      "type": "object",
      "properties": {
        "default_units": {
          "type": "integer",
          "description": "The number of units of this modifier already entered into the interface when the diner first selects these associated menu item. Applies only to default_modifiers.",
          "format": "int32"
        },
        "maximum_units": {
          "type": "integer",
          "description": "The maximum number of units that the diner can add of this modifier. Do not use zero as a maximum integer or the modifiers will not be selectable. *DO NOT use -1 as an integer for unlimited quantity. Instead use a high number, ie 99.*",
          "format": "int32"
        },
        "unit_increment": {
          "type": "integer",
          "description": "The number of units added per incremental or decremental action.",
          "format": "int32"
        }
      },
      "description": "Contains default, maximum, and custom increments for a single modifier. The properties below will be contained in a sub-object identified by the external_id of the modifier in question."
    },
    "NormalizedItemFulfillmentTypeSettings": {
      "type": "object",
      "properties": {
        "price": {
          "type": "number",
          "description": "The price to be used for a given OrderServiceType for an Item if the Item has no sizes.",
          "format": "double"
        }
      },
      "description": "ItemFulfillmentTypeSettings include configurations to be used for an Item only for oneOrderServiceType."
    },
    "NormalizedModifierFulfillmentTypeSettings": {
      "type": "object",
      "properties": {
        "price": {
          "type": "number",
          "description": "The additional cost applied to an order if a diner selects this modifier for a given OrderServiceType."
        }
      },
      "description": "ModifierFulfillmentTypeSettings include configurations to be used for an Modifier only for oneOrderServiceType."
    },
    "NormalizedSizeFulfillmentTypeSettings": {
      "type": "object",
      "properties": {
        "price": {
          "type": "number",
          "description": "The base price of the menu item at this size to be used for a given OrderServiceType."
        }
      },
      "description": "SizeFulfillmentTypeSettings include configurations to be used for a Size only for oneFulfillmentType."
    },
    "NormalizedSizedPriceFulfillmentTypeSettings": {
      "type": "object",
      "properties": {
        "price": {
          "type": "number",
          "description": "The price for the referenced Size for a given OrderServiceType."
        }
      },
      "description": "SizedPriceFulfillmentTypeSettings include configurations to be used for a SizedPrice onlyfor one OrderServiceType."
    },
    "PosNormalizedMenuMedia": {
      "type": "object",
      "properties": {
        "source_url": {
          "type": "string",
          "description": "The URL where the image file can be downloaded."
        }
      },
      "description": "Information about media used in the PosNormalizedMenu format."
    },
    "RepeatingSchedule": {
      "required": [
        "external_id",
        "name",
        "rules"
      ],
      "type": "object",
      "properties": {
        "external_id": {
          "type": "string",
          "description": "The merchant-set ID for this schedule, which can be used to link it in the `PosNormalizedMenu`."
        },
        "name": {
          "type": "string",
          "description": "The display name for this schedule, e.g. \"Sunday Brunch\""
        },
        "type": {
          "type": "string",
          "description": "How often this schedule repeats. Currently the only valid value is \"WEEKLY\".",
          "enum": [
            "WEEKLY"
          ]
        },
        "rules": {
          "type": "array",
          "description": "A set of non-overlapping time periods.",
          "items": {
            "$ref": "#/$defs/RepeatingScheduleRule"
          }
        }
      },
      "description": "Information about a weekly schedule during which a menu item may be made available. Typical usages include Breakfast, Lunch, Dinner, Weekend Brunch, etc."
    },
    "RepeatingScheduleRule": {
      "required": [
        "end_time",
        "start_time"
      ],
      "type": "object",
      "properties": {
        "days": {
          "uniqueItems": true,
          "type": "array",
          "description": "Days of the week for which the time period applies. Must be one of [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]",
          "items": {
            "type": "string",
            "description": "Days of the week for which the time period applies. Must be one of [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY]",
            "enum": [
              "MONDAY",
              "TUESDAY",
              "WEDNESDAY",
              "THURSDAY",
              "FRIDAY",
              "SATURDAY",
              "SUNDAY"
            ]
          }
        },
        "start_time": {
          "type": "string",
          "description": "The time when this schedule begins on the days listed, in the merchant's local time. Must conform to ISO date and time format",
          "example": "09:30:00.000"
        },
        "end_time": {
          "type": "string",
          "description": "The time when this schedule ends on the days listed, in the merchant's local time. Must conform to ISO date and time format",
          "example": "22:30:00.000"
        }
      },
      "description": "A time period and repetition rule."
    },
    "Size": {
      "required": [
        "external_id",
        "name"
      ],
      "type": "object",
      "properties": {
        "external_id": {
          "type": "string",
          "description": "A user-configured identifier for this object within the menu. External IDs must be unique across all menu entities of this type. Any size that shares this `external_id` will be overwritten."
        },
        "name": {
          "type": "string",
          "description": "The display name for this size, which will be given to the diner as an option to select."
        },
        "internal_name": {
          "type": "string",
          "description": "A name displayed on Grubhub menu management tools instead of the display name."
        },
        "metadata": {
          "type": "string",
          "description": "Metadata associated with the size."
        },
        "fulfillment_type_settings": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/$defs/NormalizedSizeFulfillmentTypeSettings"
          },
          "description": "OrderServiceType-specific configurations for this size. All keys should be strings representing order-service types (valid options include \"STANDARD_DELIVERY\", \"STANDARD_PICKUP\", \"CATERING_DELIVERY\", and \"GROUP_DELIVERY\". All values should be of type NormalizedSizeFulfillmentTypeSettings."
        }
      },
      "description": "Size selections for prompts within menu items."
    },
    "SizePrompt": {
      "required": [
        "external_id",
        "name"
      ],
      "type": "object",
      "properties": {
        "external_id": {
          "type": "string",
          "description": "A user-configured identifier for this object within the menu. External IDs must be unique across all menu entities of this type. Any size prompt that shares this `external_id` will be overwritten."
        },
        "name": {
          "type": "string",
          "description": "The display name for this size prompt, which in this case is the prompt given to the diner."
        },
        "internal_name": {
          "type": "string",
          "description": "A name displayed on Grubhub menu management tools instead of the display name."
        },
        "sized_prices": {
          "type": "array",
          "description": "Additional price information about size within a normalized menu. For use in Size Prompts for the item pricing model.",
          "items": {
            "$ref": "#/$defs/SizedPrice"
          }
        }
      },
      "description": "Information about item sizing, including display text and pricing."
    },
    "SizedPrice": {
      "required": [
        "price",
        "size"
      ],
      "type": "object",
      "properties": {
        "size": {
          "type": "string",
          "description": "The `external_id` reference to a PosNormalizedSize."
        },
        "price": {
          "type": "number",
          "description": "Price for the referenced size."
        },
        "calorie_content": {
          "type": "string",
          "description": "Number of calories for the size."
        },
        "display_name": {
          "type": "string",
          "description": "Optional. If present, overrides the name of the referenced size, for display to diners."
        },
        "fulfillment_type_settings": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/$defs/NormalizedSizedPriceFulfillmentTypeSettings"
          },
          "description": "OrderServiceType-specific configurations for this SizedPrice. All keys should be strings representing order-service types (valid options include \"STANDARD_DELIVERY\", \"STANDARD_PICKUP\", \"CATERING_DELIVERY\", and \"GROUP_DELIVERY\". All values should be of type NormalizedSizedPriceFulfillmentTypeSettings."
        }
      },
      "description": "Additional price information about size within a normalized menu. For use in Size Prompts for the item pricing model."
    },
    "Tag": {
      "required": [
        "group",
        "name"
      ],
      "type": "object",
      "properties": {
        "group": {
          "type": "string",
          "description": "Tag group. Currently, the only valid group is 'LEGACY'"
        },
        "name": {
          "type": "string",
          "description": "Tag name or code.",
          "enum": [
            "ADVANCED_ORDERING",
            "ALCOHOL",
            "DESSERT",
            "DAIRY_FREE",
            "DRINK",
            "GLUTEN_FREE",
            "KOSHER",
            "LOW_FAT",
            "NOT_FOR_BIKER",
            "NUT_FREE",
            "RAW_FOOD_WARNING",
            "SPECIALTY",
            "SPICY",
            "SODIUM_WARNING",
            "TAX_EXEMPT",
            "VEGAN",
            "VEGETARIAN",
            "FIFTEEN_TWENTY_LBS",
            "TWENTY_TWENTYFIVE_LBS",
            "TWENTYFIVE_THIRTY_LBS",
            "THIRTY_PLUS_LBS",
            "TWO_TWOHALF_FT",
            "TWOHALF_THREE_FT",
            "THREE_PLUS_FT"
          ]
        }
      },
      "description": "Tags for menu items are used to flag certain items for special delivery handling, regulatory treatment, and to denote an item is eligible for certain flags and icons on Grubhub diner properties."
    },
    "TaxCategory": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "description": "A valid Grubhub internal tax category code."
        }
      },
      "description": "Tax category."
    },
    "TaxRate": {
      "required": [
        "external_id",
        "name"
      ],
      "type": "object",
      "properties": {
        "external_id": {
          "type": "string",
          "description": "The merchant-set ID for this tax rate, which can be used to link it in the `PosNormalizedMenu`."
        },
        "name": {
          "type": "string",
          "description": "The name of the tax rate shown in Grubhub menu management user interfaces."
        },
        "rate": {
          "type": "number",
          "description": "Decimal tax rate. Must be between 0 and 1. This object must have a value for either this field or the `flat` field.",
          "format": "double"
        },
        "flat": {
          "type": "number",
          "description": "The absolute amount of tax applied to orders from this merchant. This object must have a value for either this field or the `rate` field.",
          "format": "double"
        }
      },
      "description": "Information about a tax rate in a normalized menu format. Tax rate to be applied at order checkout, if the diner is not tax-exempt. The tax rate listed here applies only to the items and modifiers with which it is associated. All other menu items will use the merchant tax rate."
    }
  }
}