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
- Registration is done on the integration portal, details available here.
- Follow the steps to configure the account in the portal, details available here.
- Implement the integration API, details available here, here, here, and openapi.
- Follow the steps related to the Integration Portal, details here.
- Depending on the needs, LAAS function can also be implemented, details here.
API Integration Endpoints
- staging: https://staging.store-management.glovo.alb.app.onlineservice.io
- production: https://prod.store-management.glovo.alb.app.onlineservice.io
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
POS (Point of Sale) - These are software solutions used in restaurants to manage their internal flow, from taking orders to handling products and recipes.
Integration Middleware (API Integration) - This is the solution presented in this documentation that facilitates communication with the Glovo system.
Store - Represents a store in the Glovo application that can have multiple addresses and locations.
Store Environment - Represents the type of store, whether it is a testing (staging) store or a production store. It can have the values prod and staging.
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.
Menu Validation
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:
- 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.
- 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.
Restaurant Discounts Collection: This collection contains information about the discounts supported by the restaurant.
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.
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
- The introduction of busy model.
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.
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.
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.
To add a new POS contact, select the "Adaugare contact" (Add contact) option.
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.
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.
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.
After selecting the view option, the following screen will be displayed.
The next step is to access the "Creare o noua locatie" (Create a new location) button in the bottom right corner.
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.
Choose the "Creare API Key POS" (Create POS API Key) option.
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.
Next, choose the "Creare Endpoint POS" (Create POS Endpoint) option.
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:
- Testing environment (staging/sandbox)
- Production environment (for creating real orders)
To use this service, you need to create an account by following the steps below:
- Visit the URL https://laaspartners.testglovo.com (for testing) or https://laaspartners.glovoapp.com (for production).
- Click on 'Register' and fill in the fields for Name, Email, Password.
- In the next step, you need to fill in the company's information.
- After saving the data, your account will be in the 'Account under activation' state. After verifying the details, you will be notified via email.
- Once your account becomes active, you can log in to obtain integration credentials. Access the 'Settings' menu.
- On the right side of the page, access the 'API Access Data' menu and click the 'Renew Access Data' button.
- Access data will be deleted and regenerated each time you perform the renewal action.
- Save the access data (ApiKey and ApiSecret) in a secure location.
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
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.
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.
- From the list of brands, select the 'View' option for the desired brand.
- In the 'Locations' section, choose the 'Create a New Location' option.
The location creation screen will open.
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.
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.
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.
IMPORTANT: If you do not see the LAAS section in the portal, please request its activation.