Wolt.com $0.8๐ฐ URL | City Search | Restaurants and Menus
Pricing
from $0.80 / 1,000 results
Wolt.com $0.8๐ฐ URL | City Search | Restaurants and Menus
From $0.8/1K. Scrape Wolt restaurants and full menus at the city scale. Extract 60+ fields, including name, address, GPS, hours, ratings, tags, menus with images and prices, delivery zones, fees, minimum order, and merchant details. Supports city search or URL input with fast, rich output.
Pricing
from $0.80 / 1,000 results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
0
Bookmarked
16
Total users
5
Monthly active users
13 days ago
Last modified
Categories
Share
Wolt Restaurants Scraper
Pull restaurants and full menus from Wolt at city scale. Returns 60+ fields per venue: name, brand, address, GPS, phone, website, opening and delivery hours, ratings, food tags, full menu with images and prices, delivery polygon, fees, service-fee estimate, order minimum, tipping config, and the merchant legal block (DSA-compliant business_id and registered address). Two modes: search by city name, or paste Wolt URLs (single venue or city pages).
Why this scraper
- 60+ fields per venue, vs the 18 in the older Wolt scrapers on the Store
- Full menu surface: categories, items, images with blurhashes, original and discounted prices, deal flags, allergen and dietary tags, EU lowest-price disclosures, VAT, allowed delivery methods, weighted-item info, alcohol per mille, age-restriction flags
- Brand identity: brand_slug, brand_name, brand_logo image and blurhash for chain consolidation across cities
- Delivery polygon (full GeoJSON) for each venue, plus separate opening_times_schedule vs delivery_times_schedule
- Merchant legal block: registered name, business_id, full registered address, country (DSA-compliant)
- Fast and cheap: very low cost per venue at production scale
- Two modes: search by city or paste URLs, plus filters for cuisine, minimum rating, minimum review count
Data you get
Sample shape, values are illustrative placeholders, not from a live listing.
| Field | Example |
|---|---|
| venueId | 00000000000000000000000a |
| slug | sample-burger-place |
| name | Sample Burger Place |
| brandSlug | sample-burger |
| brandName | Sample Burger |
| brandLogoImage | https://imageproxy.wolt.com/mes-image/00000000-0000-0000-0000-000000000000/00000000-0000-0000-0000-000000000000 |
| brandLogoBlurhash | LKO2?V%2Tw=w]~RBVZRi};RPxuwH |
| coverImage | https://imageproxy.wolt.com/assets/000000000000000000000000 |
| coverBlurhash | jkSsmKKXhXhq;;KXJAKXHtlmJjKW |
| description | Best burgers in town. |
| address | Sample Street 1 |
| city | Helsinki |
| cityId | 0000000000000000000000aa |
| citySlug | helsinki |
| postCode | 00100 |
| countryCode | FIN |
| phone | +35800000000 |
| website | https://example.com |
| woltUrl | https://wolt.com/en/fin/helsinki/restaurant/sample-burger-place |
| latitude | 60.0000 |
| longitude | 24.0000 |
| timezone | Europe/Helsinki |
| currency | EUR |
| deliveryBasePrice | 199 |
| orderMinimum | 1000 |
| serviceFeeMin / Max / Percentage | 45 / 99 / 3 |
| isWoltPlus | true |
| ncdAllowed | true |
| isPickupFriendly | false |
| priceRange | 1 (1-4 wallet icons) |
| foodTags | ["burger", "fries"] |
| categories | [{name: "American", slug: "american", primary: true}] |
| rating / ratingScore / ratingVolume | 3 / 8.0 / 200 |
| workingHours | 7-day array of {day, formatted_times} |
| deliveryHours | 7-day array, separate from workingHours |
| deliveryGeoRange | full GeoJSON Polygon |
| tipping | {currency, tip_amounts, max, min, type} |
| merchant | {id, name, business_id, street_address, city, post_code, country} |
| digitalServicesAct | DSA-mandated legal disclosures |
| menuCategoryCount | 13 |
| menuItemCount | 96 |
| menuCategories | array of {id, slug, name, image, blurhash, itemCount, subcategoryCount} |
| menuItems | array of {id, categoryId, name, image, currentPrice, originalPriceCents, discounted, discountAmount, discountPercent, discountValidFrom, lowestPriceCents, dietaryPreferences, vatPercentage, ...} |
| primaryLanguage / availableLanguages | de / [{language, name, autotranslated}] |
| scrapedAt | 2026-01-01T00:00:00.000Z |
| changeType | NEW (incremental mode only โ see "Resume vs Incremental mode" below) |
| changedFields | ["deliveryBasePrice"] (incremental mode, UPDATED rows only) |
| firstSeenAt | 2026-01-01T00:00:00.000Z (incremental mode only) |
| lastSeenAt | 2026-01-02T00:00:00.000Z (incremental mode only) |
How to use
Find restaurants in one city
{"mode": "search","cities": ["Helsinki"],"fetchMenu": true,"maxVenues": 25}
Multi-city, cuisine filter, rating floor
{"mode": "search","cities": ["Helsinki", "Stockholm", "Berlin"],"primaryCategories": ["pizza", "italian"],"minRating": 8,"minRatingVolume": 50,"fetchMenu": true,"maxVenuesPerCity": 10,"maxVenues": 30}
Direct URLs (single venue)
{"mode": "url","urls": ["https://wolt.com/en/aut/graz/restaurant/kfc-graz","https://wolt.com/en/fin/helsinki/restaurant/sample-burger-place"],"fetchMenu": true}
Direct URLs (city pages, multi)
{"mode": "url","urls": ["https://wolt.com/en/aut/graz/restaurants","https://wolt.com/en/fin/helsinki/restaurants"],"fetchMenu": false,"maxVenues": 100}
Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| mode | string | search | search or url |
| cities | array of strings | ["Helsinki"] | City names or free-text places. Wolt's own city directory is matched first, anything else falls back to geocoding. Search mode only. |
| urls | array of strings | (empty) | Wolt venue or city URLs. URL mode only. |
| primaryCategories | array of strings | (empty) | Cuisine slugs (pizza, sushi, vegan, kebab, etc.). Empty = all. |
| minRating | integer 0-10 | (none) | Minimum venue score on the 0-10 scale. |
| minRatingVolume | integer | 0 | Minimum review count to include. |
| fetchMenu | boolean | true | Toggle full menu enrichment. Off = SERP-only, ~6x faster. |
| includeReviews | boolean | true | Toggle the rating, ratingScore, and ratingVolume fields in output. |
| language | string | en | ISO language code passed to Wolt for menu and venue text. |
| maxVenues | integer | 50 | Hard cap on total venues across the run. 0 = unlimited. |
| maxVenuesPerCity | integer | 0 | Per-city cap. 0 = unlimited per city. |
| resumeFromRunId | string | (none) | Continue ONE specific interrupted run โ see "Resume vs Incremental mode" below. |
| incrementalMode | boolean | false | Cross-run change detection for recurring/scheduled runs โ adds changeType (NEW/UPDATED/UNCHANGED/REAPPEARED/EXPIRED) to every row. See below. |
| stateKey | string | (auto) | Names an incremental-mode monitoring campaign. Leave empty to derive one automatically from cities/URLs/filters/menu settings. |
| emitUnchanged | boolean | false | Incremental mode only. Also return (and bill) venues that haven't changed since the last run. |
| emitExpired | boolean | false | Incremental mode only. Also return (and bill) venues no longer found, once a run fully scanned the tracked search. |
| proxyConfiguration | object | Apify default | Apify proxy settings. City search needs a residential exit: if the default proxy is refused, the actor retries that request over Residential, geo-targeted at the city's own country. Selecting Residential up front skips the refused first attempt. |
Resume vs Incremental mode
Two different things:
Resume (resumeFromRunId) continues ONE specific interrupted run. Paste a previous run ID or
dataset ID and this run skips venues already collected there, returning only the remaining new ones.
{ "mode": "search", "cities": ["Helsinki"], "maxVenues": 500, "resumeFromRunId": "PREVIOUS_RUN_ID" }
Incremental mode (incrementalMode) is for scheduling this actor daily/weekly against the SAME
search and getting only what changed โ the actor remembers the previous run itself, no run ID needed.
The first run returns everything as NEW. Later runs return only NEW, UPDATED, and REAPPEARED
venues by default; unchanged venues are suppressed (and not billed).
{ "mode": "search", "cities": ["Helsinki"], "incrementalMode": true }
Turn on emitUnchanged or emitExpired only when you also want those rows returned โ both bill extra
rows. State is isolated automatically per city/URL/filter/menu setup; set stateKey to name or
deliberately share a monitoring campaign.
Both features can combine: incrementalMode + resumeFromRunId bootstraps a fresh incremental
baseline from a large resumed pull. This only works when it's a genuinely first run for that state key;
if incremental state already exists, the run fails fast rather than silently mixing the two.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape โ the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record โ not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify โ Settings โ Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Output example
Sample shape, values are illustrative placeholders, not from a live listing.
{"venueId": "00000000000000000000000a","slug": "sample-burger-place","name": "Sample Burger Place","description": "Best burgers in town.","brandSlug": "sample-burger","brandName": "Sample Burger","brandLogoImage": "https://imageproxy.wolt.com/mes-image/00000000-0000-0000-0000-000000000000/00000000-0000-0000-0000-000000000000","brandLogoBlurhash": "LKO2?V%2Tw=w]~RBVZRi};RPxuwH","coverImage": "https://imageproxy.wolt.com/assets/000000000000000000000000","coverBlurhash": "jkSsmKKXhXhq;;KXJAKXHtlmJjKW","address": "Sample Street 1","city": "Helsinki","cityId": "0000000000000000000000aa","citySlug": "helsinki","postCode": "00100","countryCode": "FIN","phone": "+35800000000","website": "https://example.com","woltUrl": "https://wolt.com/en/fin/helsinki/restaurant/sample-burger-place","latitude": 60.0,"longitude": 24.0,"timezone": "Europe/Helsinki","currency": "EUR","deliveryMethods": ["homedelivery"],"deliveryBasePrice": 199,"deliveryBasePriceFormatted": "โฌ1.99","serviceFeeMin": 45,"serviceFeeMax": 99,"serviceFeePercentage": 3,"orderMinimum": 1000,"orderMinimumFormatted": "โฌ10.00","deliveryGeoRange": { "type": "Polygon", "coordinates": "..." },"isPickupFriendly": false,"isWoltPlus": true,"ncdAllowed": true,"groupOrderEnabled": true,"priceRange": 1,"foodTags": ["burger", "fries"],"categories": [{ "name": "American", "slug": "american", "primary": true }],"rating": 3,"ratingScore": 8,"ratingVolume": 200,"workingHours": [{ "day": "Monday", "formatted_times": "10:00-22:00" },{ "day": "Tuesday", "formatted_times": "10:00-22:00" }],"deliveryHours": [{ "day": "Monday", "formatted_times": "10:00-22:00" }],"tipping": {"currency": "EUR","tip_amounts": [100, 200, 500],"max_amount": 10000,"min_amount": 50,"type": "pre_tipping_amount"},"merchant": {"id": "0000000000000000000000ab","name": "Sample Operator GmbH","business_id": "FN 000000 a","street_address": "Sample Address 1","city": "Sample City","post_code": "00000","country": "Sample Country"},"digitalServicesAct": {"name": "Sample Operator GmbH","business_id": "FN 000000 a","address": "Sample Address 1, 00000 Sample City, Sample Country","self_certification": "...","report_item_url": "https://www.example.com/report"},"assortmentId": "00000000000000000000000b","primaryLanguage": "fi","selectedLanguage": "en","availableLanguages": [{ "language": "fi", "name": "Finnish", "autotranslated": false },{ "language": "en", "name": "English", "autotranslated": true }],"menuCategoryCount": 13,"menuItemCount": 96,"menuCategories": [{"id": "00000000000000000000000c","slug": "burgers-1","name": "Burgers","image": "https://wolt-menu-images-cdn.wolt.com/menu-images/.../sample.jpg","blurhash": "UkSFbBRj.Tx[sRjZW=WX%~odI9R+XAbIn#n$","itemCount": 7,"subcategoryCount": 0}],"menuItems": [{"id": "00000000000000000000000d","categoryId": "00000000000000000000000c","categoryName": "Burgers","categorySlug": "burgers-1","name": "Sample Burger","description": "Beef patty, lettuce, tomato.","image": "https://wolt-menu-images-cdn.wolt.com/menu-images/.../sample.jpg","blurhash": "UkSFbBRj.Tx[sRjZW=WX%~odI9R+XAbIn#n$","currency": "EUR","currentPrice": "EUR 9.90","currentPriceCents": 990,"originalPriceCents": 1090,"discounted": true,"discountAmount": 100,"discountPercent": 9,"lowestPriceCents": 990,"lowestPriceWindowDays": 30,"dietaryPreferences": [],"vatPercentage": 14,"tags": [],"allowedDeliveryMethods": ["homedelivery"],"isAlcohol": false,"isWoltPlusOnly": false}],"scrapedAt": "2026-01-01T00:00:00.000Z"}
Plan requirement
Wolt is open to public requests with no extra credentials needed, but the endpoint behind city search refuses datacenter addresses outright, so search mode needs an Apify Residential proxy (Starter plan or higher). The actor still starts on whatever proxy you configure and escalates to Residential only for a request that comes back refused, geo-targeted at the country of the city being searched; selecting Residential in proxyConfiguration up front avoids the wasted first attempt. URL mode for individual venues, and menus, work on the default proxy. Override any of this via the proxyConfiguration input field.