Wolt Restaurant Menu Scraper avatar

Wolt Restaurant Menu Scraper

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Wolt Restaurant Menu Scraper

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

Banea Teodor

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

8 days ago

Last modified

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, lowestPrice carries 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:

CountryCitiesCountryCities
Finland109Croatia36
Germany79Romania35
Greece79Serbia31
Slovakia78Kazakhstan27
Denmark71Israel25
Hungary66Poland25
Czechia61Slovenia18
Norway58Lithuania16
Sweden51Latvia14

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

ModeWhat you give itWhat you get
Search venues by keywordSearch terms + a locationVenues matching each term, with ratings, fees and ETAs
Browse city discovery pageA locationThe venues Wolt surfaces for that city
Venue URLs → full menusWolt venue page URLsEvery 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 wantSettingsResults
Quick lookSearch pizza, Helsinki, max 10 venues10 venues
Venues in a cityDiscovery, Helsinki~200 venues
Menus of 25 restaurantsDiscovery + menus, max 25 venues~5,000 items
One grocery store's catalogVenue URL + expand catalogs~1,000+ items
One competitor's full menuVenue 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

FieldTypeDescription
modeselectsearch, discovery, or venueUrls
searchQueriesstring[]Keywords, e.g. ["pizza", "sushi"] (search mode)
venueUrlsURL[]Wolt venue pages (venueUrls mode)
citystringCity name, e.g. Helsinki
latitude / longitudestringExact point; overrides city
includeMenusbooleanAlso scrape every venue's full menu
expandCatalogsbooleanWalk category pages so grocery stores return items
languagestringLanguage for menu text, e.g. en, fi, de
maxVenuesintegerOptional cap on venues; 0 (default) = no limit
maxMenuItemsPerVenueintegerOptional cap per venue; 0 (default) = the whole menu
maxItemsTotalintegerOptional hard ceiling on results; 0 (default) = no limit
maxConcurrency, maxRequestsPerMinuteintegerSpeed 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.

{
"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 use runId to 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 maxItemsTotal deliberately. It is the hard ceiling on a run. Leaving it at 0 means 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 expandCatalogs for 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.