# TripAdvisor Reviews Scraper API (`lurkapi/tripadvisor-reviews-scraper-api`) Actor

Extract up to 1,000 TripAdvisor reviews per place for hotels, restaurants, attractions, tours, and rentals. Get one review per row with original and translated text, language and rating filters, newest-first sorting, plus optional photos, owner responses, and AI summaries.

- **URL**: https://apify.com/lurkapi/tripadvisor-reviews-scraper-api.md
- **Developed by:** [LurkAPI](https://apify.com/lurkapi) (community)
- **Categories:** Automation, Agents, Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.25 / 1,000 review scrapeds

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/actors/running/actors-in-store.md#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 API

Export public reviews from TripAdvisor hotels, restaurants, attractions, tours, and vacation rentals into one clean dataset. Paste a place URL, review URL, or numeric place ID and get up to 1,000 reviews per place, one row per review, with ratings, dates, reviewer details, original text, and any available English translation kept in separate fields.

### 🎯 What it does

TripAdvisor is easy to browse when you need a handful of opinions. It gets slow when you need hundreds of reviews, several places, or data you can actually compare. This scraper does that work in one run.

- **Build a ready-to-use review dataset.** Collect reviews from hotels, restaurants, attractions, tours, and vacation rentals, with one clean row per review.
- **Focus on the feedback that matters.** Narrow reviews by rating, language, or date, and put the newest feedback first.
- **Read both versions.** Get the review in its original language, with TripAdvisor's English translation alongside it when available. The original is always kept intact.
- **Monitor new feedback.** On repeat runs, provide the newest review ID you already have and collect only the reviews added since then.
- **See the full conversation.** Add review photos, owner responses, or TripAdvisor's AI review summary when available.
- **Need just one review?** Paste its review URL instead of collecting the entire place history.

### 📋 How to use it

#### Step 1: Add places or reviews

Paste any mix of TripAdvisor place pages and individual review pages into **TripAdvisor URLs**. If you already have numeric place IDs, add them under **Location IDs**.

A place page returns reviews for that place. An individual review page returns that one review. Duplicate inputs are removed automatically.

#### Step 2: Choose what comes back

Set the maximum number of reviews per place and choose TripAdvisor's default order or newest first. Narrow the results by language, rating, or publication date.

Running the same places regularly? Add the newest review ID you already have to collect only reviews posted since your last run.

You can also include review photos, owner responses, and TripAdvisor's AI review summary. Paid options are marked with **($)** in the input form, so you can see what affects the price before starting.

#### Step 3: Run and export

Click **Start**. Reviews appear in the **Output** tab as each place finishes. Download them as JSON, CSV, or Excel, or retrieve them through the API.

Successful reviews and explanatory messages are clearly separated by the `status` column. Failed lookups and no-result messages are never charged.

### 👀 Example result

Each review becomes one structured row. This shortened example shows how the reviewer's original French text and TripAdvisor's English translation are returned together:

```json
{
  "status": "Success",
  "locationId": "10521834",
  "name": "Example Hotel",
  "placeRating": 4.7,
  "reviewId": "1074185350",
  "reviewUrl": "https://www.tripadvisor.com/ShowUserReviews-...",
  "rating": 5,
  "publishedDate": "2026-08-21",
  "tripType": "COUPLES",
  "originalTitle": "Un excellent séjour",
  "originalText": "Chambre calme et personnel accueillant.",
  "originalLanguage": "fr",
  "translatedTitle": "A wonderful stay",
  "translatedText": "Quiet room and welcoming staff.",
  "translatedLanguage": "en",
  "authorName": "SampleReviewer",
  "scrapedAt": "2026-08-27T14:30:00.000Z"
}
```

The complete output can also include reviewer details, place information, sub-ratings, photos, owner responses, and an AI review summary.

### 📊 Output and views

Every successful row represents one review. Place details travel with the review, so your CSV, spreadsheet, or API response remains useful on its own.

The **Output** tab includes ready-made views:

- **Overview:** the place, rating, review text, author, language, and publication date at a glance.
- **Review text:** original and translated titles and text shown side by side.
- **Authors:** reviewer name, username, location, contributions, profile, and avatar.
- **Place:** place name, URL, rating, total review count, and original input.
- **Review photos:** photos attached to reviews when requested and available.
- **Owner responses:** the reply, responder, language, and publication date.
- **AI review summary:** TripAdvisor's summary for each place when requested and available.
- **All fields:** every field enabled for the run.

All views organize the same dataset; you do not pay extra for opening or exporting them.

| Data group | What it can include |
|---|---|
| Review | Review ID and URL, rating, dates, trip type, helpful votes, and sub-ratings |
| Text and language | Original and translated titles and text, language codes, and translation details |
| Reviewer | Name, username, location, contribution count, profile URL, and avatar |
| Place | Place ID, name, URL, overall rating, and total review count |
| Optional additions | Review photos, owner responses, and AI review summary |
| Run details | Status, error message when applicable, original input URL, and collection time |

`inputUrl` is the exact URL you supplied. It is empty when you start with a numeric place ID; in that case, `placeWebUrl` contains the resolved TripAdvisor page.

Turn off any optional output field you do not need. Disabled fields are removed from the row instead of being returned empty.

Rows marked **Error** or **No results** explain what happened in plain English and are never charged.

### 💎 Add-ons

You can collect complete base reviews without enabling any add-ons. Turn on only the extras that are useful for your run.

- **New reviews only ($):** Keep scheduled or repeat runs focused on fresh feedback instead of collecting the same reviews again. Charged for each review delivered while this mode is active.
- **Review photos ($):** See the images reviewers attached to their feedback. Charged only when a delivered review contains photos.
- **Owner responses ($):** See how the business answered a compliment, complaint, or question. Charged only when a delivered review contains a response.
- **AI review summary (per place) ($):** Add TripAdvisor's own summary of recent feedback for a quick overview of recurring themes. Charged once per place, and only when TripAdvisor provides a summary.

### 🤖 Use it from AI clients (MCP)

Connect this scraper to Claude Code, Claude Desktop, Codex, Cursor, or another client that supports the Model Context Protocol. Once connected, you can start review jobs in plain language.

For example: *"Collect the 100 newest reviews for this TripAdvisor hotel and include owner responses."*

You will need an `APIFY_TOKEN` from [your integration settings](https://console.apify.com/settings/integrations).

**Claude Code**

```bash
claude mcp add apify -- npx -y @apify/actors-mcp-server \
  --actors lurkapi/tripadvisor-reviews-scraper-api
```

Add your token to the server configuration as `APIFY_TOKEN`.

**Claude Desktop**

Edit `~/Library/Application Support/Claude/claude_desktop_config.json` on macOS or `%APPDATA%\Claude\claude_desktop_config.json` on Windows:

```json
{
  "mcpServers": {
    "apify": {
      "command": "npx",
      "args": [
        "-y",
        "@apify/actors-mcp-server",
        "--actors",
        "lurkapi/tripadvisor-reviews-scraper-api"
      ],
      "env": {
        "APIFY_TOKEN": "YOUR_TOKEN"
      }
    }
  }
}
```

**Codex CLI**

Add the following to `~/.codex/config.toml`:

```toml
[mcp_servers.apify]
command = "npx"
args = [
  "-y",
  "@apify/actors-mcp-server",
  "--actors",
  "lurkapi/tripadvisor-reviews-scraper-api"
]
env = { APIFY_TOKEN = "YOUR_TOKEN" }
```

**Cursor**

Add the same server configuration used for Claude Desktop to `~/.cursor/mcp.json`.

### 💰 Pricing

Pay only for the reviews and optional results you actually receive.

| Event | Price | When |
|---|---:|---|
| Actor start | $0.001 per run | once when the run starts |
| Review scraped | **$0.25 per 1,000 reviews** | per review delivered |
| New reviews only | +$0.10 per 1,000 reviews | per review delivered when a last-collected review ID is supplied |
| Review photos | +$1.00 per 1,000 reviews | per delivered review containing photos |
| Owner responses | +$2.00 per 1,000 reviews | per delivered review containing an owner response |
| AI review summary | +$0.04 per place | when a summary is returned for the place |

No charge for filtered-out or duplicate reviews, failed lookups, unavailable optional data, or **Error** and **No results** rows.

### 💡 Good to know

- **Bring back only what's new.** Add the latest review ID from your previous run to collect fresh reviews without downloading the same history again.
- **Every review keeps its original voice.** Translated text is added alongside the original, never in its place.
- **The same review is delivered once.** Duplicate inputs are removed automatically, preventing duplicate rows and charges.
- **Shape the dataset around your work.** Turn off fields you do not need and they disappear from the export entirely.
- **Collect up to 1,000 reviews per place.** This covers focused exports and ongoing monitoring without producing oversized datasets.
- **Hotels, restaurants, attractions, tours, and rentals are supported.** Use the page for the individual place rather than a city or region page.
- **Your results remain available in your dataset.** Storage time depends on your plan.

### ❓ FAQ

**How do I collect only reviews posted since my last run?**

Copy the newest `reviewId` from your previous results into **Last collected review ID ($)**. The next run will stop when it reaches that review and return only the newer ones. You can also paste the `r...` identifier from a review URL.

**Why are the translated fields empty?**

TripAdvisor does not provide a separate English translation for every review. When one is available, you receive the original and translated versions side by side. Otherwise, the original review remains complete and the translated fields stay empty.

**Can I collect reviews written in specific languages?**

Yes. Choose one or more options under **Languages**. Reviews written in other languages are excluded and are not charged.

**Why did I receive fewer reviews than requested?**

Your filters or last-collected review ID may narrow the results. TripAdvisor may also make fewer reviews available than the total shown on the place page. Each place is limited to 1,000 reviews per run.

**How do I collect reviews from an older period?**

Set both **Reviews from date** and **Reviews to date** to define the period. An older end date used on its own searches through only the latest 600 reviews, so use a complete date range when looking further back.

**Why wasn't an individual review link found?**

The scraper looks for that review within the place's newest available reviews. A very old or removed review may no longer be reachable. When that happens, you receive an uncharged **No results** row.

**Why are reviews from different places mixed together?**

Places are collected at the same time so larger runs finish sooner. Reviews remain identifiable by their place name and ID, and you can sort the export by place, publication date, or review ID.

**What happens if a run is interrupted?**

The run keeps track of reviews it has already delivered. If it resumes, those reviews are recognized and are not delivered or charged again.

### 🔗 Other tools you might like

- [TripAdvisor Email Leads Scraper API](https://apify.com/lurkapi/tripadvisor-email-leads-scraper-api): Build lead lists of hotels, restaurants, attractions, and tours, with available contact details and ratings.
- [Google Maps Reviews Scraper](https://apify.com/lurkapi/google-maps-reviews-scraper): Export public Google Maps reviews with reviewer details, ratings, dates, photos, and owner replies.
- [Trustpilot Reviews & Company Data Scraper API](https://apify.com/lurkapi/trustpilot-reviews-and-company-data-scraper-api): Collect public Trustpilot reviews alongside company information.

### ⚖️ Disclaimer

This tool is intended for personal, research, and educational use. You are responsible for complying with TripAdvisor's Terms of Service and applicable laws in your jurisdiction. Data availability depends on TripAdvisor at run time.

**Keywords:** tripadvisor reviews scraper, tripadvisor review scraper, review extraction, hotel reviews, restaurant reviews, tripadvisor api, review data, sentiment data

# Actor input Schema

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

TripAdvisor detail or review URLs for hotels, restaurants, attractions, tours, and vacation rentals. A place page returns that place's reviews; a review page returns that specific review. Bare numeric place IDs also work in the Location IDs field below.

## `locationIds` (type: `array`):

Bare TripAdvisor place IDs (the numeric `d...` token in a place URL), one per line. Each ID returns that place's reviews.

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

Cap how many reviews are returned for each place or input (maximum 1,000 per place).

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

TripAdvisor's review list only offers its default order or newest-first. A date or review-ID cutoff below forces newest-first so the cutoff can stop early.

## `language` (type: `array`):

Only return reviews originally written in these languages. Leave empty for all languages.

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

Only return reviews with these star ratings (1 to 5). Leave empty for all ratings.

## `fromDate` (type: `string`):

Only return reviews published on or after this date (ISO YYYY-MM-DD). Filtered after fetch, newest-first.

## `toDate` (type: `string`):

Only return reviews published on or before this date (ISO YYYY-MM-DD). Filtered after fetch, newest-first.

## `fromReviewId` (type: `string`):

Use the review ID from your previous results, or the `r...` token in a TripAdvisor review URL. Adds $0.10 per 1,000 delivered reviews.

## `includePhotos` (type: `boolean`):

Return the photo URLs attached to each review. Paid add-on, charged only for reviews that have photos.

## `includeOwnerResponses` (type: `boolean`):

Return the management reply text attached to each review. Paid add-on, charged only for reviews that have a reply.

## `includeAiReviewSummary` (type: `boolean`):

Return TripAdvisor's own AI summary of the place's recent reviews, where TripAdvisor publishes one. Paid add-on, charged once per place.

## `outputReviewId` (type: `boolean`):

Include the review ID column.

## `outputReviewUrl` (type: `boolean`):

Include the review URL column.

## `outputRating` (type: `boolean`):

Include the star rating column.

## `outputCreatedDate` (type: `boolean`):

Include the review creation date column.

## `outputPublishedDate` (type: `boolean`):

Include the review published date column.

## `outputTravelDate` (type: `boolean`):

Include the travel date column.

## `outputTripType` (type: `boolean`):

Include the trip type column.

## `outputHelpfulVotes` (type: `boolean`):

Include the helpful votes column.

## `outputOriginalTitle` (type: `boolean`):

Include the review title in its original language.

## `outputTranslatedTitle` (type: `boolean`):

Include the machine-translated title, where TripAdvisor published one.

## `outputOriginalText` (type: `boolean`):

Include the review text in its original language.

## `outputTranslatedText` (type: `boolean`):

Include the machine-translated review text, where TripAdvisor published one.

## `outputOriginalLanguage` (type: `boolean`):

Include the review's original language code.

## `outputTranslatedLanguage` (type: `boolean`):

Include the language the text was translated into.

## `outputIsMachineTranslated` (type: `boolean`):

Include whether the review was machine-translated.

## `outputTranslationType` (type: `boolean`):

Include the translation type (machine or human), where TripAdvisor published one.

## `outputAuthorId` (type: `boolean`):

Include the author's TripAdvisor user ID.

## `outputAuthorName` (type: `boolean`):

Include the author's display name.

## `outputAuthorUsername` (type: `boolean`):

Include the author's username.

## `outputAuthorLocation` (type: `boolean`):

Include the author's stated location.

## `outputAuthorContributions` (type: `boolean`):

Include the author's total TripAdvisor contributions.

## `outputAuthorProfileUrl` (type: `boolean`):

Include the author's TripAdvisor profile URL.

## `outputAuthorAvatarUrl` (type: `boolean`):

Include the author's avatar URL.

## `outputSubratings` (type: `boolean`):

Include the per-aspect sub-ratings (value, rooms, cleanliness, etc.).

## `outputPlaceWebUrl` (type: `boolean`):

Include the place's TripAdvisor page URL on every review row.

## `outputPlaceRating` (type: `boolean`):

Include the place's overall TripAdvisor rating on every review row.

## `outputPlaceReviewCount` (type: `boolean`):

Include the place's total review count on every review row.

## `outputScrapedAt` (type: `boolean`):

Include the ISO timestamp when each review was scraped.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Hotel_Review-g187147-d10521834-Reviews-Le_Tsuba_Hotel-Paris_Ile_de_France.html"
  ],
  "locationIds": [],
  "maxReviewsPerPlace": 20,
  "sortBy": "default",
  "language": [],
  "ratings": [],
  "fromDate": "",
  "toDate": "",
  "fromReviewId": "",
  "includePhotos": false,
  "includeOwnerResponses": false,
  "includeAiReviewSummary": false,
  "outputReviewId": true,
  "outputReviewUrl": true,
  "outputRating": true,
  "outputCreatedDate": true,
  "outputPublishedDate": true,
  "outputTravelDate": true,
  "outputTripType": true,
  "outputHelpfulVotes": true,
  "outputOriginalTitle": true,
  "outputTranslatedTitle": true,
  "outputOriginalText": true,
  "outputTranslatedText": true,
  "outputOriginalLanguage": true,
  "outputTranslatedLanguage": true,
  "outputIsMachineTranslated": true,
  "outputTranslationType": true,
  "outputAuthorId": true,
  "outputAuthorName": true,
  "outputAuthorUsername": true,
  "outputAuthorLocation": true,
  "outputAuthorContributions": true,
  "outputAuthorProfileUrl": true,
  "outputAuthorAvatarUrl": true,
  "outputSubratings": true,
  "outputPlaceWebUrl": true,
  "outputPlaceRating": true,
  "outputPlaceReviewCount": true,
  "outputScrapedAt": true
}
```

# Actor output Schema

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

One row per review, every enabled column.

## `overview` (type: `string`):

Place, review, rating, language, and date at a glance.

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

Original and translated title and text for each review.

## `authors` (type: `string`):

Author profile details per review.

## `place` (type: `string`):

Place reference columns per review.

## `photos` (type: `string`):

Photos attached to each review when requested and available.

## `ownerResponses` (type: `string`):

Management responses attached to reviews when requested and available.

## `aiSummary` (type: `string`):

The place-level AI review summary when requested and available.

# 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": [
        "https://www.tripadvisor.com/Hotel_Review-g187147-d10521834-Reviews-Le_Tsuba_Hotel-Paris_Ile_de_France.html"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("lurkapi/tripadvisor-reviews-scraper-api").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": ["https://www.tripadvisor.com/Hotel_Review-g187147-d10521834-Reviews-Le_Tsuba_Hotel-Paris_Ile_de_France.html"] }

# Run the Actor and wait for it to finish
run = client.actor("lurkapi/tripadvisor-reviews-scraper-api").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 '{
  "startUrls": [
    "https://www.tripadvisor.com/Hotel_Review-g187147-d10521834-Reviews-Le_Tsuba_Hotel-Paris_Ile_de_France.html"
  ]
}' |
apify call lurkapi/tripadvisor-reviews-scraper-api --silent --output-dataset

```

## MCP server setup

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

```

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/QYMvXr75KMrg74FcX/builds/5pKoucUtT9CFQ5qGm/openapi.json
