# TripAdvisor Reviews Scraper (`xtracto/tripadvisor-reviews-scraper`) Actor

Pull every traveller review for a TripAdvisor hotel, restaurant, or attraction — title, full text, rating, trip date, trip type, owner response. Designed for reputation analytics, sentiment scoring, and AI travel corpora.

- **URL**: https://apify.com/xtracto/tripadvisor-reviews-scraper.md
- **Developed by:** [Xtractoo](https://apify.com/xtracto) (community)
- **Categories:** Travel, Lead generation
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.40 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/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 Scraper

Pull every traveller review for a TripAdvisor hotel, restaurant, or attraction — title, full text, star rating, trip date, trip type, owner response — into clean structured JSON.

Whether you run a hotel and want to track guest sentiment, build a "what guests are saying" widget for your travel site, or compile a high-quality review corpus for AI / sentiment models, this actor delivers the reviews without managing scrapers, browsers, or CAPTCHAs.

---

### What you can do with it

- **Reputation analytics** — monitor your property's rating distribution, review velocity, and themes over time.
- **Competitive benchmarking** — pull every review for a rival's listing and compare side-by-side.
- **Owner-response audits** — see how often the property responds and how guests react.
- **Sentiment / topic modelling** — feed thousands of real reviews into your NLP pipeline.
- **Travel content & comparison sites** — surface real guest quotes on your pages, with proper attribution.
- **Lead generation** — find under-served properties that don't respond to negative reviews.

---

### Why use this actor

- **No TripAdvisor login required** — runs entirely on public data.
- **No CAPTCHAs to solve** — automatic retry across residential exit IPs.
- **Hotels, restaurants, and attractions** — one schema for all three entity types.
- **Owner responses preserved** — included by default; toggle off if you don't need them.
- **Language filter** — restrict to English / Spanish / Indonesian / any 2-letter language code, or pull all.
- **Stable JSON schema** — fixed fields ready to feed straight into your warehouse or notebook.

---

### How it works

1. You give the actor one or more TripAdvisor URLs (any of `Hotel_Review-`, `Restaurant_Review-`, or `Attraction_Review-`).
2. For each URL, the actor walks the paginated reviews — 10 reviews per page — until your `max_reviews_per_place` cap is hit or all reviews are exhausted.
3. Each review is normalized to one row in the dataset with consistent fields.

Pagination, retries, and proxy rotation are handled automatically.

---

### Input

```json
{
  "place_urls": [
    "https://www.tripadvisor.com/Hotel_Review-g297700-d502077-Reviews-Grand_Mercure_Bali_Seminyak-Seminyak_Kuta_District_Bali.html"
  ],
  "max_reviews_per_place": 100,
  "language": "en",
  "include_owner_responses": true,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
````

| Field | Type | Required | Description |
|---|---|---|---|
| `place_urls` | string\[] | yes | TripAdvisor `Hotel_Review-` / `Restaurant_Review-` / `Attraction_Review-` URLs |
| `max_reviews_per_place` | integer | no | Cap per place (default 100, max 10000) |
| `language` | string | no | 2-letter language filter (`en`, `fr`, `id`, ...). Leave blank for all languages. Default `en`. |
| `include_owner_responses` | boolean | no | Include owner replies (default `true`) |
| `max_concurrency` | integer | no | Parallel in-flight requests (1–4, default 1) |
| `proxy` | object | no | Apify proxy configuration; residential strongly recommended |

***

### Sample output

One record per review. Real shape of a single record:

```json
{
  "place_url": "https://www.tripadvisor.com/Hotel_Review-g297700-d502077-Reviews-Grand_Mercure_Bali_Seminyak-Seminyak_Kuta_District_Bali.html",
  "place_name": "Grand Mercure Bali Seminyak",
  "place_rating": 4.8,
  "place_review_count": 1726,
  "place_type": "Hotel",
  "location_id": "502077",
  "geo_id": "297700",
  "id": "987654321",
  "title": "Perfect family stay",
  "text": "We spent ten nights here in March. The staff were attentive, the pool spotless, breakfast spread enormous. The kids' club kept our two boys occupied while we relaxed by the infinity pool. Will definitely return.",
  "rating": 5,
  "published_date": "2025-04-02",
  "trip_date": "March 2025",
  "trip_type": "FAMILY",
  "language": "en",
  "author_name": "MartaW123",
  "author_location": "Madrid, Spain",
  "author_url": "https://www.tripadvisor.com/Profile/MartaW123",
  "owner_response": "Dear Marta, thank you so much for your kind words — we are delighted that your family had such a memorable stay and look forward to welcoming you back.",
  "owner_response_date": "2025-04-04",
  "review_url": "https://www.tripadvisor.com/ShowUserReviews-g297700-d502077-r987654321-Grand_Mercure_Bali_Seminyak.html"
}
```

***

### Output schema

| Field | Type | Description |
|---|---|---|
| `place_url` | string | Input URL the review came from |
| `place_name` | string | Hotel / restaurant / attraction name |
| `place_rating` | number | Overall TripAdvisor rating for the place (0–5) |
| `place_review_count` | integer | Total reviews TripAdvisor lists for the place |
| `place_type` | string | `Hotel`, `Restaurant`, `TouristAttraction`, etc. |
| `location_id` | string | TripAdvisor's internal `d<id>` |
| `geo_id` | string | Parent `g<id>` (city / region) |
| `id` | string | TripAdvisor review ID |
| `title` | string | Review headline |
| `text` | string | Full review body |
| `rating` | number | Reviewer's star rating (1–5) |
| `published_date` | string | ISO date the review was published |
| `trip_date` | string | "March 2025" — when the trip occurred |
| `trip_type` | string | `FAMILY` / `COUPLES` / `BUSINESS` / `SOLO` / `FRIENDS` |
| `language` | string | ISO 639-1 code of the original review language |
| `author_name` | string | Reviewer's display name |
| `author_location` | string | Reviewer's hometown when shown |
| `author_url` | string | Link to reviewer's TripAdvisor profile |
| `owner_response` | string | Property owner's reply text (when present) |
| `owner_response_date` | string | ISO date of the owner's reply |
| `review_url` | string | Canonical URL of the review |

***

### Tips

- TripAdvisor renders 10 reviews per page; high values for `max_reviews_per_place` will trigger many requests. For places with thousands of reviews, sharding across multiple actor runs is advisable.
- Pair with the [TripAdvisor Scraper](https://apify.com/xtracto/tripadvisor-scraper) to first discover places in a destination, then feed the resulting `url` values back into this actor for full review extraction.
- Language filter is enforced by TripAdvisor server-side via `?filterLang=`; if you need every language, leave the field blank.
- DataDome is aggressive on TripAdvisor — always use the residential proxy default; the actor will retry across up to 5 fresh exit IPs before failing.

# Actor input Schema

## `place_urls` (type: `array`):

Full TripAdvisor URLs. Accepts Hotel\_Review-, Restaurant\_Review-, and Attraction\_Review- pages. The actor handles pagination automatically.

## `max_reviews_per_place` (type: `integer`):

Hard cap on reviews to pull for each place. TripAdvisor returns 10 reviews per page; the actor paginates until this cap is reached or all reviews are exhausted.

## `language` (type: `string`):

Two-letter language code to filter reviews by (e.g. en, fr, de, id). Leave blank to include all languages.

## `include_owner_responses` (type: `boolean`):

If enabled (default), each review includes the property owner's response when present.

## `max_concurrency` (type: `integer`):

Parallel in-flight requests (1-4). TripAdvisor pages are heavy; keep this low to avoid DataDome heat.

## `proxy` (type: `object`):

Apify proxy configuration. Residential is strongly recommended — DataDome aggressively blocks datacenter IPs on TripAdvisor.

## Actor input object example

```json
{
  "place_urls": [
    "https://www.tripadvisor.com/Hotel_Review-g297700-d502077-Reviews-Grand_Mercure_Bali_Seminyak-Seminyak_Kuta_District_Bali.html"
  ],
  "max_reviews_per_place": 50,
  "language": "en",
  "include_owner_responses": true,
  "max_concurrency": 1,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "place_urls": [
        "https://www.tripadvisor.com/Hotel_Review-g297700-d502077-Reviews-Grand_Mercure_Bali_Seminyak-Seminyak_Kuta_District_Bali.html"
    ],
    "max_reviews_per_place": 50,
    "language": "en",
    "include_owner_responses": true,
    "max_concurrency": 1,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("xtracto/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 = {
    "place_urls": ["https://www.tripadvisor.com/Hotel_Review-g297700-d502077-Reviews-Grand_Mercure_Bali_Seminyak-Seminyak_Kuta_District_Bali.html"],
    "max_reviews_per_place": 50,
    "language": "en",
    "include_owner_responses": True,
    "max_concurrency": 1,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("xtracto/tripadvisor-reviews-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 '{
  "place_urls": [
    "https://www.tripadvisor.com/Hotel_Review-g297700-d502077-Reviews-Grand_Mercure_Bali_Seminyak-Seminyak_Kuta_District_Bali.html"
  ],
  "max_reviews_per_place": 50,
  "language": "en",
  "include_owner_responses": true,
  "max_concurrency": 1,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call xtracto/tripadvisor-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "TripAdvisor Reviews Scraper",
        "description": "Pull every traveller review for a TripAdvisor hotel, restaurant, or attraction — title, full text, rating, trip date, trip type, owner response. Designed for reputation analytics, sentiment scoring, and AI travel corpora.",
        "version": "0.1",
        "x-build-id": "GDRmaOM4Y7IcV5i9h"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/xtracto~tripadvisor-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-xtracto-tripadvisor-reviews-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/xtracto~tripadvisor-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-xtracto-tripadvisor-reviews-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/xtracto~tripadvisor-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-xtracto-tripadvisor-reviews-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": {
                    "place_urls": {
                        "title": "Place URLs",
                        "type": "array",
                        "description": "Full TripAdvisor URLs. Accepts Hotel_Review-, Restaurant_Review-, and Attraction_Review- pages. The actor handles pagination automatically.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "max_reviews_per_place": {
                        "title": "Max reviews per place",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Hard cap on reviews to pull for each place. TripAdvisor returns 10 reviews per page; the actor paginates until this cap is reached or all reviews are exhausted.",
                        "default": 100
                    },
                    "language": {
                        "title": "Language filter",
                        "type": "string",
                        "description": "Two-letter language code to filter reviews by (e.g. en, fr, de, id). Leave blank to include all languages.",
                        "default": "en"
                    },
                    "include_owner_responses": {
                        "title": "Include owner responses",
                        "type": "boolean",
                        "description": "If enabled (default), each review includes the property owner's response when present.",
                        "default": true
                    },
                    "max_concurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 4,
                        "type": "integer",
                        "description": "Parallel in-flight requests (1-4). TripAdvisor pages are heavy; keep this low to avoid DataDome heat.",
                        "default": 1
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify proxy configuration. Residential is strongly recommended — DataDome aggressively blocks datacenter IPs on TripAdvisor.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
