Wolt API endpoint
Returns one restaurant/store's menu grouped into categories, plus its restaurant summary. Each item carries a name, description, price, dietary tags, and image, read from Wolt's own anonymous menu API in a single call. The response's loading_strategy field reports whether the items are included: full means every category carries its items, while partial means Wolt does not bulk-load this venue's assortment, so the categories come back real but with empty item lists and the venue's items are reachable only by keyword through /wolt/restaurant/menu/search. Large stores of any type -- supermarkets, pharmacies, drugstores, DIY and toy stores -- are commonly partial; restaurants are full.
/wolt/restaurant/menuQuery parameters:
slug (required) — Wolt restaurant/store slug, from /wolt/search's slug field, e.g. mcdonalds-forum-katutaso. Same validation as /wolt/restaurant.An unrecognized slug returns a 404.
Response includes restaurant (the same shape /wolt/restaurant returns), loading_strategy, and categories[]. Each category has name, subcategory (only present when this entry is a flattened subcategory of a parent category — name still names the parent), and items[]. Each item has name, description, price (in the restaurant's major currency unit, e.g. euros — converted from Wolt's own minor-unit, e.g. cents, price field), original_price (only present when the item has a discount), dietary_preferences[] (e.g. vegan, vegetarian, gluten_free, halal, kosher, lactose_free, only present when Wolt's own item tags include one), tags[] (e.g. Popular), image_url, and -- for packaged retail products only -- barcode_gtin (the product's GTIN/EAN barcode), unit_info (the pack size, e.g. 1 l), and unit_price (the comparison price, with price, base, and unit). Restaurant dishes carry none of those last three.
full — every category below carries its items.partial — Wolt does not bulk-load this venue's assortment. The categories are real, but every one of them comes back with an empty items list, and the venue's items are reachable only by keyword through /wolt/restaurant/menu/search. Wolt itself only loads such an assortment a slice at a time, so its own single-call menu endpoint has nothing to resolve.Large stores of any type are commonly partial — supermarkets, pharmacies, drugstores, DIY stores and toy stores all are — while restaurants are full. This does not track product_line: an electronics, alcohol or florist store can be full. Read loading_strategy rather than inferring it from the venue's type, and treat a partial venue's empty categories as a pointer to /wolt/restaurant/menu/search, not as an empty menu.
| Field | Filled in, of 7 checked | Values in the sample |
|---|---|---|
| day | 7 | “Monday” and 6 other values |
| formatted_times | 7 | All day in all 7 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| slug | string | Yes | Wolt restaurant/store slug, from /wolt/search's slug field | mcdonalds-forum-katutaso | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/wolt/restaurant/menu?slug=mcdonalds-forum-katutaso" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"restaurant": {
"id": "5ae605a7349077000b1f5ef4",
"slug": "mcdonalds-forum-katutaso",
"name": "McDonald's Helsinki Forum Katutaso",
"currency": "EUR"
},
"loading_strategy": "full",
"categories": [
{
"name": "Hampurilaiset",
"items": [
{
"name": "Big Mac",
"description": "Two beef patties.",
"price": 4.95,
"tags": [
"Popular"
],
"image_url": "https://wolt-menu-images-cdn.wolt.com/menu-images/5adee2ab5a5917000f1f1140/example.png"
}
]
}
]
}
}Request schema
No body schema
Response schema
#/definitions/wolt.menuResponseDoc
| 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 | wolt.MenuResponse | No | ||||
| data.categories | array | No | ||||
| data.categories[].items | array | No | MenuItem record, 14 fields: barcode_gtin, description, dietary_preferences, id, image_url, name, original_price, price, tags, unit_info, unit_price. Described under Wolt Restaurant Menu Search API. | |||
| data.categories[].name | string | No | ||||
| data.categories[].subcategory | string | No | ||||
| data.loading_strategy | string | No | LoadingStrategy reports whether this venue's items are included. "full" means every category below carries its items. "partial" means Wolt does not bulk-load this venue's assortment: the categories are real but every one of them comes back with an empty items list, and the venue's items are reachable only by keyword through /wolt/restaurant/menu/search. Large stores of any kind -- supermarkets, pharmacies, drugstores, DIY and toy stores -- are commonly "partial"; restaurants are "full". | |||
| data.restaurant | wolt.RestaurantResponse | No | RestaurantResponse record, 42 fields: address, brand_name, brand_slug, categories, city, city_id, country, currency, delivery_base_price, delivery_methods, delivery_times, description and 23 more. Described under Wolt Restaurant API. | |||
| 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/wolt/restaurant/menu?slug=mcdonalds-forum-katutaso" \
-H "x-api-key: $CRAWLORA_API_KEY"