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

Scrape Tripadvisor hotel, restaurant and attraction reviews at $0.25 per 1,000 - the lowest per-review price of any established Tripadvisor review scraper on Apify. Rating, title, full text, reviewer, hometown, trip type, owner reply and review URL. No browser, no residential proxy.

- **URL**: https://apify.com/dami\_studio/tripadvisor-reviews-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** Travel, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.25 / 1,000 reviews

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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

Give it a Tripadvisor hotel, restaurant or attraction URL and it returns the public reviews as
structured rows: star rating, title, full review text, reviewer name and hometown, trip date and
trip type, the owner's reply, and a direct link to the review on Tripadvisor.

No browser and no residential proxy, so it is fast and cheap. Plain HTTP requests, about 10-15
reviews per request.

**$0.25 per 1,000 reviews** ($0.00025 each), plus $0.001 each time a run starts — the lowest
per-review price of any Tripadvisor reviews scraper on the Apify Store with an active user base. The
next cheapest, `maxcopell/tripadvisor-reviews` (506 monthly users), is $0.30 per 1,000 even on its
cheapest volume tier.

### What you get

One row per review. The coverage column below is measured on a single real run of 100 reviews
pulled from four places at once - The Empire Hotel in New York, a restaurant, the Empire State
Building, and a London hotel. These are counts from that run, not estimates.

| Field | Coverage | Example |
|---|---|---|
| `reviewId` | 100% | `1072411899` |
| `reviewUrl` | 100% | `https://www.tripadvisor.com/ShowUserReviews-g60763-d671150-r1072411899-...` |
| `rating` | 100% | `4` |
| `title` | 100% | `Clean but Needs Remodeling` |
| `reviewText` | 100% | 365 characters on average |
| `publishedAt` | 100% | `2026-08-10` |
| `createdAt` | 100% | `2026-08-09` |
| `tripDate` | 99% | `2026-08-31` |
| `tripType` | 99% | `FAMILY`, `COUPLES`, `SOLO`, `FRIENDS`, `BUSINESS` |
| `language` | 100% | `en`, `fr`, `it`, `es` |
| `helpfulVotes` | 100% present, `0` on most reviews | `2` |
| `reviewerName` | 100% | `amahmoud` |
| `reviewerId` | 100% | `51BDB06A78983782F6571787209484D5` |
| `reviewerProfileUrl` | 100% | `https://www.tripadvisor.com/Profile/amahmoud` |
| `reviewerContributions` | 100% | `65` |
| `reviewerHometown` | 42% | `Seattle, Washington` |
| `ownerResponseText` | 53% | the management reply, full text |
| `ownerResponseAt` | 53% | `2026-08-08` |
| `placeId` | 100% | `671150` |
| `placeName` | 100% | `The Empire Hotel` |
| `placeUrl` | 100% | the URL you supplied |
| `placeType` | 100% | `ACCOMMODATION`, `EATERY`, `ATTRACTION`, `ACTIVITY` |
| `placeRating` | 100% | `3.7` |
| `placeReviewCount` | 100% | `9795` |
| `scrapedAt` | 100% | ISO timestamp |

`reviewerHometown` and `ownerResponseText` are below 100% because Tripadvisor genuinely does not
have them for every review - reviewers can leave the hometown blank, and most reviews get no
management reply. Every other column was populated on all 100 rows.

### Input

```json
{
  "placeUrls": [
    "https://www.tripadvisor.com/Hotel_Review-g60763-d671150-Reviews-The_Empire_Hotel-New_York_City_New_York.html"
  ],
  "maxReviewsPerPlace": 40
}
```

- `placeUrls` - hotel, restaurant or attraction review URLs. A bare slug works too. Country
  domains (`.co.uk`, `.fr`, `.it`, ...) work and return that domain's review set.
- `maxReviewsPerPlace` - newest first. Up to 5000.
- `maxPlaces` - safety bound on how many URLs one run processes.
- `proxyConfiguration` - optional. Leave it empty; the run uses Apify's shared datacenter proxy,
  which costs nothing on top of the run.

Leave `placeUrls` empty and you get one clearly labelled sample row, free. A run with empty input
was measured charging exactly zero review events.

### Pricing

$0.25 per 1,000 reviews, plus a $0.001 run start fee. You are charged once per review row actually
stored - a 100-review run was measured charging exactly 100 events. Sample rows and diagnostic
rows are never charged, and a bad URL costs you nothing.

Resolved live on 2026-08-10: every other Tripadvisor review scraper on Apify with an active user
base charges between $0.30 and $0.70 per 1,000 reviews. $0.30/1,000 is the lowest volume tier any of
them offers — `maxcopell/tripadvisor-reviews`, at 506 monthly users — and most customers sit on
higher tiers than that. Nothing in the category is below this actor's $0.25.

### How deep can it go

Verified on The Empire Hotel, which has 8,923 reviews: page requests worked all the way to offset
8,920 with no rate limiting and no cap. Hotels and attractions serve 10 reviews per page,
restaurants serve 15; the actor works this out from the first page rather than assuming.

### What this does not do

- **No review photos.** Tripadvisor's review list returns an empty photo array on every review, so
  there is no photo column rather than a column that is always empty. Photos need a different
  query that this actor does not make.
- **No place search.** You supply the place URL; it does not find places by name or by city.
- **No sort or language filter options.** Reviews come back in Tripadvisor's default order, newest
  first. Options that were not verified to change results are not exposed.
- **Attraction pages return the attraction's product reviews.** For a big attraction, Tripadvisor's
  own review list is largely reviews of the bookable tickets and tours attached to it. Each row
  carries the `placeName`, `placeId` and `placeType` of what was actually reviewed, so you can tell
  them apart.
- **Vacation rental pages are not supported** and return an uncharged diagnostic row.
- **No private or removed reviews** - only what a logged-out visitor can see.

### FAQ

**How do I scrape Tripadvisor reviews without getting blocked?**
Tripadvisor blocks on the TLS fingerprint of the client, not on the IP address. A plain Node
`fetch` gets a 778-byte 403 from every address. This actor sends a genuine mobile-Safari
fingerprint over plain HTTP, which Tripadvisor answers with the full page. No headless browser is
involved.

**Does it need a residential proxy?**
No. It uses Apify's shared datacenter proxy, which adds nothing to the run cost. Residential
proxies would add roughly $0.008 per page at $8/GB, since each review page is about 1 MB.

**Can I scrape all reviews for a hotel?**
Yes. Set `maxReviewsPerPlace` up to 5000. Deep pagination was tested to offset 8,920 on a hotel
with 8,923 reviews.

**Does it work for restaurants and attractions too?**
Yes, and for Tripadvisor's country domains. Hotels, restaurants, attractions and activities were
all covered in the same 100-review test run.

**How much does 1,000 reviews cost?**
$0.25, plus the $0.001 start fee, so $0.251.

**What happens if a place has no reviews, or the URL is wrong?**
You get a single uncharged diagnostic row saying which it was. You are never charged for a run
that returned no reviews.

**Can I get the reviewer's email?**
No. Tripadvisor does not publish reviewer emails and this actor does not attempt to guess them.

# Actor input Schema

## `placeUrls` (type: `array`):

Tripadvisor hotel, restaurant or attraction review URLs. A bare slug such as Hotel\_Review-g60763-d671150-Reviews-The\_Empire\_Hotel-New\_York\_City\_New\_York.html also works. Country domains (.co.uk, .fr, ...) are accepted. Leave empty to get one free, clearly labelled sample row.

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

How many reviews to return for each place, newest first. Tripadvisor serves 10 per page, so this rounds up to the next page. Only stored review rows are charged.

## `maxPlaces` (type: `integer`):

Safety bound on how many of the supplied URLs are processed in one run.

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

Optional. By default the run uses Apify's shared datacenter proxy, which costs nothing extra and is enough for Tripadvisor. To use your own network, put its addresses in Proxy URLs - they are used exactly as given. Metered Apify groups (Residential, Google SERP) are not offered: if one is selected it is replaced with the datacenter group and the run log says so.

## Actor input object example

```json
{
  "placeUrls": [
    "https://www.tripadvisor.com/Hotel_Review-g60763-d671150-Reviews-The_Empire_Hotel-New_York_City_New_York.html"
  ],
  "maxReviewsPerPlace": 20,
  "maxPlaces": 10
}
```

# Actor output Schema

## `dataset` (type: `string`):

One row per public Tripadvisor review. Uncharged sample and diagnostic rows are marked with \_sample or \_diagnostic.

# 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 = {
    "placeUrls": [
        "https://www.tripadvisor.com/Hotel_Review-g60763-d671150-Reviews-The_Empire_Hotel-New_York_City_New_York.html"
    ],
    "maxReviewsPerPlace": 20,
    "maxPlaces": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/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 = {
    "placeUrls": ["https://www.tripadvisor.com/Hotel_Review-g60763-d671150-Reviews-The_Empire_Hotel-New_York_City_New_York.html"],
    "maxReviewsPerPlace": 20,
    "maxPlaces": 10,
}

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

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

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

```

## CLI example

```bash
echo '{
  "placeUrls": [
    "https://www.tripadvisor.com/Hotel_Review-g60763-d671150-Reviews-The_Empire_Hotel-New_York_City_New_York.html"
  ],
  "maxReviewsPerPlace": 20,
  "maxPlaces": 10
}' |
apify call dami_studio/tripadvisor-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/iAe0sYVAQ51YF1N3u/builds/f22Kdv1TwImygQYVk/openapi.json
