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

Scrape public Tripadvisor Reviews public place reviews, ratings, traveler context, and owner responses. Export structured reviews, source URLs, IDs, and available details to CSV, JSON, or Excel for hospitality and destination feedback analysis.

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

## Pricing

$1.00 / 1,000 results

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?

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

Scrape Tripadvisor Reviews public place reviews, ratings, traveler context, and owner responses from public pages and export Tripadvisor Reviews data to CSV, JSON, or Excel. This Tripadvisor Reviews API alternative turns repeatable inputs into structured reviews for hospitality and destination feedback analysis.

Each dataset row represents a public review or a documented alternate record type. The output includes source identifiers and links where available, so you can verify a row, compare later runs, and distinguish missing source data from an omitted column.

### What data can you extract from Tripadvisor Reviews?

The dataset schema defines every field below. Examples come from one successful published run; `null` means that field was not exposed for that particular record. Availability may differ by input mode, page, and record type.

| Field | Description | Example |
| --- | --- | --- |
| `id` | Review identifier. | `1079305955` |
| `url` | Direct review URL. | `https://www.tripadvisor.com/ShowUserReviews-g60763-d208453-r1079305955-Hilton…` |
| `title` | Review headline. | `A good base for an NY stay.` |
| `text` | Review body. | `In NY for the UN General Assembly (like everybody else this week). It's at th…` |
| `rating` | Star rating from 1 to 5. | `4` |
| `lang` | Displayed review language. | `en` |
| `originalLanguage` | Original review language, when exposed. | `en` |
| `isMachineTranslated` | Whether displayed content was machine translated, when exposed. | `false` |
| `publishedDate` | Publication date as exposed by the source. | `2026-09-25` |
| `publishedPlatform` | Publication platform, when exposed. | `null` |
| `createdDate` | Review creation date. | `2026-09-25` |
| `travelDate` | Month or date of visit, when exposed. | `2026-09-30` |
| `tripType` | Type of trip, when exposed. | `BUSINESS` |
| `helpfulVotes` | Number of helpful votes. | `0` |
| `locationId` | Place identifier. | `208453` |
| `placeName` | Place name. | `Hilton New York Times Square` |
| `placeType` | Hotel, restaurant, or attraction. | `hotel` |
| `placeUrl` | Source place URL. | `https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_Yo…` |
| `placeAddress` | Place address. | `null` |
| `reviewerName` | Public reviewer display name. | `NaughtyBeagle` |
| `reviewerId` | Public reviewer identifier. | `FDA45083CDB6C611401372E2AF000E2E` |
| `reviewerLocation` | Public reviewer location. | `London, United Kingdom` |
| `reviewerProfileUrl` | Public reviewer profile URL. | `https://www.tripadvisor.com/Profile/NaughtyBeagle` |
| `reviewerAvatarUrl` | Public reviewer avatar URL. | `https://dynamic-media-cdn.tripadvisor.com/media/photo-o/03/70/f6/f0/jonathan-…` |
| `reviewerContributions` | Public review contribution count. | `214` |
| `ownerResponseText` | Management response text. | `null` |
| `ownerResponseDate` | Management response publication date. | `null` |
| `ownerResponder` | Management responder name. | `null` |
| `photoUrls` | Public review photo URLs. | `[]` |
| `subratings` | Category ratings as exposed by the source. | `[{"name":"Value","value":4},{"name":"Rooms","value":4},{"name":"Location","va…` |

Use the identifier and URL fields as your join keys before comparing snapshots. Fields that describe a page, search, category, author, or tournament establish where the record came from; keep them when you export a subset. Numeric values and boolean flags reflect the public page at collection time, not a permanent claim about the underlying item.

### How to scrape Tripadvisor Reviews

1. Open the actor input form and choose a narrow public source: a search phrase, page URL, item URL, or ID supported by the input fields below.
2. Set the relevant per-source page or result limit and the total item limit. Start with a small sample to check which optional fields the public source exposes.
3. Run the actor. Its dataset contains one structured row per saved result; inspect the first rows and their source links for the chosen input.
4. Download the dataset as JSON, CSV, or Excel. Preserve identifiers when combining runs so repeated results can be deduplicated.

For this actor, supply public place review URLs. Reviews are paged for each place and can be limited by date, rating, and language. The place page itself may be blocked while the review query still returns public reviews.

### Input

Use only the parameters relevant to your collection mode. An omitted optional filter uses the schema default shown here; an empty array, zero, and an omitted value can have different meanings, so keep intentional settings in your saved input.

| Parameter | Type | Default | Description |
| --- | --- | --- |
| `startUrls` | `array` | No default; example `[{"url":"https://www.tripadvisor.com/Attraction_Review-g60763-d104365-Reviews…` | Public Tripadvisor hotel, restaurant, or attraction review pages. |
| `maxReviewsPerPlace` | `integer` | `50` | Maximum reviews to save for each place. Zero means no per-place limit. |
| `maxItems` | `integer` | `0` | Maximum reviews to save across all places. Zero means no total limit. |
| `lastReviewDate` | `string` | None | Save reviews published on or after this date, in YYYY-MM-DD format. |
| `reviewRatings` | `array` | `[]` | Save only selected star ratings. Leave empty for all ratings. |
| `reviewsLanguage` | `string` | \`\` | ISO language code to keep, such as en or fr. Leave blank for all languages. |
| `includeReviewerInfo` | `boolean` | `true` | Include public reviewer name, profile link, location, and contribution count when available. |
| `proxyConfiguration` | `object` | `{"useApifyProxy":true}` | Proxy settings for requests to public place pages. |

Example input based on the published golden run (long URL lists are shortened):

```json
{
  "startUrls": [
    {
      "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html"
    }
  ],
  "maxReviewsPerPlace": 30,
  "maxItems": 30
}
```

The example is a starting shape, not a guarantee of a particular result count. Source inventory and page accessibility change. When you need repeatable comparisons, save the exact input JSON with the run date and inspect the returned source or record-type field.

### Output example

The following is one real item from a successful published dataset. Long text and media arrays are shortened for readability; the actual dataset keeps the original values and all schema fields.

```json
{
  "id": "1079305955",
  "url": "https://www.tripadvisor.com/ShowUserReviews-g60763-d208453-r1079305955-Hilton_New_York_Times_Square-New_York_City_New_York.html",
  "title": "A good base for an NY stay.",
  "text": "In NY for the UN General Assembly (like everybody else this week). It's at the more standard end of the Hilton scale. One of those city hotels that people use for 2 nights max and move on. I was he…",
  "rating": 4,
  "lang": "en",
  "originalLanguage": "en",
  "isMachineTranslated": false,
  "publishedDate": "2026-09-25",
  "createdDate": "2026-09-25",
  "travelDate": "2026-09-30",
  "tripType": "BUSINESS",
  "helpfulVotes": 0,
  "locationId": "208453",
  "placeName": "Hilton New York Times Square",
  "placeType": "hotel",
  "placeUrl": "https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html",
  "reviewerName": "NaughtyBeagle",
  "reviewerId": "FDA45083CDB6C611401372E2AF000E2E",
  "reviewerLocation": "London, United Kingdom",
  "reviewerProfileUrl": "https://www.tripadvisor.com/Profile/NaughtyBeagle",
  "reviewerAvatarUrl": "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/03/70/f6/f0/jonathan-l.jpg?w=720&h=720&s=1",
  "reviewerContributions": 214,
  "photoUrls": [],
  "subratings": [
    {
      "name": "Value",
      "value": 4
    },
    {
      "name": "Rooms",
      "value": 4
    }
  ]
}
```

This row illustrates the observed output structure, including its identifiers and public links. Empty values elsewhere in the dataset should be interpreted field by field; a field shown in this example is not promised for every review.

### Use cases

- Hotel teams can group recent public comments by rating and compare recurring service issues.
- Destination researchers can analyze trip type and travel date where disclosed.
- Customer-experience teams can monitor owner responses to critical public reviews.
- Travel publishers can cite review permalinks and dates when checking public feedback.

The strongest analyses keep source context. A field such as price, rating, engagement, or rank has meaning only with its associated item, query, date, and public URL. Keep the raw export and create a separate cleaned view for charts or alerts.

### How much does it cost to scrape Tripadvisor Reviews?

The price is **$1.00 per 1,000 saved results**. Platform usage is included. The charge scales with output rows, so a restrictive filter or inaccessible page can produce fewer billable results than the requested maximum.

- 100 reviews: **$0.10**. This is useful for checking a small cohort and confirming which optional fields are present.
- 1,000 reviews: **$1.00**. This is the reference price for a larger export.
- 5,000 reviews: **$5.00**. Reaching this size may require multiple focused sources or scheduled runs, depending on public inventory and source caps.

Compute any other estimate as saved result count × $1.00 / 1,000. A maximum input is a ceiling, not a purchase of that many rows. For planning, use the actual saved-item count from an initial representative run.

### Tips for best results

Use one place URL per property or attraction and set maxReviewsPerPlace for balanced coverage. Filter by reviewRatings and reviewsLanguage only when those subsets are the actual research target.

Collect a small baseline first, record the exact input and date, and inspect both a typical row and a sparse row. Expand by adding focused sources instead of assuming one broad input can reveal the full public inventory. When comparing two runs, match stable IDs or canonical URLs and use the same filters so changes reflect the source rather than a changed query.

Export the full JSON when nested arrays or objects matter. CSV and Excel are convenient for sorting and joins, but nested structures may need flattening before spreadsheet analysis. Keep numeric fields numeric and preserve source URLs as text; do not infer a zero from a null.

### Limits

Review dates, trip details, subratings, photos, and owner responses depend on what each reviewer and place expose. A review count limit is a request ceiling, not a promise that every place has that many public reviews.

Public pages can change, disappear, or expose different fields for different records. The schema is a list of possible output columns, not a promise that each column is filled in each row. The `maxItems`-style input limits cap saved results; they do not bypass source pagination, public visibility, or a site-specific result ceiling.

Treat a saved result as a snapshot. If a later run returns fewer rows, first compare the input, source access, and public inventory before concluding that the underlying market changed. If you need an audit trail, retain the source URL, stable identifier, and run timestamp with the export.

### Use with AI agents (MCP)

An agent can supply the documented input JSON, run this actor, and work from its dataset. Ask it to keep source links and identify null values explicitly when summarizing results. Example prompts:

> Run Tripadvisor Reviews Scraper for the sample input above. Return the first 20 reviews with their source URLs and the fields needed for hospitality and destination feedback analysis. Mark unavailable fields as null.

> Schedule a repeat Tripadvisor Reviews collection with the same filters. Compare records by stable ID or canonical URL and report only new, removed, or changed public values.

### FAQ

#### Is it legal to scrape Tripadvisor Reviews?

This actor collects public data. Check the site’s terms, applicable law, and the rights of people whose data appears in your export. Follow GDPR and other privacy rules where relevant; do not use personal data for misuse, intrusive profiling, or unauthorized contact.

#### Do I need to configure proxies?

The input includes proxyConfiguration and defaults to Apify Proxy. Usually the default is enough to start. Availability can vary by page and region; changing network settings cannot make private or login-only information public.

#### How fast will a run finish?

Duration depends on the number of inputs, pages, detail requests, and source responses. A small sample is the best way to measure your workload. Increase the limits gradually, then use the observed run duration for scheduling and monitoring.

#### Can I schedule and monitor recurring runs?

Yes. Save the input and schedule recurring runs in Apify. Monitor run status, item count, and any missing-field changes; store the run date alongside exports when comparing snapshots.

#### Can I export to Google Sheets or Excel?

Yes. Download CSV or Excel from the dataset, or pass JSON to a spreadsheet integration. For nested fields, flatten the specific child values you need rather than losing the original JSON.

#### What if a field is empty?

An empty or null field means it was not available from that public source record in that run. Check the source URL, input mode, and record type. Do not replace missing prices, counts, dates, or flags with zero unless your own analysis has a documented rule for doing so.

#### Can I collect reviews from multiple hotels?

Yes. Put each public place review URL in startUrls and use maxReviewsPerPlace to balance how many reviews are collected from each.

### Integrations

Use the Apify API to start runs and retrieve the dataset, webhooks to react when a run finishes, or Zapier, Make, and n8n to route records into other systems. Google Sheets supports lightweight review, while scheduled runs provide repeat snapshots. Keep the raw JSON when downstream workflows need nested fields or exact null values.

### Support

Open an issue on the Issues tab; we reply within 24h and add fields on request.

# Actor input Schema

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

Public Tripadvisor hotel, restaurant, or attraction review pages.

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

Maximum reviews to save for each place. Zero means no per-place limit.

## `maxItems` (type: `integer`):

Maximum reviews to save across all places. Zero means no total limit.

## `lastReviewDate` (type: `string`):

Save reviews published on or after this date, in YYYY-MM-DD format.

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

Save only selected star ratings. Leave empty for all ratings.

## `reviewsLanguage` (type: `string`):

ISO language code to keep, such as en or fr. Leave blank for all languages.

## `includeReviewerInfo` (type: `boolean`):

Include public reviewer name, profile link, location, and contribution count when available.

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

Proxy settings for requests to public place pages.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.tripadvisor.com/Attraction_Review-g60763-d105127-Reviews-Central_Park-New_York_City_New_York.html"
    }
  ],
  "maxReviewsPerPlace": 50,
  "maxItems": 0,
  "reviewRatings": [],
  "reviewsLanguage": "",
  "includeReviewerInfo": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Public reviews saved to the default dataset.

# 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/Attraction_Review-g60763-d105127-Reviews-Central_Park-New_York_City_New_York.html"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mlg14/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/Attraction_Review-g60763-d105127-Reviews-Central_Park-New_York_City_New_York.html" }] }

# Run the Actor and wait for it to finish
run = client.actor("mlg14/tripadvisor-reviews-scraper").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": [
    {
      "url": "https://www.tripadvisor.com/Attraction_Review-g60763-d105127-Reviews-Central_Park-New_York_City_New_York.html"
    }
  ]
}' |
apify call mlg14/tripadvisor-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

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/lUclMcPCYh9Gi6rh1/builds/tHGjjPtXH6VWOdfBb/openapi.json
