# TripAdvisor Reviews Scraper (Owner Replies, Sub-Ratings) (`locaihost/tripadvisor-reviews`) Actor

Scrape TripAdvisor reviews for hotels, restaurants and attractions: stars, title, text, dates, trip type, sub-ratings and owner replies, plus a place row with rating breakdown, ranking, address and reply rate. Filter by stars, language, date or keyword. No login. $0.50 per 1,000 reviews.

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

## Pricing

from $0.28 / 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

## TripAdvisor Reviews Scraper (Owner Replies, Sub-Ratings)

Get TripAdvisor reviews for any hotel, restaurant, attraction or tour as clean JSON or CSV rows: stars, title, text, dates, trip type, the reviewer's sub-ratings and the owner's reply. Each place also gets a row with its rating, star breakdown, ranking, address and how often and how fast the owner replies. No login, no cookies, no account.

- **Monitor your own property:** schedule it daily with `onlyNew` and get only the reviews posted since the last run, with your replies next to them.
- **Benchmark competitors:** pull the last 90 days of reviews for every hotel on your street and compare ratings, sub-ratings (rooms, service, value) and reply rates.
- **Find what guests complain about:** 1- and 2-star reviews that mention "breakfast", "noise" or "parking", using TripAdvisor's own review search.
- **Report for clients:** one flat row per review, ready for sentiment analysis, a BI tool or a spreadsheet; one row per place for the summary page.
- **Read reviews in the language they were written:** pick languages, or get every review with TripAdvisor's English translation and the original language marked.

### Quick start

Paste this into the **JSON** tab of the input and click **Start**:

```json
{"startUrls": ["https://www.tripadvisor.com/Hotel_Review-g60763-d93437-Reviews-Hotel_Edison_Times_Square-New_York_City_New_York.html", "https://www.tripadvisor.com/Restaurant_Review-g60763-d457808-Reviews-Daniel-New_York_City_New_York.html"], "maxReviewsPerPlace": 10}
```

You get the 10 newest reviews and one place row for each: 22 rows in about 5 seconds. Links from any TripAdvisor country site work (`tripadvisor.co.uk`, `tripadvisor.de`, `tripadvisor.com.sg` and so on), and so does the location id on its own (`93437`).

More examples:

```json
{"startUrls": ["https://www.tripadvisor.com/Hotel_Review-g60763-d93437-Reviews-Hotel_Edison_Times_Square-New_York_City_New_York.html"], "ratings": ["1", "2"], "reviewsSince": "90 days", "maxReviewsPerPlace": 1000}
```

```json
{"startUrls": ["https://www.tripadvisor.co.uk/Attraction_Review-g60763-d105127-Reviews-Central_Park-New_York_City_New_York.html"], "languages": ["fr", "de"], "reviewsContaining": "bike", "maxReviewsPerPlace": 200}
```

### What data can I get?

**Review rows** (`type: "review"`):

| Field | Example |
|---|---|
| `placeName`, `placeType`, `placeId` | Daniel, restaurant, 457808 |
| `rating` | 5 |
| `title`, `text` | Great dinner, We celebrated our engagement at Daniel and had an absolutely wonderful dinner... |
| `publishedDate` | 2026-10-10T07:27:04.048Z |
| `travelDate`, `tripType` | 2025-12, couples |
| `subRatings` | `{"value": 5, "service": 5, "food": 5, "atmosphere": 5}` (when the reviewer gave them) |
| `language`, `textLanguage`, `machineTranslated` | en, en, false |
| `helpfulVotes`, `photosCount` | 0, 3 |
| `ownerResponse` | `{"text": "Dear [name removed], Thank you so much for your kind review...", "date": "2026-05-01T20:19:25Z", "responderTitle": "Owner"}` |
| `reviewerName`, `reviewerLocation` | null unless you switch on **Reviewer display names** |
| `url`, `placeUrl` | links to the review and the place on TripAdvisor |

**Place rows** (`type: "place"`), from the same run:

```json
{
  "type": "place",
  "name": "Hotel Edison Times Square",
  "placeType": "hotel",
  "address": "228 West 47th Street, New York City, NY 10036-1401",
  "city": "New York City", "region": "New York", "country": "US",
  "latitude": 40.759735, "longitude": -73.98615,
  "rating": 3.9, "reviewCount": 18836,
  "ratingHistogram": {"one": 1152, "two": 1330, "three": 3124, "four": 5721, "five": 7509},
  "subRatings": {"cleanliness": 4.1, "location": 4.8, "room": 3.6, "service": 4, "sleepQuality": 3.9, "value": 3.9},
  "ranking": "#169 of 529 hotels in New York City", "rankingPosition": 169, "rankingTotal": 529,
  "amenities": ["Blackout curtains", "Bathrobes", "Desk", "Housekeeping", "..."],
  "hotelStyles": ["Historic Hotel", "Classic", "City View", "Quiet", "Family"],
  "reviewsByLanguage": {"en": 14883, "es": 5850, "it": 5691},
  "reviewsCollected": 10, "ownerReplyRate": 0.8, "avgReplyLagDays": 1.7, "ratingLast90d": 4.22
}
```

Restaurants also get `priceLevel` (`$$$$`), `priceRange`, `cuisines`, `dietaryOptions`, `categories`, and the restaurant's own `phone`, `website` and role e-mail (`info@`, `reservations@`). `ownerReplyRate`, `avgReplyLagDays`, `ratingLast90d` and `reviewsLast90d` are worked out from the reviews this run collected, so ask for more reviews (or use **Reviews since**) for a steadier number.

The dataset has four views (**Reviews**, **Places**, **Owner replies**, **Not found (free)**) and exports to JSON, CSV, Excel or HTML. The run's `SUMMARY` record has requests made, rows by kind, free rows by reason and timing.

### How much does it cost?

You pay per review or place row returned. There is no charge for Apify platform usage on top.

| Row | Free and Starter | Scale | Business |
|---|---|---|---|
| Review | $0.50 per 1,000 | $0.375 per 1,000 | $0.275 per 1,000 |
| Place | $1.00 per 1,000 | $0.75 per 1,000 | $0.55 per 1,000 |

Plus $0.00005 per run start. **Apify's free $5 monthly credit covers about 10,000 reviews.** Free-plan runs stop at 1,000 rows each; any paid Apify plan removes the cap.

**What's free:** links that aren't a TripAdvisor place and places TripAdvisor doesn't have (each comes back as a free `not-found` row saying what to change), reviews skipped by `onlyNew`, place rows whose rating and review count haven't changed under `onlyNew`, and machine-translated copies left out when you pick languages. To cap a run's spend, set **Maximum cost per run** in the run options, or **Max rows in total** in the input.

### Limits, stated up front

- Only what a logged-out visitor sees. Nothing behind a sign-in is read.
- TripAdvisor lists about 10,000 reviews per sort order. Asking for more makes the Actor read each star rating as its own list (duplicates removed), so up to 50,000 per place. Past the first list, rows follow star order rather than one strict date order. The run says when a place had more than any visitor can page through.
- With **Languages** empty, reviews written in other languages come in TripAdvisor's English machine translation (`machineTranslated: true`, `language` = the original). Pick languages to get reviews as they were written. TripAdvisor's list for a language is mostly translations into it (for Chinese at a big New York attraction, about 1 review in 40 was written in Chinese), so a language filter can read many pages to find a few originals. The translations it skips are not charged; it just takes longer.
- The ranking text is available for hotels and restaurants, not attractions. Phone and website are available for restaurants; hotels' booking links are partner offers and are not returned.
- Owner-reply rate, reply time and 90-day rating describe the reviews collected in the run, not every review the place ever had.
- Big requests are split fairly across the run's time limit. If time runs short, the run ends successfully with the rows so far and says what to narrow.

### Privacy

Reviewers are members of the public, so the Actor keeps as little about them as it can:

- No reviewer names by default. **Reviewer display names** adds the public display name and home town shown on the review. Profile links, usernames, member ids and photos are never returned.
- E-mail addresses and phone numbers typed into a review are replaced with `[contact removed]`. With reviewer names off, a reviewer's own name in the text ("Mr. Smith", a signature on the last line) is replaced with `[name removed]` too.
- Owner replies keep the business's words, with the guest's name in the greeting and the staff member's signature replaced by `[name removed]`. The responder is described by role only (`Owner`, `Guest Services / Front Office`).

### Only new since last run, and schedules

Turn on **Only new reviews** and schedule the Actor daily. Each run returns only reviews that earlier runs with the same filters did not, and stops reading a place at the first page it had already sent. A run with nothing new charges nothing. Place rows come back only when the rating or review count changed, so a schedule also tracks rating changes. Adding a place to the list keeps the memory of the others. Set up a schedule under **Schedules** in Apify Console.

### Integrations: API, n8n, Make and AI agents

**API.** Run it and get the rows back in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/locaihost~tripadvisor-reviews/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"startUrls": ["457808"], "maxReviewsPerPlace": 50, "ratings": ["1", "2"]}'
```

Apify's API clients for Python and JavaScript work the same way.

**n8n, Make, Zapier, Google Sheets, Slack, webhooks.** Apify's built-in integrations send each run's dataset wherever you need it, for example new 1- and 2-star reviews into a Slack channel for the front office.

**AI agents (MCP).** Add this Actor to Claude, Cursor or any MCP client with `https://mcp.apify.com/?tools=locaihost/tripadvisor-reviews`, then ask something like *"What did guests complain about at these three hotels in the last 90 days, and which one answers its reviews fastest?"*

### FAQ

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

$0.50 per 1,000 reviews and $1 per 1,000 places on the Free and Starter plans, less on Scale and Business. Apify's free $5 monthly credit covers about 10,000 reviews.

#### Which links work?

The page of one hotel, restaurant, attraction or tour on any TripAdvisor country site, or its location id. Vacation rental links are accepted too; where TripAdvisor shows no reviews for one, it comes back as a free row. City pages and lists of places are refused with a free row saying so.

#### How many reviews can I get per place?

All of them for most places. TripAdvisor lists about 10,000 per sort order; past that the Actor reads each star rating separately, up to 50,000 per place.

#### Can I get only bad reviews, or reviews about one topic?

Yes. **Star ratings** keeps only the stars you pick, and **Reviews mentioning** uses TripAdvisor's own review search for a word or phrase. **Trip types** narrows to families, couples, solo, business or friends.

#### Can I use it from an AI agent?

Yes. Through the Apify MCP server (`https://mcp.apify.com/?tools=locaihost/tripadvisor-reviews`) any MCP client can call it with a list of places and read the reviews back.

#### Is it legal to scrape TripAdvisor?

The Actor reads only what any logged-out visitor can see; it never logs in or uses an account. TripAdvisor's own terms restrict automated collection, so check them against your use. Review texts are written by members of the public: respect their copyright when republishing, follow privacy law (such as GDPR) if you switch on reviewer names, and never use the data to contact, profile or harass reviewers. You are responsible for how you use the results.

#### Why are some fields empty?

`ownerResponse` is null when the owner didn't reply, `subRatings` when the reviewer gave none, `travelDate` and `tripType` when they didn't say. On place rows, `ranking` is null for attractions, and phone, website and e-mail exist only where TripAdvisor shows the business's own.

### More from locaihost data

- [Trustpilot reviews](https://apify.com/locaihost/trustpilot-reviews): company reviews with replies and reply rate, in the same row style.
- [BBB reviews and complaints](https://apify.com/locaihost/bbb-reviews): Better Business Bureau reviews, complaints and ratings.
- [Google Maps business leads](https://apify.com/locaihost/google-maps-leads): local businesses with ratings and contact details from Google Maps.

### Did it help?

If this saved you time, a quick rating on the Store helps other people find it.

### Support

Something not working, a filter you need, or another review site with the same columns? Open an issue on the **Issues** tab: we answer issues within 24 hours.

# Changelog

This Actor's version history is a separate document: https://apify.com/locaihost/tripadvisor-reviews/changelog.md

# Actor input Schema

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

TripAdvisor review pages of hotels, restaurants, attractions or tours, from any TripAdvisor country site (tripadvisor.com, .co.uk, .de, .com.sg and so on). The location id on its own works too (93437 or d93437). City pages and lists of places are not accepted: open the place and paste its own link.

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

Newest first by default. 0 returns only the place row (rating, star breakdown, ranking, address) with no reviews. TripAdvisor lists about 10,000 reviews per sort order; past that the Actor reads each star rating as its own list, so up to 50,000 per place.

## `maxResults` (type: `integer`):

Stops the whole run after this many charged rows (reviews plus places). 0 means no limit.

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

Only reviews published on or after this date, like 2026-09-01, or a period like "30 days" or "6 months". Sets the order to newest first, so reading stops at the first older review.

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

Only reviews with these star ratings. Leave empty for all.

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

Language codes like en, fr, de, es, it, ja, zh-CN. Reviews are returned as written in each language. Leave empty for every language: then reviews written in other languages come in TripAdvisor's English translation (the row's language and machineTranslated fields say so).

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

Only reviews from these kinds of trip. Leave empty for all.

## `reviewsContaining` (type: `string`):

Only reviews that mention this word or phrase, using TripAdvisor's own review search (like "breakfast" or "parking").

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

Which reviews come first. Newest first is best for monitoring and for "Reviews since".

## `includePlaceDetails` (type: `boolean`):

One place row per place, charged as a place: rating, review count, star breakdown, average sub-ratings, ranking, address, coordinates, price level, cuisines or amenities, the business's own phone and website, and the owner reply rate, reply time and 90-day rating worked out from the reviews collected.

## `includeReviewerNames` (type: `boolean`):

Add each reviewer's public display name and home town. Off by default: most uses (sentiment, reply tracking) don't need them. Profile links, usernames and photos are never returned.

## `onlyNew` (type: `boolean`):

Skip reviews an earlier run with the same filters already returned, and charge only for new ones. A place row is sent again only when its rating or review count changed. Use with a schedule to monitor places.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Hotel_Review-g60763-d93437-Reviews-Hotel_Edison_Times_Square-New_York_City_New_York.html",
    "https://www.tripadvisor.co.uk/Attraction_Review-g60763-d105127-Reviews-Central_Park-New_York_City_New_York.html",
    "457808"
  ],
  "maxReviewsPerPlace": 10,
  "maxResults": 0,
  "languages": [
    "en",
    "fr"
  ],
  "reviewsContaining": "breakfast",
  "sortBy": "newest",
  "includePlaceDetails": true,
  "includeReviewerNames": false,
  "onlyNew": false
}
```

# Actor output Schema

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

One row per review: place, stars, title, text, dates, trip type, sub-ratings, owner reply, link.

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

One row per place: rating, review count, star breakdown, ranking, address, reply rate and reply time.

## `full` (type: `string`):

Every field of every row, including free not-found rows.

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

Counts, free rows by reason, anything that failed, access stats and cost.

# 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-g60763-d93437-Reviews-Hotel_Edison_Times_Square-New_York_City_New_York.html",
        "https://www.tripadvisor.com/Restaurant_Review-g60763-d457808-Reviews-Daniel-New_York_City_New_York.html"
    ],
    "maxReviewsPerPlace": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("locaihost/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 = {
    "startUrls": [
        "https://www.tripadvisor.com/Hotel_Review-g60763-d93437-Reviews-Hotel_Edison_Times_Square-New_York_City_New_York.html",
        "https://www.tripadvisor.com/Restaurant_Review-g60763-d457808-Reviews-Daniel-New_York_City_New_York.html",
    ],
    "maxReviewsPerPlace": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("locaihost/tripadvisor-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 '{
  "startUrls": [
    "https://www.tripadvisor.com/Hotel_Review-g60763-d93437-Reviews-Hotel_Edison_Times_Square-New_York_City_New_York.html",
    "https://www.tripadvisor.com/Restaurant_Review-g60763-d457808-Reviews-Daniel-New_York_City_New_York.html"
  ],
  "maxReviewsPerPlace": 10
}' |
apify call locaihost/tripadvisor-reviews --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,locaihost/tripadvisor-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/bSFxOP7JuBfuscG3N/builds/2F8fQgfFVoxDGaVnm/openapi.json
