# Tripadvisor Reviews Scraper (`jmlp/tripadvisor-reviews-scraper`) Actor

Scrape Tripadvisor reviews of any hotel, restaurant, attraction or tour: rating, title, full text in the original language plus English, dates, trip type, sub-ratings, reviewer and owner response, plus the place's rating and address. No login.

- **URL**: https://apify.com/jmlp/tripadvisor-reviews-scraper.md
- **Developed by:** [Mary Lou](https://apify.com/jmlp) (community)
- **Categories:** Travel, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.15 / 1,000 reviews

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## Tripadvisor Reviews Scraper

Scrape **Tripadvisor reviews of any hotel, restaurant, attraction or tour**. Every review comes with its rating, title, full text and publication date. You also get the date of the stay or visit, the trip type, the sub-ratings (value, rooms, service, food...), the reviewer, and the management's response. Each row also carries the place's rating, review count and address.

Every review comes **in the language it was written in, with Tripadvisor's English translation alongside**.

No login, no Tripadvisor account.

***

### What you can do with it

- **Reputation monitoring**: follow what guests say about your hotels, restaurants or attractions, and get every new review with a daily or weekly run
- **Competitor benchmarking**: compare ratings, sub-ratings and complaints across your competitive set
- **Guest experience analysis**: feed full review texts into sentiment models, dashboards or LLM workflows, in the original language or in English
- **Response management**: see which reviews got a management response, who wrote it and how fast
- **Market research**: collect every review of every place in a destination you track
- **Agency reporting**: review exports for every client, in one run

***

### How to scrape Tripadvisor reviews

**1.** Enter the **Places**, one per line. Any of these works:

- a Tripadvisor link, from any country's Tripadvisor: `https://www.tripadvisor.co.uk/Hotel_Review-g186338-d187591-Reviews-The_Ritz_London-London_England.html`
- a location id: `d187591`
- a name: `The Ritz London`, which reads every place Tripadvisor's search finds under that name

**2.** Optionally filter by **Ratings**, **Review languages**, **Published since**, **Trip types** or **Reviews mentioning** a word.

**3.** Set **Max reviews per place**, then press Start.

```json
{
  "places": [
    "https://www.tripadvisor.com/Hotel_Review-g186338-d187591-Reviews-The_Ritz_London_Hotel-London_England.html",
    "Le Jules Verne Paris"
  ],
  "maxReviewsPerPlace": 1000,
  "ratings": ["1", "2"],
  "dateFrom": "6 months"
}
```

***

### How many reviews you get

**Every review, back to the first one.** Tripadvisor's whole history is there: The Ritz London's 5,407 reviews go back to 2004. Le Jules Verne's 1,197 reviews came in 40 seconds.

- **Max reviews per place** takes the newest. Empty means all of them.
- **Published since** with a daily or weekly schedule collects only what is new since the last run.
- The run's `SUMMARY` record shows, per place, how many reviews Tripadvisor lists, how many matched your filters, and how many were collected.

***

### Original language and English

Tripadvisor shows reviews translated into the visitor's language. This scraper gives you both versions:

- `title` and `text`: the review as its author wrote it, in French, German, Japanese or any other language
- `language`: the language it was written in
- `title_english` and `text_english`: Tripadvisor's English translation, for every review written in another language

Set **Review languages** to get only the reviews written in those languages.

***

### Output

One row per review. Export as **JSON, CSV, Excel, XML or RSS**.

```json
{
  "review_id": "1076845005",
  "review_url": "https://www.tripadvisor.com/ShowUserReviews-g187147-d719141-r1076845005-Le_Jules_Verne-Paris_Ile_de_France.html",
  "rating": 5,
  "title": "Remarquable",
  "text": "Remarquable expérience. Plats au top. Vins au top. Personnel accueillant et compétent. Mention spécial au sommelier. Et surtout vue extraordinaire...",
  "language": "fr",
  "title_english": "Remarkable",
  "text_english": "Remarkable experience. Top-notch dishes. Top-notch wines. Welcoming and competent staff. Special mention to the sommelier. And above all an extraordinary view...",
  "published_at": "2026-09-08T06:27:11.426Z",
  "travel_date": "2026-09",
  "trip_type": "Family",
  "subratings": {"value": 4, "service": 5, "food": 5, "atmosphere": 4},
  "helpful_votes": 0,
  "reviewer_name": "Laurent V",
  "reviewer_contributions": 3,
  "reply_text": "Bonjour Laurent, Nous vous remercions d'avoir pris le temps de rédiger cet avis...",
  "reply_published_at": "2026-09-15T14:57:14.626Z",
  "reply_author": "Owner",
  "place_id": "719141",
  "place_name": "Le Jules Verne",
  "place_type": "restaurant",
  "place_rating": 4.2,
  "place_review_count": 1197,
  "place_address": "6 Avenue Gustave Eiffel Eiffel Tower - 2nd floor, 75007 Paris, France",
  "place_city": "Paris",
  "place_country": "France"
}
```

| Field | Notes |
| --- | --- |
| `rating`, `title`, `text`, `language` | The rating given and the review in full, as written |
| `title_english`, `text_english` | Tripadvisor's English translation of a review written in another language |
| `published_at`, `travel_date`, `trip_type` | When it was published, the month of the stay or visit, and Business, Couples, Family, Friends or Solo |
| `subratings` | The reviewer's ratings by aspect: value, rooms, location, cleanliness, service, sleep quality for hotels; food, service, value, atmosphere for restaurants |
| `photos`, `photo_count`, `tip`, `helpful_votes` | The review's photos in full size, the reviewer's tip, and how many readers found it helpful |
| `reviewer_*` | Name, username, profile link, hometown, contributions and helpful votes |
| `reply_text`, `reply_published_at`, `reply_author` | The management's public response, when, and the responder's role |
| `place_*` | The place's id, name, type, page, rating, review count, address, city and country |

Each place's full details are saved as the `PLACES` record in the run's key-value store: rating, review counts by rating, average sub-ratings, address and coordinates, phone, price range, cuisines or amenities, room count and Travelers' Choice award.

***

### Reliable on big runs

- **Inputs are read forgivingly.** Links from any country's Tripadvisor, review links, location ids and names all work. So do ratings written as `5`, `Excellent` or `negative`, languages as `fr`, `French` or `Chinese`, and trip types as `family` or `couples`. Anything that cannot be read is skipped with a note in the log, not the whole run.
- **Refusals are retried.** A refused request moves to a new IP. Places still refused at the end get a second pass, and one that fails costs only itself.
- **No failed runs for blocks.** If Tripadvisor refuses everything, the run ends normally and its status message says why.
- **Resumable.** Progress is saved every 30 seconds.

***

### FAQ

**Do I need a Tripadvisor account?**
No. Tripadvisor reviews are public, and the scraper reads them as a signed-out visitor.

**Which places are covered?**
Hotels, restaurants, attractions, and tours and activities, in every country. A link from tripadvisor.co.uk, .de, .fr or any other Tripadvisor site gives the same place and reviews.

**What does a name give?**
Every place Tripadvisor's search finds under that exact name, or every place whose name and town hold all its words, biggest first. `Marina Bay Sands` is the hotel; `Ritz London` is the hotel and three Ritz restaurants in London. To get only one place, paste its link.

**Why do some reviews have an English version and others not?**
`text_english` is filled for reviews written in a language other than English. English reviews need no translation.

**Can I get only negative reviews?**
Yes. Set **Ratings** to 1 and 2, or type `negative`.

**Which proxy should I use?**
The default residential proxy works. Apify's datacenter proxy works too, and other settings fall back to residential when Tripadvisor refuses them.

***

### Related scrapers

- **Trustpilot Reviews Scraper**: reviews and replies of any company on Trustpilot
- **Website Contact Scraper**: emails, phones and social profiles from websites
- **Google Search Scraper**: organic results for any query
- **Meta Ads Library Scraper**: the ads a business runs on Facebook and Instagram

# Actor input Schema

## `places` (type: `array`):

One per line: a Tripadvisor link to a hotel, restaurant, attraction or tour (from any country's Tripadvisor), its location id (d187591), or its name (The Ritz London). A name stands for every place Tripadvisor's search finds under it.

## `maxReviewsPerPlace` (type: `integer`):

The newest this many reviews of each place. Empty means every review, back to the first.

## `ratings` (type: `array`):

Only reviews with these ratings. Empty means all.

## `languages` (type: `array`):

Only reviews written in these languages: codes or names (en, de, French). Empty means every language, each review in the language it was written in, with Tripadvisor's English translation alongside.

## `dateFrom` (type: `string`):

Only reviews published on or after this date: 2025-01-01, or relative such as '30 days' or '6 months'. For daily or weekly runs that collect only what is new.

## `tripTypes` (type: `array`):

Only reviews from these kinds of trips. Empty means all.

## `searchText` (type: `string`):

Only reviews that mention this word or phrase, as Tripadvisor's own review search finds them: breakfast, noise, rooftop.

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

Stop after this many reviews across every place. Caps both runtime and cost.

## `proxyConfiguration` (type: `object`):

Tripadvisor answers residential exits. The default works; other settings fall back to it.

## `resume` (type: `boolean`):

Save progress every ~30s so a run that gets migrated or restarted by the platform picks up where it stopped, without repeating reviews.

## `continueFromLastRun` (type: `boolean`):

If your previous run with the same input was interrupted, scrape only what it missed. Reviews already collected stay in THAT run's dataset.

## Actor input object example

```json
{
  "places": [
    "https://www.tripadvisor.com/Hotel_Review-g186338-d187591-Reviews-The_Ritz_London_Hotel-London_England.html"
  ],
  "maxReviewsPerPlace": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "resume": true,
  "continueFromLastRun": false
}
```

# Actor output Schema

## `reviews` (type: `string`):

One record per review.

## `places` (type: `string`):

Each place's details: rating, review counts by rating, sub-ratings, address, coordinates, price range, award.

## `summary` (type: `string`):

What each place gave, and whether anything was refused or not found.

# 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 = {
    "places": [
        "https://www.tripadvisor.com/Hotel_Review-g186338-d187591-Reviews-The_Ritz_London_Hotel-London_England.html"
    ],
    "maxReviewsPerPlace": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("jmlp/tripadvisor-reviews-scraper").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 = {
    "places": ["https://www.tripadvisor.com/Hotel_Review-g186338-d187591-Reviews-The_Ritz_London_Hotel-London_England.html"],
    "maxReviewsPerPlace": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("jmlp/tripadvisor-reviews-scraper").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 '{
  "places": [
    "https://www.tripadvisor.com/Hotel_Review-g186338-d187591-Reviews-The_Ritz_London_Hotel-London_England.html"
  ],
  "maxReviewsPerPlace": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call jmlp/tripadvisor-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

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/PmOqao2UQFIRuCtNi/builds/EPrUdu9wtCOb64VtV/openapi.json
