Glovo API endpoint
Returns the first page of up to 50 stores from a city's category, in Glovo's own ranking, optionally narrowed to one cuisine or type filter. total_entries reports how many stores match in the city; only the first page is reachable without logging in (Glovo's server-rendered list ignores paging parameters), so use filter_id to reach other subsets. A category_id the city does not list, or a filter_id the category does not offer, returns a 404; a real category with no matching stores returns an empty list. The ranking and each store's distance are relative to the city's default point and can change between calls. Each store carries its id and address_id, which the store, menu and products endpoints take, plus its rating label, delivery estimate, delivery fee, promotions and open status.
/glovo/storestotal_entries is how many stores match in the city (for example 1,539 food stores in Madrid). Only the first page is reachable without logging in: Glovo's server-rendered list ignores page and offset, and its paginated store-wall API is not available anonymously. Use filter_id (from /glovo/stores/filters) to reach other subsets. Ranking and each store's distance are relative to the city's default point and can change between calls.
A category_id the city does not list, or a filter_id the category does not offer, returns a 404; a real category with no matching stores (for example a non-store category such as package delivery) returns an empty stores list. Glovo itself renders an empty page for ids it does not know, so the service checks the id against the city's categories and the page's own filter list before returning an empty result.
Each store carries id and address_id (the values /glovo/store, /glovo/store/menu and /glovo/store/products take), slug, name, tag, the rating label and vote-count label, eta, distance, delivery fee labels and amount, promotions[], status, and is_new, is_top_rated and sponsored flags.
Query parameters: country (required), city (required), category_id (required), filter_id (optional), limit (optional, default and maximum 50), language (optional, default en).
| Field | Filled in, of 40 checked | Values in the sample |
|---|---|---|
| id | 40 | |
| address_id | 40 | |
| slug | 40 | |
| name | 40 | “VICIO” and 39 other values |
| tag | 40 | “American” and 18 other values |
| rating | 40 | “90%” and 11 other values |
| rating_votes | 26 | “(500+)” and 20 other values |
| eta | 40 | 30-40 min in all 40 |
| distance | 40 | <100m in all 40 |
| delivery_fee | 40 | Free in all 40 |
| base_delivery_fee | 40 | 0,19 € (27), 0,49 € (8), 2,99 € (1) and 4 more |
| free_delivery | 40 | true in 40 of 40 |
| delivery_fee_amount | 39 | 0.19 to 3.5, median 0.19 |
| currency | 40 | EUR in all 40 |
| status | 40 | SCHEDULEABLE (19), CLOSED (18), OPEN (3) |
| is_new | 40 | true in 0 of 40 |
| is_top_rated | 40 | true in 2 of 40 |
| sponsored | 40 | true in 0 of 40 |
| promotions | 13 | median 1 entry |
| rank_position | 39 | 1 to 39, median 20 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| country | string | Yes | Two-letter country code, from /glovo/cities. | es | |
| city | string | Yes | City slug (madrid) or city code (mad), from /glovo/cities. | madrid | |
| category_id | integer | Yes | Store category id, from /glovo/categories. | 1 | |
| filter_id | integer | No | Optional cuisine or type filter id, from /glovo/stores/filters for the same country, city and category_id. | 34701 | |
| limit | integer | No | 50 | Max stores returned from the page. Defaults to 50, maximum 50. | 50 |
| language | string | No | en | Optional two-letter response language; defaults to en. A city's supported languages are in /glovo/city's supported_languages. | en |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/glovo/stores?country=es&city=madrid&category_id=1&limit=10&language=en" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"country": "es",
"city": "madrid",
"city_code": "mad",
"category_id": 1,
"filter_id": 34701,
"total_entries": 132,
"returned": 1,
"stores": [
{
"id": 2066,
"address_id": 182787,
"slug": "100-montaditos-madrid",
"name": "100 Montaditos",
"tag": "Pizza",
"rating": "100%",
"rating_votes": "(10)",
"eta": "30-40 min",
"distance": "<100m",
"delivery_fee": "Free",
"base_delivery_fee": "0,99",
"free_delivery": true,
"delivery_fee_amount": 0.99,
"currency": "EUR",
"status": "OPEN",
"is_new": false,
"is_top_rated": false,
"sponsored": false,
"rank_position": 2
}
]
}
}Request schema
No body schema
Response schema
#/definitions/glovo.storesResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | Code is the HTTP status code or a custom code used to indicate the result of the request @example 200 | |||
| data | glovo.StoresResponse | No | ||||
| data.category_id | integer | No | ||||
| data.city | string | No | ||||
| data.city_code | string | No | ||||
| data.country | string | No | ||||
| data.filter_id | integer | No | ||||
| data.returned | integer | No | ||||
| data.stores | array | No | ||||
| data.stores[].address_id | integer | No | ||||
| data.stores[].base_delivery_fee | string | No | ||||
| data.stores[].currency | string | No | ||||
| data.stores[].delivery_fee | string | No | ||||
| data.stores[].delivery_fee_amount | number | No | ||||
| data.stores[].distance | string | No | ||||
| data.stores[].eta | string | No | ||||
| data.stores[].free_delivery | boolean | No | ||||
| data.stores[].id | integer | No | ID and AddressID are the values /glovo/store, /glovo/store/menu and /glovo/store/products take as store_id and address_id. | |||
| data.stores[].is_new | boolean | No | ||||
| data.stores[].is_top_rated | boolean | No | ||||
| data.stores[].name | string | No | ||||
| data.stores[].promotions | array | No | ||||
| data.stores[].promotions[].benefit | string | No | ||||
| data.stores[].promotions[].description | string | No | ||||
| data.stores[].promotions[].type | string | No | ||||
| data.stores[].rank_position | integer | No | ||||
| data.stores[].rating | string | No | Rating is Glovo's percentage label (for example "100%") and RatingVotes its count label (for example "(10)"); both are empty for a store with no ratings yet. | |||
| data.stores[].rating_votes | string | No | ||||
| data.stores[].slug | string | No | ||||
| data.stores[].sponsored | boolean | No | ||||
| data.stores[].status | string | No | ||||
| data.stores[].tag | string | No | ||||
| data.total_entries | integer | No | TotalEntries is how many stores match in the city. Only the first page of up to 50 is reachable anonymously; narrow with filter_id to reach others. | |||
| msg | unknown | No | Msg is the message that describes the result of the request @example "Request successful" |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/glovo/stores?country=es&city=madrid&category_id=1&limit=10&language=en" \
-H "x-api-key: $CRAWLORA_API_KEY"