Bolt Food Restaurant & Menu Scraper avatar

Bolt Food Restaurant & Menu Scraper

Pricing

from $1.80 / 1,000 results

Go to Apify Store
Bolt Food Restaurant & Menu Scraper

Bolt Food Restaurant & Menu Scraper

Scrape Bolt Food restaurants, stores and full menus with prices across 260 cities in 16 countries. Search by keyword, list every venue delivering to an address, or pull full menus from venue URLs. Every menu row carries its venue, city and rating. Clean JSON, no browser.

Pricing

from $1.80 / 1,000 results

Rating

5.0

(2)

Developer

Banea Teodor

Banea Teodor

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

8 days ago

Last modified

Share

Extract restaurants, grocery stores, full menus and live prices from Bolt Food — Bolt's food-delivery platform — across 260 cities in 16 countries. Search venues by keyword, pull the complete list of everything that delivers to an address, or hand it venue URLs and get every menu item with its price. Output is flat, typed JSON, ready for a spreadsheet or a pricing pipeline.

This is the first and only Bolt Food scraper on the Apify Store. Bolt Food is the delivery market leader in several Central and Eastern European countries, and until now its pricing data was not available anywhere as a self-serve feed.

Why use this Actor?

  • A market nobody else covers. Wolt, Glovo and Uber Eats scrapers are everywhere. Bolt Food — the leader in Estonia, Latvia, Lithuania, Slovakia and a strong number two in Czechia, Romania and Ukraine — had zero coverage before this Actor.
  • Real prices, not estimates. Every menu item comes with its exact price in major currency units, the currency code, the pre-promotion price when something is discounted, and Bolt's own formatted price string.
  • Address-level accuracy. Bolt Food shows a different venue list depending on where you are ordering to. Give the Actor a city, a street address, or exact coordinates and you get precisely the venues that deliver to that point — including the delivery fee and ETA for that address.
  • Fast and cheap. No browser. The Actor talks to Bolt Food's own JSON API, so a full city venue list is a single HTTP request and a complete restaurant menu is one more. A measured run pulled 60 venues with their full menus — 3,107 priced items — in 61 requests and 5 seconds, with no proxy and nothing retried.
  • A schema that matches our Wolt scraper. Venue and menu fields use the same names and units as the Wolt Restaurant & Menu Scraper, so you can stack both platforms in one table and compare prices per dish without writing a mapping layer.

Coverage

Every city below was verified against the live API on 2026-08-24 and returned a real venue feed.

CountryCitiesExamples
Czechia59Prague, Brno, Ostrava, Plzen, Olomouc …
Romania44Bucharest, Cluj-Napoca, Timisoara, Iasi, Brasov …
Ukraine37Kyiv, Lviv, Kharkiv, Odesa, Dnipro …
Slovakia27Bratislava, Kosice, Nitra, Zilina, Presov …
Portugal21Lisbon, Porto, Braga, Coimbra, Aveiro …
Latvia14Riga, Jurmala, Liepaja, Daugavpils, Jelgava …
Lithuania13Vilnius, Kaunas, Klaipeda, Siauliai, Panevezys …
Poland12Warsaw, Krakow, Gdansk, Wroclaw, Poznan …
Estonia10Tallinn, Tartu, Narva, Pärnu, Kohtla-Järve …
Azerbaijan8Baku, Ganja, Sumqayit, Quba, Qabala …
Cyprus4Nicosia, Limassol, Larnaca, Paphos
Kenya3Nairobi, Nakuru …
Bulgaria2Sofia, Plovdiv
Georgia2Tbilisi, Batumi
Ghana2Accra, Kumasi
Malta2Valletta, Gozo

City names are matched ignoring case and accents, so bucuresti, Bucureşti and Bucharest all work. A name that is not a Bolt Food city stops the run immediately and suggests the closest matches, so you never pay for a run aimed at the wrong place.

The five modes

The mode says exactly what a run produces — there is no separate "also get menus" toggle to find.

ModeWhat you give itWhat you get
Search by keyword → full menus (default)Search terms + a locationEvery menu item of every venue matching those terms
All venues in a city → full menusA locationEvery menu item of every venue delivering there
Specific venue URLs → full menusBolt Food venue page URLsEvery menu item of those venues
Search by keyword → venue list onlySearch terms + a locationOne row per matching venue, with ratings, fees and ETAs
All venues in a city → venue list onlyA locationOne row per venue delivering there (300–600 in a big city)

The three menu modes are full crawls: they walk the venue listing, then each venue's menu, and return one row per menu item — each row carrying the venue it came from, including its city, country, address and rating, plus the search term that surfaced it. So a single CSV export answers "what does every pizza place in Bucharest charge, and how good are they" with no joining.

The two venue-list modes stop at the listing and return one row per venue, with the full venue record: coordinates, rating count, price tier, delivery fee, ETA, distance and venue type. Use those when the venues themselves are what you are after.

What does it cost?

Pricing is pay-per-result: you are charged for starting a run and for each result. The current rates are shown on this Actor's page in the Apify Store. Every row in the dataset is one result, so what you see is what you pay for — there is no hidden second output.

Nothing is capped by default, so a run returns everything it finds. Use these to size a run:

What you wantSettingsResults
Quick lookSearch pizza, Bucharest, max 10 venues10 venues
All venues in a cityDiscovery, Prague~590 venues
Menus of 25 restaurantsDiscovery + menus, max 25 venues~3,000 items
One competitor's full menuVenue URLs, 1 URL~120 items
Weekly price tracking, 10 venuesVenue URLs, 10 URLs, weekly~1,200 items

Set Maximum results if you want a hard ceiling on how many results a run can produce — it is the most reliable way to bound a run. Maximum venues and Maximum menu items per venue narrow it further. All three are optional and default to no limit.

Input

FieldTypeDescription
modeselectsearchMenus (default), discoveryMenus, venueUrls, search, discovery
searchQueriesstring[]Keywords, e.g. ["pizza", "sushi"] (search modes)
venueUrlsURL[]Bolt Food venue pages (venueUrls mode)
citystringBolt Food city name, e.g. Bucharest
addressstringOptional street address inside that city, e.g. Piata Victoriei
latitude / longitudestringExact delivery point; overrides city and address

| expandCatalogs | boolean | Walk into supermarket category pages (see Stores vs restaurants) | | language | string | Language for venue and menu text, e.g. en-US, ro, pl | | maxVenues | integer | Optional cap on venues scraped; 0 (default) = no limit | | maxMenuItemsPerVenue | integer | Optional cap per venue; 0 (default) = the whole menu | | maxItemsTotal | integer | Optional hard ceiling on billed results; 0 (default) = no limit | | maxConcurrency, maxRequestsPerMinute | integer | Speed limits; the defaults suit every mode |

Example input

{
"mode": "searchMenus",
"searchQueries": ["pizza", "sushi"],
"city": "Bucharest",
"address": "Piata Victoriei"
}

That scrapes the full menu of every pizza and sushi venue delivering to that address. 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": "20499",
"venueSlug": "20499-burger-king-piata-victoriei",
"venueName": "Burger King Piața Victoriei",
"url": "https://food.bolt.eu/en/325-bucharest/p/20499-burger-king-piata-victoriei/",
"venueCity": "Bucharest",
"venueCountry": "RO",
"venueAddress": "Piața Victoriei 1",
"venueRating": 4.29,
"searchQuery": "burger",
"itemId": "5629505651337892",
"productId": "20499_CG_3751__ON_4__P_17600041",
"name": "Summer Crunch Double Beef Meal",
"description": "Double beef burger, fries and a drink",
"categoryId": "4785074699661226",
"categoryName": "Limited Offers",
"categoryPath": "Limited Offers",
"price": 53.9,
"originalPrice": null,
"isDiscounted": false,
"currency": "RON",
"priceFormatted": "53,90 lei",
"availability": "in_stock",
"isAvailable": true,
"isPopular": true,
"sellingUnit": null,
"optionGroupCount": 5,
"optionCount": 14,
"tags": [],
"imageUrl": "https://images.bolt.eu/store/2025/2025-03-18/31373193.jpeg",
"language": "en-US",
"scrapedAt": "2026-08-24T07:30:30.743Z"
}

Venue

{
"venueId": "3769",
"slug": "3769-sara-green-victoriei",
"name": "Sara Green - Victoriei",
"url": "https://food.bolt.eu/en/325-bucharest/p/3769-sara-green-victoriei/",
"description": "Restaurant Awards 2021 Verified Vegan",
"city": "Bucharest",
"cityId": 325,
"country": "RO",
"currency": "RON",
"address": "Bd Lascar Catargiu 43A",
"latitude": 44.450402,
"longitude": 26.089393,
"ratingScore": 4.88,
"ratingVolume": 12570,
"priceRange": 2,
"online": true,
"delivers": true,
"takeaway": true,
"deliveryEstimateMinutes": 10,
"deliveryEstimateRange": "10-15",
"deliveryBasePrice": 4.99,
"distanceKm": 0.41,
"tags": [],
"phone": "+40774962246",
"website": "https://www.saragreen.ro",
"imageUrl": "https://images.bolt.eu/store/2020/2020-08-31/f9ed1df9.jpeg",
"menuLayout": "simple",
"isNew": false,
"source": "discovery",
"searchQuery": null,
"scrapedAt": "2026-08-24T07:29:45.015Z"
}

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 billed result. Which row type you get depends on the mode: menu items in the three menu modes, venue records in the two venue-list modes. 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 always decimal numbers in major currency units (53.9 RON, 140 KES) with the currency in a separate field — never a formatted string you have to parse. Ratings are on Bolt Food's 1–5 star scale, with the exact average and the number of ratings behind it.

Tips and tricks

  • Need the venue detail as well as the menus? Run a venue-list mode for the venue records and a menu mode for the items, then join them on venueId. Menu rows already carry the venue's name, city, country, address and rating, so most price work needs only the menu run.
  • Track prices over time with productId. It is Bolt's stable per-product identifier and survives menu rebuilds, unlike itemId. Join weekly runs on venueId + productId to get a clean price history per dish.
  • Use several search terms. Bolt Food's search covers the whole city in one request and returns every match at once, so ["pizza", "burger", "sushi", "vegan"] is four requests and very broad coverage. Venues are de-duplicated across queries, so you are never billed twice for one venue.
  • Compare addresses, not just cities. Running the same city with two different address values shows which venues and fees change across neighbourhoods — that difference is the product for delivery-market analysis.
  • Keep the first run small. Leave the prefilled caps alone, look at the output, then scale up.
  • Set maxItemsTotal deliberately. It is the hard ceiling on your bill. Leaving it at 0 (unlimited) applies a 20,000-result safety cap and logs a warning.

Stores vs restaurants

Restaurant menus arrive complete in a single request. Supermarkets and other grid-layout stores are different: Bolt returns only one sample product per top-level category, with the rest behind category pages. Turn on Expand large store catalogs to walk into those pages — up to 60 extra requests per store. When it is off, the run finishes with a warning naming the venues whose catalogs were only partial, so a partial result is never presented as a complete one.

Integrations

Connect the output to Google Sheets, Airtable, Slack, Zapier or Make from the Actor's Integrations tab, or pull it straight from the API:

https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv&clean=true

Schedule the Actor weekly in venue-URL mode for a competitor price monitor, or run discovery mode monthly to track which venues enter and leave a market.

Notes and limits

  • Only public data is collected — the same venue, menu and price information any visitor sees on food.bolt.eu. No login, no personal data, and no paths that food.bolt.eu/robots.txt disallows.
  • Bolt Food rate-limits per client identity rather than per IP, and the Actor gives every single request (and every retry) its own, so runs do not trip the limit and do not need a proxy to avoid it. Measured on 2026-08-24 from one IP with no proxy: 600 requests at 126/s, none rejected.
  • Runs always go through Apify Proxy datacenter IPs, which the API serves normally (verified under load: 31 requests, none rejected). There is nothing to configure. Residential proxies are not used — they are billed by bandwidth, Bolt Food does not require them, and the per-result price covers datacenter traffic.
  • Menus reflect what is orderable at the moment of the run. Items outside their serving window come back with availability set accordingly and isAvailable: false.
  • Bolt Food gates its API on a web-app version string. If an update ever breaks every request at once, that is the cause, and it is a one-line fix in the Actor — please open an issue and it will be updated quickly.

Support

Found a bug or need another field? Open an issue on the Actor's Issues tab. Feature requests that make the output more useful for price monitoring are especially welcome.