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
| Parameter | Location | Type | Required | Description |
|---|---|---|---|---|
external_brand_id | query string | string | Optional | Your external brand identifier as configured in Yumbi |
Request Headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | Bearer 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
| Field | Type | Required | Description |
|---|---|---|---|
menus | array | Yes | Top-level menu definitions with service availability windows |
categories | array | Yes | Groupings of items (e.g. "Burgers", "Drinks") |
items | array | Yes | Individual menu items with pricing and tax info |
modifier_groups | array | Yes | Option groups for items (e.g. toppings, sizes). Can be an empty array [] if not needed |
display_options | object | Yes | Display settings. Set disable_item_instructions to control whether customers can add special instructions |
Menu Object
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique menu identifier |
title | object | Yes | Menu name (see Translations below) |
category_ids | array | Yes | Array of category id strings in this menu |
service_availability | array | Yes | When this menu is available (see below) |
Category Object
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique category identifier |
title | object | Yes | Category name (see Translations below) |
entities | array | Yes | Items in this category (see below) |
Each entity in entities:
| Field | Type | Required | Description |
|---|---|---|---|
type | string | Yes | Must be "ITEM" |
id | string | Yes | References an item id |
Item Object
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique item identifier |
title | object | Yes | Item name (see Translations below) |
description | object | No | Item description (see Translations below) |
price_info | object | Yes | Pricing — { "price": 8999 } |
tax_info | object | Yes | Tax rate — { "tax_rate": 0.15 } |
modifier_group_ids | object | No | Linked modifier groups — { "ids": ["mod-1"] } |
quantity_info | object | No | Min/max quantity constraints |
external_data | string | No | External reference metadata |
Modifier Group Object
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique modifier group identifier |
title | object | Yes | Group name (see Translations below) |
quantity_info | object | Yes | Selection constraints (min/max permitted) |
modifier_options | array | Yes | Available options within this group |
external_data | string | No | External reference metadata |
Each modifier_option follows the same structure as an Item (id, title, price_info, tax_info).
Service Availability
| Field | Type | Required | Description |
|---|---|---|---|
day_of_week | string | Yes | Lowercase day name: "monday", "tuesday", ..., "sunday" |
time_periods | array | Yes | Array 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.jsonResponses
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": {}
}Updated 22 days ago
