Bolt Food Restaurant & Menu Scraper
Pricing
from $1.80 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
8 days ago
Last modified
Categories
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.
| Country | Cities | Examples |
|---|---|---|
| Czechia | 59 | Prague, Brno, Ostrava, Plzen, Olomouc … |
| Romania | 44 | Bucharest, Cluj-Napoca, Timisoara, Iasi, Brasov … |
| Ukraine | 37 | Kyiv, Lviv, Kharkiv, Odesa, Dnipro … |
| Slovakia | 27 | Bratislava, Kosice, Nitra, Zilina, Presov … |
| Portugal | 21 | Lisbon, Porto, Braga, Coimbra, Aveiro … |
| Latvia | 14 | Riga, Jurmala, Liepaja, Daugavpils, Jelgava … |
| Lithuania | 13 | Vilnius, Kaunas, Klaipeda, Siauliai, Panevezys … |
| Poland | 12 | Warsaw, Krakow, Gdansk, Wroclaw, Poznan … |
| Estonia | 10 | Tallinn, Tartu, Narva, Pärnu, Kohtla-Järve … |
| Azerbaijan | 8 | Baku, Ganja, Sumqayit, Quba, Qabala … |
| Cyprus | 4 | Nicosia, Limassol, Larnaca, Paphos |
| Kenya | 3 | Nairobi, Nakuru … |
| Bulgaria | 2 | Sofia, Plovdiv |
| Georgia | 2 | Tbilisi, Batumi |
| Ghana | 2 | Accra, Kumasi |
| Malta | 2 | Valletta, 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.
| Mode | What you give it | What you get |
|---|---|---|
| Search by keyword → full menus (default) | Search terms + a location | Every menu item of every venue matching those terms |
| All venues in a city → full menus | A location | Every menu item of every venue delivering there |
| Specific venue URLs → full menus | Bolt Food venue page URLs | Every menu item of those venues |
| Search by keyword → venue list only | Search terms + a location | One row per matching venue, with ratings, fees and ETAs |
| All venues in a city → venue list only | A location | One 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 want | Settings | Results |
|---|---|---|
| Quick look | Search pizza, Bucharest, max 10 venues | 10 venues |
| All venues in a city | Discovery, Prague | ~590 venues |
| Menus of 25 restaurants | Discovery + menus, max 25 venues | ~3,000 items |
| One competitor's full menu | Venue URLs, 1 URL | ~120 items |
| Weekly price tracking, 10 venues | Venue 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
| Field | Type | Description |
|---|---|---|
mode | select | searchMenus (default), discoveryMenus, venueUrls, search, discovery |
searchQueries | string[] | Keywords, e.g. ["pizza", "sushi"] (search modes) |
venueUrls | URL[] | Bolt Food venue pages (venueUrls mode) |
city | string | Bolt Food city name, e.g. Bucharest |
address | string | Optional street address inside that city, e.g. Piata Victoriei |
latitude / longitude | string | Exact 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.
Menu item
{"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, unlikeitemId. Join weekly runs onvenueId+productIdto 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
addressvalues 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
maxItemsTotaldeliberately. It is the hard ceiling on your bill. Leaving it at0(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 thatfood.bolt.eu/robots.txtdisallows. - 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
availabilityset accordingly andisAvailable: 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.