Place order for Delivery

This guide will show you how to develop a flow that enables your customers to place an order for Delivery (see Order Types for more information).

Menu Screen with Delivery Times Order Summary with Cross-Selling Delivery Order Placed
delivery-times.png
dine-in-fs-cart.png
dine-in-fs-order-created.png

Before proceeding, you should have implemented:

Delivery Times

To fetch the available delivery times, the Delivery Times endpoint is called. The request should contain the delivery location latitude and longitude and the singular point id (which can be found in venues call, areas object)

The endpoint api/delivery/delivery-times can be called to get the list of all delivery times available for the current day

Request

{
  "method": "get",
  "url": "https://api-public-playground.menu.app/api/delivery/delivery-times",
  "headers": {
    "X-Request-ID": "69da3547-204b-4093-a225-54e084c24215",
    "Application": "f3a90488ffee32c3acb6fcd0ca417cf6",
    "Api-Version": 4.38.0
  },

  "body":{
  "singular_point_id": "1844fcaf-ef92-4414-8b1b-430099e9dd7d",
  "latitude": 45.26597499,
  "longitude": 19.83582061
  } 
}

The endpoint returns a collection of delivery times in the following format: "YYYY-MM-dd hh:mm:ss"

Response

{
    "status": "OK",
    "code": 200,
    "data": {
        "delivery_times": [
            "2023-08-07 15:45:00",
            "2023-08-07 16:00:00",
            "2023-08-07 16:15:00",
            "2023-08-07 16:30:00",
            "2023-08-07 16:45:00",
            "2023-08-07 17:00:00",
            "2023-08-07 17:15:00",
            "2023-08-07 17:30:00",
            "2023-08-07 17:45:00",
            "2023-08-07 18:00:00",
            "2023-08-07 18:15:00",
            "2023-08-07 18:30:00",
            "2023-08-07 18:45:00",
            "2023-08-07 19:00:00",
            "2023-08-07 19:15:00",
            "2023-08-07 19:30:00",
            "2023-08-07 19:45:00",
            "2023-08-07 20:00:00",
            "2023-08-07 20:15:00",
            "2023-08-07 20:30:00",
            "2023-08-07 20:45:00",
            "2023-08-07 21:00:00",
            "2023-08-07 21:15:00",
            "2023-08-07 21:30:00",
            "2023-08-07 21:45:00",
            "2023-08-07 22:00:00",
            "2023-08-07 22:15:00",
            "2023-08-07 22:30:00",
            "2023-08-07 22:45:00",
            "2023-08-07 23:00:00",
            "2023-08-07 23:15:00",
            "2023-08-07 23:30:00",
            "2023-08-07 23:45:00",
            "2023-08-08 00:00:00",
            "2023-08-08 00:15:00",
            "2023-08-08 00:30:00",
            "2023-08-08 00:45:00",
            "2023-08-08 01:00:00",
            "2023-08-08 01:15:00",
            "2023-08-08 01:30:00",
            "2023-08-08 01:45:00",
            "2023-08-08 02:00:00",
            "2023-08-08 02:15:00",
            "2023-08-08 02:30:00",
            "2023-08-08 02:45:00",
            "2023-08-08 03:00:00",
            "2023-08-08 03:15:00",
            "2023-08-08 03:30:00",
            "2023-08-08 03:45:00",
            "2023-08-08 04:00:00",
            "2023-08-08 04:15:00",
            "2023-08-08 04:30:00",
            "2023-08-08 04:45:00",
            "2023-08-08 05:00:00",
            "2023-08-08 05:15:00",
            "2023-08-08 05:30:00",
            "2023-08-08 05:45:00",
            "2023-08-08 06:00:00",
            "2023-08-08 06:15:00",
            "2023-08-08 06:30:00",
            "2023-08-08 06:45:00",
            "2023-08-08 07:00:00",
            "2023-08-08 07:15:00",
            "2023-08-08 07:30:00",
            "2023-08-08 07:45:00",
            "2023-08-08 08:00:00",
            "2023-08-08 08:15:00",
            "2023-08-08 08:30:00",
            "2023-08-08 08:45:00",
            "2023-08-08 09:00:00",
            "2023-08-08 09:15:00",
            "2023-08-08 09:30:00",
            "2023-08-08 09:45:00",
            "2023-08-08 10:00:00",
            "2023-08-08 10:15:00",
            "2023-08-08 10:30:00",
            "2023-08-08 10:45:00",
            "2023-08-08 11:00:00",
            "2023-08-08 11:15:00",
            "2023-08-08 11:30:00",
            "2023-08-08 11:45:00",
            "2023-08-08 12:00:00",
            "2023-08-08 12:15:00",
            "2023-08-08 12:30:00",
            "2023-08-08 12:45:00",
            "2023-08-08 13:00:00",
            "2023-08-08 13:15:00",
            "2023-08-08 13:30:00",
            "2023-08-08 13:45:00",
            "2023-08-08 14:00:00",
            "2023-08-08 14:15:00",
            "2023-08-08 14:30:00"
        ]
    }
}
Attribute Type Example Value Description
delivery_times array[string] ["2023-08-06 22:00:00","2023-08-06 22:05:00]", Array of available delivery times (to be presented to customer) - in UTC and needs to be converted to Venue timezone using venue.timezone.name

Based on the chosen delivery time, you should check the ServingTimes of the subcategories to determine which products will be available for order at the selected delivery time.

If the customer changes their delivery time after having added products to their cart, it may be that certain products are no longer available for the new delivery time, and you will need to present your customer with an experience showing that certain products are going to be removed from their cart.

Delivery Quote - Dispatch integrated stores

For the stores that have an additional integration with Dispatch service (see MENU Dispatch for more details), it is possible to verify the deliverability of the order to the selected location by the store Own Drivers or DSPs (Delivery service partners)

To determine whether a Venue has Dispatch enabled, look at the has_delivery_integration flag on the Venue resource.

Once the Ordering Process is initiated with the Dispatch integrated store, there is already a quote for delivery created during the store selection flow.

Request

Attribute Type Example Value Description
latitude float 37.777356 Latitude of delivery location coordinates
longitude float -122.399737 Longitude of delivery location coordinates
store_ids array[string] ["67984194-717f-46e7-aca6-03a7b64009f3"] Array of Venue UUIDs for which quote should be checked - provide list of Venues received on /delivery/venues API call that have has_delivery_integration enabled
estimated_delivery_time string "2023-08-11 17:00:00" Can be optionally provided if the customer is not ordering for ASAP, but for a specific time in advance
{
  "method": "post",
  "url": "https://api-public-playground.menu.app/api/dispatch-service/quotes",
  "headers": {
    "X-Request-ID": "69da3547-204b-4093-a225-54e084c24215",
    "Application": "f3a90488ffee32c3acb6fcd0ca417cf6",
    "Api-Version": 4.38.0,
    "Content-Type": "application/json"
  },
  "body": {
    "latitude": 37.777356,
    "longitude": -122.399737,
    "store_ids": [
      "67984194-717f-46e7-aca6-03a7b64009f3",
      "a9d6d0c8-1689-4114-b1ec-6da9c33f0384"
    ],
    "estimated_delivery_time": "2023-08-11 17:00:00"
  }
}

Response

{
  "code": 200,
  "data": {
    "promises": [
      {
        "state": "Ready to order",
        "token": "3921ed0b-f4a6-40eb-89a4-d68b64f6fb77",
        "store_id": "b8b96123-3f22-11ed-936c-1a67b454859d",
        "order_token": "null",
        "estimated_pickup_time": "null",
        "estimated_delivery_fee": 705,
        "estimated_delivery_time": "2023-01-23T19:00:00.000Z",
        "estimated_delivery_time": "2023-05-24T13:57:40.000Z",
        "target_delivery_providers": [
          "dsp1"
        ],
        "external_delivery_provider_promise_order_id": "null"
      }
    ]
  },
  "status": "OK"
}
Attribute Type Example Value Description
promises.[i].token string "3921ed0b-f4a6-40eb-89a4-d68b64f6fb77" Uniquely identifies the provided quote - needed for subsequent delivery API calls
promises.[i].store_id string "b8b96123-3f22-11ed-936c-1a67b454859d" UUID of Venue (Store / Location) that promise was provided for
promises.[i].estimated_delivery_time string "2023-05-24T13:57:40.000Z" Timestamp of estimated delivery time based on own fleet data or third-party DSP estimates
promises.[i].estimated_delivery_fee string 705 Estimated delivery fee cost (lowest unit) for third-party DSPs

If the customer changes their delivery time or delivery address, an additional call is made to /dispatch-service/quotes to check the deliverability to the selected location and the Estimated Delivery Time.

If the delivery is not possible for the new address, a new store search should be initiated to identify stores delivering to the new location and matching the delivery hours - Delivery Store Selection flow.

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 7 Type ID of order type for which order should be placed - see Order Types reference
order_type.delivery_info.latitude string "47.3864559" Delivery address - latitude
order_type.delivery_info.longitude string "8.4965434" Delivery address - longitude
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": 7
    },,
      "delivery_info":{
         "longitude":8.4965434,
         "latitude":47.3864559
      }
    "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": 1860,
            "discount": 0,
            "subsidy": 0,
            "service_charge": 0,
            "service_charge_rate": 0,
            "service_charge_tax_rate": 0,
            "delivery_fee": 400,
            "delivery_fee_tax": 28,
            "delivery_fee_tax_rate": 7,
            "minimum_surcharge": 0,
            "minimum_surcharge_tax": 0,
            "tip": 0,
            "tip_rate": 0,
            "total": 2641,
            "amount_for_payment": 2641,
            "tax": 381,
            "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.delivery_fee int 400 Order delivery cost calculated based on the rates setup for the store in CMS
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 7 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": 7,
        "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 7 Type ID of Order Type for which order should be placed - see Order Types reference
customer_cash_amount int 2000 Cash amount prepared by the customer for cash payment. This anount is sent in cents, i.e. 2000 for $20,00. This field is sent to make sure that the delivery driver will have enough cash to return the change to the customer.
delivery_info.street_name string "Congress Avenue" Delivery address street name
delivery_info.street_number string "320" Delivery address street name
delivery_info.place string "Austin" Delivery address city
delivery_info.administrative_area string "Texas" Delivery address State
delivery_info.administrative_area_short string "TX" Delivery address State abbreviation
delivery_info.country string "United States" Delivery address country
delivery_info.country_short string "US" Delivery address country abbreviation
delivery_info.longitude string -97.7439704 Delivery area longitude
delivery_info.latitude string 30.2661284 Delivery area latitude
delivery_info.postcode string "78701" Delivery area postcode
delivery_info.formatted_address string "Congress Avenue 320, Austin" Full address result (to be presented to the customer)
delivery_info.is_custom boolean "true" Boolean flag indicating whether the customer has given the delivery address as point on the map
delivery_info.is_number_first boolean "false" Boolean flag indicating whether the formatted address contains the street number first.
delivery_info.region string "Texas" Delivery address region
delivery_info.region_short string "TX" Delivery address region abbreviation
delivery_asap boolean false Boolean flag indicating whether the delivery is scheduled or ASAP.
delivery_at string "2023-08-06 15:00:00" Specific delivery time selected by the customer for delivery
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
tip.percentage int 10 Percentage of the total that should be payed for tips
promise.token string "ed2bea0a-1719-4aa4-99da-45041848fa1a" A token identifying Dispatch delivery quote received before placing the delivery order
{
  "method": "post",
  "url": "https://api-public-playground.menu.app/api/orders",
  "headers": {
    "X-Request-ID": "69da3547-204b-4093-a225-54e084c24215",
    "Application": "f3a90488ffee32c3acb6fcd0ca417cf6",
    "Api-Version": 4.38.0,
    "Content-Type": "application/json"
  },
  "body": {
   "singular_point_id":"ea0a2d0e-058a-4af4-957f-3bbf1272ec52",
   "order_type":{
      "id":7,
      "properties":{
         
      },
      "customer_cash_amount":2000,
      "delivery_info":{
         "id":"ChIJLwPMoJm1RIYRetVp1EtGm10",
         "street_name":"Colorado ST",
         "street_number":"23",
         "locality":null,
         "place":"Austin",
         "administrative_area":"Texas",
         "administrative_area_short":"TX",
         "country":"United States",
         "country_short":"US",
         "longitude":-97.7435582,
         "latitude":30.2679758,
         "postcode":78701,
         "formatted_address":"Colorado ST 23, Austin",
         "is_custom":true,
         "is_number_first":false,
         "region":"Texas",
         "region_short":"TX",
         "apartment_number":"2"
      },
      "delivery_asap":true,
      "delivery_at":"2023-08-08 08:41:37"
   },
   "tip":{
      "percentage":10
   },
   "menu_items":[
      {
         "id":"ae795a25-1101-409e-bea4-d1bf4b25be6b",
         "price_level_id":"ad8de37c-9613-4272-b2af-9a01ee704615",
         "quantity":1,
         "modifiers":[
            "f2f578ea-40f2-44ad-8d32-c2aac749dc24"
         ],
         "comment":"no peanuts please"
      }
   ],
   "customer_info":{
      "first_name":"John",
      "last_name":"Smith",
      "email":"john.smith@partech.com",
      "phone_number":"+15204432124",
      "demographics":[
         
      ]
   },
   "payment_info":{
      "payment_init_hash":"18b7f152a84bafc7428e04c263db3941"
   },
   "is_reorder":false,
   "promise_token":"ed2bea0a-1719-4aa4-99da-45041848fa1a"
}
}