NAV #
#

API Documentation EN

The documentation related to integrations is divided into 3 main sections.

General Info

OpenAPI Documentation can be found here

Intro

Through integration APIs, it is possible to interact with the Glovo system. You can receive notifications for new orders and canceled orders. Additionally, information related to the products of a specific Glovo store can be updated. In the following sections, we will delve into each chapter in detail.

IMPORTANT It is crucial to consider that to enable integrations between the Glovo system and POS solutions, at least two operations are required: the notification reception operation and the menu update operation. Once the integration is activated, the content of Glovo stores will be exclusively managed through the integration.

IMPORTANT This documentation is intended for the production environment. Test accounts are not accepted on this environment. There is no test environment for the Portal. Only test stores on the domain https://testglovo.com can be requested, via email at pos.integrations@appsmart.ro. The number of test stores is limited and allocated for a determined period. Please make the request after you have implemented the formats, according to the documentation, to ensure you have enough testing time before reallocation. On these test stores, the menu update function can be tested. As it is a staging environment, it is not always maintained, and notifications are not always sent. For testing notifications, it is recommended to do so in production by activating a location and receiving live orders. Activating a location does not affect the restaurant's activity.

Integration steps

  1. Registration is done on the integration portal, details available here.
  2. Follow the steps to configure the account in the portal, details available here.
  3. Implement the integration API, details available here, here, here, and openapi.
  4. Follow the steps related to the Integration Portal, details here.
  5. Depending on the needs, LAAS function can also be implemented, details here.

API Integration Endpoints

Partner Name (partner_name)

This field sent in the JSON payload for menu update identifies the POS solution in relation to the integration middleware. Typically, this attribute represents the name of the POS solution. It is advisable to use a single partner name within the system. This name is allocated when requesting the creation of an account in the integration portal. More details about this field are discussed in the payload examples section for menu update.

Store ID (store_id) / LID

In integration discussions, you will frequently encounter the terms Store ID or LID. This field uniquely identifies a Store in the Glovo system. Stores in Glovo are defined at specific addresses. The LID/Store ID must be unique within the Glovo system. LIDs used in Glovo follow the rule: partner_name__store_id.

As mentioned earlier, partner_name is allocated by the integration portal when registering a new POS solution. The Store ID is provided by the POS solution when requesting the activation of a new integration through the portal.

Glovo uses the following system to manage partner locations: - Store - one per city - Store addresses - one for each physical location.

Authorization Header

All requests to the integration APIs require an Authorization Header, which can be found in the integration portal. The header name is "Authorization."

POS Endpoints

The integration solution can send various types of notifications. The corresponding endpoints for these types of notifications are detailed in the relevant section in the portal, which you can find here.

Marketplace Orders

The delivery of an order can be handled either by a Glovo courier or by the restaurant. In cases where Glovo is not involved in the delivery process, we identify these stores as "marketplace" type. Through this document, you will find special notes and references intended for these types of stores, which require additional information to fulfill an order.

Terminology

Order Notification

Intro

Every time a new order is placed in a Glovo store, it will be sent via API to the notification endpoints of the POS solutions registered in the Integration Portal. For details on configuring these endpoints, you can access them here. NOTE: It is possible that in certain situations, in case of errors, attempts may be made to send notifications multiple times. To avoid receiving duplicates, it is recommended to create a unique index on the order_code field.

Notification format

The notification sent to the defined endpoints in the system is in JSON format.

As mentioned earlier, a restaurant can either deliver with Glovo or use its own delivery drivers. In the case where the restaurant delivers with its own drivers, it is classified as a "marketplace" type.

Depending on the restaurant's settings, the JSON format may or may not contain certain elements.

In the case of delivery by Glovo, you can see an example of a notification below. When the delivery is handled by Glovo, customer details are not available in the payload that will be sent to the POS. Only a part of the customer's name will be included in the POS payload.

{
  "traceCode": null,
  "traceId": null,
  "order_id": "616342127",
  "store_id": "TEST__111111",
  "order_code": "ISRQHPPK1",
  "order_time": "2023-05-09 16:16:36",
  "order_type": "pickup",
  "estimated_pickup_time": "2023-05-09 16:24:48",
  "payment_method": "CASH",
  "currency": "RON",
  "allergy_info": "",
  "pick_up_code": "584",
  "is_picked_up_by_customer": false,
  "cutlery_requested": false,
  "special_requirements": null,
  "loyalty_card": null,
  "payment_total": 5700,
  "customer_cash_payment_amount": null,
  "courier": {
    "name": "BogdanPopa G.",
    "phone_number": "+40758604639"
  },
  "customer": {
    "name": "Carmen H.",
    "phone_number": "N/A",
    "hash": "b4ae646e-094e-374d-b8ee-0594447ac916",
    "invoicing_details": null
  },
  "fees": [
  ],
  "discounts": [
  ],
  "products": [
    {
      "id": "27520079",
      "purchased_product_id": "MTgzMTc2Mzk0Ng==",
      "quantity": 1,
      "price": 1200,
      "name": "Parmesan fries",
      "attributes": [
      ]
    },
    {
      "id": "5942500",
      "purchased_product_id": "MTgzMTc2Mzk0OA==",
      "quantity": 1,
      "price": 1500,
      "name": "Chickee Corn Dog",
      "attributes": [
      ]
    },
    {
      "id": "2555202",
      "purchased_product_id": "MTgzMTc2Mzk0Nw==",
      "quantity": 2,
      "price": 1500,
      "name": "Hybrid Corn Dog",
      "attributes": [
      ]
    }
  ],
  "delivery_address": null,
  "bundled_orders": [
  ]
}

JSON Structure Details

Notification format

Here's the table formatted:

Field Name Data Type Description Since
traceCode String An internal code that identifies a request across multiple operations. It does not need to be used by the POS - Optional
traceId String An internal ID that identifies a request across multiple operations. It does not need to be used by the POS - Optional
is_picked_up_by_customer Boolean Value indicating whether a certain order will be picked up by the customer and not by the courier.
order_id String The ID of the order in the Glovo system. A unique identifier - Mandatory
store_id String The ID of a specific store within Glovo. This ID may contain additional encoded information, such as a particular brand. It is set in Glovo based on the IDs received from the POS - Mandatory
order_code String An alphanumeric field used for historical searches or communication with Glovo support.
order_time String A string representing the date and time when a certain order was accepted. It is in the format yyyy-MM-dd HH:mm:ss
order_type String Can have values "pickup" if delivered by Glovo or "delivery" if delivered by the restaurant with their own delivery drivers. This field is different from "is_picked_up_by_customer," and it is used in a different context. The "is_picked_up_by_customer" field with a value of true cancels the meaning of the "order_type" field.
estimated_pickup_time String The estimated time when the courier will arrive to pick up an order. It is in the format yyyy-MM-dd HH:mm:ss
payment_method String The payment method, can have two values: "DELAYED" if the payment was made by the customer with a card or "CASH" if the customer will pay with cash.
currency String The currency in which the order was placed.
allergy_info String Can contain details about the customer's allergies if provided by the customer.
pick_up_code String A 3-digit code that identifies an order and is used in communication with a courier.
cutlery_requested Boolean Indicates whether a customer requested cutlery or not.
payment_total Integer The payment value expressed in cents.
customer_cash_payment_amount Integer The cash amount that the customer needs to pay in the case of marketplace-type integrations.
courier Object Contains details about the courier.
customer Object Contains details about the customer who placed the order in the case of marketplace-type integrations.
fees Array Contains details about the fees paid by the customer, usually DeliveryFee, but it can be a list based on integration setups.
discounts Array List of applied discounts. It can be a single discount or multiple depending on the integration setup.
products Array List of selected products by the customer, including optional and required ones, the price difference is handled at the price level.
delivery_address Object The delivery address, including complete details and GPS coordinates in the case of marketplace-type integrations.
bundled_orders Array List of IDs of multiple orders that can be delivered together in the case of marketplace-type integrations.
minimum_basket_surcharge Integer The minimum basket surcharge fee in cents. It applies only to marketplace-type orders. If the order is delivered by Glovo, this fee will be null.
detailed_fees Array An array that contains the detailed fees. 11.10.2023
glovo_discounts Array A list of discounts supported by Glovo. 11.10.2023
restaurant_discounts Array A list of discounts supported by the restaurant. 11.10.2023
products_total Integer The total of the products without applied discounts or other fees. 11.10.2023

Courier format

For marketplace-type orders, the courier fields are null.

Field Name Data Type Description
name String The name of the courier assigned to the order
phone_number String The phone number of the courier assigned to the order

Customer format

For orders delivered by Glovo, the fields, except for the name, will not be populated with data.

Field Name Data Type Description
name String The name of the customer
phone_number String Hash - information sent by Glovo.
hash String (nullable) The customer's phone number
invoicing_details Object (nullable) An object that contains the invoicing details. Null if the customer does not want an invoice.

Fees / Discounts Fortmat

Field Name Data Type Description
code String The code of the fee/discount
description String A description
value String The value of the fee or discount

Products format

Here's the table properly formatted:

Field Name Data Type Description Since
quantity Integer The quantity of the selected product by the customer in the current order
price Integer The price of the product expressed in cents
name String The name of the product
id String The ID of the product. The ID corresponds to the POS solution. These IDs can be provided by the POS implementer and will be set accordingly.
attributes Array The attributes of a product, such as options like optional or additional items. The list will contain a sublist of products whose price can be 0 for optionals or greater than 0 for additional items.
purchased_product_id String The unique identifier of the product within a specific order.
discount Integer Discount in cents applied at the product level. 11.10.2023

Attributes format

Field Name Data Type Description
id String The identifier of the attribute, the product ID that is attached to the selected main product. For example, in the case of menus when they consist of multiple sub-products.
quantity Integer The quantity of a certain attribute selected.
name String The name of the attribute.
price Integer The price expressed in cents.

Delivery Address format

Field Name Data Type Description
label String The complete, unstructured address as selected in Google Maps by the Glovo user.
latitude Double The latitude at which the address is located as received from Google Maps.
longitude Double The longitude at which the address is located according to Google Maps.

Detailed Fees Structure

Field Name Data Type Description
code String Represents the code of the fee. Possible values are: DeliveryFee, MinimumBasketSurcharge, ServiceFee
description String Description of the fee
value Integer The value of the fee in the smallest unit

Glovo Discounts Structure

Field Name Data Type Description
code String Represents the code of the discount. Possible values are: GlovoDiscount, GlovoSupportedDeliveryFee, Other
description String Description of the discount
value Integer The value of the discount in the smallest unit

Restaurant Discounts Structure

Field Name Data Type Description
code String Represents the code of the discount. Possible values are: RestaurantDiscount
description String Description of the discount
value Integer The value of the discount in the smallest unit

Notification examples

Pickup Notification (1)

{ "traceCode":null, "traceId":null, "order_id":"616624880", "store_id":"test__aaa12321", "order_code":"TMRXMGYXV", "order_time":"2023-05-09 22:42:42", "order_type":"pickup", "estimated_pickup_time":"2023-05-09 22:55:14", "payment_method":"DELAYED", "currency":"RON", "allergy_info":"", "pick_up_code":"964", "is_picked_up_by_customer":false, "cutlery_requested":false, "special_requirements":null, "loyalty_card":null, "payment_total":3075, "customer_cash_payment_amount":null, "courier":{ "name":"Test T.", "phone_number":"+3333" }, "customer":{ "name":"Test Customer", "phone_number":"N/A", "hash":"740c4544-3d69-3187-b564-80eecfa83e77", "invoicing_details":null }, "fees":[

], "discounts":[ { "code":"Discount", "description":"Discounnt based on customer order for glovo delivery order ", "value":1025 } ], "products":[ { "id":"shaorma-mare-delivery-meniu_shaorma", "purchased_product_id":"MTgzMjYyMjA4MA==", "quantity":1, "price":4100, "name":"Shaorma mare pui + cartofi + racoritoare + sos deep", "attributes":[

] } ], "delivery_address":null, "bundled_orders":[

] }

Pickup Notification (2)

{ "traceCode":null, "traceId":null, "order_id":"616609143", "store_id":"TEST__22222", "order_code":"TMB9H29JC", "order_time":"2023-05-09 22:25:02", "order_type":"pickup", "estimated_pickup_time":"2023-05-09 22:38:30", "payment_method":"DELAYED", "currency":"RON", "allergy_info":"NU DORESC SALATEE IN SHAORMA SAU GYROS SI NICI SOS DE MASLINE!!!!", "pick_up_code":"496", "is_picked_up_by_customer":false, "cutlery_requested":false, "special_requirements":null, "loyalty_card":null, "payment_total":6762, "customer_cash_payment_amount":null, "courier":{ "name":"TEST", "phone_number":"+4444" }, "customer":{ "name":"TEST S.", "phone_number":"N/A", "hash":"11ad3b6a-e2ff-39ab-ad7b-d216aee26e82", "invoicing_details":null }, "fees":[

], "discounts":[ { "code":"Discount", "description":"Discounnt based on customer order for glovo delivery order ", "value":1988 } ], "products":[ { "id":"cola", "purchased_product_id":"MTgzMjU4MDQyOQ==", "quantity":1, "price":800, "name":"cola", "attributes":[

] }, { "id":"shaorma-mare-delivery-meniu_shaorma", "purchased_product_id":"MTgzMjU4MDQyOA==", "quantity":1, "price":4100, "name":"Shaorma mare pui + cartofi + racoritoare + sos deep", "attributes":[

] }, { "id":"shaorma-mica-pui-vatra-delivery-gyrs", "purchased_product_id":"MTgzMjU4MDQyNw==", "quantity":1, "price":3850, "name":"Gyros pe vatra pui + cartofi + racoritoare + sos Deep", "attributes":[

] } ], "delivery_address":null, "bundled_orders":[

] }

Marketplace Notification (1)

{ "traceCode":null, "traceId":null, "order_id":"616615673", "store_id":"TEST__12345---1", "order_code":"BU8GXCCHK", "order_time":"2023-05-09 22:32:01", "order_type":"delivery", "estimated_pickup_time":"2023-05-09 22:41:39", "payment_method":"DELAYED", "currency":"RON", "allergy_info":"", "pick_up_code":"242", "is_picked_up_by_customer":false, "cutlery_requested":false, "special_requirements":null, "loyalty_card":null, "payment_total":6400, "customer_cash_payment_amount":null, "courier":{ "name":null, "phone_number":null }, "customer":{ "name":"TEST", "phone_number":"+3333333", "hash":"211fc636-3e8a-3de0-99ab-e39c389bad4f", "invoicing_details":null }, "fees":[ { "code":"DeliveryFee", "description":null, "value":699 } ], "discounts":[ { "code":"Voucher", "description":"Calculated voucher from order", "value":699 } ], "products":[ { "id":"235", "purchased_product_id":"MTgzMjU5Nzk0Mw==", "quantity":1, "price":5000, "name":"Ciolan afumat cu fasole iahnie", "attributes":[

] }, { "id":"557", "purchased_product_id":"MTgzMjU5Nzk0Mg==", "quantity":1, "price":1400, "name":"Salată de gogoșari murati", "attributes":[

] } ], "delivery_address":{ "label":"Adresa de livrare", "latitude":44.3935971, "longitude":26.1297343 }, "bundled_orders":[

] }

Marketplace Notification (2)

{ "traceCode":null, "traceId":null, "order_id":"616610156", "store_id":"TEST__22222", "order_code":"CJTN7YT3E", "order_time":"2023-05-09 22:26:03", "order_type":"delivery", "estimated_pickup_time":"2023-05-09 22:38:35", "payment_method":"CASH", "currency":"RON", "allergy_info":"", "pick_up_code":"726", "is_picked_up_by_customer":false, "cutlery_requested":false, "special_requirements":null, "loyalty_card":null, "payment_total":6796, "customer_cash_payment_amount":10000, "courier":{ "name":null, "phone_number":null }, "customer":{ "name":"Test Test", "phone_number":"+4444", "hash":"c8a5baf3-e630-33ce-b6e6-48ea4b17ca71", "invoicing_details":null }, "fees":[ { "code":"DeliveryFee", "description":null, "value":599 } ], "discounts":[ { "code":"Voucher", "description":"Calculated voucher from order", "value":900 }, { "code":"Discount", "description":"Discount based on customer order for restaurant delivery order", "value":900 } ], "products":[ { "id":"15710361-15914393", "purchased_product_id":"MTgzMjU4MzE1Mg==", "quantity":1, "price":999, "name":"Inele de ceapă", "attributes":[

] }, { "id":"19194151-16341228", "purchased_product_id":"MTgzMjU4MzE1MA==", "quantity":1, "price":4499, "name":"Pizza Anghinare", "attributes":[

] }, { "id":"15914095-19194805", "purchased_product_id":"MTgzMjU4MzE1MQ==", "quantity":1, "price":2499, "name":"Papanasi cu smantana si gem de afine", "attributes":[

] } ], "delivery_address":{ "label":"Adresa de livrare", "latitude":46.771634, "longitude":23.6301196 }, "bundled_orders":[

] }

Marketplace Notification (2)

{ "traceCode":null, "traceId":null, "order_id":"616604244", "store_id":"test__1111", "order_code":"CJWCL11UW", "order_time":"2023-05-09 22:19:59", "order_type":"delivery", "estimated_pickup_time":"2023-05-09 22:33:48", "payment_method":"DELAYED", "currency":"RON", "allergy_info":"", "pick_up_code":"602", "is_picked_up_by_customer":false, "cutlery_requested":false, "special_requirements":null, "loyalty_card":null, "payment_total":13994, "customer_cash_payment_amount":null, "courier":{ "name":null, "phone_number":null }, "customer":{ "name":"Test Test", "phone_number":"+2222", "hash":"016e3838-d5cd-3981-8cc3-8601a2a115a7", "invoicing_details":null }, "fees":[ { "code":"DeliveryFee", "description":null, "value":599 } ], "discounts":[

], "products":[ { "id":"15914065-15914432", "purchased_product_id":"MTgzMjU2NzQ1NA==", "quantity":1, "price":500, "name":"Chilli Mayo", "attributes":[

] }, { "id":"15710352-15914267", "purchased_product_id":"MTgzMjU2NzQ1MQ==", "quantity":1, "price":3599, "name":"Chicken Burger", "attributes":[ { "id":"cf-15710352-15914267-17038868", "quantity":1, "price":999, "name":"Cartofi Fry n Dip" } ] }, { "id":"15710355-15914315", "purchased_product_id":"MTgzMjU2NzQ1Mg==", "quantity":1, "price":2999, "name":"Tenders", "attributes":[ { "id":"cf-15710355-15914315-17147846", "quantity":1, "price":999, "name":"Cartofi Fry n Dip" } ] }, { "id":"15914058-15914288", "purchased_product_id":"MTgzMjU2NzQ1Mw==", "quantity":1, "price":3799, "name":"Paste Quattro Formaggi", "attributes":[ { "id":"extra-15914058-15914288-16336474", "quantity":1, "price":500, "name":"Extra Parmezan" } ] } ], "delivery_address":{ "label":"Adresa de livrare", "latitude":46.75185968139803, "longitude":23.58961270255769 }, "bundled_orders":[

] }

Store Menu Update

Intro

The Glovo system offers the possibility to send a payload for the complete update of a specific defined store, including overwriting the old configuration with the new one. This operation is carried out by sending a JSON payload to the Glovo ETL.

The menu update operation is asynchronous and occurs in two stages. The first stage involves sending the payload to the corresponding update endpoint, defined here. The system returns a successful response, but this does not mean that the Glovo store has been successfully updated. Instead, it means that the payload has been received and will be processed.

To verify whether the operation has been successfully completed or not, it is necessary to call the second endpoint, namely the check status endpoint, with details available here. Additionally, the V3 API, compared to the previous version, allows the definition of an endpoint where notifications related to the update operation can be received. This means that when Glovo responds with SUCCESS, ERROR, or any status other than PROCESSING, Glovo ETL will send a notification to the defined endpoint. The payload sent will be the same as in the case of calling the check status function mentioned above.

IMPORTANT: There is a limit of 5 menu update operations per day per store ID. If the number of operations exceeds this limit, the API will return an error specifying that this limit has been reached. To avoid reaching this limit, for certain operations, you can use the API endpoints for Items, defined by modify attribute, modify product, or bulk update bulk.

JSON Format

An example of the structure that needs to be sent to the update menu endpoint is as follows:

{
  "store_environment": "staging",
  "store_id": "gi20__001",
  "partner_name": "gi20",
  "super_categories": [
    {
      "name": "default",
      "position": 0,
      "image_url": null,
      "display_super_category": false,
      "categories": [
        {
          "name": "MENIUL ZILEI",
          "position": 1,
          "sections": [
            {
              "name": "MENIUL ZILEI",
              "position": 0,
              "products": [
                {
                  "id": "18412870",
                  "name": "MENIUL ZILEI",
                  "price": "45.0",
                  "image_url": null,
                  "description": "Ciorbă+Fel principal+garnitură la alegere+salată de însoțire. ",
                  "available": true,
                  "attribute_groups": [
                    {
                      "id": "17876377",
                      "name": "Alege ciorba 300 g",
                      "min": 1,
                      "max": 1,
                      "collapse": true,
                      "multiple_selection": false,
                      "attributes": [
                        {
                          "id": "17876412",
                          "name": "Ciorbă de văcuță",
                          "available": true,
                          "selected_by_default": false,
                          "price": "0.0"
                        },
                        {
                          "id": "17876428",
                          "name": "Ciorbă rădăuțeană",
                          "available": true,
                          "selected_by_default": false,
                          "price": "0.0"
                        },
                        {
                          "id": "18410924",
                          "name": "Ciorbă de legume",
                          "available": true,
                          "selected_by_default": false,
                          "price": "0.0"
                        },
                        {
                          "id": "18410951",
                          "name": "Ciorba de burta",
                          "available": true,
                          "selected_by_default": false,
                          "price": "0.0"
                        }
                      ]
                    },
                    {
                      "id": "17876434",
                      "name": "Alege fel principal 130 g",
                      "min": 1,
                      "max": 1,
                      "collapse": true,
                      "multiple_selection": false,
                      "attributes": [
                        {
                          "id": "18410955",
                          "name": "Șnițel de pui parizian",
                          "available": true,
                          "selected_by_default": false,
                          "price": "0.0"
                        },
                        {
                          "id": "18410962",
                          "name": "Snitel vienez",
                          "available": true,
                          "selected_by_default": false,
                          "price": "0.0"
                        },
                        {
                          "id": "18410986",
                          "name": "Strips",
                          "available": true,
                          "selected_by_default": false,
                          "price": "0.0"
                        },
                        {
                          "id": "18411018",
                          "name": "Snitel porc",
                          "available": true,
                          "selected_by_default": false,
                          "price": "0.0"
                        },
                        {
                          "id": "29146515",
                          "name": "Pulpa de pui la cuptor",
                          "available": true,
                          "selected_by_default": false,
                          "price": "0.0"
                        }
                      ]
                    },
                    {
                      "id": "28894887",
                      "name": "Alege garnitura",
                      "min": 1,
                      "max": 1,
                      "collapse": true,
                      "multiple_selection": false,
                      "attributes": [
                        {
                          "id": "28894978",
                          "name": "Cartofi wedges",
                          "available": true,
                          "selected_by_default": false,
                          "price": "0.0"
                        },
                        {
                          "id": "28895046",
                          "name": "Cartofi pai",
                          "available": true,
                          "selected_by_default": false,
                          "price": "0.0"
                        },
                        {
                          "id": "28895274",
                          "name": "Piure de cartofi",
                          "available": true,
                          "selected_by_default": false,
                          "price": "0.0"
                        },
                        {
                          "id": "28895291",
                          "name": "Orez cu legume",
                          "available": true,
                          "selected_by_default": false,
                          "price": "0.0"
                        }
                      ]
                    },
                    {
                      "id": "18411033",
                      "name": "Alege salata",
                      "min": 0,
                      "max": 1,
                      "collapse": true,
                      "multiple_selection": false,
                      "attributes": [
                        {
                          "id": "18411039",
                          "name": "Salată de varză",
                          "available": true,
                          "selected_by_default": false,
                          "price": "0.0"
                        },
                        {
                          "id": "18411049",
                          "name": "Castraveti murati",
                          "available": true,
                          "selected_by_default": false,
                          "price": "0.0"
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "name": "MIC DEJUN",
          "position": 2,
          "sections": [
            {
              "name": "MIC DEJUN",
              "position": 0,
              "products": [
                {
                  "id": "17862204",
                  "name": "Omletă cu ciuperci",
                  "price": "17.0",
                  "image_url": null,
                  "description": "",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18411120",
                  "name": "Omletă cu șuncă",
                  "price": "18.0",
                  "image_url": null,
                  "description": "",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18411136",
                  "name": "Omletă Artemis",
                  "price": "20.0",
                  "image_url": null,
                  "description": "",
                  "available": true,
                  "attribute_groups": [
                  ]
                }
              ]
            }
          ]
        },
        {
          "name": "CIORBE",
          "position": 3,
          "sections": [
            {
              "name": "CIORBE",
              "position": 0,
              "products": [
                {
                  "id": "18411225",
                  "name": "Ciorbă de legume",
                  "price": "20.0",
                  "image_url": null,
                  "description": "",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18411250",
                  "name": "Ciorbă de văcuță",
                  "price": "23.0",
                  "image_url": null,
                  "description": "",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18411265",
                  "name": "Ciorbă de burtă",
                  "price": "23.0",
                  "image_url": null,
                  "description": "",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18411275",
                  "name": "Ciorbă rădăuțeană",
                  "price": "23.0",
                  "image_url": null,
                  "description": "",
                  "available": true,
                  "attribute_groups": [
                  ]
                }
              ]
            }
          ]
        },
        {
          "name": "HAMBURGERI",
          "position": 4,
          "sections": [
            {
              "name": "HAMBURGERI",
              "position": 0,
              "products": [
                {
                  "id": "18411340",
                  "name": "Hamburger clasic",
                  "price": "45.0",
                  "image_url": null,
                  "description": "Carne de vită, roșii, ceapă, castraveți murați, sos de casă, brânză cheddar, cartofi pai 280 gr ",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18411376",
                  "name": "Hamburger cremă de brânză",
                  "price": "46.0",
                  "image_url": null,
                  "description": "Carne de vită, roșii, sos de gorgonzola, salată, brânză cheddar, sos de casă, cartofi pai cu parmezan și usturoi 280 g",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18411407",
                  "name": "Hamburger cu trufe",
                  "price": "49.0",
                  "image_url": null,
                  "description": "Carne de vită, rucolă, nuci, ulei de trufe, brânză cedar, cartofi pai cu parmezan și usturoi 280 g ",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18411423",
                  "name": "Hamburger ARTEMIS",
                  "price": "41.0",
                  "image_url": null,
                  "description": "",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18411436",
                  "name": "Double hamburger classic",
                  "price": "54.0",
                  "image_url": null,
                  "description": "2 bucăți de carne de vită, roșii, ceapă, castraveți murați, sos de casă, brânză cheddar, cartofi pai",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18411480",
                  "name": "Double hamburger ARTEMIS",
                  "price": "55.0",
                  "image_url": null,
                  "description": "2 bucăți de carne de vită, roșii, pancetta, ou, castraveți murați, sos de casă, cartofi pai cu parmezan și usturoi",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18411513",
                  "name": "Double hamburger cu cremă de brânză",
                  "price": "53.0",
                  "image_url": null,
                  "description": "2 bucăți carne de vită, roșii, cremă de brânză, salată, mozzarella, sos de casă, cartofi pai cu usturoi și parmezan",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18411539",
                  "name": "Double hamburger trufe",
                  "price": "58.0",
                  "image_url": null,
                  "description": "Carne de vită, rucola, nuci, maioneză cu ulei de trufe, brânză cheddar, cartofi pai cu usturoi și parmezan",
                  "available": true,
                  "attribute_groups": [
                  ]
                }
              ]
            }
          ]
        },
        {
          "name": "MENIURI COMPLETE ",
          "position": 6,
          "sections": [
            {
              "name": "MENIURI COMPLETE ",
              "position": 0,
              "products": [
                {
                  "id": "18411809",
                  "name": "Cripsy wings",
                  "price": "41.0",
                  "image_url": null,
                  "description": "",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18411842",
                  "name": "Chilli wings",
                  "price": "41.0",
                  "image_url": null,
                  "description": "",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18411867",
                  "name": "Strips cu susan",
                  "price": "41.0",
                  "image_url": null,
                  "description": "",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18411879",
                  "name": "Strips cu fulgi de porumb",
                  "price": "41.0",
                  "image_url": null,
                  "description": "",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18411919",
                  "name": "Crispy strips",
                  "price": "41.0",
                  "image_url": null,
                  "description": "",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18411950",
                  "name": "Cașcaval pane+ cartofi pai",
                  "price": "30.0",
                  "image_url": null,
                  "description": "150 g/250 g",
                  "available": true,
                  "attribute_groups": [
                  ]
                }
              ]
            }
          ]
        },
        {
          "name": "SALATE ",
          "position": 9,
          "sections": [
            {
              "name": "SALATE ",
              "position": 0,
              "products": [
                {
                  "id": "18412384",
                  "name": "Salată Bulgărească",
                  "price": "28.0",
                  "image_url": null,
                  "description": "",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18412404",
                  "name": "Salată Grecească",
                  "price": "30.0",
                  "image_url": null,
                  "description": "",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18412452",
                  "name": "Salată Grecească",
                  "price": "31.0",
                  "image_url": null,
                  "description": "",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18412468",
                  "name": "Salată asortată",
                  "price": "14.0",
                  "image_url": null,
                  "description": "",
                  "available": true,
                  "attribute_groups": [
                  ]
                }
              ]
            }
          ]
        },
        {
          "name": "DESERT",
          "position": 10,
          "sections": [
            {
              "name": "DESERT",
              "position": 0,
              "products": [
                {
                  "id": "18412522",
                  "name": "Clătite cu ciocolată",
                  "price": "18.0",
                  "image_url": null,
                  "description": "Făină, ou, lapte, ciocolată, zahăr 250 g",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18412549",
                  "name": "Clătite cu dulceață",
                  "price": "18.0",
                  "image_url": null,
                  "description": "Făină, ou, lapte, zahăr, dulceață 250 g ",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18412583",
                  "name": "Clătite cu Finetti, banane și Oreo",
                  "price": "23.0",
                  "image_url": null,
                  "description": "Făină, ou, lapte, zahăr, banane, biscuiți oreo 250 g",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18412618",
                  "name": "Clătite cu brânză de vaci, stafide",
                  "price": "26.0",
                  "image_url": null,
                  "description": "Făină, ou, lapte, brânză de vaci, zahăr, stafide, smântână 250 g",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18412651",
                  "name": "Papanași",
                  "price": "26.0",
                  "image_url": null,
                  "description": "Brânză de vaci, ou, zahăr, făină, smântână, dulceață 250 g ",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18412687",
                  "name": "Cheesecake Oreo",
                  "price": "28.0",
                  "image_url": null,
                  "description": "Unt, ou, zahăr, lapte, biscuiți oreo, sos de afine, cremă de brânză 250 g ",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18412699",
                  "name": "Colțunași cu brânză dulce",
                  "price": "27.0",
                  "image_url": null,
                  "description": "",
                  "available": true,
                  "attribute_groups": [
                  ]
                },
                {
                  "id": "18412714",
                  "name": "Colțunași cu smântână dulce",
                  "price": "27.0",
                  "image_url": null,
                  "description": "",
                  "available": true,
                  "attribute_groups": [
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

Json Structure Details

The OpenAPI documentation for menu update can be found here.

In addition to the OpenAPI documentation, below we present each section of the menu update payload.

Identification properties

Within the Glovo system, the fields "store_environment", "store_id", and "partner_name" are used to identify a partner and its associated Glovo store.

The "store_environment" field identifies the location of a store within the Glovo infrastructure. The store can be defined in either the "staging" or "production" environment, and the allowed values for this field are "prod" and "staging".

The "store_id" field represents the ID of the store in the Glovo system. Generally, this ID is formed by combining the "partner_name" and an alphanumeric string (partner_name__alphanumeric).

The "partner_name" field is the name of the partner or POS solution as defined in the Portal at the time of registration.

Super Categories (super_categories)

Super categories represent the highest level of organization of information within a Glovo store. Super categories are not mandatory. If there is at least one super category, a list of all super categories is displayed to customers when they open a store in the application. Otherwise, the collection is displayed as the main structure.

DIFFERENCES Compared to the previous version, in V3 a modification was introduced. The property "super_categories" is no longer an object but an Array. This allows for creating a complex hierarchical structure. In the examples section, various payload models and their results when applied to a test store can be seen. For backward compatibility, the payload can still be sent as in version V2, i.e., as an Object instead of an Array. This can also be observed in the examples section.

Categories (categories)

A category represents level 2 of the Glovo menu, in case super categories are used, or level 1 if super categories are optional. Having at least one category in your menu is mandatory. Each category is composed of sections and must have at least one section to contain other elements. Some examples of categories include: Beverages, Burgers, Salads, Desserts, Pasta.

Sections (sections)

Sections represent a level of organization below categories.

Products (products)

A product is the main component of the Glovo menu. Usually, it represents a physical product available in a store, although we provide stores with the flexibility to configure what they want to offer as products. Each product belongs to a section.

IMPORTANT Product IDs must be unique. There cannot be products with the same ID but different prices. For example, if we have Coca-Cola, which is sold for 1 leu when sold individually, but it is also part of a combo meal where it is sold for 0 lei, there must be 2 products defined with different IDs. One for individual sale and one for sale within the combo meal.

IMPORTANT * Product images must adhere to the following criteria:
* Orientation: square.
* Size: 1000 x 1000 px.
* Format: JPG.
* File size: < 1MB
* Background: light, solid or textured color
* Protocol: HTTPS
* Pictures must be hosted by the POS solution, must respond over the HTTPS protocol, and certificates must be valid and not expired.

Attribute Groups (attribute_groups)

Attribute groups allow the grouping of similar customizations into generic groups. Each attribute group can have a minimum and maximum number of options for the customer. Examples of attribute groups may include:

Sauces: an attribute group such as mayonnaise, mustard, or ketchup Beverages: an attribute group such as water, cola, or lemon

IMPORTANT Product IDs must be unique.

Attributes (attributes)

A product can be customized in various ways, such as adding mayonnaise, including a beverage, or adding extra meat. Each of these customizations is considered an attribute. It is not mandatory for a product to have attributes. Each attribute can have a different impact on the price. Similar attributes are grouped into attribute groups.

IMPORTANT Product IDs must be unique.

Allows uploading a menu and validating it according to the current JSON schema definition. You will receive either a "all-OK" message or a list of errors and a list of warnings that the menu would generate, along with error details.

The technical specification can be found here.

Store Update Check

For manually checking the status of an update operation, you can verify the information defined here.

Store elements update

Intro

Articles represent the products and attributes included in a store's menu. These resources allow you to perform individual or bulk operations to keep them updated regarding their price and availability.

Updating the elements of products and attributes can be done in several ways. For modifying products, you can refer to the documentation here.

For modifying attributes, you can refer to the documentation here. Additionally, bulk updating of attributes and products is possible, and you can find the related documentation here.

The Bulk Update operation is asynchronous. The result of the operation can be checked by calling the bulk check endpoint, the documentation of which can be found here.

Setting a store to busy mode

At the integration API level, the option to set a store to busy mode has been introduced. Details of the operation can be found here.

Changes Log

October 11, 2023

Regarding the notification structure sent to POS solutions, certain changes have been made to introduce new data fields. These fields include the following:

  1. Detailed Fees Collection: This collection provides detailed information about the fees that can be applied within Glovo systems. These fees can include:

- DeliveryFee: Represents the delivery fee that the customer incurs. This fee applies when the Glovo store is a marketplace type, and the delivery is carried out by the restaurant.

- MinimumBasketSurcharge: Represents the minimum fee paid for an order when the order value is below a certain threshold.

- ServiceFee: This is an additional service fee that can be activated and charged by Glovo to customers. This fee is initially collected by restaurants and later settled with Glovo.

  1. Glovo Discounts Collection: This is a newly introduced collection by Glovo and provides information about the discounts supported by Glovo for the products in the order. This information was previously inferred from raw data by the Appsmart ETL system and transmitted in the form of vouchers. This functionality will continue to exist for existing discount collections. The collection can include various types of discounts, such as:

- GlovoDiscount: This is the discount supported by Glovo for the products in the order.

- GlovoSupportedDeliveryFee: This discount represents a reduction calculated by the Appsmart ETL system and is not available in the raw data provided by Glovo's central systems. It should reflect situations where Glovo covers the delivery fee payment (DeliveryFee). This can also include cases where a customer is a Prime member and does not pay the delivery fee.

- Other: This category includes other types of discounts that are not explicitly provided by Glovo's central systems but can be calculated from raw data by the Appsmart ETL system. This may include situations where a customer partially pays for the order with Glovo points.

  1. Restaurant Discounts Collection: This collection contains information about the discounts supported by the restaurant.

  2. Products Total Field: This field contains the total value of the products in the order. Unlike the paymentTotal field, which may include additional information, products_total refers only to the total value of the products, without including any additional information.

  3. Product-Level Discount: Additionally, a discount field has been introduced at the level of each product in the order. This represents the discount applied at the product level. Product level discount will appear only in the case of Restaurant funded discounts. Glovo discounts do not appear at product level.

It's important to remember that the information is duplicated between the "detailed" and "non-detailed" collections. They should not be combined for calculations.

It's also important to note that not all the information listed on the Glovo receipt needs to be passed to the restaurant through integration.

February 05, 2024

Integrations Portal

Change Language

By default, the portal will likely load in Romanian language. To switch the language, access the "Limbă" option and select English from the dropdown menu.

ChangeLanguage

The process of activating an integration involves communication with a representative from Glovo who is responsible for enabling the integration for a specific Glovo Store. To facilitate and efficiently manage this communication, an integration portal has been created, which can be accessed at https://portal.integrations.cloud.onlineservice.io/.

Account Registration

Registering a new POS solution in the system involves accessing the registration link available at https://portal.integrations.cloud.onlineservice.io/register. The name of the POS solution can only contain letters and numbers, without spaces or other special characters. Additionally, the registration link can also be accessed from the integration portal, which is available in the account section of the menu.

Registration

After submitting the registration request, the administrator will receive a notification to activate the new account. Upon activation, the POS solution will receive the authentication details via email.

POS Contacts

After authentication, a message will appear notifying you that you need to define two contacts for the POS solution. Defining these contacts is necessary to perform operations in the system. The list of POS contacts is also available in the navigation bar.

POS Contacts

To add a new POS contact, select the "Adaugare contact" (Add contact) option.

Add contact

You must add at least 2 contacts.

Brand Management

Brands represent the main category of organization. A brand can have multiple defined locations. The brand can represent a physical restaurant, a virtual restaurant, or any other grouping of locations related to the same main category, the brand.

Access the "Operatiuni - Brand" (Operations - Brand) menu, and the page for adding brands will be opened. To add a brand, choose the "Adauga Brand" (Add Brand) option.

Add Brand

Enter the requested data and save the information.

Active Execution - If this checkbox is unchecked, the POS solution will no longer receive notifications for all stores defined at the brand level.

Active LAAS - This option marks the fact that LAAS integration will be activated for the defined brand. More details about LAAS can be found here.

Activating the LAAS option involves providing two additional pieces of information. The details can be found in the LAAS documentation.

LAAS

Location Management

After adding a brand, you can select the (View) option from the grid containing all the brands. In the view screen, you can add locations related to the brand.

List of Brands

After selecting the view option, the following screen will be displayed.

Location Management

The next step is to access the "Creare o noua locatie" (Create a new location) button in the bottom right corner.

Add Locations

Name: enter the name of the restaurant.

Pos Store ID: enter the ID (POS system ID of the location) without the POS solution indicator as it will be automatically completed in the field below.

NOTE: This ID can be any alphanumeric string as long as it is unique in the system.

Address: enter the address of the restaurant.

Active Menu Update as with the brand, receiving notifications for a specific location can be deactivated.

IMPORTANT: Integration Already Activated? This attribute is used for historical data entry. Checking this option will mark the location as already activated in Glovo, meaning that the Glovo team will not be notified of the activation of a new location.

After saving a new location, the Glovo team will be notified to carry out the activation in the Glovo systems. Once the activation in Glovo is done, the Glovo team will mark the location as active, and the POS solution will receive the location activation notification. At this point, the notifications can reach the POS.

POS API Key Management

IMPORTANT: The API key value is sent in the header Authorization to the defined endpoints.

Defining an API key is a necessary step before defining endpoints in the system for notifications about new orders, menu update results, or order cancellations. The API key definition procedure can be accessed through the "Profil-API Key-uri POS" (Profile-POS API Keys) menu.

List of API Keys

Choose the "Creare API Key POS" (Create POS API Key) option.

Create API Key

API Code - any code API Key - the value that will be sent in the Authorization header to the defined endpoints. Api Name - a descriptive name for the defined key Pos implementation - automatically selected from the existing POS solution

POS Endpoint Management

For endpoint management, access the "Profil - Endpoint-uri POS" (Profile - POS Endpoints) menu.

POS Endpoints

Next, choose the "Creare Endpoint POS" (Create POS Endpoint) option.

Create or Edit POS Endpoint

Name - endpoint name URL - endpoint URL Pos Implementation - auto-completed with the existing POS solution Pos Api Keys - select from the defined API keys Code - code for the endpoint

The types of POS endpoints that can be defined are:

Order notifications - notifications for new orders are sent to this type of endpoint.

Menu update result notifications - notifications with the result of the menu update operation are sent. (Under Development)

Canceled order notifications - canceled orders are sent to this type of endpoint.

Before saving, you can press the "Testeaza endpoint" (Test endpoint) button to verify the response received from the defined endpoint.

Multiple endpoints of the same type can be defined, but it should be noted that all notifications from the POS solution account will go to all the endpoints. If the POS solution needs to distribute its messages to multiple clients, this is done at the solution level. It exposes a single endpoint to Glovo, and distribution is handled at that endpoint level.

LAAS Portal

General Information

Laas is a courier rental service provided by Glovo. The OpenAPI integration documentation for Laas can be found here.

Laas is used for renting resources for orders coming from external channels as well as for orders coming from Glovo when the restaurant delivers with its own delivery personnel, a Marketplace-type restaurant. To facilitate the creation of LAAS orders that come through Glovo, a new functionality has been created, which is documented below.

Create new LAAS Prtners Account

If you don't already have an account created in LAAS Partners, you can follow the steps below. If you already have an existing account, you can proceed to step 7.

For LAAS integration, there are two environments:

  1. Testing environment (staging/sandbox)
  2. Production environment (for creating real orders)

To use this service, you need to create an account by following the steps below:

  1. Visit the URL https://laaspartners.testglovo.com (for testing) or https://laaspartners.glovoapp.com (for production).

img.png

  1. Click on 'Register' and fill in the fields for Name, Email, Password.

img.png

  1. In the next step, you need to fill in the company's information.

img.png

img.png

  1. After saving the data, your account will be in the 'Account under activation' state. After verifying the details, you will be notified via email.

img.png

  1. Once your account becomes active, you can log in to obtain integration credentials. Access the 'Settings' menu.

img_1.png

  1. On the right side of the page, access the 'API Access Data' menu and click the 'Renew Access Data' button.

img.png

  1. Access data will be deleted and regenerated each time you perform the renewal action.

img.png

  1. Save the access data (ApiKey and ApiSecret) in a secure location.

img.png

Completing LAAS Details in the Integration Portal.

The portal's address is here: https://portal.integrations.cloud.onlineservice.io/

If you don't have an account in the portal, follow the steps here. After an admin activates your account, you will receive an email with your login credentials. After your account has been created, don't forget that you need to create at least 2 contacts in the portal. More details here

The Integration Portal supports multiple ways of working with LAAS. These are detailed below.

Orders from External Glovo Channels

For orders coming from external channels, i.e., not through Glovo, LAAS activation is done by defining a new brand and entering the keys obtained in the previous steps at the brand level.

Menu - Operations - Brands

img.png

Since this Brand will work with LAAS orders, the 'Active LAAS' option should be checked, and the keys obtained in the previous steps should be entered.

img.png

IMPORTANT: If this brand is used only for LAAS orders and there is no need to send notifications to the restaurant's POS solution, uncheck the 'Active Execution' function.

Orders Through Glovo Channels Without Sending Order Notifications to POS

To make it easier to create records in LAAS Partners, a mechanism has been created to add them by clicking a button. To do this, follow these steps. Brand definition is done according to the previous step.

Once a Brand has been defined, a location for that Brand must be defined. The location represents the physical structure from where delivery orders can be picked up. IMPORTANT: The location address must be entered with great care because this is where order pickups will be made. An incorrect pickup address will hinder the delivery process.

To define a location for a brand, follow these steps.

  1. From the list of brands, select the 'View' option for the desired brand.

img.png

  1. In the 'Locations' section, choose the 'Create a New Location' option.

img.png

The location creation screen will open.

img.png

In this screen, enter the store details. Details can also be found in the documentation here.

If the Brand is marked for LAAS, additional information to be checked will appear on the screen. If we want to generate LAAS orders for this store, check the 'Available for LAAS' function. Without this function checked, orders will not be available for creation in LAAS.

If we also want to receive orders in the POS solution used by the restaurant, check the 'Available for order notifications' option. A Brand defined as LAAS that does not have the 'Available for order notifications' option checked will not receive order notifications in the POS solution. If a Brand is defined as LAAS but it is not desired to create LAAS orders for a location in the system, only the 'Available for order notifications' option can be kept checked without the 'Available for LAAS' option.

If the approach is to create LAAS orders from the integration portal and the above options are checked, after the location is activated in Glovo, which is done by the Glovo team, eligible LAAS orders can be viewed in the Operations -> LAAS Eligible Orders section.

img.png

The list will display the latest orders entered into the system that are available to be sent to LAAS Partners. Click the 'Create LAAS Order' option to open the order creation screen.

img.png

This screen provides some information taken from the Glovo order. One very important aspect is whether the payment selected by the customer in Glovo is CASH. In this case, when creating the order in LAAS Partners, the amounts to be collected from the customer must be entered. In this case, there are two value fields: 'Delivery Value' and 'Parcel Value'. The integration portal tries to calculate these amounts based on the information coming from Glovo, but they cannot be guaranteed due to various discounts and other factors that can complicate the determination of the payment amount by the customer. The displayed amounts are for informational purposes only; a human operator is responsible for validating them. Therefore, there is a checkbox 'I confirm that I check the values and they are correct.' without which the save button will not activate.

If there are differences between the displayed amounts and those calculated by a human operator, please report the issue by clicking the 'Report Amount Issue' option.

VERY IMPORTANT: Verify the amounts in the 'Delivery Value' and 'Parcel Value' fields to ensure they are correct. The responsibility for the correctness of the values lies with the person creating an order in LAAS.

If all the information is correct, you can click the 'Save' button, and this will create an order in LAAS Partners. The order is then tracked in LAAS Partners.

img.png

IMPORTANT: If you do not see the LAAS section in the portal, please request its activation.