Add curated v2 menu example payload pack and Postman samples
This commit is contained in:
parent
519f2f7169
commit
64f214f3ae
29
docs/developer-portal/05-menu-example-payloads.md
Normal file
29
docs/developer-portal/05-menu-example-payloads.md
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# 05 Menu Example Payloads (v2)
|
||||||
|
|
||||||
|
These files are curated from the Uber v2 menu examples you shared, cleaned into valid JSON and ready for direct use in this wrapper.
|
||||||
|
|
||||||
|
Use with:
|
||||||
|
|
||||||
|
- Upload menu: `PUT /api/v1/uber/menu/replace`
|
||||||
|
- Update one item (sparse): `POST /api/v1/uber/menu/items`
|
||||||
|
|
||||||
|
## Files
|
||||||
|
|
||||||
|
- `docs/examples/menus/v2/empty-menu.json`
|
||||||
|
- Empty menu payload (can clear existing menu)
|
||||||
|
- `docs/examples/menus/v2/simple-menu.json`
|
||||||
|
- Simple menu with categories, items, and modifier groups
|
||||||
|
- `docs/examples/menus/v2/fulfillment-delivery-menu.json`
|
||||||
|
- Delivery-specific menu (`menu_type = MENU_TYPE_FULFILLMENT_DELIVERY`)
|
||||||
|
- `docs/examples/menus/v2/fulfillment-pickup-menu.json`
|
||||||
|
- Pickup-specific menu (`menu_type = MENU_TYPE_FULFILLMENT_PICK_UP`)
|
||||||
|
- `docs/examples/menus/v2/combo-bundled-items.json`
|
||||||
|
- Combo example with `bundled_items` + `core_price`
|
||||||
|
- `docs/examples/menus/v2/update-item-sparse.json`
|
||||||
|
- Sparse item update for `POST /v2/eats/stores/{store_id}/menus/items/{item_id}`
|
||||||
|
|
||||||
|
## Practical Notes
|
||||||
|
|
||||||
|
- For split fulfillment menus, upload `DELIVERY` first; after split, manage each menu type separately.
|
||||||
|
- Keep item IDs stable and avoid problematic characters like `/` and `;`.
|
||||||
|
- `alcoholic_items > 0` behaves as sticky in Uber and cannot be reverted by normal API update.
|
||||||
@ -20,6 +20,9 @@ Source checked: Uber Eats "Menu Integration" section shared by you.
|
|||||||
- aligned to upstream `POST /v2/eats/stores/{store_id}/menus/items/{item_id}`
|
- aligned to upstream `POST /v2/eats/stores/{store_id}/menus/items/{item_id}`
|
||||||
- request body is sparse update (only provided fields are changed)
|
- request body is sparse update (only provided fields are changed)
|
||||||
- supports `menu_type` enum for split delivery/pickup/dine-in menus
|
- supports `menu_type` enum for split delivery/pickup/dine-in menus
|
||||||
|
- Example payload pack:
|
||||||
|
- Added curated v2 JSON examples under `docs/examples/menus/v2/`
|
||||||
|
- Added index doc `docs/developer-portal/05-menu-example-payloads.md`
|
||||||
|
|
||||||
## Existing Before
|
## Existing Before
|
||||||
|
|
||||||
|
|||||||
@ -43,3 +43,8 @@ Best-practice note:
|
|||||||
|
|
||||||
- Use API-managed menus only for integrated stores (avoid manual Menu Maker edits to prevent drift).
|
- Use API-managed menus only for integrated stores (avoid manual Menu Maker edits to prevent drift).
|
||||||
- Alcoholic item flag is effectively sticky in Uber (`alcoholic_items > 0` cannot be reverted by API update).
|
- Alcoholic item flag is effectively sticky in Uber (`alcoholic_items > 0` cannot be reverted by API update).
|
||||||
|
|
||||||
|
Example payload pack:
|
||||||
|
|
||||||
|
- See [05-menu-example-payloads.md](./05-menu-example-payloads.md)
|
||||||
|
- JSON payloads are in `docs/examples/menus/v2/`
|
||||||
|
|||||||
52
docs/examples/menus/v2/combo-bundled-items.json
Normal file
52
docs/examples/menus/v2/combo-bundled-items.json
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
{
|
||||||
|
"menus": [
|
||||||
|
{
|
||||||
|
"id": "Menu",
|
||||||
|
"title": { "translations": { "en_us": "Menu" } },
|
||||||
|
"service_availability": [
|
||||||
|
{ "day_of_week": "monday", "time_periods": [{ "start_time": "00:00", "end_time": "23:59" }] }
|
||||||
|
],
|
||||||
|
"category_ids": ["Mains"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
{
|
||||||
|
"id": "Mains",
|
||||||
|
"title": { "translations": { "en_us": "Mains" } },
|
||||||
|
"entities": [
|
||||||
|
{ "type": "ITEM", "id": "Burger_Combo" },
|
||||||
|
{ "type": "ITEM", "id": "Best_Fries" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"id": "Burger_Combo",
|
||||||
|
"title": { "translations": { "en_us": "Best Burger Combo" } },
|
||||||
|
"price_info": { "price": 900, "overrides": [] },
|
||||||
|
"modifier_group_ids": { "ids": ["Select-Drink"] },
|
||||||
|
"bundled_items": [
|
||||||
|
{ "item_id": "Best_Fries", "core_price": 300, "included_quantity": 1 }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Best_Fries",
|
||||||
|
"title": { "translations": { "en_us": "Best Fries" } },
|
||||||
|
"price_info": { "price": 300, "overrides": [] }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Root_Beer",
|
||||||
|
"title": { "translations": { "en_us": "Root Beer" } },
|
||||||
|
"price_info": { "price": 0, "core_price": 200, "overrides": [] }
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"modifier_groups": [
|
||||||
|
{
|
||||||
|
"id": "Select-Drink",
|
||||||
|
"title": { "translations": { "en_us": "Select Drink" } },
|
||||||
|
"quantity_info": { "quantity": { "max_permitted": 1 } },
|
||||||
|
"modifier_options": [{ "type": "ITEM", "id": "Root_Beer" }]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"display_options": {}
|
||||||
|
}
|
||||||
22
docs/examples/menus/v2/empty-menu.json
Normal file
22
docs/examples/menus/v2/empty-menu.json
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"items": [],
|
||||||
|
"modifier_groups": [],
|
||||||
|
"categories": [],
|
||||||
|
"menus": [
|
||||||
|
{
|
||||||
|
"id": "empty_menu_id",
|
||||||
|
"title": { "translations": { "en_us": "Empty Menu" } },
|
||||||
|
"service_availability": [
|
||||||
|
{ "day_of_week": "monday", "time_periods": [{ "start_time": "00:00", "end_time": "23:59" }] },
|
||||||
|
{ "day_of_week": "tuesday", "time_periods": [{ "start_time": "00:00", "end_time": "23:59" }] },
|
||||||
|
{ "day_of_week": "wednesday", "time_periods": [{ "start_time": "00:00", "end_time": "23:59" }] },
|
||||||
|
{ "day_of_week": "thursday", "time_periods": [{ "start_time": "00:00", "end_time": "23:59" }] },
|
||||||
|
{ "day_of_week": "friday", "time_periods": [{ "start_time": "00:00", "end_time": "23:59" }] },
|
||||||
|
{ "day_of_week": "saturday", "time_periods": [{ "start_time": "00:00", "end_time": "23:59" }] },
|
||||||
|
{ "day_of_week": "sunday", "time_periods": [{ "start_time": "00:00", "end_time": "23:59" }] }
|
||||||
|
],
|
||||||
|
"category_ids": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"display_options": {}
|
||||||
|
}
|
||||||
39
docs/examples/menus/v2/fulfillment-delivery-menu.json
Normal file
39
docs/examples/menus/v2/fulfillment-delivery-menu.json
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
"menu_type": "MENU_TYPE_FULFILLMENT_DELIVERY",
|
||||||
|
"menus": [
|
||||||
|
{
|
||||||
|
"id": "Special",
|
||||||
|
"title": { "translations": { "en_us": "Specials" } },
|
||||||
|
"service_availability": [
|
||||||
|
{ "day_of_week": "monday", "time_periods": [{ "start_time": "00:00", "end_time": "23:59" }] }
|
||||||
|
],
|
||||||
|
"category_ids": ["Specials"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
{
|
||||||
|
"id": "Specials",
|
||||||
|
"title": { "translations": { "en_us": "Specials" } },
|
||||||
|
"entities": [
|
||||||
|
{ "type": "ITEM", "id": "Best_Burger_Delivery" },
|
||||||
|
{ "type": "ITEM", "id": "Best_Fries" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"id": "Best_Burger_Delivery",
|
||||||
|
"title": { "translations": { "en_us": "Best Burger" } },
|
||||||
|
"price_info": { "price": 900 },
|
||||||
|
"tax_info": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Best_Fries",
|
||||||
|
"title": { "translations": { "en_us": "Best Fries" } },
|
||||||
|
"price_info": { "price": 300 },
|
||||||
|
"tax_info": {}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"modifier_groups": [],
|
||||||
|
"display_options": {}
|
||||||
|
}
|
||||||
39
docs/examples/menus/v2/fulfillment-pickup-menu.json
Normal file
39
docs/examples/menus/v2/fulfillment-pickup-menu.json
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
"menu_type": "MENU_TYPE_FULFILLMENT_PICK_UP",
|
||||||
|
"menus": [
|
||||||
|
{
|
||||||
|
"id": "Special",
|
||||||
|
"title": { "translations": { "en_us": "Specials" } },
|
||||||
|
"service_availability": [
|
||||||
|
{ "day_of_week": "monday", "time_periods": [{ "start_time": "00:00", "end_time": "23:59" }] }
|
||||||
|
],
|
||||||
|
"category_ids": ["Specials"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
{
|
||||||
|
"id": "Specials",
|
||||||
|
"title": { "translations": { "en_us": "Specials" } },
|
||||||
|
"entities": [
|
||||||
|
{ "type": "ITEM", "id": "Best_Burger_Pickup" },
|
||||||
|
{ "type": "ITEM", "id": "Best_Fries" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"id": "Best_Burger_Pickup",
|
||||||
|
"title": { "translations": { "en_us": "Best Burger + Pop" } },
|
||||||
|
"price_info": { "price": 1100 },
|
||||||
|
"tax_info": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Best_Fries",
|
||||||
|
"title": { "translations": { "en_us": "Best Fries" } },
|
||||||
|
"price_info": { "price": 500 },
|
||||||
|
"tax_info": {}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"modifier_groups": [],
|
||||||
|
"display_options": {}
|
||||||
|
}
|
||||||
92
docs/examples/menus/v2/simple-menu.json
Normal file
92
docs/examples/menus/v2/simple-menu.json
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
{
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"id": "Coffee",
|
||||||
|
"title": { "translations": { "en_us": "Coffee" } },
|
||||||
|
"description": { "translations": { "en_us": "Deliciously roasted beans" } },
|
||||||
|
"modifier_group_ids": { "ids": ["Add-milk", "Add-sugar"] },
|
||||||
|
"price_info": { "price": 300 },
|
||||||
|
"tax_info": { "tax_rate": 8 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Milk",
|
||||||
|
"title": { "translations": { "en_us": "Milk" } },
|
||||||
|
"quantity_info": {
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"context_type": "MODIFIER_GROUP",
|
||||||
|
"context_value": "Add-milk",
|
||||||
|
"quantity": { "max_permitted": 1 }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"price_info": {
|
||||||
|
"price": 0,
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"context_type": "MODIFIER_GROUP",
|
||||||
|
"context_value": "Add-milk",
|
||||||
|
"price": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"tax_info": { "tax_rate": 8 }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Sugar",
|
||||||
|
"title": { "translations": { "en_us": "Sugar" } },
|
||||||
|
"quantity_info": {
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"context_type": "MODIFIER_GROUP",
|
||||||
|
"context_value": "Add-sugar",
|
||||||
|
"quantity": { "max_permitted": 2 }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"price_info": {
|
||||||
|
"price": 2,
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"context_type": "MODIFIER_GROUP",
|
||||||
|
"context_value": "Add-sugar",
|
||||||
|
"price": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"tax_info": { "tax_rate": 8 }
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"modifier_groups": [
|
||||||
|
{
|
||||||
|
"id": "Add-milk",
|
||||||
|
"title": { "translations": { "en_us": "Add milk" } },
|
||||||
|
"quantity_info": { "quantity": { "max_permitted": 1 } },
|
||||||
|
"modifier_options": [{ "type": "ITEM", "id": "Milk" }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "Add-sugar",
|
||||||
|
"title": { "translations": { "en_us": "Add sugar" } },
|
||||||
|
"quantity_info": { "quantity": { "max_permitted": 2 } },
|
||||||
|
"modifier_options": [{ "type": "ITEM", "id": "Sugar" }]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"categories": [
|
||||||
|
{
|
||||||
|
"id": "Drinks",
|
||||||
|
"title": { "translations": { "en_us": "Drinks" } },
|
||||||
|
"entities": [{ "type": "ITEM", "id": "Coffee" }]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"menus": [
|
||||||
|
{
|
||||||
|
"id": "All-day",
|
||||||
|
"title": { "translations": { "en_us": "All day" } },
|
||||||
|
"service_availability": [
|
||||||
|
{ "day_of_week": "monday", "time_periods": [{ "start_time": "00:00", "end_time": "23:59" }] }
|
||||||
|
],
|
||||||
|
"category_ids": ["Drinks"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"display_options": { "disable_item_instructions": true }
|
||||||
|
}
|
||||||
25
docs/examples/menus/v2/update-item-sparse.json
Normal file
25
docs/examples/menus/v2/update-item-sparse.json
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"menu_type": "MENU_TYPE_FULFILLMENT_DELIVERY",
|
||||||
|
"price_info": {
|
||||||
|
"price": 1300,
|
||||||
|
"container_deposit": 100,
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"suspension_info": {
|
||||||
|
"suspension": null,
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"context_type": "MODIFIER_GROUP",
|
||||||
|
"context_value": "size",
|
||||||
|
"suspension": {
|
||||||
|
"suspend_until": 8640000000,
|
||||||
|
"reason": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"product_info": {
|
||||||
|
"target_market": "EU",
|
||||||
|
"gtin": "1354435445"
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -199,6 +199,72 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Upload Simple Menu Example",
|
||||||
|
"request": {
|
||||||
|
"method": "PUT",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "x-api-key",
|
||||||
|
"value": "{{apiKey}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"mode": "raw",
|
||||||
|
"raw": "{\n \"merchantId\": \"{{merchantId}}\",\n \"storeId\": \"{{storeId}}\",\n \"menu\": {\n \"items\": [\n {\n \"id\": \"Coffee\",\n \"title\": { \"translations\": { \"en_us\": \"Coffee\" } },\n \"price_info\": { \"price\": 300 },\n \"tax_info\": { \"tax_rate\": 8 }\n }\n ],\n \"modifier_groups\": [],\n \"categories\": [\n {\n \"id\": \"Drinks\",\n \"title\": { \"translations\": { \"en_us\": \"Drinks\" } },\n \"entities\": [{ \"type\": \"ITEM\", \"id\": \"Coffee\" }]\n }\n ],\n \"menus\": [\n {\n \"id\": \"All-day\",\n \"title\": { \"translations\": { \"en_us\": \"All day\" } },\n \"service_availability\": [\n { \"day_of_week\": \"monday\", \"time_periods\": [{ \"start_time\": \"00:00\", \"end_time\": \"23:59\" }] }\n ],\n \"category_ids\": [\"Drinks\"]\n }\n ],\n \"display_options\": {}\n }\n}"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"raw": "{{baseUrl}}/api/v1/uber/menu/replace",
|
||||||
|
"host": [
|
||||||
|
"{{baseUrl}}"
|
||||||
|
],
|
||||||
|
"path": [
|
||||||
|
"api",
|
||||||
|
"v1",
|
||||||
|
"uber",
|
||||||
|
"menu",
|
||||||
|
"replace"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Upload Empty Menu Example",
|
||||||
|
"request": {
|
||||||
|
"method": "PUT",
|
||||||
|
"header": [
|
||||||
|
{
|
||||||
|
"key": "x-api-key",
|
||||||
|
"value": "{{apiKey}}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "Content-Type",
|
||||||
|
"value": "application/json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"body": {
|
||||||
|
"mode": "raw",
|
||||||
|
"raw": "{\n \"merchantId\": \"{{merchantId}}\",\n \"storeId\": \"{{storeId}}\",\n \"menu\": {\n \"items\": [],\n \"modifier_groups\": [],\n \"categories\": [],\n \"menus\": [\n {\n \"id\": \"empty_menu_id\",\n \"title\": { \"translations\": { \"en_us\": \"Empty Menu\" } },\n \"service_availability\": [\n { \"day_of_week\": \"monday\", \"time_periods\": [{ \"start_time\": \"00:00\", \"end_time\": \"23:59\" }] }\n ],\n \"category_ids\": []\n }\n ],\n \"display_options\": {}\n }\n}"
|
||||||
|
},
|
||||||
|
"url": {
|
||||||
|
"raw": "{{baseUrl}}/api/v1/uber/menu/replace",
|
||||||
|
"host": [
|
||||||
|
"{{baseUrl}}"
|
||||||
|
],
|
||||||
|
"path": [
|
||||||
|
"api",
|
||||||
|
"v1",
|
||||||
|
"uber",
|
||||||
|
"menu",
|
||||||
|
"replace"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Update Item (v2 Sparse)",
|
"name": "Update Item (v2 Sparse)",
|
||||||
"request": {
|
"request": {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user