# Tripadvisor Scraper API - Reviews, Hotels, Restaurants & Search (`santhej/tripadvisor-scraper-pro`) Actor

Scrape Tripadvisor at scale: reviews, hotels, restaurants, attractions. Two modes — paste a URL to extract reviews, or search by keyword + location to discover places (with optional reviews). Rating distribution, sub-ratings, owner responses, photos. Enterprise infrastructure. No login.

- **URL**: https://apify.com/santhej/tripadvisor-scraper-pro.md
- **Developed by:** [Santhej Kallada](https://apify.com/santhej) (community)
- **Categories:** Real estate, Travel, MCP servers
- **Features:** Limited permissions
- **Stats:** 8 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 place returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Tripadvisor Scraper API — Reviews, Hotels, Restaurants & Search

**Scrape Tripadvisor at scale. Reviews, hotels, restaurants, attractions, and vacation rentals — all from one actor.**

Two modes in a single tool. Paste a Tripadvisor URL to extract all reviews, or search by keyword + location to discover places (optionally with their reviews bundled). Returns rating distribution, sub-ratings, owner responses, photos, reviewer profiles, and structured place metadata. Built on enterprise-grade infrastructure — no login, no anti-bot breakage, no permission prompts.

***

### Why this Tripadvisor scraper

| | This actor | Other Tripadvisor scrapers |
|---|---|---|
| Price | **$0.30 / 1,000 reviews** | $0.50–$5.00 / 1,000 reviews |
| Reliability | Structured data feed | HTML scraping (breaks on layout changes) |
| Search + Reviews combo | ✅ One actor, both modes | ❌ Usually split across two actors |
| Account permissions | None required | Some require full account access |
| Rating distribution (1–5★ histogram) | ✅ Included | ❌ Rarely surfaced |
| Sub-ratings (cleanliness, service, etc.) | ✅ When Tripadvisor exposes them | ✅/❌ Inconsistent across all scrapers |
| Owner responses | ✅ Full text + role + date | ✅/❌ |

**Direct comparison vs popular alternatives on Apify:**

- **maxcopell/tripadvisor-reviews** — $5/1K free tier (drops to $0.30/1K on Diamond), requires "full account access" permission
- **api-ninja/tripadvisor-reviews-scraper** — $0.50/1K, no search-mode bundle
- **thewolves/tripadvisor-reviews-scraper** — $0.50/1K, but observed 100% silent failure (`{noResults: true}`) on a real test

This actor is **flat $0.30/1K reviews, no tiers, no friction.**

***

### What it can scrape

- ⭐ **Reviews** — full text, title, rating, sub-ratings, language, owner responses, photos
- 🏨 **Hotels** — listings, ratings, review counts, location, rating distribution
- 🍽️ **Restaurants** — same metadata, plus categories
- 🎢 **Attractions, tours, things to do**
- 🏖️ **Vacation rentals**
- 👤 **Reviewer profiles** — name, location, avatar, contribution count
- 💬 **Owner / management responses** — text, role, language, date

***

### Two modes

#### Mode A — Reviews from URLs

Paste one or more Tripadvisor place URLs. The actor extracts all reviews up to `maxReviewsPerPlace`.

```json
{
  "urls": [
    "https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html"
  ],
  "maxReviewsPerPlace": 50,
  "priority": "high"
}
```

#### Mode B — Search + (optional) reviews

Discover places by keyword + location. Optionally pull reviews for each found place in the same run.

```json
{
  "searchQuery": "italian restaurants",
  "locationName": "New York,New York,United States",
  "maxPlaces": 20,
  "includeReviewsForSearchedPlaces": true,
  "maxReviewsPerPlace": 50,
  "priority": "high"
}
```

The actor auto-detects the mode from the input — provide `urls` OR `searchQuery`, not both.

***

### Use cases

- Track competitor reviews for hotels, restaurants, attractions
- Build a custom Tripadvisor reviews dataset for NLP / sentiment analysis
- Hospitality brand monitoring (owner responses, recurring complaints)
- Lead-gen: extract reviewer locations, contact-able profiles
- Travel content aggregation
- Reputation management dashboards
- Market research for hospitality and tourism
- Sentiment trend analysis by season, traveler type, language

***

### Pricing

Pay-per-event. No subscription, no minimums.

| Event | Price | When charged |
|---|---|---|
| Actor start | **$0.005** | Once per run |
| Place returned | **$0.003** | Each Tripadvisor place returned (search mode) |
| Review returned | **$0.0003** | Each review extracted ($0.30 per 1,000) |

**Cost examples:**

| Run | Cost |
|---|---|
| 1 hotel URL, 50 reviews | $0.005 + 50 × $0.0003 = **$0.020** |
| 1 URL, 500 reviews | $0.005 + 500 × $0.0003 = **$0.155** |
| Search "hotels NYC", 20 places (no reviews) | $0.005 + 20 × $0.003 = **$0.065** |
| Search 20 places + 50 reviews each | $0.005 + $0.060 + 1,000 × $0.0003 = **$0.365** |

***

### Output schema

Each dataset record is one of: `place`, `review`, or `run_summary`.

#### `review` record (truncated example)

```json
{
  "record_type": "review",
  "place_url": "https://www.tripadvisor.com/Hotel_Review-...html",
  "place_title": "Hilton New York Times Square",
  "place_reviews_count": 8959,
  "place_overall_rating": 4.3,
  "review_id": "1060777457",
  "title": "Just need a clean room to shower and sleep!",
  "text": "AVOID FOR BUSINESS TRAVEL...",
  "rating": 1,
  "date_of_visit": "2026-05-31",
  "published_at": "2026-05-18",
  "language": "en",
  "original_language": "en",
  "is_translated": false,
  "reviewer_name": "Ben T",
  "reviewer_location": null,
  "reviewer_reviews_count": 4,
  "images": ["https://...caption.jpg", "https://..."],
  "owner_responses": [],
  "sub_ratings": []
}
```

#### `place` record

```json
{
  "record_type": "place",
  "title": "Hilton New York Times Square",
  "location": "234 West 42nd Street, 10036, New York City, New York, US",
  "rating": 4.3,
  "reviews_count": 8959,
  "rating_distribution": { "1": 272, "2": 294, "3": 709, "4": 2576, "5": 5108 },
  "url": "https://www.tripadvisor.com/Hotel_Review-...html"
}
```

#### Run summary (KV store `OUTPUT`)

Totals, estimated charges, mode, task pass/fail counts.

***

### FAQ

**Does this scrape Tripadvisor's HTML directly?**
No. It reads structured data rather than parsing Tripadvisor's HTML, so it doesn't break when Tripadvisor changes their page layout.

**Why don't you need my Tripadvisor login?**
The actor only reads publicly available Tripadvisor data. You never share credentials.

**What's the maximum reviews per place?**
4,490 — Tripadvisor's hard ceiling per listing.

**How long does a run take?**
On `priority: "high"` (default): ~1 minute per place. On `priority: "standard"`: up to 45 minutes per place (same price to you).

**Why was a review missing sub-ratings?**
Tripadvisor only exposes sub-ratings on certain reviews — same field inconsistency as on their own website. We pass through whatever is available.

**Can I get reviews in a specific language?**
The actor respects Tripadvisor's locale settings via `languageCode`. Each review record also includes `language` and `original_language` so you can filter downstream.

**Can I run this from n8n, Make, Zapier?**
Yes — set `webhookUrl` and the actor POSTs a JSON run summary on completion.

***

### Tags

`tripadvisor scraper`, `tripadvisor api`, `tripadvisor reviews api`, `tripadvisor reviews scraper`, `scrape tripadvisor`, `tripadvisor data extraction`, `hotel reviews scraper`, `restaurant reviews api`, `tripadvisor hotels scraper`, `tripadvisor restaurants scraper`, `tripadvisor places`, `review extractor`

# Actor input Schema

## `urls` (type: `array`):

Paste one or more Tripadvisor place URLs (hotels, restaurants, attractions, vacation rentals). The actor will pull reviews for each. Leave empty if you want search mode instead.

## `searchQuery` (type: `string`):

Keyword to search for on Tripadvisor — e.g. 'italian restaurants', 'luxury hotels', 'museums'. Combined with 'locationName' to discover places. Leave empty if you're using 'urls' mode.

## `locationName` (type: `string`):

Location to search in. MUST be in 3-part format 'City,Region,Country' — examples: 'New York,New York,United States', 'London,England,United Kingdom', 'Paris,Ile-de-France,France', 'Tokyo,Tokyo,Japan', 'Rome,Lazio,Italy'. Used together with 'searchQuery'. If empty, defaults to United States (overall).

## `locationCode` (type: `string`):

Numeric country/region code (e.g. '2840' for United States, '2826' for UK). Used only if 'locationName' is empty.

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

How many places to return from the search. Each charges 1 'place' event ($0.003). Default 20, max 700.

## `includeReviewsForSearchedPlaces` (type: `boolean`):

If checked AND using search mode: for each place found, also pull reviews (up to 'maxReviewsPerPlace' each). Each review charges 1 'review' event ($0.0003).

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

Maximum number of reviews to fetch per place. Applies to both 'urls' mode and 'includeReviewsForSearchedPlaces'. Default 50, max 4490 (Tripadvisor's per-place limit).

## `priority` (type: `string`):

'standard' = may take up to 45 min for results. 'high' = ~1-minute turnaround. The price you pay is the same either way. Use 'high' for interactive use.

## `languageCode` (type: `string`):

ISO 639-1 language code for search results (e.g. 'en', 'es', 'fr', 'de'). Affects which Tripadvisor regional version is queried.

## `maxBudgetUsd` (type: `number`):

Optional safety cap. If set, the actor refuses to start runs whose estimated max charges exceed this. Leave empty for no cap.

## `webhookUrl` (type: `string`):

If set, the actor POSTs a JSON run summary to this URL on completion. Useful for n8n, Make.com, Zapier, Slack.

## `demoMode` (type: `boolean`):

If checked, runs a health check WITHOUT making API calls. Useful to verify config without spending credits.

## Actor input object example

```json
{
  "urls": [
    "https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html"
  ],
  "maxPlaces": 20,
  "includeReviewsForSearchedPlaces": false,
  "maxReviewsPerPlace": 50,
  "priority": "high",
  "languageCode": "en",
  "demoMode": false
}
```

# Actor output Schema

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

All place and review records in chronological order.

## `summary` (type: `string`):

High-level run summary: counts, costs, mode, task results.

# 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 = {
    "urls": [
        "https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("santhej/tripadvisor-scraper-pro").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 = { "urls": ["https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html"] }

# Run the Actor and wait for it to finish
run = client.actor("santhej/tripadvisor-scraper-pro").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 '{
  "urls": [
    "https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html"
  ]
}' |
apify call santhej/tripadvisor-scraper-pro --silent --output-dataset

```

## MCP server setup

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

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/vZF6vhRnwTqXXA0kk/builds/rBxcMQ8DPp9ngqgX0/openapi.json
