Wolt.com $0.8๐Ÿ’ฐ URL | City Search | Restaurants and Menus avatar

Wolt.com $0.8๐Ÿ’ฐ URL | City Search | Restaurants and Menus

Pricing

from $0.80 / 1,000 results

Go to Apify Store
Wolt.com $0.8๐Ÿ’ฐ URL | City Search | Restaurants and Menus

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

Abot API

Maintained by Community

Actor stats

0

Bookmarked

14

Total users

4

Monthly active users

5 days ago

Last modified

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.

FieldExample
venueId00000000000000000000000a
slugsample-burger-place
nameSample Burger Place
brandSlugsample-burger
brandNameSample Burger
brandLogoImagehttps://imageproxy.wolt.com/mes-image/00000000-0000-0000-0000-000000000000/00000000-0000-0000-0000-000000000000
brandLogoBlurhashLKO2?V%2Tw=w]~RBVZRi};RPxuwH
coverImagehttps://imageproxy.wolt.com/assets/000000000000000000000000
coverBlurhashjkSsmKKXhXhq;;KXJAKXHtlmJjKW
descriptionBest burgers in town.
addressSample Street 1
cityHelsinki
cityId0000000000000000000000aa
citySlughelsinki
postCode00100
countryCodeFIN
phone+35800000000
websitehttps://example.com
woltUrlhttps://wolt.com/en/fin/helsinki/restaurant/sample-burger-place
latitude60.0000
longitude24.0000
timezoneEurope/Helsinki
currencyEUR
deliveryBasePrice199
orderMinimum1000
serviceFeeMin / Max / Percentage45 / 99 / 3
isWoltPlustrue
ncdAllowedtrue
isPickupFriendlyfalse
priceRange1 (1-4 wallet icons)
foodTags["burger", "fries"]
categories[{name: "American", slug: "american", primary: true}]
rating / ratingScore / ratingVolume3 / 8.0 / 200
workingHours7-day array of {day, formatted_times}
deliveryHours7-day array, separate from workingHours
deliveryGeoRangefull GeoJSON Polygon
tipping{currency, tip_amounts, max, min, type}
merchant{id, name, business_id, street_address, city, post_code, country}
digitalServicesActDSA-mandated legal disclosures
menuCategoryCount13
menuItemCount96
menuCategoriesarray of {id, slug, name, image, blurhash, itemCount, subcategoryCount}
menuItemsarray of {id, categoryId, name, image, currentPrice, originalPriceCents, discounted, discountAmount, discountPercent, discountValidFrom, lowestPriceCents, dietaryPreferences, vatPercentage, ...}
primaryLanguage / availableLanguagesde / [{language, name, autotranslated}]
scrapedAt2026-01-01T00:00:00.000Z
changeTypeNEW (incremental mode only โ€” see "Resume vs Incremental mode" below)
changedFields["deliveryBasePrice"] (incremental mode, UPDATED rows only)
firstSeenAt2026-01-01T00:00:00.000Z (incremental mode only)
lastSeenAt2026-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

ParameterTypeDefaultDescription
modestringsearchsearch or url
citiesarray 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.
urlsarray of strings(empty)Wolt venue or city URLs. URL mode only.
primaryCategoriesarray of strings(empty)Cuisine slugs (pizza, sushi, vegan, kebab, etc.). Empty = all.
minRatinginteger 0-10(none)Minimum venue score on the 0-10 scale.
minRatingVolumeinteger0Minimum review count to include.
fetchMenubooleantrueToggle full menu enrichment. Off = SERP-only, ~6x faster.
includeReviewsbooleantrueToggle the rating, ratingScore, and ratingVolume fields in output.
languagestringenISO language code passed to Wolt for menu and venue text.
maxVenuesinteger50Hard cap on total venues across the run. 0 = unlimited.
maxVenuesPerCityinteger0Per-city cap. 0 = unlimited per city.
resumeFromRunIdstring(none)Continue ONE specific interrupted run โ€” see "Resume vs Incremental mode" below.
incrementalModebooleanfalseCross-run change detection for recurring/scheduled runs โ€” adds changeType (NEW/UPDATED/UNCHANGED/REAPPEARED/EXPIRED) to every row. See below.
stateKeystring(auto)Names an incremental-mode monitoring campaign. Leave empty to derive one automatically from cities/URLs/filters/menu settings.
emitUnchangedbooleanfalseIncremental mode only. Also return (and bill) venues that haven't changed since the last run.
emitExpiredbooleanfalseIncremental mode only. Also return (and bill) venues no longer found, once a run fully scanned the tracked search.
proxyConfigurationobjectApify defaultApify 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.

  1. Authorize a connector once under Apify โ†’ Settings โ†’ Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to 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.