# Tripadvisor Reviews Scraper with Place Data (`datascraperes/tripadvisor-reviews-data-scraper`) Actor

Collect Tripadvisor reviews from public place URLs or a completed Tripadvisor Places Dataset. Save a Dataset row per unique review with ratings, text, dates, owner responses, review photos, and place context. Filter by rating or date, prioritize a language, and optionally include reviewer details.

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

## Pricing

from $0.30 / 1,000 tripadvisor 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

Collect **one structured Dataset item per Tripadvisor review** from public place URLs or a completed Tripadvisor places Dataset. The output combines review text, rating, dates, owner responses, photos, and useful place context in a predictable JSON contract.

### What this Actor does

Tripadvisor Reviews Scraper accepts public Tripadvisor place URLs from localized country domains. It extracts the Tripadvisor location ID and follows the mobile review API pages until the requested matching-review limit or source exhaustion. It can also read place IDs and URLs from a completed Dataset produced by the Tripadvisor Places Scraper, which makes place discovery and review collection two separate, composable steps.

Each Dataset item represents one unique review. It includes the review ID and URL, title, text, star rating, publication and travel dates, returned language, owner response, subratings, translation flags, and review photos when Tripadvisor exposes them. Every row also carries a compact `placeInfo` object with the place name, category, rating, review count, and URL. The mobile review route does not return the place address, coordinates, ranking, or contact details, so those keys are present but `null`. Reviewer information is omitted by default and can be enabled explicitly.

The Actor is designed for review monitoring, local SEO research, hospitality analysis, reputation workflows, and historical snapshots. It keeps collection bounded and finishes with a partial collection report when a requested place cannot be collected, while already written rows remain available in the Dataset.

### Use cases

- Build review datasets for hotels, restaurants, attractions, tours, and other Tripadvisor places.
- Monitor new reviews by combining a recurring run with `lastReviewDate`.
- Compare ratings, owner-response coverage, review language, and review text across places.
- Feed structured reviews into sentiment analysis, dashboards, spreadsheets, or a data warehouse.
- Discover places with the Tripadvisor Places Scraper and pass its completed Dataset directly to this Actor.

### How to use

1. Open the Actor in Apify Console.
2. Paste one or more public Tripadvisor place URLs, or provide a completed places Dataset ID.
3. Set the review limit and filters if needed, then click **Start** and open the Dataset when the run finishes.

For a first run, use one place URL and a small `maxItemsPerQuery` value. The default reviewer setting keeps profile data out of the Dataset.

### Input

Use `startUrls` for up to 20 public Tripadvisor place or review URLs. The URL must contain a Tripadvisor location ID in a `d<location_id>` segment; the Actor does not need to load the web page. `sourceDatasetId` is an alternative or additional input for a completed Tripadvisor places Dataset. Every item must contain a numeric `id` or `locationId`, or a public Tripadvisor `webUrl` or `sourceUrl`. Finish source collection first. The source Dataset must contain at most 50,000 items and remain unchanged while it is read.

`maxItemsPerQuery` defaults to `50` and accepts `1` to `10,000` reviews per place. `maxTotalItemsPerRun` defaults to `10,000` and caps the complete run at `50,000` reviews. Both are maximums: a place may have fewer available reviews, and the source may stop providing additional pages.

`scrapeReviewerInfo` defaults to `false`. Set it to `true` only when the public reviewer fields are necessary for your use case. `reviewRatings` accepts `ALL_REVIEW_RATINGS` or one or more values from `1` to `5`. `reviewsLanguages` accepts no language filter or one language code; the Actor always sends an explicit language filter so the source does not silently fall back to English. `lastReviewDate` accepts an inclusive `YYYY-MM-DD` cutoff. Select a date from the calendar or enter a real date such as `2026-10-21`; leave it empty for no date filter. Invalid dates must be corrected before starting a run. The cutoff is applied by the source as a `since` filter; the Actor keeps a per-row date check for reviews whose absolute date is exposed. Tripadvisor reports recent reviews with relative text such as `3 weeks ago`, so those rows carry a date approximated from that text. `disableMachineTranslations` is accepted for input compatibility but the mobile review route has no equivalent toggle; use `isMachineTranslated` and `originalLanguage` in the output.

The source can include reviews in other languages after prioritizing the selected language. `lang` and `originalLanguage` remain `null` when the source does not identify the individual review's language. Month-only publication dates are also approximate; the source date filter remains authoritative for these rows.

This is the exact input used for the representative output below:

```json
{
  "startUrls": [
    {
      "url": "https://www.tripadvisor.com/Restaurant_Review-g60750-d4725725-Reviews-Dockside_1953-San_Diego_California.html"
    }
  ],
  "maxItemsPerQuery": 45,
  "maxTotalItemsPerRun": 45,
  "scrapeReviewerInfo": false,
  "lastReviewDate": "",
  "disableMachineTranslations": false,
  "reviewRatings": [
    "ALL_REVIEW_RATINGS"
  ],
  "reviewsLanguages": [
    "ALL_REVIEW_LANGUAGES"
  ]
}
```

```json
{
  "startUrls": [
    {
      "url": "https://www.tripadvisor.com/Restaurant_Review-g60750-d4725725-Reviews-Dockside_1953-San_Diego_California.html"
    }
  ],
  "sourceDatasetId": "",
  "maxItemsPerQuery": 50,
  "maxTotalItemsPerRun": 10000,
  "scrapeReviewerInfo": false,
  "lastReviewDate": "",
  "disableMachineTranslations": false,
  "reviewRatings": ["ALL_REVIEW_RATINGS"],
  "reviewsLanguages": ["ALL_REVIEW_LANGUAGES"]
}
```

### Output

The default Dataset contains one item per unique review ID. `placeInfo` is repeated on each review so the Dataset can be filtered or exported without a separate join. `user` is `null` unless `scrapeReviewerInfo` is enabled. Empty filtered results are valid and finish without review rows. Reviews are saved as pages arrive, so a source that remains unavailable preserves earlier results with `status: partial` in the Collection report. Unavailable places do not cause an error termination; check this report before treating a run as complete. The same applies when the collection time budget is exhausted. Invalid input or unverified saved output can still stop the run with an error. The **Collection report** output summarizes saved reviews, requested and completed places, the global limit, and any incomplete places. If the same run restarts, already saved review IDs are checked before collection continues; corrupt or unrelated saved output causes the run to stop. Apify can export the Dataset as JSON, JSONL, CSV, Excel, XML, and other supported formats.

This is the complete Dataset item from a real successful execution:

```json
{
  "id": "1078222095",
  "url": "https://www.tripadvisor.com/ShowUserReviews-g60750-d4725725-r1078222095-Dockside_1953-San_Diego_California.html",
  "title": "Easy free parking with resort style dining",
  "lang": null,
  "originalLanguage": null,
  "locationId": "4725725",
  "publishedDate": "2026-09-30",
  "publishedPlatform": null,
  "rating": 5,
  "helpfulVotes": null,
  "travelDate": "Sep 2026",
  "text": "Beautiful outdoor seating with water and small beach views.  It was very resort like with a great brunch menu.  Service was wonderful and serving sizes are huge.",
  "reviewType": "REVIEW",
  "ownerResponse": {
    "id": null,
    "lang": null,
    "publishedDate": "2026-09-19",
    "connection": null,
    "responder": "Ryan Wilson",
    "text": "Dear Renee, thank you for dining with us and for taking the time to share your experience! We're delighted to hear you enjoyed the easy complimentary parking, beautiful waterfront setting, and resort-style atmosphere. It's wonderful that our brunch menu, generous portions, and attentive service helped make your visit so memorable. We appreciate your kind feedback and look forward to welcoming you back for another relaxing meal by the water soon.",
    "title": null
  },
  "subratings": [],
  "isMachineTranslated": false,
  "isMachineTranslatable": null,
  "photos": [],
  "user": null,
  "placeInfo": {
    "id": "4725725",
    "name": "Dockside 1953",
    "type": "restaurant",
    "category": "restaurant",
    "categoryName": "Restaurant",
    "locationString": null,
    "latitude": null,
    "longitude": null,
    "rating": 4.7,
    "numberOfReviews": 1267,
    "ranking": null,
    "webUrl": "https://www.tripadvisor.com/Restaurant_Review-g60750-d4725725-Reviews-Dockside_1953-San_Diego_California.html",
    "website": null,
    "address": null,
    "addressObj": null,
    "phone": null,
    "email": null,
    "photo": null
  },
  "sourceUrl": "https://www.tripadvisor.com/Restaurant_Review-g60750-d4725725-Reviews-Dockside_1953-San_Diego_California.html",
  "scrapedAt": "2026-10-21T15:30:05.858391+00:00"
}
```

`publishedDate` and the owner-response `publishedDate` are absolute `YYYY-MM-DD` values when the source exposes them. Recent reviews are returned only as relative text such as `3 weeks ago`, so those rows carry a date approximated from that text. `lang` and `originalLanguage` remain `null` when the source does not identify the individual review language. An English machine translation is identified by `lang: "en"` and `isMachineTranslated: true`, while its original language remains unknown.

### Pricing

The Actor charges only when it saves one unique Tripadvisor review as a row in the default Dataset. Place lookups, filtered-out reviews, failed reviews, empty results, and starting a run do not create a review charge. There is no separate run-start fee. The actual billing unit is one saved review; the per-1,000 figures below are comparison equivalents.

| Apify plan tier | Price per review | Equivalent per 1,000 reviews |
|---|---:|---:|
| Free | $0.000400 | $0.40 |
| Bronze | $0.000360 | $0.36 |
| Silver | $0.000320 | $0.32 |
| Gold | $0.000300 | $0.30 |
| Platinum | $0.000300 | $0.30 |
| Diamond | $0.000300 | $0.30 |

The price depends on the customer's Apify subscription tier, not the number of reviews in a run. A run that ends incomplete can still charge for review rows it successfully saved; unavailable or undelivered reviews are not charged as review rows.

### Related Actors

| Actor | Best for |
|---|---|
| [Tripadvisor Places & Ratings Data Scraper](https://apify.com/datascraperes/tripadvisor-places-scraper) | Discovering Tripadvisor hotels, restaurants, attractions, and activities before passing their completed Dataset here. |
| [Google Maps Reviews Scraper | Ratings & Replies](https://apify.com/datascraperes/google-maps-reviews-scraper) | Collecting the equivalent review fields from Google Maps for a cross-platform reputation dataset. |
| [Google Maps Reviews Scraper & Sentiment Analyzer](https://apify.com/datascraperes/google-maps-review-analyzer) | Analyzing sentiment in Google Maps reviews from Google Maps business URLs. |

### Limits and data quality

- The Actor accepts up to 20 direct URLs per run. A completed source Dataset can add more places, but `maxTotalItemsPerRun` remains the global review cap.
- When the run reaches its maximum charge budget, it stops successfully with the reviews already saved. The collection report uses `stopped_by_budget` and `chargeLimitReached: true`; this means the budget stopped collection, not that every requested review was collected.
- A review limit is a maximum, not a guarantee. Tripadvisor can expose fewer pages, fewer reviews for a selected rating, or no matching rows.
- Reviews are deduplicated by their source review ID across all submitted places. Place context is read once per unique location ID.
- The language option is a source priority and is not a strict language-only guarantee for every page or place.
- The translation compatibility flag is returned in the request contract, but the current source behavior does not prove that it changes every response. Use the output translation flags to interpret each row.
- Tripadvisor may change pagination, available fields, or source coverage. Repeated pages, incomplete pagination, unusable review records, or a place that cannot be completed make the run incomplete; successfully written rows remain available. A safety limit of 5,000 source pages per place prevents a run from continuing indefinitely.
- `originalLanguage` can be unknown for translated content. Do not infer the original language from the returned text language.
- Restart recovery applies within the same run and the same input. A new run collects a new snapshot and does not deduplicate against earlier runs.
- Reviewer profiles are optional output and are disabled by default. Review text and owner responses can still contain personal information written by third parties.

### Frequently asked questions

#### Can I use a review URL instead of a place URL?

Yes. Any public Tripadvisor URL containing the place's `d<location_id>` segment is accepted, including a public review URL. The Actor uses the location ID and collects reviews for that place.

#### Does the Actor collect every review?

It follows the available review pages until the per-place limit, the global safety cap, the date cutoff, or source exhaustion. The source can expose fewer reviews or stop pagination, so a high limit is not a guarantee of a complete historical archive.

#### What happens when I select Spanish or another language?

Tripadvisor prioritizes the selected language. It may fill the remaining page with reviews in another language, so use `lang`, `originalLanguage`, and the translation flags to interpret the returned rows.

#### Can I keep reviewer profiles out of the Dataset?

Yes. Leave `scrapeReviewerInfo` disabled, which is the default. The review text, place context, and any public owner response remain available.

### Responsible use

Use this Actor only for lawful purposes and in accordance with applicable laws, privacy obligations, database rights, and the terms governing the source data. You are responsible for deciding whether collecting, storing, combining, and using review content is permitted for your use case.

Review text and optional reviewer fields can contain personal information. Protect exported Datasets, minimize retention, avoid excessive collection, and honor applicable deletion or opt-out requests.

### Support

If a run does not behave as expected, open an issue in the Actor's **Issues** tab with the run ID, a sanitized input URL, the requested limit and filters, and the observed result. Do not post credentials, cookies, tokens, or private review content.

[Python, JavaScript and CSV integration examples](https://github.com/datacrawler-edu/tripadvisor-reviews-scraper-python)

# Actor input Schema

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

Public Tripadvisor place or review URLs. The location ID is read from the d\<location_id> segment; the web page itself is not loaded.

## `sourceDatasetId` (type: `string`):

ID of a completed Tripadvisor places Dataset with at most 50,000 items. Finish source collection first. The Dataset must remain unchanged while read, and every item must identify a place through a numeric id/locationId or public webUrl/sourceUrl.

## `maxItemsPerQuery` (type: `integer`):

Maximum unique matching reviews returned for each place. Collection follows the available pages until this limit, source exhaustion, or the complete-run safety cap.

## `maxTotalItemsPerRun` (type: `integer`):

Safety cap across all submitted places. It prevents a multi-place run from collecting without a bound.

## `scrapeReviewerInfo` (type: `boolean`):

Include the public reviewer object returned by Tripadvisor, such as username, location, contribution counts, and profile URL. Disabled by default to minimize personal data in the Dataset.

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

Select a calendar date or enter a real date in YYYY-MM-DD format, for example 2026-10-21. Leave empty for no date filter. This inclusive cutoff is sent to Tripadvisor and also checked per row when an absolute date is exposed. Reviews reported only as relative text (for example '3 weeks ago') are dated approximately. An unreadable absolute review date makes the place incomplete.

## `disableMachineTranslations` (type: `boolean`):

Accepted for input compatibility. The current mobile review route has no equivalent toggle, so this does not guarantee original-language text. Check the returned translation flags and originalLanguage in the output.

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

Filter reviews upstream by one or more star ratings. ALL_REVIEW_RATINGS returns every rating.

## `reviewsLanguages` (type: `array`):

Select at most one language code, for example es or fr. Tripadvisor prioritizes the selected language and may fill the page with fallback reviews in another language.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.tripadvisor.com/Restaurant_Review-g60750-d4725725-Reviews-Dockside_1953-San_Diego_California.html"
    }
  ],
  "maxItemsPerQuery": 5,
  "maxTotalItemsPerRun": 5,
  "scrapeReviewerInfo": false,
  "lastReviewDate": "",
  "disableMachineTranslations": false,
  "reviewRatings": [
    "ALL_REVIEW_RATINGS"
  ],
  "reviewsLanguages": [
    "ALL_REVIEW_LANGUAGES"
  ]
}
```

# Actor output Schema

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

Structured Tripadvisor reviews, deduplicated by review ID.

## `runReport` (type: `string`):

Completion status, saved-review count, requested/completed places, global-limit status and incomplete 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/Restaurant_Review-g60750-d4725725-Reviews-Dockside_1953-San_Diego_California.html"
        }
    ],
    "maxItemsPerQuery": 5,
    "maxTotalItemsPerRun": 5,
    "scrapeReviewerInfo": false,
    "lastReviewDate": "",
    "disableMachineTranslations": false,
    "reviewRatings": [
        "ALL_REVIEW_RATINGS"
    ],
    "reviewsLanguages": [
        "ALL_REVIEW_LANGUAGES"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("datascraperes/tripadvisor-reviews-data-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/Restaurant_Review-g60750-d4725725-Reviews-Dockside_1953-San_Diego_California.html" }],
    "maxItemsPerQuery": 5,
    "maxTotalItemsPerRun": 5,
    "scrapeReviewerInfo": False,
    "lastReviewDate": "",
    "disableMachineTranslations": False,
    "reviewRatings": ["ALL_REVIEW_RATINGS"],
    "reviewsLanguages": ["ALL_REVIEW_LANGUAGES"],
}

# Run the Actor and wait for it to finish
run = client.actor("datascraperes/tripadvisor-reviews-data-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/Restaurant_Review-g60750-d4725725-Reviews-Dockside_1953-San_Diego_California.html"
    }
  ],
  "maxItemsPerQuery": 5,
  "maxTotalItemsPerRun": 5,
  "scrapeReviewerInfo": false,
  "lastReviewDate": "",
  "disableMachineTranslations": false,
  "reviewRatings": [
    "ALL_REVIEW_RATINGS"
  ],
  "reviewsLanguages": [
    "ALL_REVIEW_LANGUAGES"
  ]
}' |
apify call datascraperes/tripadvisor-reviews-data-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,datascraperes/tripadvisor-reviews-data-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/ob6g4Qeh1gHHNyI6O/builds/tbVyT2PhNFLVx2yyH/openapi.json
