Posting a Menu

Upload your menu in a standardized format for propagation to ordering platforms


The Menu Integration API allows you to upload your menu in a standardised format. Once received, Yumbi transforms and propagates it to the various connected platforms — including the Yumbi ordering channel. This means you manage your menu in one place and let Yumbi handle distribution.

Endpoint

POST https://integrations.yumbi.com/uber-eats/menu
ParameterLocationTypeRequiredDescription
external_brand_idquery stringstringOptionalYour external brand identifier as configured in Yumbi

Request Headers

HeaderValue
Content-Typeapplication/json
AuthorizationBearer YOUR_ACCESS_TOKEN

Maximum request body size is 10 MB.

Request Body

The request body is a JSON object representing your full menu configuration.

{
  "menus": [
    {
      "id": "menu-1",
      "title": { "translations": { "en": "Main Menu" } },
      "category_ids": ["cat-1"],
      "service_availability": [
        {
          "day_of_week": "monday",
          "time_periods": [
            { "start_time": "09:00", "end_time": "22:00" }
          ]
        },
        {
          "day_of_week": "tuesday",
          "time_periods": [
            { "start_time": "09:00", "end_time": "22:00" }
          ]
        }
      ]
    }
  ],
  "categories": [
    {
      "id": "cat-1",
      "title": { "translations": { "en": "Burgers" } },
      "entities": [
        { "type": "ITEM", "id": "item-1" }
      ]
    }
  ],
  "items": [
    {
      "id": "item-1",
      "title": { "translations": { "en": "Classic Burger" } },
      "description": { "translations": { "en": "Our signature beef patty" } },
      "price_info": { "price": 8999 },
      "tax_info": { "tax_rate": 0.15 },
      "modifier_group_ids": { "ids": ["mod-1"] }
    }
  ],
  "modifier_groups": [
    {
      "id": "mod-1",
      "title": { "translations": { "en": "Extra Toppings" } },
      "quantity_info": {
        "min_permitted": 0,
        "max_permitted": 3
      },
      "modifier_options": [
        {
          "id": "mod-opt-1",
          "title": { "translations": { "en": "Cheese" } },
          "price_info": { "price": 1500 },
          "tax_info": { "tax_rate": 0.15 }
        }
      ]
    }
  ],
  "display_options": {
    "disable_item_instructions": false
  }
}

Menu Structure Reference

Top-Level Fields

FieldTypeRequiredDescription
menusarrayYesTop-level menu definitions with service availability windows
categoriesarrayYesGroupings of items (e.g. "Burgers", "Drinks")
itemsarrayYesIndividual menu items with pricing and tax info
modifier_groupsarrayYesOption groups for items (e.g. toppings, sizes). Can be an empty array [] if not needed
display_optionsobjectYesDisplay settings. Set disable_item_instructions to control whether customers can add special instructions

Menu Object

FieldTypeRequiredDescription
idstringYesUnique menu identifier
titleobjectYesMenu name (see Translations below)
category_idsarrayYesArray of category id strings in this menu
service_availabilityarrayYesWhen this menu is available (see below)

Category Object

FieldTypeRequiredDescription
idstringYesUnique category identifier
titleobjectYesCategory name (see Translations below)
entitiesarrayYesItems in this category (see below)

Each entity in entities:

FieldTypeRequiredDescription
typestringYesMust be "ITEM"
idstringYesReferences an item id

Item Object

FieldTypeRequiredDescription
idstringYesUnique item identifier
titleobjectYesItem name (see Translations below)
descriptionobjectNoItem description (see Translations below)
price_infoobjectYesPricing — { "price": 8999 }
tax_infoobjectYesTax rate — { "tax_rate": 0.15 }
modifier_group_idsobjectNoLinked modifier groups — { "ids": ["mod-1"] }
quantity_infoobjectNoMin/max quantity constraints
external_datastringNoExternal reference metadata

Modifier Group Object

FieldTypeRequiredDescription
idstringYesUnique modifier group identifier
titleobjectYesGroup name (see Translations below)
quantity_infoobjectYesSelection constraints (min/max permitted)
modifier_optionsarrayYesAvailable options within this group
external_datastringNoExternal reference metadata

Each modifier_option follows the same structure as an Item (id, title, price_info, tax_info).

Service Availability

FieldTypeRequiredDescription
day_of_weekstringYesLowercase day name: "monday", "tuesday", ..., "sunday"
time_periodsarrayYesArray of time windows with start_time and end_time in "HH:MM" format

Translations

All text fields use a translations object keyed by locale. At minimum, provide "en" for English:

{
  "translations": {
    "en": "Classic Burger"
  }
}

Pricing

All prices are in the smallest currency unit (e.g. cents). A price of 8999 represents R89.99.

Full Example

# Step 1: Get a token
TOKEN=$(curl -s -X POST https://auth.yumbi.com/oauth2/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=client_credentials&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET" \
  | grep -o '"access_token":"[^"]*"' | cut -d'"' -f4)

# Step 2: Post the menu
curl -X POST "https://integrations.yumbi.com/uber-eats/menu?external_brand_id=your-brand" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  --data-binary @menu.json

Responses

Success (200 OK):

{
  "ok": true
}

Unauthorized (401): Missing, invalid, or expired Bearer token.

{
  "message": "Missing or invalid Authorization header",
  "error": "Unauthorized",
  "statusCode": 401
}

Error (4xx/5xx): If the menu fails processing downstream, the response will include an error message and details.

{
  "error": "Description of what went wrong",
  "details": {}
}