# Tripadvisor Reviews, Places & Photos Scraper (`trakk/tripadvisor-reviews-places-scraper`) Actor

Scrape Tripadvisor reviews and place data from search keywords or direct URLs. Extract ratings, review text, dates, owner replies, addresses, phones, websites, coordinates, images, and search metadata for hotels, restaurants, attractions, and tours.

- **URL**: https://apify.com/trakk/tripadvisor-reviews-places-scraper.md
- **Developed by:** [Blynx](https://apify.com/trakk) (community)
- **Categories:** Travel, Automation, Developer tools
- **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. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 & Places Scraper - Extract Tripadvisor Data at Scale

**Fast, request-based Tripadvisor scraper for Apify.** Search Tripadvisor by keyword or scrape direct Tripadvisor URLs, then extract reviews, ratings, addresses, photos, owner responses, contact details, coordinates, and clean place data - without running a headless browser.

> Scrape **hotels**, **restaurants**, **attractions**, **tours**, and other Tripadvisor listings. Start from **search keywords** like `Paris restaurants` or from direct **Tripadvisor review URLs**. Export clean data to JSON, CSV, Excel, XML, RSS, Google Sheets, Make, Zapier, n8n, or your own API pipeline.

---

### 🔥 What does this Actor do?

Tripadvisor Reviews & Places Scraper turns public Tripadvisor pages into structured datasets. Use it to:

- 🏨 **Scrape hotel reviews** - ratings, guest text, dates, trip type, owner replies, reviewer profile details
- 🍽️ **Collect restaurant data** - rating, review count, phone, address, website, images, review text
- 🎟️ **Extract attraction and tour reviews** - landmarks, museums, tours, experiences, and things to do
- 🔎 **Search Tripadvisor by keyword** - city, category, landmark, brand, restaurant name, or hotel name
- 🔗 **Scrape exact Tripadvisor URLs** - paste direct listing URLs when you already know the pages
- 🖼️ **Display images directly in Apify datasets** - `imageUrl` is rendered as an image preview
- 📍 **Enrich travel directories** - address, geo coordinates, phone, website, country, city, category
- 📊 **Build review monitoring dashboards** - filter by rating, date range, place, and source query
- 🤖 **Feed AI and BI workflows** - sentiment analysis, lead enrichment, reputation tracking, competitor research

---

### ⚙️ Two ways to scrape Tripadvisor

#### Mode 1 - `SEARCH`: discover places from keywords

Provide search queries such as:

- `New York City hotels`
- `Paris restaurants`
- `London attractions`
- `Eiffel Tower`
- `Grand Canyon tours`

The Actor searches Tripadvisor, picks matching places, then fetches place details and reviews.

#### Mode 2 - `URL`: scrape exact Tripadvisor pages

Provide direct Tripadvisor URLs when you already know the listings:

- hotel review pages
- restaurant review pages
- attraction review pages
- activity or tour review pages
- cruise review pages

> 💡 **Pro tip:** use precise queries with city + category, for example `Amsterdam restaurants` or `Paris France hotels`. If a query is ambiguous, adding country or region improves matching.

---

### 🧩 Data flow

```text
searchQueries / startUrls
        |
        v
Tripadvisor search and detail pages
        |
        v
Request-based fetcher with retries and proxy support
        |
        v
Place parser + review parser
        |
        v
Default dataset + places / errors / summary datasets
````

***

### 📥 Input examples

#### Search hotels and scrape reviews

```json
{
  "searchQueries": ["New York City hotels"],
  "category": "hotels",
  "maxPlacesPerQuery": 5,
  "includeReviews": true,
  "maxReviewsPerPlace": 20,
  "maxConcurrency": 3,
  "outputMode": "reviews"
}
```

#### Scrape direct Tripadvisor URLs

```json
{
  "startUrls": [
    {
      "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html"
    }
  ],
  "includeReviews": true,
  "maxReviewsPerPlace": 50,
  "outputMode": "reviews"
}
```

#### Collect place details only

```json
{
  "searchQueries": ["restaurants in Paris"],
  "category": "restaurants",
  "maxPlacesPerQuery": 25,
  "includeReviews": false,
  "maxReviewsPerPlace": 0,
  "outputMode": "places"
}
```

#### Track recent negative reviews

```json
{
  "searchQueries": ["London hotels"],
  "category": "hotels",
  "maxPlacesPerQuery": 10,
  "includeReviews": true,
  "maxReviewsPerPlace": 100,
  "reviewRatings": ["1", "2"],
  "recentDays": 30,
  "outputMode": "reviews"
}
```

#### Export both places and reviews

```json
{
  "searchQueries": ["Rome restaurants", "Barcelona restaurants"],
  "category": "restaurants",
  "maxPlacesPerQuery": 3,
  "includeReviews": true,
  "maxReviewsPerPlace": 10,
  "outputMode": "both"
}
```

***

### 📋 Input schema

| Field | Type | Default | Description |
|---|---:|---|---|
| `searchQueries` | array | `["New York City hotels"]` when no input is provided | Keywords used to find Tripadvisor places. |
| `startUrls` | array | `[]` | Direct Tripadvisor hotel, restaurant, attraction, activity, or cruise review URLs. |
| `category` | string | `all` | `all`, `hotels`, `restaurants`, or `attractions`. In `all`, the Actor can infer obvious categories from the query. |
| `maxPlacesPerQuery` | integer | `20` | Maximum places to take from each search query. Range: `1` to `500`. |
| `includeReviews` | boolean | `true` | Fetch review pages for every discovered place. |
| `maxReviewsPerPlace` | integer | `50` | Maximum reviews per place. Set `0` to collect place details only. |
| `reviewRatings` | array | `[]` | Keep only selected ratings, for example `["1", "2"]` or `["4", "5"]`. |
| `recentDays` | integer | `0` | Keep only reviews from the last N days when an exact date is available. |
| `outputMode` | string | `reviews` | Default dataset content: `reviews`, `places`, or `both`. |
| `locale` | string | `en-US` | Tripadvisor locale used for search and page requests. |
| `proxyConfiguration` | object | Apify Residential Proxy | Proxy settings. Residential proxies are recommended for larger runs. |
| `maxConcurrency` | integer | `3` | Number of place pages fetched in parallel. Range: `1` to `10`. Use `1` for the cheapest/safest test run. |
| `requestDelayMs` | integer | `350` | Delay between requests in milliseconds. Increase for larger runs. |
| `maxRetries` | integer | `4` | Retry budget for blocked, timed out, or temporarily failed requests. |

***

### 📤 Output datasets

The Actor writes results to the default dataset and also creates helper datasets.

| Dataset | What it contains |
|---|---|
| Default dataset | Controlled by `outputMode`: reviews, places, or both. |
| `places` | One row per Tripadvisor place. Best for directories, lead enrichment, and maps. |
| `errors` | Failed URLs, unsupported URLs, search errors, or page fetch problems. |
| `summary` | Run totals, request stats, errors count, runtime, and client metrics. |

***

### 🧾 Review item schema

Every review row is enriched with place details so CSV and Excel exports are easy to analyze without joins.

| Field | Type | Description |
|---|---:|---|
| `itemType` | string | Always `review`. |
| `reviewId` | string | Tripadvisor review ID. |
| `reviewUrl` | string | Direct URL to the review. |
| `title` | string | Review title. |
| `text` | string | Full review text visible on the page. |
| `rating` | number | Review rating from `1` to `5`. |
| `publishedDateText` | string | Original date text from Tripadvisor. |
| `publishedDate` | string | Normalized date when possible, such as `2026-06-27` or `2025-07`. |
| `dateOfStay` | string | Date of stay, visit, or experience when visible. |
| `tripType` | string | Trip type such as `Family`, `Couples`, `Friends`, `Business`, or `Solo`. |
| `helpfulVotes` | integer | Helpful vote count when visible. |
| `photoCount` | integer | Number of photos attached to the review when visible. |
| `isMachineTranslated` | boolean | Whether Tripadvisor marks the review as machine translated. |
| `reviewerName` | string | Public reviewer display name. |
| `reviewerLocation` | string | Public reviewer location when visible. |
| `reviewerContributions` | integer | Public reviewer contribution count when visible. |
| `ownerResponseText` | string | Owner or management response text. |
| `ownerResponseDateText` | string | Owner response date text. |
| `ownerResponseAuthor` | string | Owner response author or role. |
| `placeName` | string | Name of the reviewed place. |
| `placeUrl` | string | Tripadvisor URL of the place. |
| `locationId` | integer | Tripadvisor location ID. |
| `parentGeoId` | integer | Tripadvisor parent geo ID. |
| `category` | string | `hotel`, `restaurant`, `attraction`, or `place`. |
| `placeRating` | number | Overall Tripadvisor place rating. |
| `placeReviewCount` | integer | Total Tripadvisor review count for the place. |
| `address` | string | Full address when available. |
| `city` | string | City. |
| `region` | string | Region or state. |
| `postalCode` | string | Postal code. |
| `country` | string | Country. |
| `latitude` | number | Latitude. |
| `longitude` | number | Longitude. |
| `phone` | string | Phone number. |
| `website` | string | Official website when listed. |
| `imageUrl` | string | Primary image URL. Rendered as an image preview in the Apify dataset table. |
| `thumbnailUrl` | string | Search thumbnail URL when available. |
| `searchQuery` | string | Source search query. |
| `snippet` | string | Search result snippet. |
| `mentionCount` | integer | Search mention count when available. |
| `source` | string | Discovery source, such as `search` or `startUrl`. |
| `sourceUrl` | string | URL used for the source page request. |
| `crawledAt` | string | ISO timestamp of the run. |

***

### 📍 Place item schema

| Field | Type | Description |
|---|---:|---|
| `itemType` | string | Always `place`. |
| `name` | string | Place name. |
| `category` | string | `hotel`, `restaurant`, `attraction`, or `place`. |
| `locationId` | integer | Tripadvisor location ID. |
| `parentGeoId` | integer | Tripadvisor parent geo ID. |
| `url` | string | Canonical Tripadvisor place URL. |
| `rating` | number | Overall place rating. |
| `reviewCount` | integer | Total review count. |
| `priceRange` | string | Price range when available. |
| `phone` | string | Phone number. |
| `website` | string | Official website when listed. |
| `address` | string | Full address. |
| `city` | string | City. |
| `region` | string | Region or state. |
| `postalCode` | string | Postal code. |
| `country` | string | Country. |
| `latitude` | number | Latitude. |
| `longitude` | number | Longitude. |
| `amenities` | array | Amenities when listed in structured data. |
| `imageUrl` | string | Primary image URL. Rendered as an image preview in the Apify dataset table. |
| `images` | array | Full image URL list from structured data. |
| `description` | string | Meta description or listing description. |
| `snippet` | string | Search result snippet. |
| `mentionCount` | integer | Search mention count when available. |
| `thumbnailUrl` | string | Search thumbnail URL. |
| `searchQuery` | string | Source search query. |
| `source` | string | Discovery source, such as `search` or `startUrl`. |
| `sourceUrl` | string | URL used for the source page request. |
| `crawledAt` | string | ISO timestamp of the run. |

***

### 🧪 Example output

#### Review row

```json
{
  "itemType": "review",
  "reviewId": "1065913654",
  "reviewUrl": "https://www.tripadvisor.com/ShowUserReviews-g187147-d12714552-r1065913654-Pizzeria_Arrivederci-Paris_Ile_de_France.html",
  "title": "Wonderful",
  "text": "The best pizza in Paris. Super thin and flavorful. Gorgeous ingredients, lovely atmosphere, and kind service. We will be back!",
  "rating": 5,
  "publishedDateText": "June 27, 2026",
  "publishedDate": "2026-06-27",
  "dateOfStay": "Jun 2026",
  "tripType": "Couples",
  "reviewerName": "Morgan D",
  "reviewerLocation": "Los Angeles, California",
  "placeName": "Pizzeria Arrivederci",
  "category": "restaurant",
  "placeRating": 4.9,
  "placeReviewCount": 6432,
  "city": "Paris",
  "country": "FR",
  "imageUrl": "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/31/36/7e/8e/the-best-pizza-in-paris.jpg?w=500&h=-1&s=1",
  "searchQuery": "Paris restaurants"
}
```

#### Place row

```json
{
  "itemType": "place",
  "name": "Pizzeria Arrivederci",
  "category": "restaurant",
  "locationId": 12714552,
  "parentGeoId": 187147,
  "url": "https://www.tripadvisor.com/Restaurant_Review-g187147-d12714552-Reviews-Pizzeria_Arrivederci-Paris_Ile_de_France.html",
  "rating": 4.9,
  "reviewCount": 6432,
  "priceRange": "$$ - $$$",
  "phone": "+33 1 77 32 45 57",
  "address": "47 rue Gay Lussac, Paris, Ile-de-France, 75005, FR",
  "city": "Paris",
  "region": "Ile-de-France",
  "postalCode": "75005",
  "country": "FR",
  "latitude": 48.84172,
  "longitude": 2.343511,
  "imageUrl": "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/31/36/7e/8e/the-best-pizza-in-paris.jpg?w=500&h=-1&s=1",
  "images": [
    "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/31/36/7e/8e/the-best-pizza-in-paris.jpg?w=500&h=-1&s=1"
  ],
  "searchQuery": "Paris restaurants"
}
```

***

### 🛡️ Request-based scraping, no browser

This Actor is built to be lightweight:

- **No Playwright / Puppeteer browser** - lower memory usage and cheaper runs
- **HTTP requests with browser-like TLS impersonation** - the request layer behaves closer to a real browser connection
- **Session warm-up before scraping** - helps obtain the cookies needed for Tripadvisor pages
- **Retries with session refresh** - temporary blocks and network failures are retried
- **Parallel place fetching** - `maxConcurrency` speeds up multi-place runs while keeping retries and proxy sessions isolated
- **Residential proxy support** - recommended for bigger jobs and more stable production runs
- **Polite request delay** - configurable via `requestDelayMs`

Tripadvisor can still apply traffic protection or change its page layout. For large runs, keep proxies enabled, start with a small sample, and increase limits gradually.

***

### 💼 Use cases

- 📈 **Reputation monitoring** for hotels, restaurants, attractions, and local businesses
- 🎯 **Lead generation** for travel, hospitality, restaurants, agencies, and tourism products
- 📊 **Competitor analysis** by review volume, rating, owner replies, and guest complaints
- 🤖 **Sentiment analysis** and AI pipelines using review text and rating filters
- 🌍 **Travel directory enrichment** with addresses, websites, coordinates, images, and categories
- 🔔 **Negative review alerts** with `reviewRatings` and `recentDays`
- 🧾 **Market research** across cities, categories, and specific Tripadvisor places
- 🔌 **Automation workflows** with Apify integrations, webhooks, Google Sheets, Make, Zapier, and n8n

***

### 💰 Cost notes

This Actor is designed to be cheaper than browser-based scrapers because it does not run a headless browser. Your final cost depends on:

- number of search queries
- `maxPlacesPerQuery`
- `maxReviewsPerPlace`
- proxy configuration
- `maxConcurrency`
- request delay and retries
- selected Apify plan and Actor pricing settings

For a quick test, use `maxPlacesPerQuery: 1`, `maxReviewsPerPlace: 3`, and `maxConcurrency: 1`. For production, increase limits gradually.

***

### ❓ FAQ

**Q: Do I need a Tripadvisor API key?**\
No. The Actor extracts publicly visible Tripadvisor data from the website.

**Q: Can I scrape only places without reviews?**\
Yes. Set `includeReviews` to `false`, `maxReviewsPerPlace` to `0`, and `outputMode` to `places`.

**Q: Can I scrape direct Tripadvisor URLs?**\
Yes. Add direct URLs to `startUrls`. You can combine `startUrls` with `searchQueries` in one run.

**Q: Can I filter by star rating?**\
Yes. Use `reviewRatings`, for example `["1", "2"]` for negative reviews or `["4", "5"]` for positive reviews.

**Q: Can I filter recent reviews?**\
Yes. Use `recentDays`. Exact daily filtering is applied when Tripadvisor exposes an exact review date. Month-only dates are kept because the exact day is not available.

**Q: Why are some fields missing from some rows?**\
Tripadvisor does not expose every field on every listing or review card. Empty values are omitted to keep the output clean.

**Q: Why are there both `imageUrl` and `images`?**\
`imageUrl` is the primary image and is shown directly in the Apify dataset table. `images` is the full image URL array for users who need all available images.

**Q: What proxy should I use?**\
Residential proxies are recommended for larger runs. The default input already uses Apify Residential Proxy.

**Q: Can I export to CSV or Excel?**\
Yes. Apify datasets can be exported to JSON, CSV, Excel, XML, RSS, and HTML. You can also access results with the Apify API.

**Q: What happens if a page fails?**\
Failed URLs or search errors are saved to the `errors` helper dataset. The `summary` dataset also reports totals and failure counts.

***

### 🛠️ Run locally

```bash
pip install -r requirements.txt
apify run
```

Deploy to Apify:

```bash
apify push
```

***

### 🏷️ Tags

`tripadvisor scraper` · `tripadvisor reviews` · `tripadvisor api` · `hotel reviews scraper` · `restaurant reviews scraper` · `travel data scraper` · `tourism data` · `review monitoring` · `sentiment analysis` · `hospitality analytics` · `attraction scraper` · `places scraper` · `restaurant data` · `hotel data` · `tripadvisor dataset` · `apify tripadvisor` · `travel lead generation` · `reviews api` · `web scraping`

***

### 🧑‍💻 Support and feature requests

If you find a bug, a page type that is not covered yet, or a field you want added, open an issue on the Actor page and include:

- the Tripadvisor URL or search query
- what you expected to get
- what was missing or incorrect
- a small sample of your run input if possible

Feature requests are welcome. If Tripadvisor exposes the data publicly, it can usually be added.

***

🔗 **Built for [Apify](https://apify.com)** · Request-based · No browser · Search + direct URLs · Reviews + places · Image previews

# Actor input Schema

## `searchQueries` (type: `array`):

Find Tripadvisor places by keyword. Good examples: New York City hotels, Paris restaurants, London attractions, Eiffel Tower.

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

Paste direct Tripadvisor hotel, restaurant, attraction, activity, or cruise review URLs. Leave empty if you want to use search queries only.

## `category` (type: `string`):

Limit search results to a specific type. Choose Auto / all to let the Actor infer hotels, restaurants, or attractions from your query when possible.

## `maxPlacesPerQuery` (type: `integer`):

How many places to take from each search query. Start small for testing, then increase when the output looks right.

## `includeReviews` (type: `boolean`):

When enabled, the Actor fetches review pages for every discovered place.

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

Maximum number of reviews to scrape from each place. Set 0 to collect place details only.

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

Return only selected star ratings. Leave empty to collect all ratings.

## `recentDays` (type: `integer`):

Return only reviews published in the last N days when Tripadvisor provides an exact date. Set 0 to disable this filter.

## `outputMode` (type: `string`):

Reviews only is best for monitoring. Places only is best for lead enrichment. Places and reviews is best for audits and QA.

## `locale` (type: `string`):

Tripadvisor locale used for search and page requests.

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

Residential proxies are recommended for larger Tripadvisor runs.

## `maxConcurrency` (type: `integer`):

How many Tripadvisor place pages can be fetched in parallel. Increase carefully for larger runs; lower it if the site starts blocking requests.

## `requestDelayMs` (type: `integer`):

Delay between requests in milliseconds. Increase this for larger or more sensitive runs.

## `maxRetries` (type: `integer`):

Retry budget for blocked, timed out, or temporarily failed requests.

## Actor input object example

```json
{
  "searchQueries": [
    "New York City hotels"
  ],
  "category": "hotels",
  "maxPlacesPerQuery": 1,
  "includeReviews": true,
  "maxReviewsPerPlace": 3,
  "reviewRatings": [],
  "recentDays": 0,
  "outputMode": "reviews",
  "locale": "en-US",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "maxConcurrency": 1,
  "requestDelayMs": 100,
  "maxRetries": 4
}
```

# 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 = {
    "searchQueries": [
        "New York City hotels"
    ],
    "category": "hotels",
    "maxPlacesPerQuery": 1,
    "includeReviews": true,
    "maxReviewsPerPlace": 3,
    "outputMode": "reviews",
    "maxConcurrency": 1,
    "requestDelayMs": 100,
    "maxRetries": 4
};

// Run the Actor and wait for it to finish
const run = await client.actor("trakk/tripadvisor-reviews-places-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 = {
    "searchQueries": ["New York City hotels"],
    "category": "hotels",
    "maxPlacesPerQuery": 1,
    "includeReviews": True,
    "maxReviewsPerPlace": 3,
    "outputMode": "reviews",
    "maxConcurrency": 1,
    "requestDelayMs": 100,
    "maxRetries": 4,
}

# Run the Actor and wait for it to finish
run = client.actor("trakk/tripadvisor-reviews-places-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "New York City hotels"
  ],
  "category": "hotels",
  "maxPlacesPerQuery": 1,
  "includeReviews": true,
  "maxReviewsPerPlace": 3,
  "outputMode": "reviews",
  "maxConcurrency": 1,
  "requestDelayMs": 100,
  "maxRetries": 4
}' |
apify call trakk/tripadvisor-reviews-places-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=trakk/tripadvisor-reviews-places-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Tripadvisor Reviews, Places & Photos Scraper",
        "description": "Scrape Tripadvisor reviews and place data from search keywords or direct URLs. Extract ratings, review text, dates, owner replies, addresses, phones, websites, coordinates, images, and search metadata for hotels, restaurants, attractions, and tours.",
        "version": "0.1",
        "x-build-id": "KdLniSKq4QPFf9PE3"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/trakk~tripadvisor-reviews-places-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-trakk-tripadvisor-reviews-places-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/trakk~tripadvisor-reviews-places-scraper/runs": {
            "post": {
                "operationId": "runs-sync-trakk-tripadvisor-reviews-places-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/trakk~tripadvisor-reviews-places-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-trakk-tripadvisor-reviews-places-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQueries": {
                        "title": "🔍 Search queries",
                        "type": "array",
                        "description": "Find Tripadvisor places by keyword. Good examples: New York City hotels, Paris restaurants, London attractions, Eiffel Tower.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "🔗 Direct Tripadvisor URLs",
                        "type": "array",
                        "description": "Paste direct Tripadvisor hotel, restaurant, attraction, activity, or cruise review URLs. Leave empty if you want to use search queries only.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "category": {
                        "title": "🏷️ Place type",
                        "enum": [
                            "all",
                            "hotels",
                            "restaurants",
                            "attractions"
                        ],
                        "type": "string",
                        "description": "Limit search results to a specific type. Choose Auto / all to let the Actor infer hotels, restaurants, or attractions from your query when possible.",
                        "default": "all"
                    },
                    "maxPlacesPerQuery": {
                        "title": "📍 Max places per search query",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "How many places to take from each search query. Start small for testing, then increase when the output looks right.",
                        "default": 20
                    },
                    "includeReviews": {
                        "title": "⭐ Scrape reviews",
                        "type": "boolean",
                        "description": "When enabled, the Actor fetches review pages for every discovered place.",
                        "default": true
                    },
                    "maxReviewsPerPlace": {
                        "title": "🧾 Max reviews per place",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of reviews to scrape from each place. Set 0 to collect place details only.",
                        "default": 50
                    },
                    "reviewRatings": {
                        "title": "🌟 Review rating filter",
                        "type": "array",
                        "description": "Return only selected star ratings. Leave empty to collect all ratings.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "1",
                                "2",
                                "3",
                                "4",
                                "5"
                            ],
                            "enumTitles": [
                                "⭐ 1 star",
                                "⭐⭐ 2 stars",
                                "⭐⭐⭐ 3 stars",
                                "⭐⭐⭐⭐ 4 stars",
                                "⭐⭐⭐⭐⭐ 5 stars"
                            ]
                        },
                        "default": []
                    },
                    "recentDays": {
                        "title": "🕒 Only recent reviews",
                        "minimum": 0,
                        "maximum": 3650,
                        "type": "integer",
                        "description": "Return only reviews published in the last N days when Tripadvisor provides an exact date. Set 0 to disable this filter.",
                        "default": 0
                    },
                    "outputMode": {
                        "title": "📦 Default dataset content",
                        "enum": [
                            "reviews",
                            "places",
                            "both"
                        ],
                        "type": "string",
                        "description": "Reviews only is best for monitoring. Places only is best for lead enrichment. Places and reviews is best for audits and QA.",
                        "default": "reviews"
                    },
                    "locale": {
                        "title": "🌍 Locale",
                        "enum": [
                            "en-US",
                            "en-GB",
                            "fr-FR",
                            "de-DE",
                            "es-ES",
                            "it-IT",
                            "pt-BR",
                            "nl-NL",
                            "ja-JP"
                        ],
                        "type": "string",
                        "description": "Tripadvisor locale used for search and page requests.",
                        "default": "en-US"
                    },
                    "proxyConfiguration": {
                        "title": "🛡️ Proxy configuration",
                        "type": "object",
                        "description": "Residential proxies are recommended for larger Tripadvisor runs.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    },
                    "maxConcurrency": {
                        "title": "⚡ Max concurrency",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "How many Tripadvisor place pages can be fetched in parallel. Increase carefully for larger runs; lower it if the site starts blocking requests.",
                        "default": 3
                    },
                    "requestDelayMs": {
                        "title": "⏱️ Request delay",
                        "minimum": 0,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Delay between requests in milliseconds. Increase this for larger or more sensitive runs.",
                        "default": 350
                    },
                    "maxRetries": {
                        "title": "🔁 Max retries",
                        "minimum": 0,
                        "maximum": 12,
                        "type": "integer",
                        "description": "Retry budget for blocked, timed out, or temporarily failed requests.",
                        "default": 4
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
