TheFork Scraper — European Restaurant Listings & Prices
Pricing
from $2.00 / 1,000 result scrapeds
TheFork Scraper — European Restaurant Listings & Prices
Scrape restaurant listings from TheFork.com, TripAdvisor's European restaurant reservation platform. Search by city and get name, cuisine, price range, rating, review count, address, and offers. No login required.
Pricing
from $2.00 / 1,000 result scrapeds
Rating
0.0
(0)
Developer
Studio Amba
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
TheFork Scraper
Extract restaurant listings from TheFork.com (TripAdvisor's European restaurant reservation platform) — search by city and get name, cuisine, price range, rating, review count, address, and current offers for every restaurant.
Why use this actor?
TheFork lists tens of thousands of restaurants across Europe, each with TripAdvisor-backed ratings, price levels, and live promotions. Restaurant discovery apps, hospitality market researchers, and local business analysts benchmarking competitors all need this data at scale rather than clicking through paginated search results by hand. This actor turns a city name into a clean, structured dataset of every restaurant listed for that city.
How to scrape TheFork data
TheFork runs DataDome anti-bot protection site-wide, and its robots.txt explicitly disallows the query-string search endpoints (/search, /search-web*, /list*). Hitting those paths directly returns either a DataDome challenge page or is against the site's own crawl rules.
Instead, this actor uses TheFork's own city landing pages — /restaurants/{city-slug}-c{cityId} (for example /restaurants/paris-c415144). These pages are explicitly allowed by robots.txt, are what Google indexes, and are server-rendered (Next.js) with the full restaurant list — up to 25 restaurants per page, with name, cuisine, price level, average price, TripAdvisor-style rating, review count, full address, geolocation, and any active offers — all embedded in the page's __NEXT_DATA__ JSON payload.
To reach these pages reliably, the actor routes requests through Bright Data's Web Unlocker, which handles TheFork's DataDome challenge automatically. Pagination beyond the first 25 results requires both a p and a page query parameter set to the same page number (the page parameter alone is silently ignored server-side) — the actor builds these URLs correctly and walks as many pages as needed to reach your requested result count.
City names are matched against a curated map of major European cities (Paris, London, Rome, Madrid, Munich, Milan, Amsterdam, Barcelona, Berlin, and more); unrecognized cities fall back to Paris.
Input
| Field | Type | Required | Description |
|---|---|---|---|
city | String | No | City to search (default: Paris). Examples: London, Rome, Madrid, Munich, Milan, Amsterdam, Barcelona, Berlin, Lyon, Marseille. |
maxResults | Integer | No | Maximum restaurants to return (default: 20, max: 1000). TheFork returns 25 per page. |
brightDataApiKey | String | No | Your own Bright Data Web Unlocker API key. Leave empty to use the built-in unlocking service. |
proxyConfiguration | Object | No | Legacy field, kept for backwards compatibility. Ignored — fetching goes through Bright Data. |
Output
Each result contains:
| Field | Type | Example |
|---|---|---|
id | String | "e3a4ef96-0b29-46b5-8ac6-66788a4c4435" |
name | String | "Restaurant Auguste - Gaël Orieux" |
cuisine | String | "French" |
priceRange | String | "€€€€" |
avgPrice | Number | 100 |
currency | String | "EUR" |
rating | Number | 9.5 |
reviewCount | Number | 3314 |
address | String | "54, rue de Bourgogne" |
city | String | "Paris" |
postalCode | String | "75007" |
latitude | Number | 48.85616 |
longitude | Number | 2.31712 |
imageUrl | String | Main restaurant photo URL |
offers | Array | ["Menu Instant Michelin €96", "Yums x2"] |
isBookable | Boolean | true |
url | String | Full TheFork restaurant URL |
Example output
{"id": "e3a4ef96-0b29-46b5-8ac6-66788a4c4435","name": "Restaurant Auguste - Gaël Orieux","cuisine": "French","priceRange": "€€€€","avgPrice": 100,"currency": "EUR","rating": 9.5,"reviewCount": 3314,"address": "54, rue de Bourgogne","city": "Paris","postalCode": "75007","latitude": 48.85616,"longitude": 2.31712,"imageUrl": "https://cdn.thefork.com/tf-lab/image/upload/restaurant/e3a4ef96-0b29-46b5-8ac6-66788a4c4435/4f06eca7-c9f1-466f-83e9-870610815ef8.jpg","offers": ["Menu Instant Michelin €96", "Yums x2"],"isBookable": true,"url": "https://www.thefork.com/restaurant/restaurant-auguste-gael-orieux-r26201","scrapedAt": "2026-07-14T21:24:18.487Z"}
Cost estimate
This actor uses approximately 1 compute unit per 200 results (one Bright Data Web Unlocker request returns a full page of 25 restaurants). At standard Apify pricing, that's roughly $0.25-$0.50 per 1,000 restaurants.
Limitations
- City coverage is limited to a curated map of major European cities. Smaller towns not in the map fall back to Paris — request a specific city and check the output's
cityfield to confirm the match. - Data reflects TheFork's own listings and TripAdvisor-sourced ratings at the time of the run, and may change without notice (prices, offers, and availability update frequently).
- Very large
maxResultsvalues (multiple hundreds) mean multiple sequential page fetches and a longer run time. - Respect TheFork's terms of service and use responsibly.
Frequently asked questions
Does this require a TheFork account or login? No. The actor scrapes TheFork's public city listing pages, which don't require authentication.
Can I filter by cuisine, price, or promotions? Not directly through the input — this actor returns the full restaurant list for a city, including each restaurant's cuisine, price range, and current offers, so you can filter the output dataset however you need after the run.
Why does a smaller town fall back to Paris?
City IDs on TheFork are internal numeric identifiers, not derived from the city name, so this actor uses a curated map of major European cities. Smaller towns not yet in that map default to Paris — check the output's city field to confirm what was actually scraped.
How fresh is the data? Every run scrapes live pages at request time, so ratings, review counts, and active offers reflect TheFork's current listings.
Need this data on a schedule, or a custom version?
We run this scraper as a managed service for businesses: scheduled runs, deduplication, delta detection, and delivery to your inbox, Google Sheets, or API — maintenance included. We can also build a custom version with your exact fields and filters, or combine multiple sources into one feed.
See studioamba.dev/services or email hello@studioamba.dev for a free data sample. We maintain 300+ European web scrapers and answer within one business day.