Wolt API endpoint
Returns restaurants and stores near a coordinate, optionally filtered by a keyword or browsed by category. With none of those, this reads Wolt's own plain location browse; with a query it uses Wolt's own keyword search across restaurant/store names, dishes, and cuisines; with a category it browses Wolt's own per-category listing (the same page a homepage cuisine tile links to) -- call /wolt/search/filters for the current, complete, location-scoped list of valid category values. category and query cannot be combined. A keyword search additionally accepts sort, product_line, and open_now; those three apply to keyword search only and return a 400 without query. Each result carries its slug (the value the restaurant and menu endpoints take), name, address, coordinates, tags, price range, rating, and delivery estimate; the two browse modes additionally carry each venue's own category ids. The response also carries is_serviceable, which says whether Wolt delivers to the requested coordinates at all: false means the coordinates are outside Wolt's delivery coverage, so the empty results list is a coverage answer rather than a no-matches answer. A keyword that simply matches nothing inside a covered area returns an empty list with is_serviceable true. Call /wolt/cities for the coordinates of every city Wolt operates in.
/wolt/searchQuery parameters:
latitude (required) — search center latitude, e.g. 60.1699.longitude (required) — search center longitude, e.g. 24.9384.query (optional) — keyword to search restaurant/store names, dishes, or cuisines by, e.g. pizza. With no query this reads Wolt's own plain location browse of nearby restaurants and stores; with a query it uses Wolt's own keyword search. Cannot be combined with category.category (optional) — Wolt category id to browse by instead of a keyword search, e.g. pizza, sushi, vegan, street_food. Call /wolt/search/filters for the current, complete, location-scoped list of valid values. Cannot be combined with query. A value Wolt does not recognize at all returns a 404; a real category that this particular market does not use returns an empty restaurants list, since the category taxonomy is location-scoped and markets differ.limit (optional) — max restaurants/stores returned. Defaults to 30, maximum 100. Wolt's own plain browse has no pagination of its own and can return 1000+ results for a dense city in one call, so this endpoint truncates client-side; total_results in the response still reports the full count Wolt returned before truncation.sort (optional) — result ordering. One of recommended, distance, rating, delivery_fee, delivery_estimate. Requires query.product_line (optional) — store-type filter. One of restaurant, grocery, alcohol, pharmacy, pet_supply, health_and_beauty, electronics, toys_games_and_kids, home_and_diy, florist, general_merchandise, gift_card, charity, subscription, other. Requires query.open_now (optional) — when true, restrict results to venues currently delivering. Requires query.sort, product_line, and open_now apply to a keyword search only. This is an upstream limitation: Wolt exposes sorting and filtering on its keyword search, while the plain browse and category listings have no such mechanism at all and silently ignore a sort parameter. Passing any of the three without query returns a 400 rather than silently dropping it, and an unrecognized sort or product_line value also returns a 400 rather than being silently ignored the way Wolt itself would.
A coordinate or keyword with no matches returns an empty restaurants list, not an error — is_serviceable (below) is what tells the two apart. Supplying both query and category returns a 400.
product_line distinguishes a restaurant (restaurant) from the various kinds of retail store Wolt carries. Which store types a market actually stocks varies widely by country — some markets offer only restaurant and grocery, others most of the list — so a store type that market does not have returns no results rather than an error. Results are unfiltered by store type when the parameter is omitted.
Response includes query (only present when a keyword was supplied), category (only present when a category was supplied), sort/product_line/open_now (each only present when that filter was applied), total_results, and restaurants[]. Each restaurant has id, slug, name, address, city, country, currency, product_line, short_description, tags[], price_range (an integer tier, e.g. 1-4), rating_score (0-10), rating_count, estimate_minutes, estimate_range (a display string, e.g. 10-20), online, delivers, image_url, latitude/longitude (the venue's own coordinates), and categories[] (the venue's own Wolt category ids, in exactly the taxonomy this endpoint's category parameter and /wolt/search/filters accept -- a different, machine-readable vocabulary from the free-text tags[] display list). Wolt only returns categories[] on its two browse modes (no query, or category set); a keyword search omits it.
| Field | Filled in, of 30 checked | Values in the sample |
|---|---|---|
| id | 30 | |
| slug | 30 | |
| name | 30 | “Kotipizza Kamppi” and 29 other values |
| address | 30 | |
| country | 30 | FIN in all 30 |
| currency | 30 | EUR in all 30 |
| product_line | 30 | restaurant in all 30 |
| short_description | 30 | “Kuuma, kuumempi, Kotipizza” and 28 other values |
| tags | 30 | median 3 entries |
| price_range | 30 | 1 to 3, median 2 |
| rating_score | 30 | 8 to 9.4, median 8.8 |
| rating_count | 30 | 16 to 1,711, median 344 |
| estimate_minutes | 30 | 15 to 35, median 25 |
| estimate_range | 30 | 20-30 (12), 25-35 (7), 15-25 (6) and 2 more |
| online | 30 | true in 30 of 30 |
| delivers | 30 | true in 30 of 30 |
| image_url | 30 | imageproxy.wolt.com |
| latitude | 30 | |
| longitude | 30 | |
| categories | 30 | median 4 entries |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| latitude | number | Yes | Search center latitude | 60.1699 | |
| longitude | number | Yes | Search center longitude | 24.9384 | |
| query | string | No | Optional keyword to search restaurant/store names, dishes, or cuisines by. Cannot be combined with category. | pizza | |
| category | string | No | Optional Wolt category id to browse by instead of a keyword search, e.g. pizza, sushi, vegan. Call /wolt/search/filters for the current, complete, location-scoped list of valid values. Cannot be combined with query. A value Wolt does not recognize at all returns a 404; a real category this particular market does not use returns an empty list, since the taxonomy is location-scoped and markets differ. | pizza | |
| limit | integer | No | 30 | Max restaurants/stores returned. Defaults to 30, maximum 100. | 30 |
| sort | string | No | Optional result ordering. Only applies together with query -- Wolt exposes sorting on its keyword search only, not on its plain browse or category listings. Allowed values: recommended, distance, rating, delivery_fee, delivery_estimate. | rating | |
| product_line | string | No | Optional store-type filter. Only applies together with query. Which store types a market actually stocks varies by country; one absent from the searched market returns no results rather than an error. Allowed values: restaurant, grocery, alcohol, pharmacy, pet_supply, health_and_beauty, electronics, toys_games_and_kids, home_and_diy, florist, general_merchandise, gift_card, charity, subscription, other. | restaurant | |
| open_now | boolean | No | When true, restrict results to venues currently delivering. Only applies together with query. | true | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/wolt/search?latitude=60.1699&longitude=24.9384&query=coffee&limit=10&sort=recommended&product_line=restaurant&open_now=true" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"total_results": 1097,
"restaurants": [
{
"id": "5ae605a7349077000b1f5ef4",
"slug": "mcdonalds-forum-katutaso",
"name": "McDonald's Helsinki Forum Katutaso",
"address": "Mannerheimintie 16",
"country": "FIN",
"currency": "EUR",
"product_line": "restaurant",
"short_description": "I'm lovin' it",
"tags": [
"hamburger",
"salad",
"wrap"
],
"price_range": 1,
"rating_score": 8.2,
"rating_count": 1858,
"estimate_minutes": 15,
"estimate_range": "10-20",
"online": true,
"delivers": true,
"image_url": "https://imageproxy.wolt.com/assets/67332fcc40111921ceedb4f4",
"latitude": 60.16883307,
"longitude": 24.93949592,
"categories": [
"burgers",
"american"
]
}
],
"is_serviceable": true
}
}Request schema
No body schema
Response schema
#/definitions/wolt.searchResponseDoc
| 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.SearchResponse | No | ||||
| data.category | string | No | ||||
| data.is_serviceable | boolean | No | IsServiceable reports whether Wolt delivers to the requested coordinates at all. False means the coordinates are outside Wolt's delivery coverage, so an empty restaurants list is a coverage answer rather than a no-matches answer. True with an empty list means the location is served but nothing matched. Always present: all three search modes -- plain browse, keyword search, and category browse -- answer it definitively. | |||
| data.open_now | boolean | No | ||||
| data.product_line | string | No | ||||
| data.query | string | No | ||||
| data.restaurants | array | No | ||||
| data.restaurants[].address | string | No | ||||
| data.restaurants[].categories | array | No | Categories are the venue's own category ids, in the same taxonomy /wolt/search's category parameter and /wolt/search/filters use. This is a machine-readable vocabulary, distinct from Tags's free-text display list. Only the two browse modes carry it; a keyword search omits it. | |||
| data.restaurants[].city | string | No | ||||
| data.restaurants[].country | string | No | ||||
| data.restaurants[].currency | string | No | ||||
| data.restaurants[].delivers | boolean | No | ||||
| data.restaurants[].estimate_minutes | integer | No | ||||
| data.restaurants[].estimate_range | string | No | ||||
| data.restaurants[].id | string | No | ||||
| data.restaurants[].image_url | string | No | ||||
| data.restaurants[].latitude | number | No | Latitude/Longitude are the venue's own coordinates. | |||
| data.restaurants[].longitude | number | No | ||||
| data.restaurants[].name | string | No | ||||
| data.restaurants[].online | boolean | No | ||||
| data.restaurants[].price_range | integer | No | ||||
| data.restaurants[].product_line | string | No | ||||
| data.restaurants[].rating_count | integer | No | ||||
| data.restaurants[].rating_score | number | No | ||||
| data.restaurants[].short_description | string | No | ||||
| data.restaurants[].slug | string | No | ||||
| data.restaurants[].tags | array | No | ||||
| data.sort | string | No | ||||
| data.total_results | integer | No | ||||
| 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/search?latitude=60.1699&longitude=24.9384&query=coffee&limit=10&sort=recommended&product_line=restaurant&open_now=true" \
-H "x-api-key: $CRAWLORA_API_KEY"