# TripAdvisor Guest Review & Rating Extractor (`vexaloom-labs/tripadvisor-guest-review-and-rating-extractor`) Actor

Scrape guest reviews from any TripAdvisor hotel, restaurant, or attraction page, with rating, reviewer details, trip type, and owner replies, enriched with the place's own overall rating and address.

- **URL**: https://apify.com/vexaloom-labs/tripadvisor-guest-review-and-rating-extractor.md
- **Developed by:** [vexaloom-labs](https://apify.com/vexaloom-labs) (community)
- **Categories:** Travel, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

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 Guest Review & Rating Extractor

Collect guest reviews from TripAdvisor hotels, restaurants, attractions and tours. Get the full review text, star and category ratings, trip context, reviewer history, photos and owner replies, plus each place's ranking, price range, rating breakdown and key amenities.

### What this actor does

- Collects reviews from one or more TripAdvisor places in a single run, using place URLs or numeric location IDs
- Supports hotels, restaurants, attractions and activity/tour pages, including links from any country's TripAdvisor site
- Filters by star rating, traveler type, publication month, language and review keyword
- Adds exact publish dates, visit dates, reviewer profile details, photos, per-review subratings and owner responses
- Attaches place-level ranking, price range, hotel class, rating breakdown and key amenities to every review
- Omits fields the source does not provide instead of writing empty strings

### Output per review

#### Place fields

- `placeName`, `placeId`, `placeUrl`, `placeCategory` — the reviewed place, its TripAdvisor ID, page URL and type (`hotel`, `restaurant`, `attraction`, `activity`)
- `placeRating`, `placeReviewCount` — overall rating and total review count
- `placeAddress`, `placeCity`, `placeCountry`, `placeLatitude`, `placeLongitude` — location details
- `placeRanking`, `placeRankingPosition`, `placeRankingCount` — ranking string and its numeric parts
- `placePriceRange`, `placePriceLevel`, `placeHotelClass` — price and class details when shown
- `placeRatingBreakdown` — counts for `excellent`, `veryGood`, `average`, `poor` and `terrible`
- `placeAmenities` — key amenities shown for the place

#### Review fields

- `reviewId`, `reviewTitle`, `reviewText`, `reviewRating` — the review itself; `reviewId` is TripAdvisor's review ID
- `reviewDate`, `reviewPublishedAt` — published date in readable and ISO form
- `travelDate`, `travelDateIso`, `tripType` — when the reviewer traveled and with whom
- `reviewerName`, `reviewerLocation`, `reviewerContributions`, `reviewerUsername`, `reviewerProfileUrl` — reviewer details
- `helpfulVotes` — helpful-vote count
- `reviewPhotos`, `reviewPhotoCount` — review photo URLs and total photo count
- `ownerResponse`, `ownerResponseDate`, `ownerResponseAt`, `ownerResponseRole`, `ownerResponseAuthor` — management reply details
- `reviewSubratings` — category scores such as `value`, `rooms`, `service`, `cleanliness` or `food`
- `reviewTip` — a short reviewer tip when one is attached
- `isHighlighted`, `hasSafetyAlert` — flags shown by TripAdvisor when present
- `reviewLanguage`, `displayLanguage`, `isTranslated` — the language the review was written in, the language shown, and whether it was machine translated
- `reviewUrl` — direct link to the review
- `position` — the review's position in this run's collection order for that place
- `scrapeTimestamp` — when the run collected the record

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array | – | TripAdvisor place URLs or numeric location IDs. Required. Supports hotel, restaurant, attraction, activity/tour, single-review and country-domain links. |
| `maxReviews` | integer | `100` | Maximum reviews per place (1–10,000). The run also stops when the source runs out. |
| `sortBy` | string | `mostRecent` | `mostRecent`, `detailed` or `insightful`. `detailed` prioritizes longer reviews; `insightful` is accepted but currently returns the same order as `mostRecent` on tested places. |
| `ratingFilter` | array | `[]` | Keep only these star ratings (1–5). Empty means all ratings. |
| `tripTypeFilter` | array | `[]` | Keep only these traveler types: `solo`, `couples`, `family`, `friends`, `business`. |
| `monthFilter` | array | `[]` | Keep only reviews published in these months. TripAdvisor applies this to the review submission month; the visit month is reported in `travelDate`. Empty means all months. |
| `reviewLanguage` | array | `[]` | Keep reviews available in these languages. The original language and translation flag are always reported. |
| `keyword` | string | – | Keep only reviews containing this text. |
| `publishedAfter` | string | – | Keep reviews published on or after this date (`YYYY-MM-DD`). Useful for scheduled incremental runs. |

### Example: recent reviews from a hotel

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Hotel_Review-g60763-d675616-Reviews-The_Plaza_New_York-New_York_City_New_York.html"
  ],
  "maxReviews": 50,
  "sortBy": "mostRecent"
}
```

### Example: five-star family reviews about breakfast

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Hotel_Review-g60763-d675616-Reviews-The_Plaza_New_York-New_York_City_New_York.html",
    "https://www.tripadvisor.com/Restaurant_Review-g60763-d457808-Reviews-Daniel-New_York_City_New_York.html"
  ],
  "maxReviews": 200,
  "ratingFilter": ["5"],
  "tripTypeFilter": ["family"],
  "keyword": "breakfast"
}
```

### Example: a scheduled incremental run

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Attraction_Review-g60763-d104365-Reviews-Empire_State_Building-New_York_City_New_York.html"
  ],
  "maxReviews": 100,
  "publishedAfter": "2026-10-01"
}
```

### Example: hotels, restaurants, attractions and a tour

```json
{
  "startUrls": [
    "675616",
    "https://www.tripadvisor.com/Restaurant_Review-g60763-d457808-Reviews-Daniel-New_York_City_New_York.html",
    "https://www.tripadvisor.com/Attraction_Review-g60763-d104365-Reviews-Empire_State_Building-New_York_City_New_York.html",
    "https://www.tripadvisor.com/AttractionProductReview-g293916-d12565966-Bangkok_Midnight_Food_Tuk_Tuk_Tour-Bangkok.html"
  ],
  "maxReviews": 40
}
```

### Use cases

- **Reputation monitoring** — keep a daily or weekly feed of new guest reviews and owner replies for your properties
- **Competitive benchmarking** — compare ratings, complaint themes and response rates across nearby hotels or restaurants
- **Guest-experience research** — study reviews by trip type, month or language for product and service decisions
- **Response auditing** — identify reviews without an owner reply and measure response coverage
- **Travel content** — collect real guest quotes, photos and ratings for destination pages and newsletters
- **Data enrichment** — attach place ranking, price range and rating breakdown to an existing review dataset

### FAQ

**Which TripAdvisor place types are supported?**
Hotels, restaurants, attractions and activity/tour products. You can paste a place page URL, a single-review URL, a link from any TripAdvisor country site, or a bare numeric location ID.

**Do I need a TripAdvisor account, cookies or an API key?**
No. The actor reads publicly available review data and needs no login, user cookies or API key. It generates an anonymous session cookie at runtime.

**How many reviews can I collect?**
Up to `maxReviews` per place. The run stops early when the place has no more reviews. Very large listings can return incomplete results after roughly 6,000 reviews per place because of TripAdvisor's deep-pagination behaviour; when that happens the run finishes with an honest partial-count message instead of failing.

**Why are some fields missing from a record?**
TripAdvisor does not show every field for every review. Reviewer location, photos, owner replies, subratings and tips are conditional, so they are omitted when absent. Counts such as `helpfulVotes` and `reviewPhotoCount` are still included when they are zero.

**What is the difference between `reviewLanguage` and `displayLanguage`?**
`reviewLanguage` is the language the reviewer wrote in. `displayLanguage` is the language TripAdvisor returned the text in. When `isTranslated` is true, the text you receive was machine translated, and `reviewLanguage` still tells you the original language.

**Why do activity/tour rows have fewer place fields?**
Activity product pages do not expose the same address, ranking, price range or amenity data as hotels, restaurants and attractions. Those records still include the product name, review count, review fields and review URL.

**Can I use this for scheduled incremental runs?**
Yes. Set `publishedAfter` to a recent date and schedule the actor. With the default most-recent sort it stops once it reaches older reviews.

**Are owner responses included?**
Yes, when the business posted one. The response text, date, responder role and responder name are included.

**Is this affiliated with TripAdvisor?**
No. This is an independent, third-party actor that reads publicly available TripAdvisor review data. It is not affiliated with or endorsed by TripAdvisor.

# Actor input Schema

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

TripAdvisor place URLs or numeric location IDs. Hotel, restaurant, attraction, activity/tour, single-review and country-domain links are supported.

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

Maximum number of reviews to collect from each place. The run also stops when the source runs out.

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

Order in which reviews are collected. 'detailed' prioritizes longer reviews; 'insightful' is accepted but currently returns the same order as 'most recent' on tested places.

## `ratingFilter` (type: `array`):

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

## `tripTypeFilter` (type: `array`):

Only collect reviews from these traveler types. Leave empty for all trip types.

## `monthFilter` (type: `array`):

Only collect reviews published in these months. TripAdvisor applies this to the review submission month; the visit month is reported in travelDate. Leave empty for all months.

## `reviewLanguage` (type: `array`):

Only collect reviews available in these languages. TripAdvisor may show a machine translation; the language each review was written in is always reported.

## `keyword` (type: `string`):

Only collect reviews containing this text. Leave empty for all reviews.

## `publishedAfter` (type: `string`):

Keep reviews published on or after this date (YYYY-MM-DD). Useful for scheduled incremental runs. Leave empty for all dates.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Hotel_Review-g60763-d675616-Reviews-The_Plaza_New_York-New_York_City_New_York.html"
  ],
  "maxReviews": 5,
  "sortBy": "mostRecent",
  "ratingFilter": [],
  "tripTypeFilter": [],
  "monthFilter": [],
  "reviewLanguage": [],
  "keyword": "",
  "publishedAfter": ""
}
```

# Actor output Schema

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

Dataset containing all scraped TripAdvisor reviews.

# 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-d675616-Reviews-The_Plaza_New_York-New_York_City_New_York.html"
    ],
    "maxReviews": 5,
    "sortBy": "mostRecent",
    "ratingFilter": [],
    "tripTypeFilter": [],
    "monthFilter": [],
    "reviewLanguage": [],
    "keyword": "",
    "publishedAfter": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("vexaloom-labs/tripadvisor-guest-review-and-rating-extractor").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-d675616-Reviews-The_Plaza_New_York-New_York_City_New_York.html"],
    "maxReviews": 5,
    "sortBy": "mostRecent",
    "ratingFilter": [],
    "tripTypeFilter": [],
    "monthFilter": [],
    "reviewLanguage": [],
    "keyword": "",
    "publishedAfter": "",
}

# Run the Actor and wait for it to finish
run = client.actor("vexaloom-labs/tripadvisor-guest-review-and-rating-extractor").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-d675616-Reviews-The_Plaza_New_York-New_York_City_New_York.html"
  ],
  "maxReviews": 5,
  "sortBy": "mostRecent",
  "ratingFilter": [],
  "tripTypeFilter": [],
  "monthFilter": [],
  "reviewLanguage": [],
  "keyword": "",
  "publishedAfter": ""
}' |
apify call vexaloom-labs/tripadvisor-guest-review-and-rating-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vexaloom-labs/tripadvisor-guest-review-and-rating-extractor"
        }
    }
}
```

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/Dgmncd5oCzxnIeFH1/builds/ZjovOOA8WlEoaTuGe/openapi.json
