# TheFork Restaurant Reviews Scraper - Multi-Language (`clearpath/thefork-restaurant-reviews`) Actor

Extract all reviews from any TheFork restaurant across 7 languages. Get ratings, review text, meal dates, reviewer details, photos, and restaurant replies. Automatic deduplication. Export as JSON, CSV, or Excel.

- **URL**: https://apify.com/clearpath/thefork-restaurant-reviews.md
- **Developed by:** [ClearPath](https://apify.com/clearpath) (community)
- **Categories:** Automation, Lead generation, Travel
- **Features:** Limited permissions
- **Stats:** 74 total users, 21 monthly users, 95.9% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.29 / 1,000 reviews

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## TheFork Review Scraper | All Reviews, All Languages (2026)

[![All TheFork reviews. Every language. 5,000 reviews in under 5 minutes. Photos. Reviewer profiles. Restaurant replies.](https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/thefork-restaurant-reviews-readme-hero-v1.png)](https://console.apify.com/actors/GzM1sRA0QwmfnUjEb/input)

From <strong>Clearpath</strong>, creators of <a href="https://apify.com/clearpath/thefork-scraper">TheFork Restaurant Scraper</a>, <a href="https://apify.com/clearpath/yelp-reviews-scraper">Yelp Reviews</a> and <a href="https://apify.com/clearpath/tripadvisor-reviews-scraper">Tripadvisor Reviews</a>. Restaurant discovery and review research from the same team.

### Why choose this actor?

<strong>Get the reviews across languages, with duplicates removed.</strong> Collect the available review history from each restaurant, including reviews written in other languages. Every row keeps its language and restaurant, ready to compare feedback across locations.

<strong>Collect 5,000 reviews in under 5 minutes.</strong> Process several restaurants in one run and export one combined dataset. For ongoing monitoring, use a rolling date window such as <code>2 days</code> to collect recent feedback on a schedule.

<strong>See the dining experience behind each score.</strong> Keep meal dates, dining occasions, reviewer history, photos and restaurant replies where published. Food, service and ambience scores for the restaurant add useful context to each review.

<a href="https://console.apify.com/actors/GzM1sRA0QwmfnUjEb/input"><img src="https://api.apify.com/v2/key-value-stores/pJ7iaZsTFhR3k9tjV/records/thefork-restaurant-reviews-readme-cta-v1.svg" width="258" height="48" alt="Collect restaurant reviews"/></a>

### Quick start

Paste a TheFork restaurant URL. Start with 20 reviews across all languages:

```json
{
  "restaurantUrl": "https://www.thefork.com/restaurant/el-lago-r2406",
  "reviewLanguage": "all",
  "maxReviews": 20
}
```

Set <code>maxReviews</code> to <code>0</code> to collect all available reviews, or use <code>restaurantUrls</code> for several restaurants. The limit applies per restaurant; free-tier trials are capped at 50 reviews per run across all restaurants, for 10 lifetime runs. <a href="https://console.apify.com/actors/GzM1sRA0QwmfnUjEb/input">Open actor input</a> to choose your restaurants. Export JSON, CSV or Excel; reviews are billed per result.

<table><tr><td colspan="5" style="background:#8BFF6E;color:#003F38;padding:10px 14px;font-size:13px;font-weight:700">Restaurant & Review Tools</td></tr><tr><td style="background:#C9FFBA;padding:8px 10px;border:1px solid #BDDCAE;vertical-align:top"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-GzM1sRA0QwmfnUjEb-QxgCbbKvfB-thefork-scraper-logo.png" width="20" height="20" alt="" style="display:inline-block;vertical-align:middle;margin:0"/>&nbsp;<a href="https://console.apify.com/actors/GzM1sRA0QwmfnUjEb/input" style="color:#003F38;text-decoration:none;font-weight:700;font-size:13px">TheFork Reviews</a></span><br><span style="color:#365530;font-size:12px;white-space:nowrap">You are here</span></td><td style="background:#E8FFDF;padding:8px 10px;border:1px solid #BDDCAE;vertical-align:top"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-Jtb2nC8e8u4B0aXUv-9vhv0q4m14-thefork-scraper-logo.png" width="20" height="20" alt="" style="display:inline-block;vertical-align:middle;margin:0"/>&nbsp;<a href="https://apify.com/clearpath/thefork-scraper" style="color:#003F38;text-decoration:none;font-weight:700;font-size:13px">TheFork Places</a></span><br><span style="color:#365530;font-size:12px;white-space:nowrap">Menus & details</span></td><td style="background:#E8FFDF;padding:8px 10px;border:1px solid #BDDCAE;vertical-align:top"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-AQGRB6KUvHqkSvHPj-KDZIkmFvBu-yelp-review-scraper-logo.png" width="20" height="20" alt="" style="display:inline-block;vertical-align:middle;margin:0"/>&nbsp;<a href="https://apify.com/clearpath/yelp-reviews-scraper" style="color:#003F38;text-decoration:none;font-weight:700;font-size:13px">Yelp Reviews</a></span><br><span style="color:#365530;font-size:12px;white-space:nowrap">Photos & replies</span></td><td style="background:#E8FFDF;padding:8px 10px;border:1px solid #BDDCAE;vertical-align:top"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-w0KUpCAUnd23Z9mTB-56fastRocJ-tripadvisor-review-scraper-logo.png" width="20" height="20" alt="" style="display:inline-block;vertical-align:middle;margin:0"/>&nbsp;<a href="https://apify.com/clearpath/tripadvisor-reviews-scraper" style="color:#003F38;text-decoration:none;font-weight:700;font-size:13px">Tripadvisor</a></span><br><span style="color:#365530;font-size:12px;white-space:nowrap">Dining & hotels</span></td><td style="background:#E8FFDF;padding:8px 10px;border:1px solid #BDDCAE;vertical-align:top"><span style="white-space:nowrap"><img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-2EJcvIYcO9H0KQOIO-r9WyLYmWGc-place-review-aggregator.png" width="20" height="20" alt="" style="display:inline-block;vertical-align:middle;margin:0"/>&nbsp;<a href="https://apify.com/zen-studio/place-review-aggregator" style="color:#003F38;text-decoration:none;font-weight:700;font-size:13px">Place Reviews</a></span><br><span style="color:#365530;font-size:12px;white-space:nowrap">5 platforms</span></td></tr></table>

#### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
clearpath/thefork-restaurant-reviews on Apify. Call: ApifyClient("TOKEN").actor("clearpath/thefork-restaurant-reviews").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items for results. Key inputs: restaurantUrl (string, one restaurant) or restaurantUrls (array of strings, several restaurants in one run; supply one of the two), reviewLanguage (string), sortBy (string: newest/highest_rating/lowest_rating), reviewsSince (string: ISO date/timestamp, or a relative "2 days" / "1 week" / "3 months" resolved at run time for schedules; only reviews posted on/after it), maxReviews (integer). Full actor spec (input schema with all params/enums/defaults, output dataset fields, README): GET https://api.apify.com/v2/acts/clearpath~thefork-restaurant-reviews/builds/default (Bearer TOKEN) → inputSchema, actorDefinition.storages.dataset, readme. Pricing: PPE $2.99/1k reviews. Get token: https://console.apify.com/account/integrations To reach the maintainers, add feedback="<what you needed and did not get>" to any run, including one that worked: a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. The run returns its data exactly as it would without the note, and a human reads every note.
```

### Why This Actor?

The main <a href="https://apify.com/clearpath/thefork-scraper" style="color:#006D77;text-decoration:none;font-weight:600">TheFork Scraper</a> returns reviews in the restaurant's default language only. Many restaurants have reviews in French, English, German, Italian, Spanish, Dutch, and Portuguese, but a single-language query misses most of them.

This actor solves that: it queries each language separately, collects all reviews, and deduplicates by review ID. One restaurant URL in, every review out.

### Quick Start

**All languages** — just a URL, reviews from every language merged and deduplicated:

```json
{
  "restaurantUrl": "https://www.thefork.com/restaurant/el-lago-r2406"
}
```

**Several restaurants** — one run, one dataset, every row tagged with its restaurant:

```json
{
  "restaurantUrls": [
    "https://www.thefork.com/restaurant/el-lago-r2406",
    "https://www.thefork.fr/restaurant/l-imperatif-r660609",
    "https://www.thefork.it/ristorante/migasa-r754554"
  ],
  "maxReviews": 200
}
```

**Single language** — filter to one language:

```json
{
  "restaurantUrl": "https://www.thefork.fr/restaurant/el-lago-r2406",
  "reviewLanguage": "fr",
  "maxReviews": 200
}
```

**Highest-rated first** — sort by rating instead of date:

```json
{
  "restaurantUrl": "https://www.thefork.com/restaurant/el-lago-r2406",
  "sortBy": "highest_rating",
  "maxReviews": 50
}
```

**Daily monitoring** — on a schedule, look back from each run:

```json
{
  "restaurantUrl": "https://www.thefork.com/restaurant/el-lago-r2406",
  "reviewsSince": "2 days"
}
```

A relative value is resolved when the run starts, so the same scheduled input keeps working. For a one-off catch-up, give an exact moment instead:

```json
{
  "restaurantUrl": "https://www.thefork.com/restaurant/el-lago-r2406",
  "reviewsSince": "2026-06-10T00:00:00Z"
}
```

### Pricing

<table>
<tr>
<td style="padding:12px 20px;background:#006D77;border:none;border-radius:8px 0 0 0"><span style="color:#EDF6F9;font-weight:600;font-size:12px;text-transform:uppercase;letter-spacing:1px">Apify Plan</span></td>
<td style="padding:12px 20px;background:#006D77;border:none;border-radius:0 8px 0 0"><span style="color:#EDF6F9;font-weight:600;font-size:12px;text-transform:uppercase;letter-spacing:1px">Price per 1,000 Reviews</span></td>
</tr>
<tr>
<td style="padding:12px 20px;border-bottom:1px solid #F5F5F4">Free</td>
<td style="padding:12px 20px;border-bottom:1px solid #F5F5F4"><span style="font-weight:700">$2.99</span></td>
</tr>
<tr>
<td style="color:#1C1917;padding:12px 20px;border-bottom:1px solid #F5F5F4;background:#EDF6F9">Starter</td>
<td style="padding:12px 20px;border-bottom:1px solid #F5F5F4;background:#EDF6F9"><span style="color:#006D77;font-weight:700">$2.79</span></td>
</tr>
<tr>
<td style="padding:12px 20px;border-bottom:1px solid #F5F5F4">Scale</td>
<td style="padding:12px 20px;border-bottom:1px solid #F5F5F4"><span style="font-weight:700">$2.49</span></td>
</tr>
<tr>
<td style="color:#1C1917;padding:12px 20px;background:#EDF6F9">Business</td>
<td style="padding:12px 20px;background:#EDF6F9"><span style="color:#006D77;font-weight:700">$2.29</span></td>
</tr>
</table>

 

#### Free Users

New users get **10 free runs** with up to **50 reviews per run** to test the actor before subscribing. [Upgrade your plan](https://console.apify.com/billing/subscription) for unlimited results.

### Use Cases

<table>
<tr>
<td style="padding:20px 24px;border-left:3px solid #006D77;background:#EDF6F9;border-top:none;border-right:none;border-bottom:none;vertical-align:top;width:50%">
<span style="color:#006D77;font-weight:700">Sentiment Analysis</span><br>
<span style="color:#57534E;font-size:14px">Collect all reviews across languages for NLP analysis. Detect trends in food quality, service, and ambience over time.</span>
</td>
<td style="padding:20px 24px;border-left:3px solid #006D77;background:#EDF6F9;border-top:none;border-right:none;border-bottom:none;vertical-align:top;width:50%">
<span style="color:#006D77;font-weight:700">Competitor Monitoring</span><br>
<span style="color:#57534E;font-size:14px">Track what guests say about competing restaurants. Compare ratings, complaint patterns, and response rates.</span>
</td>
</tr>
<tr><td style="padding:4px;border:none" colspan="2"></td></tr>
<tr>
<td style="padding:20px 24px;border-left:3px solid #006D77;background:#EDF6F9;border-top:none;border-right:none;border-bottom:none;vertical-align:top;width:50%">
<span style="color:#006D77;font-weight:700">Reputation Management</span><br>
<span style="color:#57534E;font-size:14px">Export all reviews including restaurant replies. Identify unanswered negative reviews and response gaps.</span>
</td>
<td style="padding:20px 24px;border-left:3px solid #006D77;background:#EDF6F9;border-top:none;border-right:none;border-bottom:none;vertical-align:top;width:50%">
<span style="color:#006D77;font-weight:700">Market Research</span><br>
<span style="color:#57534E;font-size:14px">Analyze review volume and ratings across languages to understand tourist vs. local dining patterns.</span>
</td>
</tr>
<tr><td style="padding:4px;border:none" colspan="2"></td></tr>
<tr>
<td colspan="2" style="padding:20px 24px;border-left:3px solid #006D77;background:#EDF6F9;border-top:none;border-right:none;border-bottom:none;vertical-align:top">
<span style="color:#006D77;font-weight:700">New Review Monitoring</span><br>
<span style="color:#57534E;font-size:14px">Schedule recurring runs with <code>reviewsSince</code> set to a relative window such as <code>2 days</code>, which is resolved fresh on every run. The run stops as soon as it reaches older reviews, so you only collect (and pay for) genuinely new ones. Pipe new low ratings into alerts or a reputation dashboard.</span>
</td>
</tr>
</table>

### Parameters

<table>
<tr>
<td style="padding:12px 20px;background:#006D77;border:none;border-radius:8px 0 0 0"><span style="color:#EDF6F9;font-weight:600;font-size:12px;text-transform:uppercase;letter-spacing:1px">Parameter</span></td>
<td style="padding:12px 16px;background:#006D77;border:none"><span style="color:#EDF6F9;font-weight:600;font-size:12px;text-transform:uppercase;letter-spacing:1px">Type</span></td>
<td style="padding:12px 20px;background:#006D77;border:none;border-radius:0 8px 0 0"><span style="color:#EDF6F9;font-weight:600;font-size:12px;text-transform:uppercase;letter-spacing:1px">Description</span></td>
</tr>
<tr>
<td style="padding:12px 20px;border-bottom:1px solid #F5F5F4"><code>restaurantUrl</code></td>
<td style="padding:12px 16px;border-bottom:1px solid #F5F5F4"><span style="font-size:12px;font-weight:700">string</span></td>
<td style="padding:12px 20px;border-bottom:1px solid #F5F5F4;">TheFork restaurant URL. Country-specific domains and localized paths such as <code>/ristorante/</code> and <code>/restaurante/</code> are supported.</td>
</tr>
<tr>
<td style="padding:12px 20px;border-bottom:1px solid #F5F5F4"><code>restaurantUrls</code></td>
<td style="padding:12px 16px;border-bottom:1px solid #F5F5F4"><span style="font-size:12px;font-weight:700">array</span></td>
<td style="padding:12px 20px;border-bottom:1px solid #F5F5F4;">Several restaurant URLs in one run. Reviews land in a single dataset, each row carrying its own restaurant name, ID and coordinates. <code>maxReviews</code> then applies to each restaurant separately.</td>
</tr>
<tr>
<td style="color:#1C1917;padding:12px 20px;border-bottom:1px solid #F5F5F4;background:#EDF6F9"><code>reviewLanguage</code></td>
<td style="padding:12px 16px;border-bottom:1px solid #F5F5F4;background:#EDF6F9"><span style="color:#006D77;font-size:12px;font-weight:700">string</span></td>
<td style="padding:12px 20px;border-bottom:1px solid #F5F5F4;background:#EDF6F9;color:#57534E">"All languages" iterates every language and merges. Or pick one: en, fr, de, it, es, nl, pt. Default: <code>all</code></td>
</tr>
<tr>
<td style="padding:12px 20px;border-bottom:1px solid #F5F5F4"><code>sortBy</code></td>
<td style="padding:12px 16px;border-bottom:1px solid #F5F5F4"><span style="font-size:12px;font-weight:700">string</span></td>
<td style="padding:12px 20px;border-bottom:1px solid #F5F5F4;">Review order: <code>newest</code>, <code>highest_rating</code>, or <code>lowest_rating</code>. With "All languages", applied within each language. Default: <code>newest</code></td>
</tr>
<tr>
<td style="padding:12px 20px;border-bottom:1px solid #F5F5F4"><code>reviewsSince</code></td>
<td style="padding:12px 16px;border-bottom:1px solid #F5F5F4"><span style="font-size:12px;font-weight:700">string</span></td>
<td style="padding:12px 20px;border-bottom:1px solid #F5F5F4;">Only reviews posted on/after this point (UTC). Accepts a relative <code>2 days</code>, <code>1 week</code>, <code>3 months</code>, <code>1 year</code>, resolved when the run starts, or an exact <code>2026-06-10</code> / <code>2026-06-10T14:30:00Z</code>. Stops early, so you only collect new reviews. Forces newest order. Default: empty (all)</td>
</tr>
<tr>
<td style="color:#1C1917;padding:12px 20px;border-bottom:1px solid #F5F5F4;background:#EDF6F9"><code>maxReviews</code></td>
<td style="padding:12px 16px;border-bottom:1px solid #F5F5F4;background:#EDF6F9"><span style="color:#E29578;font-size:12px;font-weight:700">integer</span></td>
<td style="padding:12px 20px;border-bottom:1px solid #F5F5F4;background:#EDF6F9;color:#57534E">Max reviews to collect across all languages. <code>0</code> = no limit. Default: <code>0</code></td>
</tr>
</table>

### Output

Each review is a flat dataset item with 37 fields:

**Restaurant details** — name, ID, full address (street, city, zip, country) and exact coordinates, on every row, so each row stands on its own.

**Restaurant rating summary** — overall rating (1-10 scale), total review count, and the category scores for food, service, and ambience, plus the restaurant's TripAdvisor rating (1-5 scale) and review count when available. These restaurant-level fields are identical on every row, so a single review gives you the full summary. The summary is also written to the run's key-value store under `OUTPUT`, together with a per-language review breakdown, so it is available even for restaurants that have ratings but no written reviews.

**Review data** — rating (1-10 scale), review text, occasion (romantic, business, family, friends), meal date, creation date, status, restaurant reply, photos, likes

**Reviewer data** — first name, last name, username, avatar URL, total review count, member-since date

#### Output Example

```json
{
    "restaurant_id": "61beac0c-ba99-45d2-b7e5-70e067c86be7",
    "restaurant_name": "El Lago",
    "restaurant_city": "Marbella",
    "restaurant_country": "Spain",
    "restaurant_address": "Urb. Elviria Hills, Avda. Las Cumbres s/n, 29604, Marbella",
    "restaurant_street": "Urb. Elviria Hills, Avda. Las Cumbres s/n",
    "restaurant_zip_code": "29604",
    "restaurant_latitude": 36.4894,
    "restaurant_longitude": -4.9066,
    "restaurant_overall_rating": 9.5,
    "restaurant_overall_review_count": 367,
    "restaurant_food_rating": 9.6,
    "restaurant_service_rating": 9.6,
    "restaurant_ambience_rating": 9.4,
    "restaurant_review_count": 172,
    "restaurant_tripadvisor_rating": null,
    "restaurant_tripadvisor_review_count": null,
    "review_id": "ac9a66c7-25b1-11f0-b007-0e8af7bd4d53",
    "created_at": "2025-04-30T10:55:48.569Z",
    "updated_at": "2025-04-30T10:55:48.569Z",
    "rating_value": 10,
    "meal_date": "2025-04-29T18:00:00.000Z",
    "status": "PUBLISHED",
    "occasion": "ROMANTIC",
    "review_body": "Love this place & the serenity, excellent food & amazing champagne/wine list",
    "restaurant_reply_body": null,
    "restaurant_reply_status": null,
    "reviewer_id": "0be0b618-0202-4c66-ab88-da0067ce7f61",
    "reviewer_first_name": "Jose",
    "reviewer_last_name": "T.",
    "reviewer_username": "Jose T.",
    "reviewer_avatar_url": null,
    "reviewer_review_count": 2,
    "reviewer_member_since": "2019-08-14T09:12:33.104Z",
    "photos": [
        {
            "id": "a39a94be-7c2e-4c1f-9d33-5f0b9a2e77d1",
            "title": null,
            "description": null,
            "image_url": "https://cdn.thefork.com/tf-lab/image/upload/f_auto,q_auto,w_800,c_limit/customer/61beac0c.../a39a94be.jpg",
            "preview_url": "https://cdn.thefork.com/tf-lab/image/upload/f_auto,q_auto,g_auto:subject,w_488,h_488,c_fill/customer/61beac0c.../a39a94be.jpg",
            "created_ts": "2025-04-30T10:57:34.768Z",
            "likes": 0
        }
    ],
    "likes": 0,
    "language": "en"
}
```

#### Run Summary

The same restaurant-level figures, plus how the reviews split across languages, are written to the key-value store under `OUTPUT`. With several restaurants it holds a `restaurants` list of these same objects, one per restaurant:

```json
{
    "restaurant_id": "61beac0c-ba99-45d2-b7e5-70e067c86be7",
    "restaurant_name": "El Lago",
    "restaurant_city": "Marbella",
    "restaurant_country": "Spain",
    "restaurant_address": "Urb. Elviria Hills, Avda. Las Cumbres s/n, 29604, Marbella",
    "restaurant_street": "Urb. Elviria Hills, Avda. Las Cumbres s/n",
    "restaurant_zip_code": "29604",
    "restaurant_latitude": 36.4894,
    "restaurant_longitude": -4.9066,
    "restaurant_overall_rating": 9.5,
    "restaurant_overall_review_count": 367,
    "restaurant_food_rating": 9.6,
    "restaurant_service_rating": 9.6,
    "restaurant_ambience_rating": 9.4,
    "restaurant_review_count": 172,
    "restaurant_tripadvisor_rating": null,
    "restaurant_tripadvisor_review_count": null,
    "reviews_by_language": {
        "all": 172,
        "en": 96,
        "es": 61,
        "fr": 11,
        "null": 4
    }
}
```

### API Integration

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("your_token")
run = client.actor("clearpath/thefork-restaurant-reviews").call(run_input={
    "restaurantUrl": "https://www.thefork.com/restaurant/el-lago-r2406",
    "reviewLanguage": "all",
    "maxReviews": 500,
})

for review in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{review['language']} | {review['rating_value']} | {review['review_body'][:80]}")
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'your_token' });
const run = await client.actor('clearpath/thefork-restaurant-reviews').call({
    restaurantUrl: 'https://www.thefork.com/restaurant/el-lago-r2406',
    reviewLanguage: 'all',
    maxReviews: 500,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`${items.length} reviews collected`);
```

### More Zen Studio & Clearpath review scrapers

**🔗 Review aggregators**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-2EJcvIYcO9H0KQOIO-RfOMRAFXbQ-local-business-leads-scraper.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Place reviews**
  - [Place Review Aggregator](https://apify.com/zen-studio/place-review-aggregator)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-qIdkSE8q4I8DIfNlD-lKLPnrjTrn-hotel-review-aggregator-logo2.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Hotel reviews**
  - [Hotel Review Aggregator API: Google, Booking, Expedia & More](https://apify.com/clearpath/hotel-review-aggregator)
- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-9UyFQFcuwmvWG91uH-BWRrsdwsuQ-software-reviews-aggregator-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Software reviews**
  - [All-in-One Review Scraper: G2, Capterra & Trustpilot](https://apify.com/zen-studio/software-review-scraper)

**📍 Individual review sources**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-ojjo6BxQiOiLYRca1-RU3DuH650K-google-maps-directions-api-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Google Maps**
  - [Google Maps Reviews Scraper - Unlimited Reviews Per Place](https://apify.com/zen-studio/google-maps-reviews-scraper)
  - [Google Maps Scraper - Every Place, Not Just the Top 250](https://apify.com/zen-studio/google-maps-scraper)

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/NWYsOG96fMDy8ycdf-actor-sv8jAMKDT0AnGB24l-NYt0D11tLA-swarm-foursquare-scraper-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Swarm / Foursquare**
  - [Foursquare & Swarm Scraper: Places, Reviews, Busy Hours](https://apify.com/zen-studio/swarm-place-reviews-scraper)

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-AQGRB6KUvHqkSvHPj-KDZIkmFvBu-yelp-review-scraper-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Yelp**
  - [Yelp Reviews Scraper - All Languages & Owner Replies](https://apify.com/clearpath/yelp-reviews-scraper)

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-w0KUpCAUnd23Z9mTB-56fastRocJ-tripadvisor-review-scraper-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Tripadvisor**
  - [Tripadvisor Reviews Scraper - Hotels, Restaurants, Attractions](https://apify.com/clearpath/tripadvisor-reviews-scraper)
  - [Tripadvisor Scraper - Hotels, Restaurants, Attractions, Emails](https://apify.com/clearpath/tripadvisor-scraper)
    **📍 Place discovery**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-4VOKn4ssqn7AQJIUP-tDQgAGNQZE-local-business-leads-scraper.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **Business leads**
  - [Fast Business Leads Scraper - Up to 1,000 in 30 Seconds](https://apify.com/clearpath/local-business-lead-extractor)
    **🍽️ Restaurant review tools**

- <img src="https://apify-image-uploads-prod.s3.us-east-1.amazonaws.com/DSvMCAwsufMyZeLyt-actor-GzM1sRA0QwmfnUjEb-QxgCbbKvfB-thefork-scraper-logo.png" width="16" height="16" style="vertical-align:middle;border-radius:3px"> **TheFork**
  - [TheFork Scraper - Restaurants, Reviews & Menus](https://apify.com/clearpath/thefork-scraper)

### Supported Languages

<table>
<tr>
<td style="padding:14px 20px;background:#EDF6F9;border:none;border-radius:8px 0 0 8px;text-align:center;width:14%">
<span style="color:#006D77;font-weight:700;font-size:18px">EN</span><br>
<span style="color:#78716C;font-size:11px">English</span>
</td>
<td style="padding:14px 20px;background:#EDF6F9;border:none;text-align:center;width:14%">
<span style="color:#006D77;font-weight:700;font-size:18px">FR</span><br>
<span style="color:#78716C;font-size:11px">French</span>
</td>
<td style="padding:14px 20px;background:#EDF6F9;border:none;text-align:center;width:14%">
<span style="color:#006D77;font-weight:700;font-size:18px">DE</span><br>
<span style="color:#78716C;font-size:11px">German</span>
</td>
<td style="padding:14px 20px;background:#EDF6F9;border:none;text-align:center;width:14%">
<span style="color:#006D77;font-weight:700;font-size:18px">IT</span><br>
<span style="color:#78716C;font-size:11px">Italian</span>
</td>
<td style="padding:14px 20px;background:#EDF6F9;border:none;text-align:center;width:14%">
<span style="color:#006D77;font-weight:700;font-size:18px">ES</span><br>
<span style="color:#78716C;font-size:11px">Spanish</span>
</td>
<td style="padding:14px 20px;background:#EDF6F9;border:none;text-align:center;width:14%">
<span style="color:#006D77;font-weight:700;font-size:18px">NL</span><br>
<span style="color:#78716C;font-size:11px">Dutch</span>
</td>
<td style="padding:14px 20px;background:#EDF6F9;border:none;border-radius:0 8px 8px 0;text-align:center;width:14%">
<span style="color:#006D77;font-weight:700;font-size:18px">PT</span><br>
<span style="color:#78716C;font-size:11px">Portuguese</span>
</td>
</tr>
</table>

 

The actor auto-detects which languages have reviews for each restaurant. Set `reviewLanguage` to `"all"` to iterate all of them, or pick a specific code.

### Data Export

<table>
<tr>
<td style="padding:16px 24px;border:1px solid #E7E5E4;border-right:none;border-radius:8px 0 0 8px;text-align:center;width:33%">
<span style="font-weight:700">JSON</span><br>
<span style="color:#78716C;font-size:13px">NLP pipelines, APIs</span>
</td>
<td style="padding:16px 24px;border:1px solid #E7E5E4;border-right:none;text-align:center;width:33%">
<span style="font-weight:700">CSV</span><br>
<span style="color:#78716C;font-size:13px">Spreadsheets, reporting</span>
</td>
<td style="padding:16px 24px;border:1px solid #E7E5E4;border-radius:0 8px 8px 0;text-align:center;width:33%">
<span style="font-weight:700">Excel</span><br>
<span style="color:#78716C;font-size:13px">Dashboards, presentations</span>
</td>
</tr>
</table>

### FAQ

**Can I scrape more than one restaurant per run?**

Yes. Put the URLs in `restaurantUrls`, one per line. Every review lands in the same dataset, tagged with its restaurant name, ID and coordinates, so a single export covers the whole set. `maxReviews` applies to each restaurant, so ten URLs with `maxReviews: 100` give you up to 1,000 reviews.

**What restaurant information comes with each review?**

Whatever identifies and locates the restaurant: ID, name, full address, city, country and coordinates, repeated on every row so a single review is self-contained and rows group straight into a pipeline.

Everything else about the restaurant itself, menus and dish prices, photos, features, opening hours, Michelin data, comes from [TheFork Restaurant Scraper](https://apify.com/clearpath/thefork-scraper) and joins onto these rows on `restaurant_id`.

**How is this different from the main TheFork Scraper?**

The main scraper returns reviews in one language per restaurant (the domain's default). This actor iterates all 7 languages separately, collecting reviews that only appear in non-default language buckets. It also deduplicates automatically.

**Are reviews deduplicated?**

Yes. The same review can appear in multiple language buckets. The actor tracks review IDs and skips duplicates.

**Do I need a TheFork account?**

No. All data is publicly available.

**How many reviews can I extract?**

No limit. Set `maxReviews` to `0` for all reviews. Restaurants typically have between 50 and 5,000 reviews across all languages.

**Can I use any TheFork domain?**

Yes. URLs from thefork.com, thefork.fr, thefork.de, thefork.it, and thefork.es all work.

### Support

<table>
<tr>
<td style="padding:0;width:4px;background:#006D77;border:none;border-radius:4px"></td>
<td style="padding:16px 20px;border:none">
<span style="font-weight:600">Need help?</span><br>
<span style="font-size:14px">Email <a href="mailto:max@mapa.slmail.me" style="text-decoration:none;font-weight:600">max@mapa.slmail.me</a> or open an issue in the Issues tab.</span>
</td>
</tr>
</table>

### Legal Compliance

Extracts publicly available review data from TheFork. Users must comply with applicable data protection regulations (GDPR, CCPA) and TheFork's terms of service.

***

<p style="text-align:center;color:#A8A29E;font-size:12px;letter-spacing:0.5px">
Built by <a href="https://apify.com/clearpath" style="color:#006D77;text-decoration:none;font-weight:600">Clearpath</a>
</p>

# Actor input Schema

## `restaurantUrl` (type: `string`):

Paste one TheFork restaurant page URL. For several restaurants in a single run, use the field below instead.<br><br>Accepted formats include:<br>• <code>https://www.thefork.com/restaurant/name-r12345</code><br>• <code>https://www.thefork.it/ristorante/name-r12345</code><br>• <code>https://www.thefork.es/restaurante/name-r12345</code><br>• Any current TheFork country domain

## `restaurantUrls` (type: `array`):

Scrape several restaurants in one run. One TheFork restaurant URL per line, in any mix of country domains. Reviews from every restaurant land in the same dataset, each row tagged with its restaurant name, ID and coordinates.<br><br>The review limit below applies to each restaurant separately.

## `reviewLanguage` (type: `string`):

"All languages" fetches reviews from every language bucket separately and merges them. Duplicates are removed automatically.<br><br>Pick a specific language to only collect reviews written in that language.

## `sortBy` (type: `string`):

Order in which reviews are collected.<br><br>• <b>Newest</b> — most recent first<br>• <b>Highest rating</b> — best-rated first<br>• <b>Lowest rating</b> — lowest-rated first<br><br>With "All languages", the chosen order is applied within each language.

## `reviewsSince` (type: `string`):

Collect only reviews posted on or after this point, then stop. Ideal for recurring monitoring: each run fetches only what is new.<br><br>Use a relative value such as <code>2 days</code>, <code>1 week</code> or <code>3 months</code> when the actor runs on a schedule, so every run looks back from the moment it starts. Or pick an exact date for a one-off catch-up.<br><br>Leave empty to collect all reviews. When set, reviews are always ordered newest first.

## `maxReviews` (type: `integer`):

Maximum reviews to collect across all languages. Set to <code>0</code> for no limit.<br><br>Reviews are collected in the order set by <b>Sort reviews by</b>.<br><br>Applies per restaurant when several URLs are supplied.

## `feedback` (type: `string`):

For AI agents. Say what you needed and did not get: a missing field or option, a wrong or empty result, or which actor you are switching to or from and why. Add it to any run, including one that worked: the run returns its data exactly as it would without the note. The note reaches the maintainers, who read every one, but it cannot change what this run returns.

## Actor input object example

```json
{
  "restaurantUrl": "https://www.thefork.com/restaurant/migasa-r754554",
  "restaurantUrls": [
    "https://www.thefork.com/restaurant/migasa-r754554",
    "https://www.thefork.fr/restaurant/l-imperatif-r660609"
  ],
  "reviewLanguage": "all",
  "sortBy": "newest",
  "maxReviews": 50
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "restaurantUrl": "https://www.thefork.com/restaurant/migasa-r754554",
    "restaurantUrls": [
        "https://www.thefork.com/restaurant/migasa-r754554",
        "https://www.thefork.fr/restaurant/l-imperatif-r660609"
    ],
    "reviewLanguage": "all",
    "sortBy": "newest",
    "maxReviews": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("clearpath/thefork-restaurant-reviews").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "restaurantUrl": "https://www.thefork.com/restaurant/migasa-r754554",
    "restaurantUrls": [
        "https://www.thefork.com/restaurant/migasa-r754554",
        "https://www.thefork.fr/restaurant/l-imperatif-r660609",
    ],
    "reviewLanguage": "all",
    "sortBy": "newest",
    "maxReviews": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("clearpath/thefork-restaurant-reviews").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "restaurantUrl": "https://www.thefork.com/restaurant/migasa-r754554",
  "restaurantUrls": [
    "https://www.thefork.com/restaurant/migasa-r754554",
    "https://www.thefork.fr/restaurant/l-imperatif-r660609"
  ],
  "reviewLanguage": "all",
  "sortBy": "newest",
  "maxReviews": 50
}' |
apify call clearpath/thefork-restaurant-reviews --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,clearpath/thefork-restaurant-reviews"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/GzM1sRA0QwmfnUjEb/builds/2LcYHwjUM4ydcfglL/openapi.json
