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

Reliably scrape TripAdvisor reviews using stealth Firefox (Camoufox) and residential proxies to bypass DataDome. Filter by rating, date, and language. Get structured reviews + place metadata. Export as JSON, CSV, or Excel

- **URL**: https://apify.com/marklp/tripadvisor-reviews-scraper.md
- **Developed by:** [ML Data Solutions](https://apify.com/marklp) (community)
- **Categories:** Travel, Automation
- **Stats:** 14 total users, 1 monthly users, 96.5% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.00 / 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.

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

### What is TripAdvisor Reviews Scraper?

**TripAdvisor Reviews Scraper** extracts **public reviews** from any **[TripAdvisor](https://www.tripadvisor.com/)** place page — hotels, restaurants, and attractions. Paste one or more TripAdvisor place URLs (the input **defaults to Apify Residential Proxy**), start a run, and you get a structured dataset of reviews plus a place-level summary — no TripAdvisor account or API key needed.

The Actor does **not** access private accounts, inboxes, or paywalled content. It collects what is publicly visible to any browser visiting the listing page.

***

### Why scrape TripAdvisor reviews?

TripAdvisor is one of the world's largest travel review platforms. Extracting its public review data at scale lets you:

- 📊 **Monitor reputation** — track rating trends and review volume for your property or competitors over time
- 🔍 **Competitive benchmarking** — compare guest sentiment across multiple hotels or restaurants in one run
- 🤖 **Feed NLP and sentiment pipelines** — build topic models, sentiment classifiers, or LLM fine-tuning datasets from real traveller language
- 📈 **Market research** — understand what guests value (location, service, price) across a destination or category
- 🗂️ **Train recommendation systems** — structured review data with ratings, dates, and trip type is ready for ML use

***

### What can this Actor do?

- 🌐 Scrape **multiple TripAdvisor places** in a single run from a list of URLs
- ⭐ Filter by **star rating** (1–5), **publish date range**, and **review language**
- 🔢 Set a **maximum reviews per place** cap for targeted pulls
- 📋 Get **one structured row per review** in the default dataset (JSON, CSV, Excel, HTML)
- 🗃️ Get **place-level metadata** saved separately as `Places.json` and a readable `Places.md` summary
- ☁️ Run on the **Apify platform** with scheduling, webhooks, API access, and integrations — no server setup needed

***

### What data can you extract from TripAdvisor?

| Data point | Description |
|------------|-------------|
| **Place name** | Name of the scraped place |
| **Review title** | Short headline written by the reviewer |
| **Review text** | Full body of the public review |
| **Star rating** | 1–5 overall rating |
| **Published date** | When the review was posted (`YYYY-MM-DD`) |
| **Travel date** | Month/year of the stay or visit (when provided) |
| **Trip type** | e.g. Family, Business, Couples, Solo (when provided) |
| **Review language** | Language code of the review text |
| **Reviewer name** | Public display name (not private account data) |
| **Helpful votes** | How many users found the review helpful |
| **Sub-ratings** | Category scores (e.g. cleanliness, service) when present |
| **Owner response** | Management reply to the review when present |

The Console **Output** tab offers two views: **Overview** (compact table) and **Full Details** (all fields including `id`, `originalLanguage`, etc.).
Place URLs are stored in **`Places.json`** and **`Places.md`** (key-value store), not in each review row.

***

### How to scrape TripAdvisor reviews — step by step

1. Open **[TripAdvisor Reviews Scraper](https://console.apify.com/)** on Apify Console and go to the **Input** tab.
2. Add one or more **Place URLs** — each must be a `https://www.tripadvisor.com/` hotel, restaurant, or attraction page.
3. **Proxy configuration** is pre-filled with **Apify Proxy** and the **RESIDENTIAL** group (required on Apify Cloud — datacenter IPs are blocked by TripAdvisor's bot protection). Leave it as-is unless you use a custom proxy.
4. Optionally set **Max reviews per place**, **Start date / End date**, **Review ratings**, and **Review language** to narrow the dataset.
5. Click **Start** and monitor the **Log** tab for progress messages.
6. When the run finishes, open the **Dataset** tab for review rows or **Storage → Key-value store** for `Places.json` and `Places.md`.

You can download results in **JSON, CSV, Excel, or HTML** from the Dataset tab, or pull them via the **[Apify API](https://docs.apify.com/api/v2)**.

***

### How much does it cost to scrape TripAdvisor?

Cost depends on your Apify plan, the number of reviews scraped, and proxy usage.

**What drives compute units (CUs)**

- 🌐 **Browser session** — Each place requires a real browser context to pass bot-protection checks before the review API can run.
- 📑 **Review volume** — More reviews mean more API round-trips. The Actor fetches in parallel batches, so the cost per review is low.
- 🔄 **Retries** — A bad proxy session that triggers a captcha causes a retry and wastes CUs. Good residential proxies reduce retries.

**Rough estimates**

| Reviews scraped | Approx. run time | Notes |
|----------------|-----------------|-------|
| 3 places × 300 reviews | ~2–3 min | Clean session, residential proxy |
| 3 places × 600 reviews | ~3–5 min | Same session reused, no retries |
| 10 places × 200 reviews | ~10–15 min | Depends on proxy quality |

**Tips to control cost**

- 💡 Always **test with one URL and a small `Max reviews` limit** before a large run.
- 📅 Use **date and rating filters** to avoid downloading reviews you'll discard.
- 🔒 Prefer **keeping one stable session** over aggressive rotation — session continuity reduces repeated challenges.

Apify's **[free tier](https://apify.com/pricing)** covers small test runs. For production volumes, plan for a residential proxy budget in addition to compute.

***

### Input

TripAdvisor Reviews Scraper accepts the following input fields. Open the **Input** tab in Apify Console to fill them in using the form — no JSON editing needed.

| Field | Type | Description |
|-------|------|-------------|
| **Place URLs** (`startUrls`) | List of URLs | Required. TripAdvisor.com place pages (hotels, restaurants, attractions). |
| **Max reviews per place** (`maxReviewsPerPlace`) | Integer | Maximum reviews to collect per place. `0` = no limit. |
| **Start date** (`startDate`) | `YYYY-MM-DD` | Only include reviews published on or after this date. |
| **End date** (`endDate`) | `YYYY-MM-DD` | Only include reviews published on or before this date. |
| **Review ratings** (`reviewRatings`) | Multi-select | Filter by star rating: 5 ★ Excellent … 1 ★ Terrible. Leave empty for all. |
| **Review language** (`language`) | Select | Filter by language (English, German, French, …). Leave empty for all. |
| **Proxy configuration** (`proxyConfiguration`) | Proxy | Defaults to **Apify Proxy** with the **RESIDENTIAL** group. Override only if you need a different Apify proxy setup or a custom proxy URL. |

***

### Output

The Actor writes to two locations:

**Default dataset — one row per review**

```json
{
  "id": "942837461",
  "placeName": "The Waterfront Hotel",
  "title": "Wonderful location and friendly staff",
  "text": "We stayed for 4 nights in March. The location right on the seafront...",
  "rating": 5,
  "publishedDate": "2025-03-10",
  "travelDate": "2025-03",
  "tripType": "Couples",
  "lang": "en",
  "originalLanguage": "en",
  "reviewerName": "Traveler_Malta2025",
  "helpfulVotes": 2,
  "subratings": [],
  "ownerResponse": null,
  "url": "https://www.tripadvisor.com/ShowUserReviews-..."
}
```

**Key-value store**

- `Places.json` — place-level metadata: name, URL, overall rating, rating distribution, review count, oldest review date.
- `Places.md` — human-readable summary of all scraped places, useful for quick inspection.

Download dataset results in **JSON, CSV, Excel, or HTML** from the Dataset tab, or fetch via the **[Apify API](https://docs.apify.com/api/v2)**.

***

### Tips and advanced notes

- 🧪 **Always test small first** — run with one URL and `Max reviews per place = 50` before a large pull.
- 🏘️ **Residential proxy is required** on Apify Cloud — datacenter IPs are consistently blocked by TripAdvisor's bot-protection layer (DataDome) regardless of browser fingerprinting.
- 🔒 **Avoid over-rotating the proxy** — reusing the same residential session across multiple places lets cookies and session trust accumulate, which lowers the chance of a block and saves CUs.
- 📅 **Use date filters** for incremental pulls — set `startDate` to yesterday's date to collect only new reviews on a schedule.
- 🔗 **Automate with scheduling** — use [Apify Schedules](https://docs.apify.com/platform/schedules) to run the Actor daily or weekly and push fresh reviews to your pipeline via [webhooks](https://docs.apify.com/platform/webhooks) or [integrations](https://apify.com/integrations) (Make, Zapier, Slack, Google Sheets, and more).

***

### FAQ, disclaimers, and support

#### Is it legal to scrape TripAdvisor?

This Actor only collects **public content** shown to any visitor — review text, ratings, dates, and display names that users have chosen to share publicly. It does not access private accounts, inboxes, or hidden data.

You are responsible for complying with TripAdvisor's **[Terms of Use](https://tripadvisor.com/pages/terms.html)**, applicable **copyright law**, and **data-protection regulations** (e.g. GDPR) when you store or process reviews containing personal data. When in doubt, seek legal advice. See also: **[Is web scraping legal? — Apify blog](https://blog.apify.com/is-web-scraping-legal/)**.

#### Does TripAdvisor have an official API?

TripAdvisor offers **[partner and commercial APIs](https://www.tripadvisor.com/developers)** for eligible businesses. This Actor is **not** an official TripAdvisor product — it automates the **public website** the way any browser would. Compare the official API's coverage and licensing against your use case before building production pipelines.

#### Why am I getting blocked or captchas?

Common causes:

- ❌ **Datacenter IP** — switch to a **Residential** proxy group.
- ❌ **Proxy country mismatch** — the Actor auto-aligns the browser's timezone and locale to the proxy exit IP; if you override the proxy country, make sure it is consistent.
- ❌ **Cold session on many places** — start with one place to warm the session, then add more.
- ❌ **Too many retries** — if blocks persist after 4 attempts, try a different proxy group or reduce the number of places per run.

#### Where can I get help?

- 💬 **[Apify Discord](https://discord.com/invite/jyEM2PRvMU)** — community help and Apify staff.
- 🐛 **Issues tab** — report bugs or request features directly on the Actor page.
- 📖 **[Apify documentation](https://docs.apify.com/)** — platform guides, API reference, and SDK docs.

***

### Resources

- [Apify SDK for Python](https://docs.apify.com/sdk/python)
- [Crawlee for Python](https://crawlee.dev/python)
- [Apify Proxy documentation](https://docs.apify.com/platform/proxy)
- [Apify Schedules](https://docs.apify.com/platform/schedules)
- [Apify Integrations](https://apify.com/integrations)
- [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

# Actor input Schema

## `startUrls` (type: `array`):

TripAdvisor place URLs to scrape reviews from (hotels, restaurants, attractions). Must start with https://www.tripadvisor.com/

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

Maximum number of reviews to scrape per place (0 = unlimited)

## `startDate` (type: `string`):

Only include reviews published on or after this date (YYYY-MM-DD). Leave empty for all reviews. Must be on or before End Date.

## `endDate` (type: `string`):

Only include reviews published on or before this date (YYYY-MM-DD). Leave empty for all reviews. Must be on or after Start Date.

## `reviewRatings` (type: `array`):

Only include reviews with the selected star ratings. Leave empty to include all ratings.

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

Only include reviews written in this language. Leave empty for all languages.

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

Residential proxy is required to bypass DataDome on Apify Cloud. Default uses Apify Proxy with the RESIDENTIAL group; change only if you use a custom proxy.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.tripadvisor.com/Hotel_Review-g190327-d264936-Reviews-1926_Hotel_Spa-Sliema_Island_of_Malta.html"
    }
  ],
  "maxReviewsPerPlace": 0,
  "startDate": "",
  "endDate": "",
  "reviewRatings": [],
  "language": "",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

All scraped reviews in the default dataset

## `Places.json` (type: `string`):

Place metadata with rating distribution, review count and oldest date

## `Places.md` (type: `string`):

Human-readable summary of all scraped places

# 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 = {
    "startUrls": [
        {
            "url": "https://www.tripadvisor.com/Hotel_Review-g190327-d264936-Reviews-1926_Hotel_Spa-Sliema_Island_of_Malta.html"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("marklp/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 = {
    "startUrls": [{ "url": "https://www.tripadvisor.com/Hotel_Review-g190327-d264936-Reviews-1926_Hotel_Spa-Sliema_Island_of_Malta.html" }],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("marklp/tripadvisor-reviews-scraper").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 '{
  "startUrls": [
    {
      "url": "https://www.tripadvisor.com/Hotel_Review-g190327-d264936-Reviews-1926_Hotel_Spa-Sliema_Island_of_Malta.html"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call marklp/tripadvisor-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/kdEhQbwpDHB20Z4AP/builds/NDxqfO0zNthOFA2ly/openapi.json
