# TripAdvisor Review Scraper: Hotel & Restaurant Monitor (`themineworks/tripadvisor-reviews`) Actor

Extract reviews, ratings, reviewer profiles and owner responses from any TripAdvisor hotel, restaurant or attraction page. Pay per review. Use as an MCP server in Claude & AI agents.

- **URL**: https://apify.com/themineworks/tripadvisor-reviews.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Travel, Business, MCP servers
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.60 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 🏨 TripAdvisor Reviews Scraper: Hotels, Restaurants, Attractions

### Overview

TripAdvisor Reviews Scraper extracts reviews at scale from any TripAdvisor hotel, restaurant, or attraction page: star ratings, full review text, reviewer profile, trip type, owner responses, photos, and hotel sub-ratings (cleanliness, service, value, location, sleep quality, rooms). Give it a list of listing URLs and it returns clean structured JSON, sorted the way you want.

TripAdvisor sits behind PerimeterX anti-bot protection. This actor drives PlaywrightCrawler with Apify's RESIDENTIAL proxies and retries automatically when a challenge or 403 is detected, rotating to a fresh proxy session on each attempt (up to five retries per page). You pay only for reviews actually pushed to the dataset.

✅ Handles PerimeterX anti-bot | ✅ Hotels, restaurants, and attractions | ✅ Owner responses included | ✅ Pay only per review delivered | ✅ MCP-ready for AI agents

### Features

Full review extraction: rating, headline, expanded body text, visit date, trip type, and helpful-vote count.
Reviewer context: display name, home city and country, and total review contributions.
Hotel sub-ratings (cleanliness, service, value, location, sleep quality, rooms) where TripAdvisor exposes them.
Owner responses and response dates when a listing has management replies.
Language filtering, four sort orders (newest, oldest, highest rated, lowest rated), and paginated pulls up to 2,000 reviews per listing.

### How it works

The actor drives PlaywrightCrawler against each TripAdvisor listing URL you supply, applies your language filter as a query parameter, walks the paginated review list (10 reviews per page), and expands truncated bodies to full text. Reviews are yielded as flat records with all sub-fields normalized.

TripAdvisor uses PerimeterX aggressively; success depends on the quality of the residential IP drawn from the pool. On Apify's STARTER plan, RESIDENTIAL IPs may hit a 403 on retry for some target URLs. For the most reliable results, users on Apify Scale+ plans should switch `proxyConfig` to `apifyProxyGroups: ["SHADER"]`, Apify's premium anti-detect proxy tier that handles PerimeterX at the protocol level.

### 🧾 Input configuration

```json
{
  "urls": [
    "https://www.tripadvisor.com/Hotel_Review-g60763-d112962-Reviews-The_Plaza-New_York_City_New_York.html"
  ],
  "maxReviews": 200,
  "language": "en",
  "sortBy": "date_desc",
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

### 📤 Output format

```json
{
  "reviewId": "9345712345",
  "listingUrl": "https://www.tripadvisor.com/Hotel_Review-g60763-d112962-Reviews-The_Plaza-New_York_City_New_York.html",
  "listingName": "The Plaza",
  "listingType": "hotel",
  "reviewerName": "TravellerAnna",
  "reviewerLocation": "London, United Kingdom",
  "reviewerContributions": 47,
  "rating": 5,
  "title": "A once-in-a-lifetime stay",
  "text": "We booked the Plaza for our anniversary and the service was exceptional...",
  "visitDate": "May 2026",
  "visitType": "Couples",
  "helpfulVotes": 12,
  "ownerResponse": "Dear Anna, thank you for choosing the Plaza for such a special occasion...",
  "ownerResponseDate": "2026-06-02",
  "subRatings": { "cleanliness": 5, "service": 5, "value": 4, "location": 5, "sleep_quality": 5, "rooms": 5 },
  "photos": [],
  "language": "en",
  "charged": true,
  "scraped_at": "2026-07-10T12:00:00.000Z"
}
```

Every review record contains these fields:

| Field | Description |
| --- | --- |
| 🆔 `reviewId` | TripAdvisor review ID |
| 🔗 `listingUrl` | Source listing URL |
| 🏷️ `listingName` | Hotel, restaurant, or attraction name |
| 🏨 `listingType` | `hotel`, `restaurant`, or `attraction` |
| 👤 `reviewerName` | Reviewer display name |
| 🌍 `reviewerLocation` | Reviewer home city and country |
| ✍️ `reviewerContributions` | Total reviews written by this user |
| ⭐ `rating` | Overall rating (1 to 5) |
| 📰 `title` | Review headline |
| 📝 `text` | Full review body (expanded) |
| 📅 `visitDate` | Month and year of visit |
| 🧳 `visitType` | Business, Couples, Family, Friends, or Solo |
| 👍 `helpfulVotes` | Number of Helpful votes |
| 🏢 `ownerResponse` | Management reply text (when present) |
| 📆 `ownerResponseDate` | Date of management reply |
| 📊 `subRatings` | Hotel sub-ratings (cleanliness, service, value, location, sleep\_quality, rooms) |
| 🖼️ `photos[]` | URLs of photos attached to the review |
| 🌐 `language` | Review language code |
| 💰 `charged` | True if this result was billable |
| 🕒 `scraped_at` | ISO 8601 timestamp of capture |

### 💼 Common use cases

**Hotel reputation management**
Pull your property's latest reviews daily and feed rating and sentiment into a dashboard.
Track owner-response rates against competitor properties in the same market.

**Restaurant competitive intelligence**
Compare ratings, visit types, and reviewer language across competing restaurants in a city.
Identify which dishes or service aspects drive 5-star vs. 1-star reviews.

**Travel content aggregation**
Build destination guides enriched with real traveller quotes, trip types, and sub-ratings.
Filter to a specific language or visit type (e.g. family trips to theme parks).

**Sentiment and NLP analysis**
Feed `text`, `rating`, and `visitType` into a classifier to predict satisfaction drivers.
Owner responses are a ready-made training set for hospitality reply-generation models.

### 🚀 Getting started

1. Open the actor and paste one or more TripAdvisor listing URLs (hotel, restaurant, or attraction).
2. Set Max reviews per listing (default 5, up to 2,000).
3. Optionally set Language (ISO code, e.g. `en`, `fr`) and Sort order (newest, oldest, highest rated, lowest rated).
4. Keep the default RESIDENTIAL proxy; upgrade to SHADER if you are on an Apify Scale+ plan and need higher reliability.
5. Click Save & Start, then download as JSON, CSV, or Excel, or pull via API or MCP.

### FAQ

**Does this handle PerimeterX bot protection?**
Yes. The actor uses PlaywrightCrawler with residential proxies and retries automatically with a fresh session on each challenge (up to five retries per page). On Apify's STARTER plan, some target URLs may hit persistent 403s; upgrade to SHADER (Scale+ plans) for the most reliable results.

**How do I filter reviews by language?**
Set `language` to an ISO 639-1 code (`en`, `fr`, `de`, `es`). Leave blank to collect all languages. The filter is applied as a TripAdvisor URL query parameter before scraping.

**Are sub-ratings available for restaurants and attractions?**
No. Sub-ratings (cleanliness, service, value, location, sleep quality, rooms) are a hotel-specific feature. The `subRatings` field is absent from restaurant and attraction records.

**Can I access owner responses?**
Yes. The `ownerResponse` field contains the management reply text and `ownerResponseDate` contains when it was posted. Both are omitted when there is no reply.

**How am I charged?**
Pay per review at $0.003 per review. There is no free tier. Charging happens after a review is successfully pushed to the dataset; you are never charged for failed or incomplete results.

### Use in Claude, ChatGPT & any MCP agent

```
https://mcp.apify.com/?tools=themineworks/tripadvisor-reviews
```

Or call it programmatically with the Apify client:

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('themineworks/tripadvisor-reviews').call({
  urls: ['https://www.tripadvisor.com/Hotel_Review-g60763-d112962-Reviews-The_Plaza-New_York_City_New_York.html'],
  maxReviews: 100,
  sortBy: 'date_desc',
});

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

### 🛠️ Complete your travel intelligence pipeline

Reviews are one signal. Add pricing, geo, and rival social signals:

- **[Trustpilot Business Search](https://apify.com/themineworks/trustpilot-business-search)**: brand reputation signals across service categories.
- **[Google Maps Leads Scraper](https://apify.com/themineworks/maps-leads)**: hospitality businesses with verified emails from Google Maps.
- **[Threads Scraper](https://apify.com/themineworks/threads-scraper)**: public social conversation on any brand or property.

Typical flow: pull TripAdvisor sentiment for a shortlist of properties, cross-check on Trustpilot for service reputation, and monitor social chatter on Threads or X.

Found a bug or have a feature request? Open an issue on the actor's Apify Console page or reach out through the Apify profile.

# Actor input Schema

## `urls` (type: `array`):

TripAdvisor hotel, restaurant or attraction page URLs to scrape reviews from.

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

Maximum number of reviews to extract per listing URL. You are charged only for reviews successfully delivered to the dataset.

## `language` (type: `string`):

Filter reviews by language code (e.g. "en" for English). Leave empty for all languages.

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

Sort order for reviews.

## `proxyConfig` (type: `object`):

Apify proxy settings. TripAdvisor is protected by DataDome; RESIDENTIAL proxies are required (datacenter proxies are blocked 100%).

## Actor input object example

```json
{
  "urls": [
    "https://www.tripadvisor.com/Hotel_Review-g60763-d223019-Reviews-Broadway_Plaza_Hotel-New_York_City_New_York.html"
  ],
  "maxReviews": 5,
  "language": "en",
  "sortBy": "date_desc",
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# 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 = {
    "urls": [
        "https://www.tripadvisor.com/Hotel_Review-g60763-d223019-Reviews-Broadway_Plaza_Hotel-New_York_City_New_York.html"
    ],
    "maxReviews": 5,
    "language": "en",
    "sortBy": "date_desc",
    "proxyConfig": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/tripadvisor-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 = {
    "urls": ["https://www.tripadvisor.com/Hotel_Review-g60763-d223019-Reviews-Broadway_Plaza_Hotel-New_York_City_New_York.html"],
    "maxReviews": 5,
    "language": "en",
    "sortBy": "date_desc",
    "proxyConfig": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

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

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

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

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.tripadvisor.com/Hotel_Review-g60763-d223019-Reviews-Broadway_Plaza_Hotel-New_York_City_New_York.html"
  ],
  "maxReviews": 5,
  "language": "en",
  "sortBy": "date_desc",
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call themineworks/tripadvisor-reviews --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=themineworks/tripadvisor-reviews",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/r7ukNXDbYdocAi7VG/builds/sEvQluGYAnxwBa146/openapi.json
