Wolt Restaurant Menu Scraper
Pricing
from $1.00 / 1,000 results
Wolt Restaurant Menu Scraper
Scrape Wolt restaurants, grocery stores and full menus with prices across 961 cities in 30 countries. Search by keyword, list a whole city, or pull menus from venue URLs. Every item carries its venue, category, dietary labels and VAT. Clean JSON, no browser.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Banea Teodor
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
8 days ago
Last modified
Categories
Share
Wolt Restaurant & Menu Scraper
Extract restaurants, full menus and live prices from Wolt across 961 cities in 30 countries. Search venues by keyword, pull everything that delivers to a location, or hand it venue URLs and get every menu item with its price, dietary labels and VAT. Output is flat, typed JSON, ready for a spreadsheet or a pricing pipeline.
Why use this Actor?
- Real menu prices, not estimates. Every item comes with its price in major currency units, the currency code, the pre-discount price when something is on offer, VAT percentage, and the unit price for retail items.
- Dietary and allergen labels included. Vegan, gluten-free and the rest come straight through, so you can slice a market by dietary segment without inferring anything from item names.
- EU price-transparency field. Where Wolt publishes it,
lowestPricecarries the lowest price in the last 30 days, which is what the Omnibus directive asks retailers to show. - Menu rows carry their venue. Each item includes the venue it belongs to, with its city, country, address and rating, so a single export answers "what does every sushi place in this city charge, and how well is it rated" with no joining.
- Fast and cheap. No browser. The Actor talks to Wolt's own JSON API, so a city venue list is one request and a complete restaurant menu is one more.
- A schema that matches our Bolt Food scraper. Venue and menu fields use the same names and units across both platforms, so you can stack them in one table and compare like for like.
Coverage
961 cities across 30 countries, read live from Wolt's own city list at the start of every run, so new cities work the day Wolt adds them. The largest markets:
| Country | Cities | Country | Cities |
|---|---|---|---|
| Finland | 109 | Croatia | 36 |
| Germany | 79 | Romania | 35 |
| Greece | 79 | Serbia | 31 |
| Slovakia | 78 | Kazakhstan | 27 |
| Denmark | 71 | Israel | 25 |
| Hungary | 66 | Poland | 25 |
| Czechia | 61 | Slovenia | 18 |
| Norway | 58 | Lithuania | 16 |
| Sweden | 51 | Latvia | 14 |
Plus Azerbaijan, Georgia, Albania, Austria, Estonia, Bulgaria, Iceland, Cyprus, Luxembourg, North Macedonia, Kosovo and Malta. City names are matched ignoring case and accents.
The three modes
| Mode | What you give it | What you get |
|---|---|---|
| Search venues by keyword | Search terms + a location | Venues matching each term, with ratings, fees and ETAs |
| Browse city discovery page | A location | The venues Wolt surfaces for that city |
| Venue URLs → full menus | Wolt venue page URLs | Every menu item of those venues, with prices |
Turn on Include full menus in the first two modes to get menu items instead of venue rows. Each menu row then carries the venue it came from, so nothing is lost by not receiving a separate venue list.
Grocery stores need one extra switch. Wolt Market and similar large venues keep their catalog behind category pages, so a normal menu request returns nothing at all for them. Turn on Expand large store catalogs to walk those pages, up to 60 per store. A run without it warns you by name when it hits such a venue, so a partial result is never presented as a complete one. Restaurants never need it.
What does it cost?
You pay per result, plus the Apify platform usage the run consumes. Current rates are on this Actor's page in the Apify Store.
Nothing is capped by default, so a run returns everything it finds. Use these to size one:
| What you want | Settings | Results |
|---|---|---|
| Quick look | Search pizza, Helsinki, max 10 venues | 10 venues |
| Venues in a city | Discovery, Helsinki | ~200 venues |
| Menus of 25 restaurants | Discovery + menus, max 25 venues | ~5,000 items |
| One grocery store's catalog | Venue URL + expand catalogs | ~1,000+ items |
| One competitor's full menu | Venue URLs, 1 URL | ~200 items |
Set Maximum results for a hard ceiling on how many results a run can produce. Maximum venues and Maximum menu items per venue narrow it further. All three are optional and default to no limit.
Input
| Field | Type | Description |
|---|---|---|
mode | select | search, discovery, or venueUrls |
searchQueries | string[] | Keywords, e.g. ["pizza", "sushi"] (search mode) |
venueUrls | URL[] | Wolt venue pages (venueUrls mode) |
city | string | City name, e.g. Helsinki |
latitude / longitude | string | Exact point; overrides city |
includeMenus | boolean | Also scrape every venue's full menu |
expandCatalogs | boolean | Walk category pages so grocery stores return items |
language | string | Language for menu text, e.g. en, fi, de |
maxVenues | integer | Optional cap on venues; 0 (default) = no limit |
maxMenuItemsPerVenue | integer | Optional cap per venue; 0 (default) = the whole menu |
maxItemsTotal | integer | Optional hard ceiling on results; 0 (default) = no limit |
maxConcurrency, maxRequestsPerMinute | integer | Speed limits; the defaults suit every mode |
Example input
{"mode": "search","searchQueries": ["pizza", "sushi"],"city": "Helsinki","includeMenus": true}
That scrapes the full menu of every pizza and sushi venue in Helsinki. Add "maxVenues": 25 or
"maxItemsTotal": 3000 if you want to bound it.
Output
Menu items and venues each have a fixed set of fields. A field with no value is null rather than
missing, so every row has the same shape and CSV exports never shift columns.
Menu item
{"venueId": "59437df72673d01cc5ff4a1f","venueSlug": "uuno-jatkasaari","venueName": "Uuno Jätkäsaari","url": "https://wolt.com/en/fin/helsinki/restaurant/uuno-jatkasaari","venueCity": "helsinki","venueCountry": "FIN","venueAddress": "Atlantinkatu 20 B","venueRating": 9.4,"searchQuery": "pizza","itemId": "6512e0f4a1b2c3d4e5f60718","name": "Margherita","description": "Tomato, mozzarella, basil","categoryName": "Pizza","price": 12,"originalPrice": null,"lowestPrice": null,"isDiscounted": false,"currency": "EUR","vatPercentage": 14,"unitInfo": null,"unitPrice": null,"dietaryPreferences": ["vegetarian"],"isWoltPlusOnly": false,"optionGroupCount": 2,"language": "en","isAutotranslated": false,"scrapedAt": "2026-08-24T11:20:00.000Z","runId": "oTj3oUFU2hecG69aZ"}
Venue
{"venueId": "5c3f4d1e8f2a4b0001a2b3c4","slug": "makikupla","name": "Mäkikupla","url": "https://wolt.com/en/fin/helsinki/restaurant/makikupla","city": "helsinki","country": "FIN","currency": "EUR","address": "Torkkelinkatu 2","latitude": 60.187,"longitude": 24.951,"ratingScore": 9.2,"ratingVolume": 500,"priceRange": 2,"online": true,"delivers": true,"deliveryEstimateMinutes": 30,"deliveryEstimateRange": "25-35","deliveryBasePrice": 1.49,"tags": ["pizza"],"imageUrl": "https://imageproxy.wolt.com/venue/...","source": "discovery","searchQuery": null,"scrapedAt": "2026-08-24T11:20:00.000Z","runId": "oTj3oUFU2hecG69aZ"}
Where things land
Everything goes to the run's default dataset, and that is the only dataset the Actor writes. Each row there is one result. Which row type you get depends on the mode: menu items when menus are scraped, venue records otherwise. Never a mix, so one export is always one shape.
Failed requests are reported in the run log with their URL, label and reason.
Prices are numbers in major currency units (12 for €12.00, converted from the minor units Wolt
returns) with the currency in a separate field, never a formatted string you have to parse. Ratings
are on Wolt's 0–10 scale.
Tips and tricks
- Track prices over time with
venueId+itemId. Join runs on that pair to get a clean price history per dish, and userunIdto keep merged exports separable. - Use several search terms. Wolt's search returns up to about 100 venues per query and has no
pagination, so
["pizza", "burger", "sushi", "vegan"]covers far more of a city than one term. Venues are de-duplicated across queries, so you are never charged twice for the same venue. - Watch
isAutotranslated. Wolt machine-translates menus into the language you ask for. If you are comparing item names across markets, that flag tells you which text is original. - Set
maxItemsTotaldeliberately. It is the hard ceiling on a run. Leaving it at0means the run returns everything it finds.
Notes and limits
- Only public data is collected: the same venue, menu and price information any visitor sees on wolt.com. No login and no personal data.
- Runs go through Apify Proxy datacenter IPs, which Wolt's API serves normally.
- Menus reflect what is orderable at the moment of the run. Large Wolt Market venues serve their
catalog as category pages rather than one response; enable
expandCatalogsfor those, and the run warns by name for any venue it had to leave partial. - Wolt gates some of its older endpoints on an app version. This Actor uses the endpoints wolt.com itself consumes, but if every request starts failing at once, that is the likely cause. Please open an issue and it will be updated.
Support
Found a bug or need another field? Open an issue on the Actor's Issues tab.