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
14
Total users
4
Monthly active users
5 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. Datacenter is fine; residential is recommended for high volume. |
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. The Apify Free plan works on small runs. For high volume or repeated runs, switch the proxy to Apify Residential (Starter or higher). The actor uses the standard Apify proxy by default; override via the proxyConfiguration input field.