TheFork Scraper - Restaurants, Discounts, Ratings & Prices
Pricing
from $1.60 / 1,000 restaurants
TheFork Scraper - Restaurants, Discounts, Ratings & Prices
Scrape TheFork (LaFourchette, ElTenedor) restaurants by city or list URL on 12 sites: name, cuisine, address, coordinates, average price, rating, reviews, discounts (-30%, -50%), booking times, Michelin. Discounted-only mode checks each offer; monitors new restaurants and offers.
Pricing
from $1.60 / 1,000 restaurants
Rating
0.0
(0)
Developer
Amit Aviv
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 hours ago
Last modified
Categories
Share
TheFork Restaurants Scraper
Restaurants from TheFork (LaFourchette, ElTenedor) list pages: name, cuisine, address, coordinates, average price, rating and review count, discounts such as -30% and the booking times shown with them, Michelin and other distinctions, tags and photos. Give it city names or paste city, district, cuisine or offers pages from any of twelve TheFork sites. With Only restaurants with a discount, every restaurant delivered has a current percentage discount, checked on its own restaurant page when the list does not show it. You pay only for delivered restaurants (plus, in monitoring mode, the list pages checked), and a run that delivers nothing because of an error ends as Failed, never as a green empty run.
What you get
- Name, TheFork id, page URL, cuisine, street, postcode, city, country, full address, latitude and longitude
- Average price per person and currency, TheFork price level (1 to 4), rating out of 10 and number of reviews
- Offers (
-50%, "Up to -30%", TheFork Festival, double Yums) with the percentage of each, the best discount in percent, whether the restaurant takes online bookings, the booking times the list page shows for today with the offer of each, and the number of bookings made today. On offers pages every restaurant's discount is complete (checked on its restaurant page when needed); on other lists the offers are what the list page shows, which leaves out the offer of a restaurant with no table left today (see theoffersfield below) - Michelin (star, Bib Gourmand or listed), TheFork top-100 rank, other distinctions, tags (dishes, diets, payment methods, atmosphere, facilities)
- On request: TheFork's machine-written summary of the restaurant's customer reviews (off by default because it can name staff; never reviewers)
- Main photo and the restaurant photos the list page carries (up to 12; not the restaurant's total photo count, which the list page does not give)
- One record per restaurant, as JSON, CSV or Excel, or through the API
- A run summary (
OUTPUT_SUMMARYin the run's key-value store): what was requested, delivered and charged, which inputs failed or were ignored, how many restaurants TheFork reports for each list, and why the run stopped
What it does not return: reviews, reviewers' names or review texts, phone numbers, e-mail addresses, websites, menus, opening hours, anything behind a login. These are on the restaurant's own page; the actor reads that page only on offers pages, and only for the restaurant's current offer.
How to use
- Type city names into City names and pick the TheFork site, or open a list on TheFork in your browser (a city, a district, a cuisine, a city's offers page) and copy its address.
- Paste addresses into TheFork list pages. Several entries are fine, from different sites too.
- Tick Only restaurants with a discount if you want discounted restaurants only: the actor reads each city's offers page and delivers only restaurants with a current percentage discount (a restaurant the list shows without one, because it has no table left today, is checked on its restaurant page; one without a discount is left out and not charged). Set Max restaurants per city or URL and press Start.
- Download the results from the Output tab, or read them from the API.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
startUrls | list of URLs | Paris (prefill) | TheFork list pages: city (…/restaurants/paris-c415144), district (…/paris-c415144/11e-arrondissement-a537), cuisine or other tag (…/paris-c415144/italien-t436), offers (…/milano-c348156/promozioni), region (…/ile-de-france-b1752). Single restaurant pages and /search pages are refused with a reason. Anything after ? is dropped. |
cities | list of text | empty | City names, written as on the chosen site ("Milano" on thefork.it, "München" on thefork.de); common English names (Brussels, Geneva, Munich, Milan, Rome, Lisbon, Vienna, Antwerp…) are understood too. Looked up in the site's own city list. City names typed into startUrls are treated the same way. A city given both as a name and as its address is read once. |
site | choice | thefork.fr | The site the city names are looked up on: thefork.fr, .it, .es, .co.uk, .com, .de, .nl, .be, .ch, .at, .pt, .se. It sets the language of cuisine names and tags. |
offersOnly | yes/no | no | Only restaurants with a discount: read each city's offers page instead of the full list and deliver only restaurants with a current percentage discount (see offers). Applies to city pages and city names; a pasted offers page is always read this way. |
maxItemsPerQuery | number | 100 | Stop after this many restaurants for each city or URL (1 to 20,000; other values are replaced by the nearest allowed one, with a warning). |
includeReviewsSummary | yes/no | no | Fill reviewsSummary with TheFork's machine-written summary of the customer reviews. Off by default: the summary can name staff by first name. |
onlyNew | yes/no | no | Monitoring: new restaurants on TheFork, or restaurants new on (or with a new best discount on) an offers page. Charged per list page read as well. See "Monitoring". |
monitorKey | text | empty | Name of the monitor memory, to keep two schedules apart. |
{"startUrls": [{ "url": "https://www.thefork.es/restaurantes/madrid-c328022" },{ "url": "https://www.thefork.co.uk/restaurants/london-c665790" }],"cities": ["Milano"],"site": "thefork.it","offersOnly": true,"maxItemsPerQuery": 40}
That is the input of run fod1HJoQhVHj7lzl8 (2026-10-14, 20:45 in Madrid): 120 restaurants, 40 from each of the Madrid, London and Milan offers pages, every one with a discount, in 45 seconds (54 and 63 seconds in runs XMWaax1taXvjvAd5I and SDHdCeDz7ZIqaGZKj later that evening). 45 of the 120 had no table left that evening, so the list page showed no offer for them and their discount was read from their restaurant pages. Expect about a minute; the more restaurants are fully booked, the more restaurant pages are read.
Example result
Taken from run fod1HJoQhVHj7lzl8 on 2026-10-14, unedited. The list page showed only "Yums x2" for The Chelsea Bar that evening (no table left); its restaurant page showed the TheFork Festival offer:
{"id": "d6e510e3-43fb-45df-af42-313eb16d37b2","legacyId": 852480,"name": "The Chelsea Bar","url": "https://www.thefork.co.uk/restaurant/the-chelsea-bar-r852480","cuisine": "British","street": "11 Cadogan Gardens","postalCode": "SW3 2RJ","city": "London","country": "United Kingdom","address": "11 Cadogan Gardens, SW3 2RJ, London","latitude": 51.4935726,"longitude": -0.1592237,"averagePrice": 9,"currency": "GBP","priceRangeLevel": 1,"rating": 9.5,"reviewCount": 34,"offers": [{ "type": "SUPER_YUMS", "label": "Yums x2", "discountPercent": null },{ "type": "EVENT_OFFER", "label": "50% off during TheFork Festival", "discountPercent": 50 }],"offerSource": "restaurantPage","hasDiscount": true,"maxDiscountPercent": 50,"isBookable": true,"availableTimes": [],"bookingsToday": 0,"michelin": null,"topChartRank": null,"distinctions": [],"tags": ["American Express", "Apple Pay", "Mastercard", "Visa", "No Google Link", "No Google Reserve", "Trip Advisor", "British", "European", "Mediterranean", "Vegan", "Vegetarian", "Vegan dishes", "Vegetarian dishes", "French Fry", "Hummus", "Super YUMS", "YUMS x2", "Chelsea", "Chelsea and South Kensington", "Knightsbridge", "Knightsbridge and Belgravia", "United Kingdom", "Air-conditioning", "Bar", "English spoken", "Open in August", "Open late", "Open sunday", "Wi-Fi", "After work", "Central location", "Contemporary cuisine", "Good for groups", "Hotel Restaurant", "With friends", "Black Friday", "TheFork Festival", "TheFork SUMMER!", "Veganuary"],"paymentMethods": ["American Express", "Apple Pay", "Mastercard", "Visa"],"reviewsSummary": null,"mainPhotoUrl": "https://cdn.thefork.com/tf-lab/image/upload/restaurant/d6e510e3-43fb-45df-af42-313eb16d37b2/15b6909a-5a60-492c-bdcf-e673b448cec8.jpg","photoUrls": ["https://cdn.thefork.com/tf-lab/image/upload/restaurant/d6e510e3-43fb-45df-af42-313eb16d37b2/8ced6d56-fbdd-42cb-a9f9-36350b4de478.png","https://cdn.thefork.com/tf-lab/image/upload/restaurant/d6e510e3-43fb-45df-af42-313eb16d37b2/b4eb0ef8-6759-498a-97d2-91d75cd97b2b.jpg","https://cdn.thefork.com/tf-lab/image/upload/restaurant/d6e510e3-43fb-45df-af42-313eb16d37b2/15b6909a-5a60-492c-bdcf-e673b448cec8.jpg","https://cdn.thefork.com/tf-lab/image/upload/restaurant/d6e510e3-43fb-45df-af42-313eb16d37b2/fec26923-fd1c-4ee3-913c-6c050e08fdab.jpg","https://cdn.thefork.com/tf-lab/image/upload/restaurant/d6e510e3-43fb-45df-af42-313eb16d37b2/b94d2c70-10a3-4e84-82c8-1cf0831d1864.jpg"],"site": "thefork.co.uk","searchUrl": "https://www.thefork.co.uk/restaurants/london-c665790/deals","page": 1,"position": 2,"scrapedAt": "2026-10-14T18:45:19.888Z"}
| Field | Meaning |
|---|---|
id | TheFork's own restaurant id; stable between runs and the same on every TheFork site. |
legacyId | The number in the restaurant's page address (…-r852480). |
averagePrice | Average price per person as TheFork shows it, in currency. |
priceRangeLevel | TheFork's price band, 1 (cheapest) to 4. |
rating, reviewCount | TheFork rating out of 10 and its number of reviews; null for restaurants with no rating yet. |
offers | The restaurant's offers, each with TheFork's type, its label (in the site's language) and its percentage (discountPercent, null for offers without one, such as double Yums or a set menu). They come from the list page, which shows a restaurant's offers only while it has a table left today. On offers pages (Only restaurants with a discount, or a pasted offers page) a restaurant the list shows without a percentage offer is checked on its restaurant page and that page's current offer is added (type PROMOTION, or EVENT_OFFER for TheFork Festival); a restaurant without a discount there is left out. On other lists the restaurant page is not read, so a restaurant with no table left today can have offers: [] or only double Yums even when it runs a discount: open url to check. |
offerSource | Where the offers were read: listPage, restaurantPage (the list page showed no percentage offer; the last entry of offers is from the restaurant page) or null (no offers). |
maxDiscountPercent | The highest percentage among offers and the booking times shown; null when there is none. hasDiscount is true when it is above 0, which is always the case on offers pages. Set menus show as offer MENU with 0 %. |
availableTimes | The booking times the list page shows, with the offer of each. They are for today and start after the current local time (runs at 17:20 to 17:50 local time showed 18:00 to 21:30). Empty when TheFork shows none. |
bookingsToday | The "booked N times today" figure TheFork shows. |
michelin | 1_star, 2_stars, 3_stars, Bib (Bib Gourmand), listed (in the guide without star or Bib) or null. |
topChartRank | Rank in TheFork's top 100 of the city, when the restaurant is in it. |
reviewsSummary | Only with Include TheFork's review summary (otherwise null): TheFork's machine-written summary of the restaurant's customer reviews. It can name the chef or staff by first name ("especialmente Albert, el maître"); it never names reviewers. The reviews themselves are not read. |
photoUrls | The photos on the list page: up to 12 per restaurant (in a 1,373-restaurant run, 708 had 12). |
searchUrl, page, position | The list page read, the page number, and the position in TheFork's order. |
Fields TheFork does not provide for a given restaurant are null or an empty list, never missing.
Pricing
Pay per event. You pay for what is delivered, not for time, proxies or memory.
| Event | Free | Bronze | Silver | Gold and above |
|---|---|---|---|---|
| Actor start (once per run at the default memory) | $0.0042 | $0.0035 | $0.00315 | $0.0028 |
| Restaurant delivered | $0.0024 | $0.002 | $0.0018 | $0.0016 |
| List page checked (only with Only new restaurants) | $0.0084 | $0.007 | $0.0063 | $0.0056 |
Worked examples (Bronze): all of Milan, 1,373 restaurants, is 1,373 × $0.002 + $0.0035 = $2.75 (run YPKSRMnAX1sICWe4j, 4 minutes). 100 restaurants of Paris cost 100 × $0.002 + $0.0035 = $0.2035. Without monitoring there is no page charge. With Only restaurants with a discount the price is the same: the restaurant pages read to check offers are included, and restaurants left out for having no discount are not charged.
Monitoring Paris: TheFork's "new restaurants" list of Paris had 160 restaurants on 7 pages on 2026-10-14. The first run costs 160 × $0.002 + 7 × $0.007 + $0.0035 = $0.37; a later run that finds nothing new costs 7 × $0.007 + $0.0035 = $0.0525 (run RAbXqVyP4teJDOyV5: 7 page checks, 0 restaurants charged), about $1.60 a month on a daily schedule. Each page read costs us residential traffic whether or not it holds something new, which is why monitoring is charged per page.
- Restaurants that could not be delivered are not charged. A restaurant found by two of your entries in one run is delivered and charged once.
- A run that is restarted by the platform reads its pages again but charges neither restaurants nor page checks twice.
- The maximum total charge you set for a run is respected: the actor stops before it would go over, keeps what was delivered, and says so in the status message (run
VzW2LbCE0wqGuC037: limit $0.0635, exactly 30 restaurants delivered and charged). - The start event is charged once per GB of memory; the default is 256 MB, so once per run.
Reliability and failure behaviour
| What happened | Run status | Status message |
|---|---|---|
| Restaurants delivered | Succeeded | Scraped 100 restaurants from 1 query |
| TheFork has no restaurants for the list | Succeeded | 0 results: TheFork has no restaurants for this query |
| Some entries worked, some failed | Succeeded | Scraped 35 restaurants from 8 queries — 1 of 8 queries failed ("…": …) |
| Offers page: a restaurant page could not be read after 12 attempts | Succeeded | … — the offer of 1 restaurant could not be read on its restaurant page, so it was left out (that restaurant is not delivered or charged) |
| Nothing delivered because of errors or blocking | Failed | No restaurants delivered: TheFork blocked every attempt; try again later. No restaurants were charged (the start fee applies). |
| A list page TheFork does not have, or a city name it does not know | Failed (or named in the message when other entries worked) | TheFork has no such page (404): … / thefork.fr has no city page for "…" |
| Input the actor cannot use | Failed, within seconds | Nothing to do: … Add at least one entry to "startUrls" or "cities", e.g. … |
| Maximum charge reached | Succeeded | … — stopped at the maximum charge set for this run |
| Run timeout close | Succeeded | … — stopped just before the run timeout; raise the timeout to get the rest |
- TheFork is protected by DataDome. The actor reads it with plain HTTP through residential addresses in the site's country; DataDome refused between one address in three and one in two in our tests, and each refused request is retried from a new address, up to 12 attempts per page (each refusal is a line in the run log). In the test runs of 2026-10-14 this absorbed 10 refusals in 68 requests (Milan, 1,373 restaurants), 16 in 77 (Paris, 1,500) and 16 in 35 (Lyon). If one page is still refused 12 times, that list stops there and the status message names it.
- Results are saved page by page. A run that is aborted, times out or is resurrected keeps what was delivered and never delivers or charges the same restaurant twice (run
WOzqIHGNKf2rVi8yS: aborted at 75, resurrected, 300 delivered, 300 unique, 300 charged). - Measured on 2026-10-14: in the test runs every query on thefork.fr, .it, .es, .co.uk, .nl, .de, .be, .ch, .at, .pt and .se delivered what was asked. One query on thefork.com failed in an early build that used Irish addresses (8 of 8 refused); thefork.com now goes through French addresses and delivered in run
B3deCC8ykFnFGYS9B.
Limits
- TheFork shows 25 restaurants a page; the actor reads about 100 to 350 restaurants a minute, depending on how many requests DataDome refuses (Milan, 1,373 restaurants: 4 minutes; Lyon, 381: 3.3 minutes in run
GAgi0y1EDJVcUOlwd). - Offers pages are slower, because restaurants shown without their offer are checked on their restaurant page (4 at a time). How many depends on the hour: in the evening of 2026-10-14, 45 of 120 in the example run (45 seconds), 17 of 30 in Munich (run
ePbO9o2pva5upxlPx, 12 seconds), 58 of 100 in Paris (runCPU2p2x4etpmFfXCk, 58 seconds) and 97 of 142 in Lyon (run81tamZ5sFfgrxbeSh, 3 minutes). - A city list contains what TheFork lists for the city, which can include restaurants in neighbouring towns: use the
cityfield of each record. The whole Milan list matched TheFork's own count exactly (1,373 of 1,373). availableTimescovers today only and at most the five times the list page shows; for other dates or party sizes open the restaurant on TheFork.- Photos: the list page carries up to 12 per restaurant.
- City names are matched against the city list of the chosen site (about 1,000 cities on thefork.fr and 1,100 on thefork.it on 2026-10-14), then against a short list of English names. A smaller town that is not in it: open its page on TheFork and paste the address.
- Filters set in TheFork's filter panel (dates, party size, price filters) are not applied; district, cuisine and offers pages are.
Monitoring: only new restaurants
- Turn on Only new restaurants and save the input as a task.
- Schedule the task (daily is enough for most lists).
- The first run delivers what it finds (up to the maximum). Every later run delivers and charges only restaurants this monitor has not delivered before; a run with nothing new ends as Succeeded with
0 new restaurants…and is charged the start event and the pages it checked.
What the monitor reads:
| You give | It reads | "New" means |
|---|---|---|
| A city (name or address) or a district page | TheFork's own new restaurants list of that city or district (e.g. Paris: 160 restaurants, 7 pages; Milan: 65, 3 pages; Lyon: 22, 1 page on 2026-10-14) | Recently added to TheFork and not delivered before by this monitor |
| A city with Only restaurants with a discount, or an offers page | The offers page (only restaurants with a discount, as above) | On the offers page and not delivered before, or the list shows it with a best discount this monitor has not delivered for it (e.g. -20% became -50%). A restaurant delivered before that the list shows without its offer (no table left today) is not checked again and does not count as changed. |
| A cuisine, other tag or region page | The list, up to its first 500 restaurants | Not delivered before by this monitor |
thefork.se has no new-restaurants list; there the city list is read (first 500). TheFork orders every list by its own ranking and its lists cannot be sorted by date, so each run reads its list again from the first page: that is what the page charge pays for.
Runs vI5AI6JtDaAtK5GMw (Paris, 160 new restaurants, 7 pages) and LcUbDQjKcpzazXXtF / RAbXqVyP4teJDOyV5 (the same monitor later: 0 new). An offers monitor and a new-restaurants monitor of the same city keep separate memories even under one monitor name (runs b3FbHADcF9FOunXaJ and 76ZpgOE6OTORDFJBR). Lyon offers monitor: 81tamZ5sFfgrxbeSh delivered 142 restaurants with a discount (97 checked on their restaurant page), then 8y6fMV3OZzr5FFNFF delivered 0 and read no restaurant page (6 page checks).
The memory is a key-value store named thefork-restaurants-scraper-monitor in your own account (one record per list and monitor name, at most 10,000 entries each, oldest forgotten first). Delete the store or change Monitor name to start over. Restaurants cut off by the maximum per query or by your charge limit are not marked as seen: the next run delivers them. To be notified, add an integration to the task (email, Slack, webhook) on "run succeeded".
FAQ
Do I need a proxy? No. The actor uses residential addresses in the site's country itself; their cost is included in the price.
Why did I get fewer restaurants than TheFork shows? Check Max restaurants per city or URL (default 100). The run summary shows reportedBySite, TheFork's own count, next to what was delivered.
Can I get phone numbers, opening hours or menus? Not from this actor: they are on each restaurant's own page.
Why does a restaurant have offers: [] or hasDiscount: false although it runs a discount? On a full city, district or cuisine list the offers are what TheFork's list page shows, and the list page shows a restaurant's offer only while it has a table left today. Read the city's offers page instead (Only restaurants with a discount): there every restaurant is delivered with its discount, checked on its restaurant page when the list does not show it.
Why does monitoring cost more per run than a normal run that finds nothing? A normal run stops when it has what you asked for; a monitoring run must read its whole list every time, because TheFork does not sort lists by date. Monitoring a city reads only its new-restaurants list, which keeps that to a few pages.
Can I run it from code? Yes: the API, the Apify clients for JavaScript and Python, Make, Zapier, n8n. Through the API, startUrls takes objects: [{ "url": "https://…" }].
What happens when TheFork changes its pages? Runs fail loudly instead of returning empty data; report the run id under Issues.
Legal and responsible use
This actor collects business information about restaurants that TheFork shows publicly without a login: names, addresses, prices, ratings, offers. It does not collect reviews, reviewers' names or profiles, or any data about TheFork's users. The short review excerpts on list pages are not read. The reviewsSummary field (TheFork's own machine-written summary, which can mention the chef or staff by first name but not reviewers) is empty unless you turn on Include TheFork's review summary.
TheFork's terms of use forbid automated collection of its content, and in the EU a database can be protected by the database right. The actor reads only pages that TheFork's robots.txt does not exclude (checked 2026-10-14): list pages, one at a time, and on offers pages the data of restaurant pages, at most four at a time. You are responsible for how you use the data: respect TheFork's terms, copyright and database rights, and data-protection law (GDPR and others). Some restaurants carry a person's name (a chef's restaurant): do not use the output for unsolicited marketing to individuals. If you are unsure, ask a lawyer before you build on it.
Related actors
Other actors by the same developer:
- Yandex Maps Scraper: restaurants, cafés and other places in Russia, the CIS and Türkiye from Yandex Maps, with phones, websites, social links and opening hours, the contact details this actor does not return.
- Europages Company Scraper: European B2B companies by keyword and country, such as food and drink wholesalers or catering equipment makers, with address, phone, website and the company's email on request, if you work on the supply side of the restaurant trade.
- Leboncoin Scraper: classified ads from leboncoin.fr in every category, such as used catering equipment or restaurant job ads, if you serve restaurants in France.
Changelog
- 2026-10-14 0.1.14: Only restaurants with a discount (formerly "Only restaurants with offers") delivers only restaurants with a current percentage discount; restaurants the list shows without their offer are checked on their restaurant page (
offerSource,discountPercentper offer). Offers monitors no longer count a fully booked day as a change.reviewsSummaryis off by default (new option). - 2026-10-14 0.1: first version. Twelve TheFork sites, city names, offers pages, monitoring of TheFork's new-restaurants lists and of offers pages (charged per page checked).
Support
Open an issue on the actor's Issues tab with the run id.