Grubhub Menu API

Create, update and manage Grubhub Marketplace menus. Ingestion is diff-based against external IDs: validate a normalized menu, submit it, poll the ingestion job, and read back what Grubhub stored. Also carries menu-item schedule overrides (by internal or external ID, in bulk) and alcohol tagging.

Operations 10

POST /pos/v1/menu/ingestion/validate Validate a normalized menu #
POST /pos/v1/menu/ingestion Add or update a normalized menu #
PATCH /pos/v1/merchant/{merchant_id}/menu/schedules/overrides/external Bulk menu item schedule override operation by external IDs #
GET /pos/v1/merchant/{merchant_id}/menu/schedules/overrides Get schedule overrides for a merchant #
PATCH /pos/v1/merchant/{merchant_id}/menu/schedules/overrides Bulk menu item schedule override operation by Grubhub internal IDs #
PATCH /pos/v1/merchant/{merchant_id}/menu/entities/tags/alcohol Mark items/modifiers as alcoholic #
GET /pos/v1/merchant/{merchant_id}/menu/schedules/overrides/{job_id}/status Get bulk schedule override job status #
GET /pos/v1/merchant/{merchant_id}/menu/normalized Retrieve a normalized menu for a given merchant ID #
GET /pos/v1/merchant/{merchant_id}/menu/entities/tags/{job_id}/status Check supplemental tag job status #
GET /pos/v1/menu/ingestion/jobs/{job_id} Check ingestion job status #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/grubhub-menu"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

grubhub-menu-openapi.yml Raw ↑
openapi: 3.0.1
info:
  title: Menu
servers:
- url: https://api-third-party-gtm-pp.grubhub.com
  description: preprod
- url: https://api-third-party-gtm.grubhub.com
  description: prod
tags:
- name: Models
  description: "# RepeatingSchedule \n <SchemaDefinition schemaRef=\"#/components/schemas/RepeatingSchedule\"/>\n\
    \n# RepeatingScheduleRule \n <SchemaDefinition schemaRef=\"#/components/schemas/RepeatingScheduleRule\"/>\n\n\
    # PosNormalizedMenuValidationResult \n <SchemaDefinition schemaRef=\"#/components/schemas/PosNormalizedMenuValidationResult\"\
    />\n\n# PosNormalizedMenuUpdateRequest \n <SchemaDefinition schemaRef=\"#/components/schemas/PosNormalizedMenuUpdateRequest\"\
    />\n\n# PosNormalizedMenuUpdateResult \n <SchemaDefinition schemaRef=\"#/components/schemas/PosNormalizedMenuUpdateResult\"\
    />\n\n# PosScheduleOverrideBaseRequest \n <SchemaDefinition schemaRef=\"#/components/schemas/PosScheduleOverrideBaseRequest\"\
    />\n\n# PosScheduleOverrideBulkRequest \n <SchemaDefinition schemaRef=\"#/components/schemas/PosScheduleOverrideBulkRequest\"\
    />\n\n# ScheduleOverride \n <SchemaDefinition schemaRef=\"#/components/schemas/ScheduleOverride\"/>\n\n# PosScheduleOverrideMultiOperationResult\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/PosScheduleOverrideMultiOperationResult\"/>\n\n# TagProductsRequest\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/TagProductsRequest\"/>\n\n# PosSupplementalTagMultiOperationResult\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/PosSupplementalTagMultiOperationResult\"/>\n\n# BulkProcessingItemEntityStatus\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/BulkProcessingItemEntityStatus\"/>\n\n# PosBulkScheduleOverrideStatus\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/PosBulkScheduleOverrideStatus\"/>\n\n# PosItemScheduleOverrides\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/PosItemScheduleOverrides\"/>\n\n# PosModifierScheduleOverrides\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/PosModifierScheduleOverrides\"/>\n\n# PosScheduleOverrides\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/PosScheduleOverrides\"/>\n\n# AvailabilityOverride \n\
    \ <SchemaDefinition schemaRef=\"#/components/schemas/AvailabilityOverride\"/>\n\n# AvailabilityRange \n <SchemaDefinition\
    \ schemaRef=\"#/components/schemas/AvailabilityRange\"/>\n\n# Dimensions \n <SchemaDefinition schemaRef=\"#/components/schemas/Dimensions\"\
    />\n\n# Item \n <SchemaDefinition schemaRef=\"#/components/schemas/Item\"/>\n\n# MeasuredPrice \n <SchemaDefinition\
    \ schemaRef=\"#/components/schemas/MeasuredPrice\"/>\n\n# MenuInfo \n <SchemaDefinition schemaRef=\"#/components/schemas/MenuInfo\"\
    />\n\n# MenuSection \n <SchemaDefinition schemaRef=\"#/components/schemas/MenuSection\"/>\n\n# Modifier \n <SchemaDefinition\
    \ schemaRef=\"#/components/schemas/Modifier\"/>\n\n# ModifierList \n <SchemaDefinition schemaRef=\"#/components/schemas/ModifierList\"\
    />\n\n# ModifierPrompt \n <SchemaDefinition schemaRef=\"#/components/schemas/ModifierPrompt\"/>\n\n# ModifierPromptFreeSettings\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/ModifierPromptFreeSettings\"/>\n\n# ModifierPromptQuantitySettings\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/ModifierPromptQuantitySettings\"/>\n\n# ModifierPromptSelectionSettings\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/ModifierPromptSelectionSettings\"/>\n\n# ModifierQuantitySettings\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/ModifierQuantitySettings\"/>\n\n# NormalizedItemFulfillmentTypeSettings\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/NormalizedItemFulfillmentTypeSettings\"/>\n\n# NormalizedModifierFulfillmentTypeSettings\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/NormalizedModifierFulfillmentTypeSettings\"/>\n\n# NormalizedSizeFulfillmentTypeSettings\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/NormalizedSizeFulfillmentTypeSettings\"/>\n\n# NormalizedSizedPriceFulfillmentTypeSettings\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/NormalizedSizedPriceFulfillmentTypeSettings\"/>\n\n\
    # PosNormalizedMenu \n <SchemaDefinition schemaRef=\"#/components/schemas/PosNormalizedMenu\"/>\n\n# PosNormalizedMenuMedia\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/PosNormalizedMenuMedia\"/>\n\n# Size \n <SchemaDefinition\
    \ schemaRef=\"#/components/schemas/Size\"/>\n\n# SizePrompt \n <SchemaDefinition schemaRef=\"#/components/schemas/SizePrompt\"\
    />\n\n# SizedPrice \n <SchemaDefinition schemaRef=\"#/components/schemas/SizedPrice\"/>\n\n# Tag \n <SchemaDefinition\
    \ schemaRef=\"#/components/schemas/Tag\"/>\n\n# TaxCategory \n <SchemaDefinition schemaRef=\"#/components/schemas/TaxCategory\"\
    />\n\n# TaxRate \n <SchemaDefinition schemaRef=\"#/components/schemas/TaxRate\"/>\n\n# PosBulkSupplementalTagStatus\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/PosBulkSupplementalTagStatus\"/>\n\n# InvalidCodeAndEntityIds\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/InvalidCodeAndEntityIds\"/>\n\n# MediaValidationErrorDTO\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/MediaValidationErrorDTO\"/>\n\n# MenuMerchantStatus\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/MenuMerchantStatus\"/>\n\n# PosNormalizedMenuUpdateStatus\
    \ \n <SchemaDefinition schemaRef=\"#/components/schemas/PosNormalizedMenuUpdateStatus\"/>\n\n"
paths:
  /pos/v1/menu/ingestion/validate:
    post:
      tags:
      - Endpoints
      summary: Validate a normalized menu
      description: Verifies that the menu provided as the request body is a valid and complete PosNormalizedMenu
        data object. You do not need to validate a menu object before you run the ingestion process, but validation
        can save you the hassle of having a menu ingestion process fail unexpectedly.
      operationId: validatePosMenu
      parameters:
      - name: is_normalized_menu
        in: query
        description: Is the menu in a normalized format.
        required: true
        explode: true
        schema:
          type: boolean
          default: false
      - name: merchant_id
        in: query
        description: The Grubhub or third-party provided external ID for the merchant. Corresponds to a single location.
        required: false
        explode: true
        schema:
          type: string
      responses:
        '503':
          description: The menu validation has timed out.
        '200':
          description: Successfully or unsuccessfully performed a validation check.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PosNormalizedMenuValidationResult'
              example:
                valid: true
                validation_errors: []
  /pos/v1/menu/ingestion:
    post:
      tags:
      - Endpoints
      summary: Add or update a normalized menu
      description: 'Uploads a complete menu to Grubhub, including schedules, sections, items, and modifiers. Because
        of the size of the data used in this operation, the processing portion of this job completes after this
        endpoint responds. To find out the status of a normalized menu ingestion, call GET /pos/v1/menu/ingestion/jobs/{job_id}.
        Use the job_id returned from this endpoint.<br/><br/>By default, this endpoint expects the menu to conform
        to the normalized menu structure. To indicate this reference structure, the required field normalized_menu=true
        must be in the request body.<br/><br/>All objects within this menu payload must have external_id values
        attached to them for this upload to complete. External IDs that match existing objects will be merged with
        that object''s data. If a field exists in both the existing and ingested data, the ingested data will replace
        it. If the data only exists in the new data, then that object will be created. If the data exists in the
        old menu but not the new one, then that object will be deleted.<br/><br/>External IDs must be unique across
        all menu entities of the same type, except for menu schedules and sections, which must be globally unique.<br/><br/>Grubhub
        has a retry mechanism when attempting to download a partner menu. Upon failure, nine retry attempts over
        a span of five minutes are made before failing the job completely.<br/><br/>You can call GET /pos/v1/merchant/{merchant_id}/ingestion/menu
        to retrieve the current menu, then edit that object and use this endpoint to replace the existing menu with
        the edited one.<br/><br/>This call supports GZIP compression. In the request header, pass Accept-Encoding:
        gzip to receive a compressed response payload. Whether you send the JSON object compressed or not, it must
        be encoded in UTF-8.<br/><br/>We recommend that you use this endpoint for all menu creation, edits, and
        deletions.'
      operationId: addOrUpdatePosFullMenu
      parameters:
      - name: X-GH-PARTNER-KEY
        in: header
        required: true
        explode: false
        schema:
          type: string
          format: uuid
      requestBody:
        description: The request payload.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PosNormalizedMenuUpdateRequest'
            example:
              merchant_ids:
              - store182
              menu_url: https://example.com/menu
              normalized_menu: true
              apply_existing_schedule_overrides: false
        required: true
      responses:
        '409':
          description: Merchant(s) already has an active async update process.
        '422':
          description: Syntax of the request content was correct, but unable to process the contained instructions.
        '200':
          description: Menu successfully enqueued for processing.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PosNormalizedMenuUpdateResult'
              example:
                job_id: b78fba98-fb76-4748-9c72-dba110afa923
  /pos/v1/merchant/{merchant_id}/menu/schedules/overrides/external:
    patch:
      tags:
      - Endpoints
      summary: Bulk menu item schedule override operation by external IDs
      description: Bulk add or update the menu schedule overrides by external ID. Used to '86' a list of entities
        (items / modifiers).
      operationId: bulkAddOrUpdateSchedulesOverridesByExternalIds
      parameters:
      - name: merchant_id
        in: path
        description: The Grubhub or third-party provided external ID for the merchant.
        required: true
        explode: false
        schema:
          type: string
      - name: allow_partial_success
        in: query
        description: Should valid overrides still be applied if there are individual failures on the bulk operation
        required: true
        explode: true
        schema:
          type: boolean
          default: false
      requestBody:
        description: A list of PosScheduleOverrideBulkRequests, each containing a list of Partner external entity
          IDs and the schedule override operation to be applied for all of them.
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/PosScheduleOverrideBulkRequest'
            example:
            - entity_ids:
              - entity_id1
              - entity_id2
              schedule_override:
                op: ADD
                start: '2023-07-20T12:00:00.000Z'
                end: '9999-12-31T23:59:00.000Z'
                show_or_hide: SHOW
            - entity_ids:
              - entity_id3
              - entity_id4
              schedule_override:
                op: UPDATE
                cur_end_date: '2023-07-20T12:00:00.000Z'
                start: '2023-07-20T12:00:00.000Z'
                end: '2023-12-31T23:59:00.000Z'
                show_or_hide: HIDE
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PosScheduleOverrideMultiOperationResult'
              example:
                status: QUEUED
                message: Menu entity schedule override operation is queued.
                entity_ids:
                - entity_id_1
                - entity_id_2
                job_id: b3332f8b-64c6-4a46-89c2-3c27c27e8edf
  /pos/v1/merchant/{merchant_id}/menu/schedules/overrides:
    get:
      tags:
      - Endpoints
      summary: Get schedule overrides for a merchant
      description: Returns the schedule overrides for a given merchant, optionally you can pass dates to use as
        a range.
      operationId: getSchedulesOverridesForMerchant
      parameters:
      - name: merchant_id
        in: path
        description: The short Grubhub ID for the merchant. Corresponds to a single location.
        required: true
        explode: false
        schema:
          type: string
      - name: ending_after
        in: query
        description: A start date to use for the search window. If "now" is provided then current datetime will
          be used.
        required: true
        explode: true
        schema:
          type: string
      - name: ending_before
        in: query
        description: An end date to use for the search window. If "endOfTime" is provided then December 31, 9999,
          23:59 (11:59 PM) UTC will be used
        required: true
        explode: true
        schema:
          type: string
      responses:
        '200':
          description: Schedule overrides were successfully retrieved.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PosScheduleOverrides'
              example:
                merchant_id: merchant_id_123
                item_overrides:
                - merchant_id: merchant_id_123
                  item_id: item_id_1
                  external_id: external_item_id_1
                  intervals:
                  - start: '2023-07-18T12:00:00Z'
                    end: '2023-07-18T15:00:00Z'
                    show_or_hide: SHOW
                  - start: '2023-07-19T10:00:00Z'
                    end: '2023-07-19T13:00:00Z'
                    show_or_hide: HIDE
                - merchant_id: merchant_id_123
                  item_id: item_id_2
                  external_id: external_item_id_2
                  intervals:
                  - start: '2023-07-18T14:00:00Z'
                    end: '2023-07-18T17:00:00Z'
                    show_or_hide: HIDE
                modifier_overrides:
                - merchant_id: merchant_id_123
                  modifier_id: modifier_id_1
                  external_id: external_modifier_id_1
                  intervals:
                  - start: '2023-07-18T12:00:00Z'
                    end: '2023-07-18T15:00:00Z'
                    show_or_hide: SHOW
        '404':
          description: Schedule Override(s) do not exist.
    patch:
      tags:
      - Endpoints
      summary: Bulk menu item schedule override operation by Grubhub internal IDs
      description: Bulk add or update the menu schedule overrides by Grubhub ID. Used to '86' a list of entities
        (items / modifiers).
      operationId: bulkAddOrUpdateSchedulesOverridesByInternalIds
      parameters:
      - name: merchant_id
        in: path
        description: The Grubhub or third-party provided external ID for the merchant.
        required: true
        explode: false
        schema:
          type: string
      - name: allow_partial_success
        in: query
        description: Should existing overrides be applied to the updated menu.Should only be "true" if overrides
          currently exist and the present and updated menu share the same set of items and modifiers.
        required: true
        explode: true
        schema:
          type: boolean
          default: false
      requestBody:
        description: A list of PosScheduleOverrideBulkRequests, each containing a list of Grubhub internal entity
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/PosScheduleOverrideBulkRequest'
            example:
            - entity_ids:
              - entity_id1
              - entity_id2
              schedule_override:
                op: ADD
                start: '2023-07-20T12:00:00.000Z'
                end: '9999-12-31T23:59:00.000Z'
                show_or_hide: SHOW
            - entity_ids:
              - entity_id3
              - entity_id4
              schedule_override:
                op: UPDATE
                cur_end_date: '2023-07-20T12:00:00.000Z'
                start: '2023-07-20T12:00:00.000Z'
                end: '2023-12-31T23:59:00.000Z'
                show_or_hide: HIDE
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PosScheduleOverrideMultiOperationResult'
              example:
                status: QUEUED
                message: Menu entity schedule override operation is queued.
                entity_ids:
                - entity_id_1
                - entity_id_2
                job_id: b3332f8b-64c6-4a46-89c2-3c27c27e8edf
  /pos/v1/merchant/{merchant_id}/menu/entities/tags/alcohol:
    patch:
      tags:
      - Endpoints
      summary: Mark items/modifiers as alcoholic
      description: Mark a merchant's specific items/modifiers with an 'ALCOHOL' classification tag.
      operationId: tagProductsAsAlcoholic
      parameters:
      - name: merchant_id
        in: path
        description: The short Grubhub ID for the merchant. Corresponds to a single location.
        required: true
        explode: false
        schema:
          type: string
      requestBody:
        description: Request payload for tagging products as alcoholic.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TagProductsRequest'
            example:
              external_ids:
              - item-1
              - item-2
        required: true
      responses:
        '202':
          description: Successfully started the operation for tagging items/modifiers as alcoholic.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PosSupplementalTagMultiOperationResult'
  /pos/v1/merchant/{merchant_id}/menu/schedules/overrides/{job_id}/status:
    get:
      tags:
      - Endpoints
      summary: Get bulk schedule override job status
      description: Returns the status of the bulk schedule override job.
      operationId: getBulkScheduleOverrideStatus
      parameters:
      - name: merchant_id
        in: path
        description: The Grubhub ID for the merchant OR the Partner merchant ID. This ID is not validated.
        required: true
        explode: false
        schema:
          type: string
      - name: job_id
        in: path
        description: The bulk schedule override unique job identifier.
        required: true
        explode: false
        schema:
          type: string
          format: uuid
      responses:
        '422':
          description: Unprocessable Entity
        '200':
          description: Job status was successfully retrieved.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PosBulkScheduleOverrideStatus'
              example:
                job_id: e72d57a9-41c8-4a60-8f0b-fd42b396f11d
                processing_complete: true
                status: SUCCESSFUL
                reason: Bulk schedule override completed successfully.
                entity_override_results:
                - entity_index: 0
                  entity_id: entity_id_1
                  status: SUCCESSFUL
                  details: Entity override successful.
                - entity_index: 1
                  entity_id: entity_id_2
                  status: SUCCESSFUL
                  details: Entity override successful.
                merchant_id: merchant_id_123
        '404':
          description: Job does not exist.
  /pos/v1/merchant/{merchant_id}/menu/normalized:
    get:
      tags:
      - Endpoints
      summary: Retrieve a normalized menu for a given merchant ID
      description: Returns the current menu as a PosNormalizedMenu object, which can be edited and ingested to update
        a merchant's or group of merchants' menu. You can edit the response payload and use it to update menus with
        the primary menu ingestion endpoint.
      operationId: findNormalizedMenu
      parameters:
      - name: merchant_id
        in: path
        description: The short Grubhub ID for the merchant. Corresponds to a single location.
        required: true
        explode: false
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PosNormalizedMenu'
              example:
                menu_info:
                  currency: USD
                  sections:
                  - 1_sandwich
                  - 5_drinks
                  header_media: null
                  logo_media: null
                  search_media: null
                tax_rates:
                - external_id: feb124cea788f2d582bd40b188ffce1c
                  name: Tax rate feb124cea788f2d582bd40b188ffce1c
                  rate: 0.06
                - external_id: e737c3b7a4c99675212fd1d50e6d945b
                  name: Tax rate e737c3b7a4c99675212fd1d50e6d945b
                  rate: 0.0525
                - external_id: 1e89f83ca9c996b33fe10a907322c2e0
                  name: Tax rate 1e89f83ca9c996b33fe10a907322c2e0
                  rate: 0.0725
                - external_id: 37d5c0b6b354bc3c790d2696b42756c9
                  name: Tax rate 37d5c0b6b354bc3c790d2696b42756c9
                  rate: 0.08
                repeating_schedules: []
                menu_sections:
                - external_id: 1_sandwich
                  name: Sandwiches
                  internal_name: Sandwiches
                  description: These are delicious!
                  items:
                  - 1_sandwich|100_pbj_sandwich
                  - 1_sandwich|40006_basket_of_breadsticks
                  availability_ranges: []
                  schedule_ids: []
                  availability_override: null
                  media: null
                  tax_category:
                    code: '100020'
                - external_id: 5_drinks
                  name: Drinks
                  internal_name: Drinks
                  description: Great drinks for you enjoy on the go
                  items:
                  - 5_drinks|coffee
                  - 5_drinks|smoothie
                  - 5_drinks|fountain_drink
                  - 5_drinks|san_pellegrino_sparking_natural_mineral_water
                  availability_ranges: []
                  schedule_ids: []
                  availability_override: null
                  media: null
                items:
                - external_id: 1_sandwich|100_pbj_sandwich
                  name: PBJ Sandwich
                  internal_name: PBJ Sandwich
                  description: Delicious Peanut Butter and Jelly Sandwich
                  price: 0.0
                  tax_rate: feb124cea788f2d582bd40b188ffce1c
                  miscellaneous_taxes: []
                  size_prompt: null
                  modifier_prompts:
                  - 1_sandwich|100_pbj_sandwich|uid_opt_pbj_size
                  - 1_sandwich|100_pbj_sandwich|uid_opt_grilled_toppings_large
                  - 1_sandwich|100_pbj_sandwich|spreads_pbj
                  schedule_ids: []
                  tags: []
                  minimum_order_quantity: null
                  maximum_order_quantity: null
                  calorie_content: null
                  media:
                    source_url: https://example.com/348863390-1.jpg
                  metadata: '{"order_ahead_menu_id":48630}'
                  availability_ranges: []
                  allowable_order_types:
                  - standard
                  availability_override: null
                  tax_category:
                    code: '100021'
                - external_id: 1_sandwich|40006_basket_of_breadsticks
                  name: Basket of Breadsticks
                  internal_name: Basket of Breadsticks
                  description: Shareable size of breadsticks
                  price: 3.0
                  tax_rate: feb124cea788f2d582bd40b188ffce1c
                  miscellaneous_taxes: []
                  size_prompt: null
                  modifier_prompts: []
                  schedule_ids: []
                  tags: []
                  minimum_order_quantity: 1
                  maximum_order_quantity: 50
                  calorie_content: null
                  media:
                    source_url: https://dreamdinners.com/theme/dreamdinners/images/recipe/default/745.jpg
                  metadata: '{"order_ahead_menu_id":48630}'
                  availability_ranges: []
                  allowable_order_types:
                  - standard
                  availability_override: null
                - external_id: 5_drinks|coffee
                  name: Coffee
                  internal_name: Coffee
                  description: Delicious coffee
                  price: 4.0
                  tax_rate: feb124cea788f2d582bd40b188ffce1c
                  miscellaneous_taxes: []
                  size_prompt: null
                  modifier_prompts:
                  - 5_drinks|coffee|uid_opt_coffee_size
                  - 5_drinks|coffee|opt_coffee_topping
                  - 5_drinks|coffee|opt_coffee_milk
                  schedule_ids: []
                  tags: []
                  minimum_order_quantity: null
                  maximum_order_quantity: null
                  calorie_content: null
                  media:
                    source_url: https://https://example.com/5473ca2.jpg
                  metadata: '{"order_ahead_menu_id":48630}'
                  availability_ranges: []
                  allowable_order_types:
                  - standard
                  availability_override: null
                - external_id: 5_drinks|smoothie
                  name: Smoothie
                  internal_name: Smoothie
                  description: Delicious smoothie
                  price: 3.0
                  tax_rate: feb124cea788f2d582bd40b188ffce1c
                  miscellaneous_taxes: []
                  size_prompt: null
                  modifier_prompts:
                  - 5_drinks|smoothie|uid_opt_coffee_size
                  - 5_drinks|smoothie|opt_smoothie_topping
                  schedule_ids: []
                  tags: []
                  minimum_order_quantity: null
                  maximum_order_quantity: null
                  calorie_content: null
                  media:
                    source_url: https://example.com/09dc1a2bbb542310071.png
                  metadata: '{"order_ahead_menu_id":48630}'
                  availability_ranges: []
                  allowable_order_types:
                  - standard
                  availability_override: null
                - external_id: 5_drinks|fountain_drink
                  name: Fountain Drink
                  internal_name: Fountain Drink
                  description: Pick your size and soda
                  price: 3.0
                  tax_rate: feb124cea788f2d582bd40b188ffce1c
                  miscellaneous_taxes: []
                  size_prompt: null
                  modifier_prompts:
                  - 5_drinks|fountain_drink|drink_selection
                  schedule_ids: []
                  tags: []
                  minimum_order_quantity: null
                  maximum_order_quantity: null
                  calorie_content: null
                  media:
                    source_url: https://example.com/1231231.png
                  metadata: '{"order_ahead_menu_id":48630}'
                  availability_ranges: []
                  allowable_order_types:
                  - standard
                  availability_override: null
                - external_id: 5_drinks|san_pellegrino_sparking_natural_mineral_water
                  name: San Pellegrino Sparkling Natural Mineral Water
                  internal_name: San Pellegrino Sparkling Natural Mineral Water
                  description: S.Pellegrino is a carbonated natural mineral water rich in minerals.
                  price: 4.0
                  tax_rate: feb124cea788f2d582bd40b188ffce1c
                  miscellaneous_taxes: []
                  size_prompt: null
                  modifier_prompts: []
                  schedule_ids: []
                  tags: []
                  minimum_order_quantity: null
                  maximum_order_quantity: null
                  calorie_content: null
                  media:
                    source_url: https://example.com/12312.jpg
                  metadata: '{"order_ahead_menu_id":48630}'
                  availability_ranges: []
                  allowable_order_types:
                  - standard
                  availability_override: null
                  gtin: 041508802185
                modifier_prompts:
                - external_id: 1_sandwich|100_pbj_sandwich|uid_opt_pbj_size
                  name: Size
                  internal_name: Size
                  modifier_list: 1_sandwich|100_pbj_sandwich|uid_opt_pbj_size|modifier_list
                  default_selection_model:
                    minimum_quantity: 1
                    maximum_quantity: 1
                  modifier_prompt_quantity_settings:
                    minimum_units: 1
                    maximum_units: 1
                  modifier_quantity_settings:
                    1_sandwich|100_pbj_sandwich|uid_opt_pbj_size|10_pbj_small:
                      default_units: 0
                      maximum_units: 1
                      unit_increment: 1
                    1_sandwich|100_pbj_sandwich|uid_opt_pbj_size|30_pbj_large:
                      default_units: 0
                      maximum_units: 1
                      unit_increment: 1
                    1_sandwich|100_pbj_sandwich|uid_opt_pbj_size|20_pbj_medium:
                      default_units: 0
                      maximum_units: 1
                      unit_increment: 1
                  defaulted_modifiers: []
                  modifier_prompt_free_settings: null
                - external_id: 1_sandwich|100_pbj_sandwich|uid_opt_grilled_toppings_large|10_cheese_opt_grilled_toppings_large|cheese_type
                  name: Type of Cheese
                  internal_name: Type of Cheese
                  modifier_list: 1_sandwich|100_pbj_sandwich|uid_opt_grilled_toppings_large|10_cheese_opt_grilled_toppings_large|cheese_type|modifier_list
                  default_selection_model:
                    minimum_quantity: 1
                    maximum_quantity: 1
                  modifier_prompt_quantity_settings:
                    minimum_units: 1
                    maximum_units: 1
                  modifier_quantity_settings:
                    1_sandwich|100_pbj_sandwich|uid_opt_grilled_toppings_large|10_cheese_opt_grilled_toppings_large|cheese_type|cheese_cheddar:
                      default_units: 1
                      maximum_units: 1
                      unit_increment: 1
                    ? 1_sandwich|100_pbj_sandwich|uid_opt_grilled_toppings_large|10_cheese_opt_grilled_toppings_large|cheese_type|cheese_american
                    : default_units: 0
                      maximum_units: 1
                      unit_increment: 1
                    ? 1_sandwich|100_pbj_sandwich|uid_opt_grilled_toppings_large|10_cheese_opt_grilled_toppings_large|cheese_type|cheese_provolone
                    : default_units: 0
                      maximum_units: 1
                      unit_increment: 1
                  de

# --- truncated at 32 KB (134 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/grubhub/refs/heads/main/openapi/grubhub-menu-openapi.yml