Place order for Curbside
This guide will show you how to develop a flow that enables your customers to place an order for Curbside pickup (see Order Types for more information).
Before proceeding, you should have implemented:
Curbside orders make getting takeaway super convenient – customers can pick up their orders without even stepping out of their car. The customers can order online and select the desired pickup time. The customer share their vehicle details to help the store staff easily locate them in the curbside lot. When they arrive at the curbside, they simply tap the [I'm here] button in their app to let the store staff know. The store staff then brings the order right to their vehicle. (See Curbside Order Workflow).
Get Singular Point
Singular Points are physical or virtual destinations, connected to Areas, that orders are placed to.
In order to retrieve the Singular Point UUID specific to the Curbside order, the Venue needs to be retrieved.
We can make a call to /venues/{venue_uuid} in order to get all details of the Venue, including its Areas:
Request
{
"method": "get",
"url": "https://api-public-playground.menu.app/api/venues/{venue_uuid}",
"headers": {
"X-Request-ID": "69da3547-204b-4093-a225-54e084c24215",
"Application": "f3a90488ffee32c3acb6fcd0ca417cf6",
"Api-Version": 4.38.0
}
}
Response
{
"status": "OK",
"code": 200,
"data": {
"venue": {
"id": "a9d6d0c8-1689-4114-b1ec-6da9c33f0384",
"uuid": "a9d6d0c8-1689-4114-b1ec-6da9c33f0384",
"name": "Kauwela San Francisco 5",
"code": "3342",
"currency_id": "692f600e-3e2a-4c43-9bed-66e5a23473bc",
"language_id": 1,
"external_dlc_id": null,
"brand_id": "de3a0527-7e4c-4888-91de-71b6d29efa74",
"timezone": {
"name": "America/Los_Angeles",
"offset": "-07:00"
},
"description": "",
"kiosk_receipt_footer": "",
"imprint": "",
"welcome_message": "welcome_message welcome_messagewelcome_message",
"translations": {
"description": "",
"kiosk_receipt_footer": null,
"welcome_message": "welcome_message welcome_messagewelcome_message"
},
"address": "798 Brannan St",
"state": 1,
"city": "San Francisco",
"zip": "94103",
"latitude": 37.7737509,
"longitude": -122.4135012,
"tax_number": "123XYZ234",
"phone": "134829481",
"price_configuration": {
"order_types": [
{
"type_id": 1,
"price_configuration": null
},
{
"type_id": 4,
"price_configuration": null
},
{
"type_id": 6,
"price_configuration": null
},
{
"type_id": 7,
"price_configuration": 3
},
{
"type_id": 8,
"price_configuration": null
},
{
"type_id": 9,
"price_configuration": null
}
],
"external_channels": []
},
"used_price_configurations": [
3
],
"cuisine": "",
"store_url": "",
"is_shown_in_directory": true,
"allow_item_comments": false,
"tip_default": 5,
"tip_max": 15,
"service_charge": 0,
"pickup_time": 5,
"is_pickup_on_open_allowed": false,
"calculation_method": "exclusive",
"image": {
"thumbnail_small": "https://s3.eu-central-1.amazonaws.com/api.playground/images/venue_images/_thumbs280/2023-07-27/5ffd72acf623047511e49a2f91e19a55.jpeg",
"thumbnail_medium": "https://s3.eu-central-1.amazonaws.com/api.playground/images/venue_images/_thumbs720/2023-07-27/5ffd72acf623047511e49a2f91e19a55.jpeg",
"fullsize": "https://s3.eu-central-1.amazonaws.com/api.playground/images/venue_images/2023-07-27/5ffd72acf623047511e49a2f91e19a55.jpeg"
},
"available_payment_methods": [
{
"payment_method_id": "e3423d4d-7200-4c16-a154-a51fb2695838",
"payment_method_type_id": 1,
"payment_method_brand": "Visa",
"payment_processor_type_id": 32,
"payment_processor_id": "5bab16ce-bb27-4e62-aff4-124266647eaf",
"properties": null,
"fraud_detection_processor_id": null,
"visibility_scopes": null
},
{
"payment_method_id": "ea1ac590-b980-4d79-9376-9411fae5ff11",
"payment_method_type_id": 1,
"payment_method_brand": "MasterCard",
"payment_processor_type_id": 32,
"payment_processor_id": "5bab16ce-bb27-4e62-aff4-124266647eaf",
"properties": null,
"fraud_detection_processor_id": null,
"visibility_scopes": null
},
{
"payment_method_id": "8f78d853-2ad1-4371-9a47-68ca18f291cf",
"payment_method_type_id": 1,
"payment_method_brand": "Amex",
"payment_processor_type_id": 32,
"payment_processor_id": "5bab16ce-bb27-4e62-aff4-124266647eaf",
"properties": null,
"fraud_detection_processor_id": null,
"visibility_scopes": null
},
{
"payment_method_id": "e7ac7117-13ba-4da3-a7f2-142cba95eb48",
"payment_method_type_id": 1,
"payment_method_brand": "Diners Club",
"payment_processor_type_id": 32,
"payment_processor_id": "5bab16ce-bb27-4e62-aff4-124266647eaf",
"properties": null,
"fraud_detection_processor_id": null,
"visibility_scopes": null
}
],
"country": {
"id": "5123365b-2d43-45bf-8418-21dcacc595ef",
"currency_id": "692f600e-3e2a-4c43-9bed-66e5a23473bc",
"name": "American Samoa",
"code": "AS",
"code_alpha3": "ASM",
"code_numeric": "016",
"calling_code": "+1-684",
"distance_unit": "km",
"is_address_number_first": false,
"currency_settings": {
"currency_space": true,
"decimal_separator": ".",
"thousands_separator": ",",
"symbol_position": "left"
},
"supported_travel_modes": [
"driving"
],
"available_payment_methods": []
},
"currency": {
"id": "692f600e-3e2a-4c43-9bed-66e5a23473bc",
"code": "EUR",
"code_numeric": "978",
"symbol": "€",
"rounding_unit": 0.01,
"rounding_unit_tip": 0.01
},
"order_types": [
{
"id": "81035813-b64f-4776-8a6c-ef00043aff05",
"type_id": 1,
"reference_type": "OrderTypeDineIn",
"state": 1,
"is_table_supported": true,
"external_channel_only": false,
"tip_default": 0,
"tip_max": 0
},
{
"id": "aaa1ae2f-6bbf-4547-b722-61375cf1f835",
"type_id": 4,
"reference_type": "OrderTypePreorder",
"state": 1,
"is_table_supported": false,
"external_channel_only": false,
"tip_default": 0,
"tip_max": 0
},
{
"id": "b3265e27-eef5-425d-8f21-0f9780ff6236",
"type_id": 6,
"reference_type": "OrderTypeTakeOut",
"state": 1,
"is_table_supported": false,
"external_channel_only": false,
"tip_default": 5,
"tip_max": 15
},
{
"id": "3ca0c042-4a89-43fa-b197-7820a2818782",
"type_id": 7,
"reference_type": "OrderTypeDelivery",
"state": 1,
"is_table_supported": false,
"external_channel_only": false,
"tip_default": 0,
"tip_max": 0
},
{
"id": "5514ba04-70d9-47f8-826d-7c22deff741a",
"type_id": 8,
"reference_type": "OrderTypeCurbside",
"state": 1,
"is_table_supported": false,
"external_channel_only": false,
"tip_default": 5,
"tip_max": 15
},
{
"id": "a20372c5-d989-4d20-b64c-141f558f499e",
"type_id": 9,
"reference_type": "OrderTypeFoodspot",
"state": 1,
"is_table_supported": false,
"external_channel_only": false,
"tip_default": 0,
"tip_max": 0
}
],
"temporary_updated_entities": [],
"serving_times": [
{
"id": "219f26ca-2ccc-4433-b099-dcb4147cc512",
"type_id": 2,
"reference_type": "WeekDays",
"time_from": "06:30",
"time_to": "23:00",
"delivery_at": null,
"days": [
1,
2,
3,
4,
5
]
},
{
"id": "60931918-f682-4e4a-a9db-65ae8d3d9d1f",
"type_id": 1,
"reference_type": "SpecialDays",
"time_from": null,
"time_to": null,
"delivery_at": null,
"date": "2023-08-31",
"date_to": "2023-08-31",
"working": false
},
{
"id": "4adfb91d-19a0-4313-8b42-86c96b3a737e",
"type_id": 1,
"reference_type": "SpecialDays",
"time_from": "08:00",
"time_to": "13:00",
"delivery_at": null,
"date": "2023-09-01",
"date_to": "2023-09-05",
"working": true
}
],
"is_open": false,
"will_open": false,
"has_discounts": true,
"has_loyalty": true,
"has_promotions": true,
"has_delivery_integration": false,
"delivery_integration_properties": null,
"delivery_travel_type": "driving",
"is_calculated_delivery_buffer_used": false,
"is_monitoring_enabled": false,
"is_threeds_enabled": false,
"is_fraud_detection_enabled": false,
"is_smart_orders_enabled": false,
"use_pos_order_number": false,
"has_uc_capacity_management": false,
"kiosk_face_count": null,
"is_order_regret_enabled": false,
"is_billable": true,
"default_delivery_buffer": 20,
"integration": {
"id": "361cc1a1-ca5d-451c-a893-3963c2efd0d7",
"type_id": 1,
"reference_type": "Plain",
"is_windows_pos": false,
"pos_modifier_group_type": 1,
"support_combo_meals": false,
"max_comment_limit": 0,
"allow_multiple_days_in_advance": true
},
"created_at": "2023-07-24 13:54:56",
"updated_at": "2023-08-05 22:34:33",
"areas": [
{
"id": "41d2dcf0-5e59-4204-b28d-67f03fcd4d91",
"type_id": 4,
"reference_type": "AreaTakeOut",
"menu_id": "899129db-5b88-4c95-8fe2-972e6faec523",
"singular_point_id": "db2f3288-63f4-4939-81f6-d0351bce9c70",
"pos_id": null,
"name": "takeout",
"use_tablet": true,
"state": 1,
"is_table_supported": 0,
"properties": {
"location_type": "table"
},
"order_types": [
{
"id": "b3265e27-eef5-425d-8f21-0f9780ff6236",
"type_id": 6,
"reference_type": "OrderTypeTakeOut",
"state": 1,
"is_table_supported": null,
"external_channel_only": false,
"tip_default": 5,
"tip_max": 15
}
],
"table_pos_id": null,
"tablet": {
"id": "fdca7af8-1650-48dd-9481-df8059f33517",
"name": "SF tablet",
"use_notifications": 0,
"show_kiosk_orders": false,
"kiosk_notification_type": 0,
"middleware_endpoint": null,
"pls_name": null,
"state": 3,
"is_online": false,
"last_request_at": null,
"failure_reported": false,
"is_critical": false,
"area_ids": [
"41d2dcf0-5e59-4204-b28d-67f03fcd4d91",
"b39d789b-ecad-455a-a8d2-ad5bfa4e43d0",
"c2e6402c-518f-4d54-8830-6d818b25b608",
"2b7a5795-965a-4258-9f0d-8c9a987d0e26",
"181cbf5d-580c-4fb5-8391-79e850715872"
],
"allow_disable_product": false
}
},
{
"id": "b39d789b-ecad-455a-a8d2-ad5bfa4e43d0",
"type_id": 6,
"reference_type": "AreaCurbside",
"menu_id": "899129db-5b88-4c95-8fe2-972e6faec523",
"singular_point_id": "661f5619-9495-4df0-94f0-a1e3dd552e99",
"pos_id": null,
"name": "curbside",
"use_tablet": true,
"state": 1,
"is_table_supported": 0,
"properties": null,
"order_types": [
{
"id": "5514ba04-70d9-47f8-826d-7c22deff741a",
"type_id": 8,
"reference_type": "OrderTypeCurbside",
"state": 1,
"is_table_supported": null,
"external_channel_only": false,
"tip_default": 5,
"tip_max": 15
}
],
"table_pos_id": null,
"tablet": {
"id": "fdca7af8-1650-48dd-9481-df8059f33517",
"name": "SF tablet",
"use_notifications": 0,
"show_kiosk_orders": false,
"kiosk_notification_type": 0,
"middleware_endpoint": null,
"pls_name": null,
"state": 3,
"is_online": false,
"last_request_at": null,
"failure_reported": false,
"is_critical": false,
"area_ids": [
"41d2dcf0-5e59-4204-b28d-67f03fcd4d91",
"b39d789b-ecad-455a-a8d2-ad5bfa4e43d0",
"c2e6402c-518f-4d54-8830-6d818b25b608",
"2b7a5795-965a-4258-9f0d-8c9a987d0e26",
"181cbf5d-580c-4fb5-8391-79e850715872"
],
"allow_disable_product": false
}
},
{
"id": "c2e6402c-518f-4d54-8830-6d818b25b608",
"type_id": 7,
"reference_type": "AreaFoodspot",
"menu_id": "899129db-5b88-4c95-8fe2-972e6faec523",
"singular_point_id": "d24c7292-455f-447c-8434-3d42da923a5d",
"pos_id": null,
"name": "FoodSpot",
"use_tablet": true,
"state": 1,
"is_table_supported": 0,
"properties": null,
"order_types": [
{
"id": "a20372c5-d989-4d20-b64c-141f558f499e",
"type_id": 9,
"reference_type": "OrderTypeFoodspot",
"state": 1,
"is_table_supported": null,
"external_channel_only": false,
"tip_default": 0,
"tip_max": 0
}
],
"table_pos_id": null,
"tablet": {
"id": "fdca7af8-1650-48dd-9481-df8059f33517",
"name": "SF tablet",
"use_notifications": 0,
"show_kiosk_orders": false,
"kiosk_notification_type": 0,
"middleware_endpoint": null,
"pls_name": null,
"state": 3,
"is_online": false,
"last_request_at": null,
"failure_reported": false,
"is_critical": false,
"area_ids": [
"41d2dcf0-5e59-4204-b28d-67f03fcd4d91",
"b39d789b-ecad-455a-a8d2-ad5bfa4e43d0",
"c2e6402c-518f-4d54-8830-6d818b25b608",
"2b7a5795-965a-4258-9f0d-8c9a987d0e26",
"181cbf5d-580c-4fb5-8391-79e850715872"
],
"allow_disable_product": false
}
},
{
"id": "175cff75-3f8f-4908-bde7-74d1f8c6a542",
"type_id": 1,
"reference_type": "AreaFullService",
"menu_id": "899129db-5b88-4c95-8fe2-972e6faec523",
"singular_point_id": "93397e8d-d889-4e6b-8764-fa3ecfbfe8bf",
"pos_id": null,
"name": "Full Service",
"use_tablet": false,
"state": 1,
"is_table_supported": 1,
"properties": {
"location_type": "table"
},
"order_types": [
{
"id": "81035813-b64f-4776-8a6c-ef00043aff05",
"type_id": 1,
"reference_type": "OrderTypeDineIn",
"state": 1,
"is_table_supported": null,
"external_channel_only": false,
"tip_default": 0,
"tip_max": 0
}
],
"singular_point_input_type": "ManualInput"
},
{
"id": "2b7a5795-965a-4258-9f0d-8c9a987d0e26",
"type_id": 3,
"reference_type": "AreaQuickService",
"menu_id": "899129db-5b88-4c95-8fe2-972e6faec523",
"singular_point_id": "a1bb94d6-b4bb-4938-8388-1e63075afe4f",
"pos_id": null,
"name": "Quick Service",
"use_tablet": true,
"state": 1,
"is_table_supported": 0,
"properties": {
"location_type": "table"
},
"order_types": [
{
"id": "aaa1ae2f-6bbf-4547-b722-61375cf1f835",
"type_id": 4,
"reference_type": "OrderTypePreorder",
"state": 1,
"is_table_supported": null,
"external_channel_only": false,
"tip_default": 0,
"tip_max": 0
}
],
"table_pos_id": null,
"tablet": {
"id": "fdca7af8-1650-48dd-9481-df8059f33517",
"name": "SF tablet",
"use_notifications": 0,
"show_kiosk_orders": false,
"kiosk_notification_type": 0,
"middleware_endpoint": null,
"pls_name": null,
"state": 3,
"is_online": false,
"last_request_at": null,
"failure_reported": false,
"is_critical": false,
"area_ids": [
"41d2dcf0-5e59-4204-b28d-67f03fcd4d91",
"b39d789b-ecad-455a-a8d2-ad5bfa4e43d0",
"c2e6402c-518f-4d54-8830-6d818b25b608",
"2b7a5795-965a-4258-9f0d-8c9a987d0e26",
"181cbf5d-580c-4fb5-8391-79e850715872"
],
"allow_disable_product": false
}
},
{
"id": "181cbf5d-580c-4fb5-8391-79e850715872",
"type_id": 5,
"reference_type": "AreaDelivery",
"menu_id": "899129db-5b88-4c95-8fe2-972e6faec523",
"singular_point_id": "63b07572-302f-4c77-ba23-18b048fac9b9",
"pos_id": null,
"name": "Delivery",
"use_tablet": true,
"state": 1,
"is_table_supported": 0,
"properties": null,
"order_types": [
{
"id": "3ca0c042-4a89-43fa-b197-7820a2818782",
"type_id": 7,
"reference_type": "OrderTypeDelivery",
"state": 1,
"is_table_supported": null,
"external_channel_only": false,
"tip_default": 0,
"tip_max": 0
}
],
"delivery_area_maps": [
{
"minimal_order_amount": 2000,
"name": "Zone 1",
"coordinate_polygon": [
[
[
-122.41478866031048,
37.786212408637766
],
[
-122.39770835330202,
37.78153183822485
],
[
-122.40809386661071,
37.75676736819847
],
[
-122.43779128482215,
37.75893883148851
],
[
-122.41478866031048,
37.786212408637766
]
]
],
"radius": null,
"state": 1,
"created_at": "2023-08-05 22:21:54",
"updated_at": "2023-08-05 22:21:54",
"delivery_fee": {
"type_id": 1,
"reference_type": "DeliveryFeeFixed",
"price": 150,
"price_per_unit": 0,
"unit": "kilometer",
"created_at": "2023-08-05 22:21:33",
"updated_at": "2023-08-05 22:21:33"
}
},
{
"minimal_order_amount": null,
"name": "Zone 2",
"coordinate_polygon": [
[
[
-122.464913782376,
37.75547803172418
],
[
-122.43015235354434,
37.74665565298056
],
[
-122.39324515749658,
37.75235638718793
],
[
-122.39556258608592,
37.790757026685185
],
[
-122.40431731631512,
37.79672565261811
],
[
-122.45487159183062,
37.79638653906568
],
[
-122.464913782376,
37.75547803172418
]
],
[
[
-122.43779128482215,
37.75893883148851
],
[
-122.40809386661071,
37.75676736819847
],
[
-122.39770835330202,
37.78153183822485
],
[
-122.41478866031048,
37.786212408637766
],
[
-122.43779128482215,
37.75893883148851
]
]
],
"radius": null,
"state": 1,
"created_at": "2023-08-05 22:21:54",
"updated_at": "2023-08-05 22:21:54",
"delivery_fee": {
"type_id": 2,
"reference_type": "DeliveryFeeDistance",
"price": 0,
"price_per_unit": 200,
"unit": "kilometer",
"created_at": "2023-08-05 22:21:48",
"updated_at": "2023-08-05 22:21:48"
}
}
],
"delivery_times": [
{
"id": "8b644f29-1604-47ac-9623-2e6b0596c9c2",
"type_id": 2,
"reference_type": "WeekDays",
"time_from": "09:30",
"time_to": "21:30",
"delivery_at": null,
"days": [
1,
2,
3,
4,
5
]
},
{
"id": "aa5eac96-99fa-483a-99f2-9c5f2b9a784a",
"type_id": 1,
"reference_type": "SpecialDays",
"time_from": null,
"time_to": null,
"delivery_at": null,
"date": "2023-08-31",
"date_to": "2023-08-31",
"working": false
},
{
"id": "7e328d69-18d8-4f73-8726-39e27d8ef9e2",
"type_id": 1,
"reference_type": "SpecialDays",
"time_from": "04:00",
"time_to": "14:00",
"delivery_at": null,
"date": "2023-09-01",
"date_to": "2023-09-05",
"working": true
}
],
"tablet": {
"id": "fdca7af8-1650-48dd-9481-df8059f33517",
"name": "SF tablet",
"use_notifications": 0,
"show_kiosk_orders": false,
"kiosk_notification_type": 0,
"middleware_endpoint": null,
"pls_name": null,
"state": 3,
"is_online": false,
"last_request_at": null,
"failure_reported": false,
"is_critical": false,
"area_ids": [
"41d2dcf0-5e59-4204-b28d-67f03fcd4d91",
"b39d789b-ecad-455a-a8d2-ad5bfa4e43d0",
"c2e6402c-518f-4d54-8830-6d818b25b608",
"2b7a5795-965a-4258-9f0d-8c9a987d0e26",
"181cbf5d-580c-4fb5-8391-79e850715872"
],
"allow_disable_product": false
}
}
],
"menu_id": "899129db-5b88-4c95-8fe2-972e6faec523",
"days_in_advance": 0,
"payment_processors": [
{
"id": 3288,
"venue_id": 3342,
"payment_method_type_id": 1,
"payment_processor_id": 3866,
"properties": null
}
]
}
}
}
| Attribute | Type | Example Value | Description |
|---|---|---|---|
venue |
Venue resource | Venue resource - see Select a Store for Dine-in or Takeout for more details | |
venues.[i].venue.areas |
array[Area] | See Areas reference | |
venues.[i].venue.areas.type_id |
int | 6 |
Type ID of Area - see Areas reference |
venues.[i].venue.areas.reference_type |
string | AreaCurbside |
Type name of the Area - see Areas reference |
venues.[i].venue.areas.singular_point_id |
int | db2f3288-63f4-4939-81f6-d0351bce9c70 |
Singular Point ID, which will be used for placing the order |
venues.[i].venue.areas.state |
int | 1 |
Current status of Area - refer to States reference |
venues.[i].venue.areas.order_types |
array[OrderType] | Array of OrderTypes that are configured for that Area | |
venues.[i].venue.areas.order_types.[i].type_id |
int | 4 |
Type of Order Types - see Order Types reference |
venues.[i].venue.timezone.name |
string | "America/Los_Angeles" |
Name of timezone for pickup time conversions - see Timezone resource for more details |
From the areas array, we have to identify the Area that is either for the 3 Quick Service or 4 Takeout Area (Area Type ID):
{
"id": "41d2dcf0-5e59-4204-b28d-67f03fcd4d91",
"type_id": 4,
"reference_type": "AreaTakeOut",
"singular_point_id": "db2f3288-63f4-4939-81f6-d0351bce9c70"
}
Make a note of the singular_point_id, since we will need it to place the order.
Pickup Times
Curbside orders can be placed for ASAP or a specific Pickup Time. Pickup Times determine at which time the order will be picked up, including which products will be available at the chosen Pickup Time (e.g. if I am ordering for in the afternoon, I will not be able to order breakfast items).
Using the /orders/pickup-times API call, we can call all available Pickup Times for the current day:
Request
| Attribute | Type | Example Value | Description |
|---|---|---|---|
singular_point_id |
string | "db2f3288-63f4-4939-81f6-d0351bce9c70" |
Singular Point ID from /venues/{venue_uuid} call |
{
"method": "post",
"url": "https://api-public-playground.menu.app/api/orders/pickup-times",
"headers": {
"X-Request-ID": "69da3547-204b-4093-a225-54e084c24215",
"Application": "f3a90488ffee32c3acb6fcd0ca417cf6",
"Api-Version": 4.38.0,
"Content-Type": "application/json"
},
"body": {
"singular_point_id": "db2f3288-63f4-4939-81f6-d0351bce9c70"
}
}
Response
{
"status": "OK",
"code": 200,
"data": {
"pickup_times": [
"2023-08-06 22:00:00",
"2023-08-06 22:05:00",
"2023-08-06 22:10:00",
"2023-08-06 22:15:00",
"2023-08-06 22:20:00",
"2023-08-06 22:25:00",
"2023-08-06 22:30:00",
"2023-08-06 22:35:00",
"2023-08-06 22:40:00",
"2023-08-06 22:45:00",
"2023-08-06 22:50:00",
"2023-08-06 22:55:00",
"2023-08-06 23:00:00",
"2023-08-06 23:05:00",
"2023-08-06 23:10:00",
"2023-08-06 23:15:00",
"2023-08-06 23:20:00",
"2023-08-06 23:25:00",
"2023-08-06 23:30:00",
"2023-08-06 23:35:00",
"2023-08-06 23:40:00",
"2023-08-06 23:45:00",
"2023-08-06 23:50:00",
"2023-08-06 23:55:00",
"2023-08-07 00:00:00",
"2023-08-07 00:05:00",
"2023-08-07 00:10:00",
"2023-08-07 00:15:00",
"2023-08-07 00:20:00",
"2023-08-07 00:25:00",
"2023-08-07 00:30:00",
"2023-08-07 00:35:00",
"2023-08-07 00:40:00",
"2023-08-07 00:45:00",
"2023-08-07 00:50:00",
"2023-08-07 00:55:00",
"2023-08-07 01:00:00",
"2023-08-07 01:05:00",
"2023-08-07 01:10:00",
"2023-08-07 01:15:00",
"2023-08-07 01:20:00",
"2023-08-07 01:25:00",
"2023-08-07 01:30:00",
"2023-08-07 01:35:00",
"2023-08-07 01:40:00",
"2023-08-07 01:45:00",
"2023-08-07 01:50:00",
"2023-08-07 01:55:00",
"2023-08-07 02:00:00",
"2023-08-07 02:05:00",
"2023-08-07 02:10:00",
"2023-08-07 02:15:00",
"2023-08-07 02:20:00",
"2023-08-07 02:25:00",
"2023-08-07 02:30:00",
"2023-08-07 02:35:00",
"2023-08-07 02:40:00",
"2023-08-07 02:45:00",
"2023-08-07 02:50:00",
"2023-08-07 02:55:00",
"2023-08-07 03:00:00",
"2023-08-07 03:05:00",
"2023-08-07 03:10:00",
"2023-08-07 03:15:00",
"2023-08-07 03:20:00",
"2023-08-07 03:25:00",
"2023-08-07 03:30:00",
"2023-08-07 03:35:00",
"2023-08-07 03:40:00",
"2023-08-07 03:45:00",
"2023-08-07 03:50:00",
"2023-08-07 03:55:00",
"2023-08-07 04:00:00",
"2023-08-07 04:05:00",
"2023-08-07 04:10:00",
"2023-08-07 04:15:00",
"2023-08-07 04:20:00",
"2023-08-07 04:25:00",
"2023-08-07 04:30:00",
"2023-08-07 04:35:00",
"2023-08-07 04:40:00",
"2023-08-07 04:45:00",
"2023-08-07 04:50:00",
"2023-08-07 04:55:00",
"2023-08-07 05:00:00",
"2023-08-07 05:05:00",
"2023-08-07 05:10:00",
"2023-08-07 05:15:00",
"2023-08-07 05:20:00",
"2023-08-07 05:25:00",
"2023-08-07 05:30:00",
"2023-08-07 05:35:00",
"2023-08-07 05:40:00",
"2023-08-07 05:45:00",
"2023-08-07 05:50:00",
"2023-08-07 05:55:00",
"2023-08-07 06:00:00",
"2023-08-07 06:05:00",
"2023-08-07 06:10:00",
"2023-08-07 06:15:00",
"2023-08-07 06:20:00",
"2023-08-07 06:25:00",
"2023-08-07 06:30:00",
"2023-08-07 06:35:00",
"2023-08-07 06:40:00",
"2023-08-07 06:45:00",
"2023-08-07 06:50:00",
"2023-08-07 06:55:00",
"2023-08-07 07:00:00",
"2023-08-07 07:05:00",
"2023-08-07 07:10:00",
"2023-08-07 07:15:00",
"2023-08-07 07:20:00",
"2023-08-07 07:25:00",
"2023-08-07 07:30:00",
"2023-08-07 07:35:00",
"2023-08-07 07:40:00",
"2023-08-07 07:45:00",
"2023-08-07 07:50:00",
"2023-08-07 07:55:00",
"2023-08-07 08:00:00",
"2023-08-07 08:05:00",
"2023-08-07 08:10:00",
"2023-08-07 08:15:00",
"2023-08-07 08:20:00",
"2023-08-07 08:25:00",
"2023-08-07 08:30:00",
"2023-08-07 08:35:00",
"2023-08-07 08:40:00",
"2023-08-07 08:45:00",
"2023-08-07 08:50:00",
"2023-08-07 08:55:00",
"2023-08-07 09:00:00",
"2023-08-07 09:05:00",
"2023-08-07 09:10:00",
"2023-08-07 09:15:00",
"2023-08-07 09:20:00",
"2023-08-07 09:25:00",
"2023-08-07 09:30:00",
"2023-08-07 09:35:00",
"2023-08-07 09:40:00",
"2023-08-07 09:45:00",
"2023-08-07 09:50:00",
"2023-08-07 09:55:00",
"2023-08-07 10:00:00",
"2023-08-07 10:05:00",
"2023-08-07 10:10:00",
"2023-08-07 10:15:00",
"2023-08-07 10:20:00",
"2023-08-07 10:25:00",
"2023-08-07 10:30:00",
"2023-08-07 10:35:00",
"2023-08-07 10:40:00",
"2023-08-07 10:45:00",
"2023-08-07 10:50:00",
"2023-08-07 10:55:00",
"2023-08-07 11:00:00",
"2023-08-07 11:05:00",
"2023-08-07 11:10:00",
"2023-08-07 11:15:00",
"2023-08-07 11:20:00",
"2023-08-07 11:25:00",
"2023-08-07 11:30:00",
"2023-08-07 11:35:00",
"2023-08-07 11:40:00",
"2023-08-07 11:45:00",
"2023-08-07 11:50:00",
"2023-08-07 11:55:00",
"2023-08-07 12:00:00",
"2023-08-07 12:05:00",
"2023-08-07 12:10:00",
"2023-08-07 12:15:00",
"2023-08-07 12:20:00",
"2023-08-07 12:25:00",
"2023-08-07 12:30:00",
"2023-08-07 12:35:00",
"2023-08-07 12:40:00",
"2023-08-07 12:45:00",
"2023-08-07 12:50:00",
"2023-08-07 12:55:00",
"2023-08-07 13:00:00",
"2023-08-07 13:05:00",
"2023-08-07 13:10:00",
"2023-08-07 13:15:00",
"2023-08-07 13:20:00",
"2023-08-07 13:25:00",
"2023-08-07 13:30:00",
"2023-08-07 13:35:00",
"2023-08-07 13:40:00",
"2023-08-07 13:45:00",
"2023-08-07 13:50:00",
"2023-08-07 13:55:00",
"2023-08-07 14:00:00",
"2023-08-07 14:05:00",
"2023-08-07 14:10:00",
"2023-08-07 14:15:00",
"2023-08-07 14:20:00",
"2023-08-07 14:25:00",
"2023-08-07 14:30:00",
"2023-08-07 14:35:00",
"2023-08-07 14:40:00",
"2023-08-07 14:45:00",
"2023-08-07 14:50:00",
"2023-08-07 14:55:00",
"2023-08-07 15:00:00",
"2023-08-07 15:05:00",
"2023-08-07 15:10:00",
"2023-08-07 15:15:00",
"2023-08-07 15:20:00",
"2023-08-07 15:25:00",
"2023-08-07 15:30:00",
"2023-08-07 15:35:00",
"2023-08-07 15:40:00",
"2023-08-07 15:45:00",
"2023-08-07 15:50:00",
"2023-08-07 15:55:00",
"2023-08-07 16:00:00",
"2023-08-07 16:05:00",
"2023-08-07 16:10:00",
"2023-08-07 16:15:00",
"2023-08-07 16:20:00",
"2023-08-07 16:25:00",
"2023-08-07 16:30:00",
"2023-08-07 16:35:00",
"2023-08-07 16:40:00",
"2023-08-07 16:45:00",
"2023-08-07 16:50:00",
"2023-08-07 16:55:00",
"2023-08-07 17:00:00",
"2023-08-07 17:05:00",
"2023-08-07 17:10:00",
"2023-08-07 17:15:00",
"2023-08-07 17:20:00",
"2023-08-07 17:25:00",
"2023-08-07 17:30:00",
"2023-08-07 17:35:00",
"2023-08-07 17:40:00",
"2023-08-07 17:45:00",
"2023-08-07 17:50:00",
"2023-08-07 17:55:00",
"2023-08-07 18:00:00",
"2023-08-07 18:05:00",
"2023-08-07 18:10:00",
"2023-08-07 18:15:00",
"2023-08-07 18:20:00",
"2023-08-07 18:25:00",
"2023-08-07 18:30:00",
"2023-08-07 18:35:00",
"2023-08-07 18:40:00",
"2023-08-07 18:45:00",
"2023-08-07 18:50:00",
"2023-08-07 18:55:00",
"2023-08-07 19:00:00",
"2023-08-07 19:05:00",
"2023-08-07 19:10:00",
"2023-08-07 19:15:00",
"2023-08-07 19:20:00",
"2023-08-07 19:25:00",
"2023-08-07 19:30:00",
"2023-08-07 19:35:00",
"2023-08-07 19:40:00",
"2023-08-07 19:45:00",
"2023-08-07 19:50:00",
"2023-08-07 19:55:00",
"2023-08-07 20:00:00",
"2023-08-07 20:05:00",
"2023-08-07 20:10:00",
"2023-08-07 20:15:00",
"2023-08-07 20:20:00",
"2023-08-07 20:25:00",
"2023-08-07 20:30:00",
"2023-08-07 20:35:00",
"2023-08-07 20:40:00",
"2023-08-07 20:45:00",
"2023-08-07 20:50:00",
"2023-08-07 20:55:00",
"2023-08-07 21:00:00",
"2023-08-07 21:05:00",
"2023-08-07 21:10:00",
"2023-08-07 21:15:00",
"2023-08-07 21:20:00",
"2023-08-07 21:25:00",
"2023-08-07 21:30:00",
"2023-08-07 21:35:00",
"2023-08-07 21:40:00",
"2023-08-07 21:45:00"
]
}
}
| Attribute | Type | Example Value | Description |
|---|---|---|---|
pickup_times |
array[string] | ["2023-08-06 22:00:00","2023-08-06 22:05:00]", |
Array of available pickup times (to be presented to customer) - in UTC and needs to be converted to Venue timezone using venue.timezone.name |
Based on the chosen pickup time, you should check the ServingTimes of the subcategories to determine which products will be available for order at the chosen pickup time.
If the customer changes their pickup time after having added products to their cart, it may be that certain products are no longer available for the new pickup time, and you will need to present your customer with an experience showing that certain products are going to be removed from their cart.
Vehicle Details
For signed in customers it is possible to Fetch, Add or Remove previously used vehicles.
For curbside order customer should add their vehicle details to make it easier for the Store staff to find the customer during the Curbside pickup. The POST api/customer-accounts/{customer-accounts-id}/vehicles endpoint allows saving the vehicle details to customer account
Request
| Attribute | Type | Example Value | Description |
|---|---|---|---|
Authorization |
string | "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS1k" |
Authorization is required for the endpoint, JWT Bearer authorization token is sent in the request header |
customer-account-id |
string | "df5701c0-9799-4e30-90da-f2c0b8b196cb" |
Customer account UUID to which the vehicle is being added. This value is sent as query parameter. |
color |
string | "Gray" |
Curbside pickup vehicle color |
brand_and_model |
string | "Fiat Bravo 1.9 MJET" |
Curbside pickup vehicle brand and model name |
license_plate_number |
string | "CA102FX" |
Curbside pickup vehicle plate number |
{
"method": "post",
"url": "https://api-public-playground.menu.app/api/customer-accounts/{customer-accounts-id}/vehicles",
"headers": {
"X-Request-ID": "69da3547-204b-4093-a225-54e084c24215",
"Application": "f3a90488ffee32c3acb6fcd0ca417cf6",
"Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS1kZW1vLm1lbnUuYXBwL2FwaS9jdXN0b21lcnMvcmVmcmVzaCIsImlhdCI6MTY5MzIzNDE2NSwiZXhwIjoxNjkzMjM4NjY0LCJuYmYiOjE2OTMyMzUwNjQsImp0aSI6IjNoNGFuenBEcERrOGcxRzAiLCJzdWIiOiIyNTgzIiwicHJ2IjoiY2MzMjkyMWExNTQ4MGExMTdkOWJiYzcyYzBlMTI1NmE2ODUyNDU4YiIsImFwcGxpY2F0aW9uX2lkIjoxMTIsInNlc3Npb25faWQiOjE1NDk4fQ.AcHKLAR9bKBIGKe1AiWq5I4Cpr6NrxRK5QsJu9A35O0",
"Api-Version": 4.38.0,
"Accept": "appliction/json",
"X-QB-Enabled": "true"
}
,
"body":
{
"color": "Gray",
"brand_and_model": "Fiat Bravo 1.9 MJET",
"license_plate_number": "CA102FX"
}
}
Fetch previously used vehicles details
To fetch previously used vehicles, the endpoint GET api/customer-accounts/{customer-accounts-id}/vehicles should be called:
Request
| Attribute | Type | Example Value | Description |
|---|---|---|---|
Authorization |
string | "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS1k" |
Authorization is required for the endpoint, JWT Bearer authorization token is sent in the request header |
{
"method": "get",
"url": "https://api-public-playground.menu.app/api/customer-accounts/{customer-accounts-id}/vehicles",
"headers": {
"X-Request-ID": "69da3547-204b-4093-a225-54e084c24215",
"Application": "f3a90488ffee32c3acb6fcd0ca417cf6",
"Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2FwaS1kZW1vLm1lbnUuYXBwL2FwaS9jdXN0b21lcnMvcmVmcmVzaCIsImlhdCI6MTY5MzIzNDE2NSwiZXhwIjoxNjkzMjM4NjY0LCJuYmYiOjE2OTMyMzUwNjQsImp0aSI6IjNoNGFuenBEcERrOGcxRzAiLCJzdWIiOiIyNTgzIiwicHJ2IjoiY2MzMjkyMWExNTQ4MGExMTdkOWJiYzcyYzBlMTI1NmE2ODUyNDU4YiIsImFwcGxpY2F0aW9uX2lkIjoxMTIsInNlc3Npb25faWQiOjE1NDk4fQ.AcHKLAR9bKBIGKe1AiWq5I4Cpr6NrxRK5QsJu9A35O0",
"Api-Version": 4.38.0
}
}
Response
{
"code": 200,
"data": [
{
"id": "7dada664-6074-4c3d-ba75-250b142b6913",
"color": "Gray",
"brand_and_model": "Fiat bravo",
"customer_account_id": "69f8ad44-3f23-11ed-936c-1a67b454859d",
"license_plate_number": "CA102FX"
}
],
"status": "OK"
}
Remove previously used vehicles details
To remove the vehicle the endpoint DELETE api/customer-accounts/{customer-accounts-id}/vehicles should be called:
Request
{
"method": "delete",
"url": "https://api-public-playground.menu.app/api/customer-accounts/{customer-accounts-id}/vehicles/{vehicle_id}",
"headers": {
"X-Request-ID": "69da3547-204b-4093-a225-54e084c24215",
"Application": "f3a90488ffee32c3acb6fcd0ca417cf6",
"Authorization": ""
"Api-Version": 4.38.0,
"Accept": "appliction/json",
"X-QB-Enabled": "true"
}
}
Calculate
With every modification to the cart (e.g as the customer is adding, modifying or deleting products) a call to /orders/calculate should be made, in order to calculate the order totals for presentation to the customer:
Request
| Attribute | Type | Example Value | Description |
|---|---|---|---|
singular_point_id |
string | "db2f3288-63f4-4939-81f6-d0351bce9c7"0 |
Singular Point ID from /venues/{venue_uuid} call |
order_type.id |
id | 8 |
Type ID of order type for which order should be placed - see Order Types reference |
menu_items |
array[MenuItem] | Array of Menu Items that are included in the cart | |
menu_items.id |
string | "833c2e35-5066-4b1c-a813-fe5cb349a6aa"", |
Menu Item UUID |
menu_items.quantity |
int | 1 |
Number of the same Menu Items with same price level and modifiers that are in cart |
menu_items.price_level_id |
string | "76efaa5d-b849-4549-9468-72b8131b904a"", |
UUID of Price Level of Menu Item that customer chose |
calculate_accurate_tax |
bool | false |
Defines whether external tax engine (such as POS system) should be used to calculate accurate taxes, or whether a prediction should be returned - should be set to true when proceeding to checkout and be false while the customer is still composing their cart. |
{
"method": "post",
"url": "https://api-public-playground.menu.app/api/orders/calculate",
"headers": {
"X-Request-ID": "69da3547-204b-4093-a225-54e084c24215",
"Application": "f3a90488ffee32c3acb6fcd0ca417cf6",
"Api-Version": 4.38.0,
"Content-Type": "application/json"
},
"body": {
"singular_point_id": "db2f3288-63f4-4939-81f6-d0351bce9c70",
"order_type": {
"id": 8
},
"menu_items": [
{
"id": "833c2e35-5066-4b1c-a813-fe5cb349a6aa",
"quantity": 1,
"price_level_id": "76efaa5d-b849-4549-9468-72b8131b904a"
}
],
"calculate_accurate_tax": false
}
}
Response
{
"status": "OK",
"code": 200,
"data": {
"calculations": {
"calculation_method": "exclusive",
"subtotal": 1200,
"discount": 0,
"subsidy": 0,
"service_charge": 0,
"service_charge_rate": 0,
"service_charge_tax_rate": 0,
"delivery_fee": 0,
"delivery_fee_tax": 0,
"delivery_fee_tax_rate": 0,
"minimum_surcharge": 0,
"minimum_surcharge_tax": 0,
"tip": 0,
"tip_rate": 0,
"total": 1260,
"amount_for_payment": 1260,
"tax": 60,
"tax_exemption": 0,
"tax_rates": {
"5": 60
},
"items": [
{
"id": "833c2e35-5066-4b1c-a813-fe5cb349a6aa",
"type_id": 1,
"price": 1200,
"quantity": 1,
"subtotal": 1200,
"discount": 0,
"total": 1260,
"tax": 60,
"tax_exemption": 0,
"tax_rate": 5,
"tax_rates": {
"5": 60
},
"modifiers": []
}
],
"customer_account_id": null
}
}
}
| Attribute | Type | Example Value | Description |
|---|---|---|---|
calculations.calculation_method |
string | "exclusive" |
Whether the tax is included in the product prices ("inclusive") or taxes are not included in product prices and need to be calculated on top ("exclusive") |
calculations.subtotal |
int | 1200 |
Order subtotal (lowest unit), excluding discounts, taxes and fees |
calculations.total |
int | 1260 |
All-in payable total (lowest unit) of the order, including discounts, taxes and fees |
calculations.tax |
int | 60 |
Total tax amount (lowest unit) of the order - depending on calculation_method is included in subtotal or not |
calculations.tax_rates |
object | {"5": 60} |
Tax amount (lowest unit) by tax percentage - depending on your region / country, a tax breakdown may be required to be shown to your customer |
calculations.items.[i].price |
int | 1200 |
Price (lowest unit) of single unit of Menu Item (excl. modifiers) |
calculations.items.[i].subtotal |
int | 1200 |
Price (lowest unit) of Menu Item based on provided quantity (excl. modifiers) |
calculations.items.[i].total |
int | 2520 |
All-in total (lowest unit) of Menu Item, including discounts, taxes and modifiers |
Calculating Accurate Tax
Prior to proceeding to checkout, you should make another call to /orders/calculate with the calculate_accurate_tax flag set to true. This will ensure you have the most accurate taxes calculated (by tax engine, such as from POS) before payment.
Only request accurate taxes when the customer proceeds to checkout, since API fees may apply (depending on tax engine). Implementations with excessive requests for accurate taxes will not be certified and cannot be promoted to production.
Cross-Selling
Cross-selling enables you to show your customer other items they may be interested in, based on the current cart that they have already configured.
Cross-selling is based on pre-configured cross-sell items and applies an algorithm that automatically excludes cross-sell items of subcategories of which items are already in cart, as well as optimizes for the highest possible variety in cross-sell items. A maximum of 5 cross-sell items are returned.
See here to learn more about how to configure cross-sell items in the Management Center.
Using the /venues/{venue_uuid}/menus/{menu_uuid}/cross-sellings API endpoint you can post the menu items that you already have in cart and receive cross-sell item suggestions:
Request
| Attribute | Type | Example Value | Description |
|---|---|---|---|
order_type.id |
int | 8 |
Type ID of Order Type for which order is being placed - only items that are available for the specified order type will be returned. See Order Types reference for more information |
order_type.pickup_asap |
bool | true |
Whether order is being placed for ASAP or not |
menu_item_ids |
array[string] | ["833c2e35-5066-4b1c-a813-fe5cb349a6aa"] |
Array of Menu Item UUIDs that are already included in the customer's cart |
{
"method": "post",
"url": "https://api-public-playground.menu.app/api/venues/a9d6d0c8-1689-4114-b1ec-6da9c33f0384/menus/899129db-5b88-4c95-8fe2-972e6faec523/cross-sellings",
"headers": {
"X-Request-ID": "69da3547-204b-4093-a225-54e084c24215",
"Application": "f3a90488ffee32c3acb6fcd0ca417cf6",
"Api-Version": 4.38.0,
"Content-Type": "application/json"
},
"body": {
"order_type": {
"id": 8,
"pickup_asap": true
},
"menu_item_ids" : [
"833c2e35-5066-4b1c-a813-fe5cb349a6aa"
]
}
}
Response
{
"status": "OK",
"code": 200,
"data": {
"cross_selling_items": [
{
"id": "dd8fdcd6-d1c0-41ee-8b59-ffb9ccbb7d3d",
"name": "Moringa Bowl",
"description": "Mango, Spinach, Banana, Moringa, Fresh Pineapple",
"internal_name": "",
"printer_id": 0,
"position": 1,
"tax_id": "56f60144-370d-4233-8e61-aee9d5471a3b",
"image": {
"thumbnail_small": "https://s3.eu-central-1.amazonaws.com/api.playground/images/item_images/_thumbs280/2023-07-25/76626b232c1aa12512d5bb15bbade9c3.png",
"thumbnail_medium": "https://s3.eu-central-1.amazonaws.com/api.playground/images/item_images/_thumbs720/2023-07-25/76626b232c1aa12512d5bb15bbade9c3.png",
"fullsize": "https://s3.eu-central-1.amazonaws.com/api.playground/images/item_images/2023-07-25/76626b232c1aa12512d5bb15bbade9c3.png"
},
"translations": {
"name": "Moringa Bowl",
"description": "Mango, Spinach, Banana, Moringa, Fresh Pineapple"
},
"allow_takeout": true,
"is_deliverable": true,
"is_dine_in_allowed": true,
"is_foodspot_allowed": true,
"is_self_serving": false,
"show_in_menu": true,
"state": 1,
"is_visible": true,
"is_visible_in_cms": true,
"is_visible_in_store_group": true,
"is_in_combo": true,
"temporary_disabled_until": null,
"allergens": [],
"food_type": {
"id": "vegetarian",
"translated_name": "Vegetarian"
},
"price_levels": [
{
"id": "b235b704-84d0-4d03-bb7c-acd51c994902",
"name": null,
"price": 750,
"delivery_price": 750,
"price_configuration_2": 750,
"price_configuration_3": 750,
"price_configuration_4": 750,
"price_configuration_5": 750,
"price_configuration_6": 750,
"price_configuration_7": 750,
"pos_id": "",
"state": 1,
"calories": 195,
"is_visible": true,
"translations": {
"name": "",
"description": ""
}
}
],
"modifier_groups": [
{
"id": "b0fb219e-4f72-44f1-b277-7feed29025c5",
"name": "Rice or Salad",
"internal_name": "",
"min_selected": 1,
"max_selected": 1,
"pos_min_selected": 0,
"pos_max_selected": 99,
"pos_id": "",
"pos_name": "",
"state": 1,
"is_visible": true,
"is_visible_in_store_group": true,
"is_visible_in_cms": true,
"type_id": 1,
"reference_type": "CoreGlobalModifierGroup",
"position": 0,
"translations": {
"name": "Rice or Salad"
},
"modifiers": [
{
"id": "31d03cb4-5002-43b1-8951-aaa1824d29d5",
"type_id": 1,
"reference_type": "CoreSimpleModifier",
"name": "No Edamame",
"internal_name": "",
"price": 0,
"delivery_price": 0,
"price_configuration_2": 0,
"price_configuration_3": 0,
"price_configuration_4": 0,
"price_configuration_5": 0,
"price_configuration_6": 0,
"price_configuration_7": 0,
"pos_id": "",
"pos_name": "",
"state": 1,
"is_visible": true,
"is_visible_in_store_group": true,
"is_visible_in_cms": true,
"temporary_disabled_until": null,
"calories": 25,
"allergens": [],
"image": {
"thumbnail_small": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/_thumbs280/2023-07-25/ab3b413f2058c9b639a9ad9da1e704b4.png",
"thumbnail_medium": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/_thumbs720/2023-07-25/ab3b413f2058c9b639a9ad9da1e704b4.png",
"fullsize": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/2023-07-25/ab3b413f2058c9b639a9ad9da1e704b4.png"
},
"translations": {
"name": "No Edamame"
},
"channel_visibility": [
"menu"
],
"position": 7,
"is_preselected": false
},
{
"id": "c49b3847-2d3f-4975-a690-fc9c8bc69091",
"type_id": 1,
"reference_type": "CoreSimpleModifier",
"name": "No Radish",
"internal_name": "",
"price": 0,
"delivery_price": 0,
"price_configuration_2": 0,
"price_configuration_3": 0,
"price_configuration_4": 0,
"price_configuration_5": 0,
"price_configuration_6": 0,
"price_configuration_7": 0,
"pos_id": "",
"pos_name": "",
"state": 1,
"is_visible": true,
"is_visible_in_store_group": true,
"is_visible_in_cms": true,
"temporary_disabled_until": null,
"calories": 40,
"allergens": [],
"image": {
"thumbnail_small": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/_thumbs280/2023-07-25/e18337ced14ced22e6ef4380aa89c104.png",
"thumbnail_medium": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/_thumbs720/2023-07-25/e18337ced14ced22e6ef4380aa89c104.png",
"fullsize": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/2023-07-25/e18337ced14ced22e6ef4380aa89c104.png"
},
"translations": {
"name": "No Radish"
},
"channel_visibility": [
"menu"
],
"position": 2,
"is_preselected": false
},
{
"id": "cb5c5146-de36-4586-bde7-b8a92903989c",
"type_id": 1,
"reference_type": "CoreSimpleModifier",
"name": "Organic Wild Rice",
"internal_name": "",
"price": 0,
"delivery_price": 0,
"price_configuration_2": 0,
"price_configuration_3": 0,
"price_configuration_4": 0,
"price_configuration_5": 0,
"price_configuration_6": 0,
"price_configuration_7": 0,
"pos_id": "",
"pos_name": "",
"state": 1,
"is_visible": true,
"is_visible_in_store_group": true,
"is_visible_in_cms": true,
"temporary_disabled_until": null,
"calories": null,
"allergens": [],
"image": {
"thumbnail_small": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/_thumbs280/2023-07-25/2864934613df10b0f1e97095390f0658.png",
"thumbnail_medium": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/_thumbs720/2023-07-25/2864934613df10b0f1e97095390f0658.png",
"fullsize": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/2023-07-25/2864934613df10b0f1e97095390f0658.png"
},
"translations": {
"name": "Organic Wild Rice"
},
"channel_visibility": [
"menu"
],
"position": 1,
"is_preselected": false
},
{
"id": "cacda3ea-4298-477e-a874-b5f02787152a",
"type_id": 1,
"reference_type": "CoreSimpleModifier",
"name": "Organic Arugula",
"internal_name": "",
"price": 0,
"delivery_price": 0,
"price_configuration_2": 0,
"price_configuration_3": 0,
"price_configuration_4": 0,
"price_configuration_5": 0,
"price_configuration_6": 0,
"price_configuration_7": 0,
"pos_id": "",
"pos_name": "",
"state": 1,
"is_visible": true,
"is_visible_in_store_group": true,
"is_visible_in_cms": true,
"temporary_disabled_until": null,
"calories": 25,
"allergens": [],
"image": {
"thumbnail_small": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/_thumbs280/2023-07-25/6ae112b7b131b991a1baf811b6e5647c.png",
"thumbnail_medium": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/_thumbs720/2023-07-25/6ae112b7b131b991a1baf811b6e5647c.png",
"fullsize": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/2023-07-25/6ae112b7b131b991a1baf811b6e5647c.png"
},
"translations": {
"name": "Organic Arugula"
},
"channel_visibility": [
"menu"
],
"position": 4,
"is_preselected": false
},
{
"id": "90e41b01-40a1-407e-b6eb-eebdcf5af12a",
"type_id": 1,
"reference_type": "CoreSimpleModifier",
"name": "Organic Baby Spinach",
"internal_name": "",
"price": 0,
"delivery_price": 0,
"price_configuration_2": 0,
"price_configuration_3": 0,
"price_configuration_4": 0,
"price_configuration_5": 0,
"price_configuration_6": 0,
"price_configuration_7": 0,
"pos_id": "",
"pos_name": "",
"state": 1,
"is_visible": true,
"is_visible_in_store_group": true,
"is_visible_in_cms": true,
"temporary_disabled_until": null,
"calories": 25,
"allergens": [],
"image": {
"thumbnail_small": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/_thumbs280/2023-07-25/86a15cb93d53a56b819d214e79e42cdd.png",
"thumbnail_medium": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/_thumbs720/2023-07-25/86a15cb93d53a56b819d214e79e42cdd.png",
"fullsize": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/2023-07-25/86a15cb93d53a56b819d214e79e42cdd.png"
},
"translations": {
"name": "Organic Baby Spinach"
},
"channel_visibility": [
"menu"
],
"position": 3,
"is_preselected": false
},
{
"id": "ff5f69ca-1137-4924-b7d7-b4f15ecf55aa",
"type_id": 1,
"reference_type": "CoreSimpleModifier",
"name": "Warm Organic Quinoa",
"internal_name": "",
"price": 0,
"delivery_price": 0,
"price_configuration_2": 0,
"price_configuration_3": 0,
"price_configuration_4": 0,
"price_configuration_5": 0,
"price_configuration_6": 0,
"price_configuration_7": 0,
"pos_id": "",
"pos_name": "",
"state": 1,
"is_visible": true,
"is_visible_in_store_group": true,
"is_visible_in_cms": true,
"temporary_disabled_until": null,
"calories": 120,
"allergens": [],
"image": {
"thumbnail_small": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/_thumbs280/2023-07-25/9216c8cc0281856facd22db16373fd3a.png",
"thumbnail_medium": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/_thumbs720/2023-07-25/9216c8cc0281856facd22db16373fd3a.png",
"fullsize": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/2023-07-25/9216c8cc0281856facd22db16373fd3a.png"
},
"translations": {
"name": "Warm Organic Quinoa"
},
"channel_visibility": [
"menu"
],
"position": 6,
"is_preselected": false
},
{
"id": "6da050d5-4f58-4abc-9b6a-65209f3780e2",
"type_id": 1,
"reference_type": "CoreSimpleModifier",
"name": "Organic Mesclun",
"internal_name": "",
"price": 0,
"delivery_price": 0,
"price_configuration_2": 0,
"price_configuration_3": 0,
"price_configuration_4": 0,
"price_configuration_5": 0,
"price_configuration_6": 0,
"price_configuration_7": 0,
"pos_id": "",
"pos_name": "",
"state": 1,
"is_visible": true,
"is_visible_in_store_group": true,
"is_visible_in_cms": true,
"temporary_disabled_until": null,
"calories": 20,
"allergens": [],
"image": {
"thumbnail_small": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/_thumbs280/2023-07-25/595c9060cbaaa2d88bfdd628edcdb30e.png",
"thumbnail_medium": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/_thumbs720/2023-07-25/595c9060cbaaa2d88bfdd628edcdb30e.png",
"fullsize": "https://s3.eu-central-1.amazonaws.com/api.playground/images/modifier_images/2023-07-25/595c9060cbaaa2d88bfdd628edcdb30e.png"
},
"translations": {
"name": "Organic Mesclun"
},
"channel_visibility": [
"menu"
],
"position": 5,
"is_preselected": false
}
],
"channel_visibility": [
"menu"
]
}
],
"required_modifier_group_ids": [],
"channel_visibility": [
"menu"
]
}
]
}
}
| Attribute | Type | Example Value | Description |
|---|---|---|---|
cross_selling_items.id |
string | "dd8fdcd6-d1c0-41ee-8b59-ffb9ccbb7d3d" |
Menu Item UUID |
cross_selling_items.name |
string | "Moringa Bowl" |
Name of Menu Item (in brand's default language) |
cross_selling_items.translations.name |
string | "Moringa Bowl" |
Name of Menu Item (to be presented to customer) - based on language provided in Content-Language header |
cross_selling_items.description |
string | "Mango, Spinach, Banana, Moringa, Fresh Pineapple" |
Description of Menu Item (in brand's default language) |
cross_selling_items.translations.description |
string | "Mango, Spinach, Banana, Moringa, Fresh Pineapple" |
Description of Menu Item (to be presented to customer) - based on language provided in Content-Language header |
cross_selling_items.price_levels |
array[PriceLevel] | Array of Price Levels for the Menu Item - see Menu Concepts for more information | |
cross_selling_items.modifier_groups |
array[ModifierGroup] | Array of Modifier Groups for the Menu Item - see Menu Concepts for more information |
After any modification to the cart (including adding one of the cross-sell items), a new call should be made to /venues/{venue_uuid}/menus/{menu_uuid}/cross-sellings to refresh the cross-sell item suggestions.
Initialize Payment
Once all the items, modifiers and combos have been selected by the customer, and they are ready to check out, the Payment Flow is initiated.
for the signed-in customers, the storing of the payment methods is available. See Store Payment Methods guide for more details.
To perform the payment, follow the Make a Payment guide.
The Payment implementation is different depending on the Payment Processor that is being used by the brand. See the PAR Pay guide to implement the PAR Pay Payment Processor
Place Order
Once payment initialization has been completed by the customer, you can proceed with posting the order to /orders:
Request
| Attribute | Type | Example Value | Description |
|---|---|---|---|
singular_point_id |
string | "db2f3288-63f4-4939-81f6-d0351bce9c70" |
Singular Point ID from /venues/{venue_uuid} call |
order_type.id |
int | 8 |
Type ID of Order Type for which order should be placed - see Order Types reference |
order_type.pickup_asap |
bool | true |
Whether order is being placed for ASAP (as soon as possible) or not |
order_type.pickup_at |
string | "2023-08-06 23:20:00" |
Specific pickup time selected / specified by customer |
order_type.customer_account_vehicle_id |
string | "7dada664-6074-4c3d-ba75-250b142b6913" |
Customer vehicle UUID |
order_type.menu_items.[i].id |
string | "833c2e35-5066-4b1c-a813-fe5cb349a6aa" |
Menu Item UUID |
order_type.menu_items.[i].quantity |
int | 2 |
Number of Menu Item with same price level and modifiers ordered |
order_type.menu_items.[i].price_level_id |
string | "76efaa5d-b849-4549-9468-72b8131b904a" |
UUID of Price Level of Menu Item that was selected by the customer |
order_type.customer_info.email |
string | "jane.doe@partech.com" |
Customer's e-mail address (to send order confirmation e-mail to) |
order_type.customer_info.first_name |
string | "Jane" |
Customer's first name (useful for identification at pickup) |
order_type.customer_info.last_name |
string | "Doe" |
Customer's last name (useful for identification at pickup) |
order_type.customer_info.phone_number |
string | "+112345566" |
Customer's phone number - shown to store in order to contact customer in case of issues |
order_type.payment_info.payment_init_hash |
string | "6d930b1593304c87f1092001ceb29ae2" |
Payment initialization identifier, representing payment for the order |
{
"method": "post",
"url": "https://api-public-playground.menu.app/api/orders",
"headers": {
"X-Request-ID": "69da3547-204b-4093-a225-54e084c24215",
"Application": "f3a90488ffee32c3acb6fcd0ca417cf6",
"Authorization": ""
"Api-Version": 4.38.0,
"Accept": "appliction/json",
"X-QB-Enabled": "true"
"Content-Language" : "en",
"DLC-Authorization" : ""
},
"body": {
"singular_point_id": "db2f3288-63f4-4939-81f6-d0351bce9c70",
"order_type": {
"id": 8,
"trigger_type": 2,
"customer_phone_number": "+381 21 123-45-6d7",
"customer_account_vehicle_id": "7dada664-6074-4c3d-ba75-250b142b6913",
"pickup_asap": true,
"pickup_at": "2020-09-29 18:00:00"
},
"menu_items": [
{
"id": "833c2e35-5066-4b1c-a813-fe5cb349a6aa",
"quantity": 2,
"price_level_id": "76efaa5d-b849-4549-9468-72b8131b904a"
}
],
"customer_info": {
"email": "jane.doe@partech.com",
"first_name": "Jane",
"last_name": "Doe",
"phone_number": "+112345566"
},
"payment_info": {
"payment_init_hash": "6d930b1593304c87f1092001ceb29ae2"
}
}
}
Customer arrives
The system is tailored to make sure the Store staff only heads out to the curbside when the customer is there. Once the customer has arrived, the system should be notified of their arrival by calling the enpoint api/orders/{order-id}/customer-arrived. The order_idshould be transmitted as query parameter.
Request
{
"method": "post",
"url": "https://api-public-playground.menu.app/api/orders/{order_id}/customer-arrived",
"headers": {
"X-Request-ID": "69da3547-204b-4093-a225-54e084c24215",
"Application": "f3a90488ffee32c3acb6fcd0ca417cf6",
"Api-Version": 4.38.0
}
}
Once this request is sent, a notification appears on the Tablet(when in use) or selected POS system, informing the Store staff that the customer has arrived and it is time to deliver the order to the customer vehicle.


