# TripAdvisor Hotel Reviews API (`factden/tripadvisor-hotel-reviews-api`) Actor

Scrape ALL reviews from any TripAdvisor hotel, restaurant, or attraction - a free, unlimited alternative to the official API (which returns only 3). Review text, ratings, dates, owner responses, per-review subratings, reviewer profiles, plus property details.

- **URL**: https://apify.com/factden/tripadvisor-hotel-reviews-api.md
- **Developed by:** [Factden](https://apify.com/factden) (community)
- **Categories:** Travel, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

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

Scrape **all** reviews from any TripAdvisor **hotel, restaurant, or attraction**, a free, unlimited alternative
to TripAdvisor's official API, which returns only **3 reviews** per location. Give it a **TripAdvisor URL** or a
**location ID** and get every review as structured JSON: text, rating, travel date, **owner responses**,
**per-review subratings**, reviewer profile, plus **property details** (rating, structured city ranking, price
range, amenities, photos), TripAdvisor's **official category subratings**, and its **AI review
summary**. Or run **Discover mode** with just a **city name** to get a list of that city's places with all those
details.

Covers the searches people actually run: a **TripAdvisor reviews API**, to **scrape TripAdvisor reviews**, for
**TripAdvisor hotel reviews**, **restaurant reviews** and **attraction reviews**, reliably, at scale, and cheap.

### What makes this different

Most TripAdvisor scrapers give you *only* the review text and break every few weeks. This one:

- **Returns ALL reviews, not 3**, the official TripAdvisor Content API caps at 3 reviews per location; this
  returns every public review.
- **Is one actor, not two**, reviews **and** full property details **and** the AI summary in a single run
  (competitors split "reviews" and "listing details" into separate paid actors).
- **Ships the deepest data**, owner responses, per-review subratings, official entity subratings, price range,
  ranking, amenities, photos, and an **LLM-ready `markdownContent`** field on every row.
- **Is durable**, built on TripAdvisor's stable, static-key data endpoints, so it doesn't break on the web-page
  changes that take other scrapers down.
- **Two modes**, **Reviews** (paste URLs or location IDs, get every review + place details) and **Discover**
  (**search a city** and get a list of its places with full details).

### Does TripAdvisor have a reviews API?

Yes, the official TripAdvisor Content API, but it is gated (approval required) and returns only **3 reviews per
location**, with no owner responses, no subratings, and strict display rules. This actor is the practical
alternative: **all** public reviews, richer fields, no gatekeeping, pay only for what you extract.

### What does TripAdvisor Hotel Reviews API do?

| It extracts | From |
|---|---|
| Every review: text, title, rating, travel date, published date, helpful votes, language | hotels · restaurants · attractions |
| Owner / management responses | any place |
| Per-review subratings (cleanliness, service, value, location, rooms, sleep quality) | where the reviewer left them |
| Reviewer profile (username, home location, contributions, avatar) | any review |
| Property details: name, address, geo, rating, structured **city ranking**, price range, hotel class, amenities/cuisine, photos | one record per place |
| **Official category subratings** + TripAdvisor's **AI review summary** (prose + attribute chips) | one record per place |

Output is structured **JSON, CSV, Excel or HTML**, available via API, [MCP](https://mcp.apify.com/), scheduler and
every Apify integration (Make, Zapier, n8n, Google Sheets…).

### Who is it for?

- **Hotels & hospitality**, monitor your own and competitors' reviews, subratings and ranking over time.
- **Market & academic researchers**, build review datasets across a whole city or category.
- **Reputation / BI teams**, track sentiment, owner-response rates, and category scores.
- **AI / RAG builders**, feed the LLM-ready `markdownContent` straight into a vector store or agent.

#### Example jobs it does

- *Scrape all reviews for one hotel* → paste its URL, set a high `maxReviews`.
- *Track new reviews weekly* → set `fromDate` to last run; only the new ones come back.
- *List every hotel in a city* → **Discover mode**: put `Barcelona` in **Search terms**, pick `hotels`, set `maxPlaces`. Then feed the returned Location IDs into **Reviews mode** for their reviews.
- *Complaint mining* → `minRating: 1`, `maxRating: 2`.
- *Competitor subrating benchmark* → compare the place records' official cleanliness/service/value scores.

### How to scrape TripAdvisor reviews (to CSV)

1. Keep **Mode** on **Reviews** and paste one or more **TripAdvisor URLs** (hotel, restaurant or attraction), or
   enter **Location IDs**. (Don't know the places yet? Switch to **Discover** mode and search a city first to
   list them, then bring the Location IDs back here.)
2. Set **Max reviews per place** (use a large number for all).
3. Optionally filter by **language**, **rating range** (`minRating`/`maxRating`) or a **date window**
   (`fromDate`/`toDate`). Every run also returns the place record with the AI summary + official subratings.
4. Click **Start**. When it finishes, open the **Output** tab and **Export → CSV** (or JSON/Excel).

![TripAdvisor Hotel Reviews API input form](https://raw.githubusercontent.com/factden/apify-actor-assets/main/tripadvisor-hotel-reviews-api/01-input-form.png)

### Input

See the **Input** tab. Industry-standard field names so API/MCP callers can fill them predictably:

| Field | Type | What it does |
|---|---|---|
| `startUrls` | array | TripAdvisor `Hotel_Review` / `Restaurant_Review` / `Attraction_Review` URLs |
| `locationIds` | array | TripAdvisor location IDs (the `d`-number in a URL) |
| `searchTerms` | array | Discovery mode: a city/place to find places in |
| `placeTypes` | array | For search: `hotels` / `restaurants` / `attractions` |
| `maxPlaces` | integer | For search: cap places per term |
| `maxReviews` | integer | Reviews per place (large number = all) |
| `reviewLanguages` | array | Filter reviews by language (or `all`) |
| `minRating` / `maxRating` | integer | Star-rating range (1-5) |
| `fromDate` / `toDate` | string | Review date window (YYYY-MM-DD) |
| `proxyConfiguration` | object | Proxy (default Apify datacenter is enough) |

Every run also emits one **place record** per place (property details + official subratings + AI summary). Reviewer
profile, per-review subratings and owner responses are always included too (they arrive in the same call).

### Output

Two datasets. **Reviews** (default, one row per review) and **Places** (one record per place).

![TripAdvisor reviews output](https://raw.githubusercontent.com/factden/apify-actor-assets/main/tripadvisor-hotel-reviews-api/02-output-reviews.png)

![TripAdvisor place details output with AI summary](https://raw.githubusercontent.com/factden/apify-actor-assets/main/tripadvisor-hotel-reviews-api/03-output-places.png)

**Review row:**

```json
{
  "placeId": 1465497,
  "placeType": "hotel",
  "placeName": "W Barcelona",
  "reviewId": "1070232616",
  "rating": 5,
  "title": "Incredible stay",
  "text": "The rooftop and the service were exceptional...",
  "publishedDate": "2026-07-26T23:11:20-04:00",
  "travelDate": "2026-07",
  "helpfulVotes": 3,
  "subratings": [{ "name": "Service", "value": 5 }, { "name": "Location", "value": 5 }],
  "ownerResponse": { "responder": "GM W Barcelona", "text": "Thank you...", "publishedDate": "2026-07-28" },
  "user": { "username": "traveler_bcn", "userLocation": "London, UK", "contributions": 42 },
  "url": "https://www.tripadvisor.com/ShowUserReviews-...",
  "markdownContent": "# Incredible stay, W Barcelona\n**Rating:** ★★★★★ (5/5) ..."
}
```

**Place record** (abridged):

```json
{
  "placeId": 1465497, "name": "W Barcelona", "rating": 4.2, "numReviews": 8452,
  "rank": 309, "rankOutOf": 594, "priceRange": "$459 - $822", "hotelClass": 5,
  "subratings": { "cleanliness": 4.5, "service": 4.23, "value": 3.81, "location": 4.36, "rooms": 4.56, "sleepQuality": 4.6 },
  "aiReviewSummary": { "title": "Reviews summary", "text": "W Barcelona is popular for its upscale amenities...",
                       "chips": [{ "attribute": "Location", "opinion": "Beachfront" }] },
  "amenities": ["Beach", "Bar / Lounge", "Business Center"]
}
```

You can download the dataset as **JSON, CSV, Excel or HTML**.

### Run on a schedule

Set a **Schedule** in Apify and pair it with `fromDate` (e.g. yesterday) to pull only new reviews on each run -
ideal for ongoing reputation monitoring. Failures are alerted; the actor exits gracefully on transient issues.

### AI agents, MCP & RAG

Every row carries an LLM-ready **`markdownContent`** field, and each dataset has an **AI ingest** view. Call the
actor from any agent via the [Apify MCP server](https://mcp.apify.com/), or feed the markdown straight into a
vector store. The property record's `aiReviewSummary` gives you TripAdvisor's own generative summary + attribute
chips for instant grounding.

### Pricing

Pay-per-event, **no start fee**, you only pay for what you extract. Per-review pricing is volume-tiered by your
Apify plan and **undercuts every alternative at every tier**:

| Apify plan | Per 1,000 reviews | Per 1,000 place records |
|---|---|---|
| Free | $0.45 | $2.00 |
| Bronze | $0.42 | $1.80 |
| Silver | $0.40 | $1.60 |
| Gold | $0.38 | $1.40 |

**Example:** 200 reviews + details for 1 hotel ≈ **$0.09**. Reviews only, 1,000 reviews ≈ **$0.45**.

### Is it legal to scrape TripAdvisor?

This actor collects only **publicly available** data. You are responsible for using the data in compliance with
applicable laws (including GDPR/CCPA for any personal data) and TripAdvisor's terms. Reviewer fields are public,
pseudonymous profile data; handle them accordingly.

### FAQ

**Does TripAdvisor have a reviews API?** Yes, but the official Content API is gated and returns only 3 reviews per
location. This actor returns all public reviews with richer fields.

**Which pages work?** Any TripAdvisor `Hotel_Review`, `Restaurant_Review` or `Attraction_Review` URL, a location
ID (the `d`-number), or a city name via *Search terms*.

**Can I get all reviews for a place?** Yes, set `maxReviews` to a large number (e.g. 100000).

**Can I search a whole city?** Yes, use **Discover** mode: put the city in `searchTerms`, choose `placeTypes`,
and set `maxPlaces`. It returns a list of places with full details; take those Location IDs into
**Reviews** mode to get their reviews.

**Are reviews translated?** Reviews come in the requested language (default English); pick specific languages via
`reviewLanguages`.

**Do I get subratings and owner responses?** Yes, always included per review, plus computed/official category
subratings on the place record.

**What is the AI review summary?** TripAdvisor's own generative summary of the reviews (prose + attribute chips),
on the place record when property details are on.

**Can I call it from an AI agent?** Yes, via the Apify MCP server; the input uses standard field names and every
row has `markdownContent`.

**Does it break often?** No, it's built on TripAdvisor's stable static-key data endpoints, not the fragile web
page, so it's resilient to site redesigns.

**Is a stale/merged URL a problem?** No, a merged place self-heals to its current ID automatically.

### Related actors

- [Google Hotels Scraper](https://apify.com/factden/google-hotels-scraper), prices, OTA rates and reviews for any hotel.
- [Expedia Reviews Scraper](https://apify.com/factden/expedia-hotel-reviews-scraper), all Expedia hotel reviews.
- [Hotels.com Reviews Scraper](https://apify.com/factden/hotels-com-reviews-scraper), all Hotels.com reviews.
- [G2 Reviews Scraper](https://apify.com/factden/g2-reviews-scraper), software reviews from G2.

### Support

Found a bug or need a field added? Open the **Issues** tab on this actor, we respond quickly, and custom variants
are available.

If this actor helped, a ⭐ **review** and a **bookmark** on the Apify Store mean a lot 🙏

### Changelog

- **2026-07-31**, Launch: reviews + property details + official subratings + AI summary + city discovery;
  standard field names; volume-tiered pricing; durable static-key backend.

# Actor input Schema

## `mode` (type: `string`):

What do you want? **Reviews** = you have TripAdvisor URLs or Location IDs and want every review (plus each place's details). **Discover** = search a city/place and get a list of places with their details. Fill the matching block below.

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

TripAdvisor detail-page URLs, one per place, copy them from your browser. Works for **hotels** (`Hotel_Review`), **restaurants** (`Restaurant_Review`) and **attractions** (`Attraction_Review`). A stale/merged URL self-heals to the current place.

## `locationIds` (type: `array`):

TripAdvisor location IDs, the `d`-number in a URL (e.g. `1465497` from `…-d1465497-…`), for any place type. One ID per line, e.g. `1465497`, `1029199`, `190166`.

## `maxReviews` (type: `integer`):

Cap the reviews scraped per place (paginated, newest-first). Use a large number (e.g. `100000`) to get **all** reviews. A smaller number keeps a first run fast and cheap.

## `reviewLanguages` (type: `array`):

Only scrape reviews written in these languages (each has its own review count). Choose `All languages`, or pick specific ones.

## `minRating` (type: `integer`):

Only keep reviews with at least this star rating (1-5). Set `minRating` = `maxRating` for a single rating (e.g. both 1 for complaints).

## `maxRating` (type: `integer`):

Only keep reviews with at most this star rating (1-5). Leave at 5 with minRating 1 for all ratings.

## `fromDate` (type: `string`):

Lower bound (YYYY-MM-DD). Stop once reviews are older than this, perfect for a scheduled refresh. Leave empty to go as far back as available.

## `toDate` (type: `string`):

Upper bound (YYYY-MM-DD): only keep reviews on or before this date. Pair with **Reviews from** for a window, e.g. all of 2024.

## `searchTerms` (type: `array`):

Used when Mode = Discover. Enter a **city or place name** (e.g. `Barcelona`, `Rome`, `Bali`) and the actor returns a list of its places with full details (name, rating, ranking, price range, amenities, official subratings, AI summary), no URLs needed. One per line. To pull the reviews for any of them, take its Location ID into Reviews mode.

## `placeTypes` (type: `array`):

Which place types to pull when searching (Discover mode only).

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

Discover mode only: cap how many places to take per search term (split evenly across the selected types). Keeps a city search fast and predictable.

## `discoveryDepth` (type: `string`):

Discover mode only. **Quick** returns the fast city directory (name, rating, ranking, price, category, address, contact) with no per-place calls. **Full details** additionally fetches official subratings, the AI summary, and amenities for each place (slower).

## `includePhotos` (type: `boolean`):

Discover + Full details only: also fetch the photo gallery for each place (one extra request per place). Off by default to keep runs fast.

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

Proxy settings for outbound requests. The default (Apify Proxy, datacenter) is sufficient, the data endpoints are lightweight and not anti-bot gated.

## Actor input object example

```json
{
  "mode": "reviews",
  "startUrls": [
    {
      "url": "https://www.tripadvisor.com/Hotel_Review-g187497-d1465497-Reviews-W_Barcelona-Barcelona_Catalonia.html"
    },
    {
      "url": "https://www.tripadvisor.com/Restaurant_Review-g153983-d1029199-Reviews-La_Troje.html"
    },
    {
      "url": "https://www.tripadvisor.com/Attraction_Review-g187497-d190166-Reviews-Basilica_de_la_Sagrada_Familia-Barcelona_Catalonia.html"
    }
  ],
  "maxReviews": 200,
  "reviewLanguages": [
    "all"
  ],
  "minRating": 1,
  "maxRating": 5,
  "placeTypes": [
    "hotels"
  ],
  "maxPlaces": 20,
  "discoveryDepth": "quick",
  "includePhotos": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `reviews` (type: `string`):

No description

## `properties` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.tripadvisor.com/Hotel_Review-g187497-d1465497-Reviews-W_Barcelona-Barcelona_Catalonia.html"
        },
        {
            "url": "https://www.tripadvisor.com/Restaurant_Review-g153983-d1029199-Reviews-La_Troje.html"
        },
        {
            "url": "https://www.tripadvisor.com/Attraction_Review-g187497-d190166-Reviews-Basilica_de_la_Sagrada_Familia-Barcelona_Catalonia.html"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("factden/tripadvisor-hotel-reviews-api").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrls": [
        { "url": "https://www.tripadvisor.com/Hotel_Review-g187497-d1465497-Reviews-W_Barcelona-Barcelona_Catalonia.html" },
        { "url": "https://www.tripadvisor.com/Restaurant_Review-g153983-d1029199-Reviews-La_Troje.html" },
        { "url": "https://www.tripadvisor.com/Attraction_Review-g187497-d190166-Reviews-Basilica_de_la_Sagrada_Familia-Barcelona_Catalonia.html" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("factden/tripadvisor-hotel-reviews-api").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 '{
  "startUrls": [
    {
      "url": "https://www.tripadvisor.com/Hotel_Review-g187497-d1465497-Reviews-W_Barcelona-Barcelona_Catalonia.html"
    },
    {
      "url": "https://www.tripadvisor.com/Restaurant_Review-g153983-d1029199-Reviews-La_Troje.html"
    },
    {
      "url": "https://www.tripadvisor.com/Attraction_Review-g187497-d190166-Reviews-Basilica_de_la_Sagrada_Familia-Barcelona_Catalonia.html"
    }
  ]
}' |
apify call factden/tripadvisor-hotel-reviews-api --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/jDQ2qpF4iRYLbUM0c/builds/nQxLXNqdfoZsTtOOa/openapi.json
