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

\[$4/1K reviews, 20% below the leader, paid plans down to $0.72/1K] Scrape Tripadvisor reviews of hotels, restaurants and attractions: rating, title, text, review date, visit month, reviewer, photos, owner response with date. Filter by stars, traveller type, month. Only-new mode. No start fee.

- **URL**: https://apify.com/blueskyscraper/tripadvisor-reviews-scraper.md
- **Developed by:** [BlueskyScraper](https://apify.com/blueskyscraper) (community)
- **Categories:** Travel, AI, Agents
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.72 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### What is Tripadvisor Reviews Scraper?

**Tripadvisor Reviews Scraper** is a **Tripadvisor API** for reviews of **hotels, restaurants and attractions**. Paste Tripadvisor links, or type a place name and a city, and get **one row per review** with the **star rating**, **title**, **full text**, **review date**, **month of visit**, **language**, **reviewer name, home town and review count**, **photos**, the **owner response with its date**, and the **sub-ratings** the reviewer gave (rooms, service, value, cleanliness, location, sleep quality for hotels; food, service, value, atmosphere for restaurants). Every row also carries the place name, type, address, overall rating and total number of reviews.

Reviews are read from Tripadvisor through a licensed data provider, so there are **no proxies, CAPTCHAs or browser sessions** to manage and no Tripadvisor account or official API key is needed. Filters run on Tripadvisor's side — **star ratings**, **traveller type** (families, couples, solo, business, friends), **months of visit** and a **minimum review date** — so you pay only for the reviews you asked for. The field names match our **Agoda**, **Booking.com** and **Airbnb** review scrapers, so one parser covers all of them.

- 💰 **$0.004 per review** on the free plan — **20% below the market leader** ($4 per 1,000 reviews; paid plans from $1.52 on Bronze down to $0.72 on Gold and above). No start fee.
- 💬 **Owner response and its date in every row**, plus how many days the owner took to answer
- 🗓️ **Month of visit** and **traveller type** (when filtered) next to the review date
- 🔁 **Only new reviews** mode for daily monitoring — later runs write and charge only reviews you have not received
- 🆓 **Error rows are free** — a dead link, an unknown city or a place with no matching reviews costs nothing
- 🤖 Works from the **Apify API**, **MCP server** (Claude, ChatGPT, Cursor), n8n, Make and Zapier

### What data can Tripadvisor Reviews Scraper extract?

One row per review. Example values are from a real run on a hotel in Ubud, Bali.

| Field | Example | Notes |
|---|---|---|
| `type` | `review` | `place` for the optional summary row, `error` for free error rows |
| `placeName` | The Ubud Village Resort & Spa | Hotel, restaurant or attraction |
| `placeType` | hotel | hotel, restaurant, attraction |
| `placeUrl` | https://www.tripadvisor.com/Hotel_Review-g297701-d610805-… | Tripadvisor page of the place |
| `placeAddress` | Jalan Raya Nyuh Kuning, 80571, ID | As Tripadvisor shows it |
| `placeRating` / `placeReviewsCount` | 4.8 / 1,943 | Overall rating and total reviews |
| `reviewId` / `reviewUrl` | 1079936254 / …ShowUserReviews-…r1079936254… | Direct link to the review |
| `rating` | 5 | Stars, 1–5 |
| `title` / `text` | Stunningly beautiful hotel / We stayed here for 4 nights… | Full text, not truncated |
| `reviewDate` | 2026-09-30 | Date the review was published |
| `visitMonth` | 2026-09 | Month of the stay or visit |
| `travelerType` | couples | Filled when you filter by traveller type |
| `language` / `textLanguage` / `isTranslated` | it / en / true | Original language, language of the text, translation flag |
| `translationMissing` | false | Translation was on, but Tripadvisor has no English version of this review (null when translation is off) |
| `reviewerName` / `reviewerLocation` | otl / Welwyn, United Kingdom | Home town when the profile shows it |
| `reviewerReviewCount` / `reviewerProfileUrl` | 272 / https://www.tripadvisor.com/Profile/otl | How active the reviewer is |
| `images` / `imagesCount` | \[7 photo links] / 7 | Full-size photo URLs |
| `hasOwnerResponse` / `ownerResponse` | true / Dear waynegF2832OP, Greetings from The Ubud Village Resort & Spa… | The management's reply |
| `ownerResponseDate` / `ownerResponseDelayDays` | 2026-09-26T00:00:00.000Z / 0 | Reply date and days to answer |
| `responderName` | Ubud Village Group | Who answered |
| `subRatings` | {"value":5,"rooms":5,"location":4,"cleanliness":5,"service":5,"sleepQuality":5} | Per-aspect scores, when the reviewer gave them |
| `searchQuery` / `searchLocation` | Ayana Resort / Denpasar,Bali,Indonesia | When the place came from a name search |
| `scrapedAt` | 2026-10-02T00:44:37Z | When the row was produced |

With **🏨 Add a place summary row** switched on, each place also gets one `place` row with name, type, address, overall rating, total reviews and the **rating distribution**: `rating5Count`, `rating4Count`, `rating3Count`, `rating2Count`, `rating1Count` (for example 4,266 / 848 / 340 / 130 / 147 for Ayana Resort Bali).

### 💰 How much does it cost to scrape Tripadvisor reviews?

Tripadvisor Reviews Scraper uses **pay-per-event** pricing. You pay per review row, and per place summary row only when you switch that option on:

| Event | Free plan | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|
| `review` | **$0.004** | $0.00152 | $0.0012 | $0.00072 | $0.00072 | $0.00072 |
| `place` (optional summary) | **$0.001** | $0.0009 | $0.0008 | $0.0007 | $0.0007 | $0.0007 |

- **20% below the market leader** on the free plan and on Bronze to Gold (checked 11 October 2026). 1,000 reviews cost $4 on the free plan, $1.52 on Bronze and $0.72 on Gold.
- **No start fee** and no charge per run.
- **$1 = 250 reviews** on the free plan; Apify's free $5 monthly credit covers about **1,250 reviews a month**.
- **Error rows are free**: a link that is not a Tripadvisor place, a location that does not exist, a place with no reviews matching your filters.
- **Filtered-out reviews are free.** Star, traveller-type and month filters are applied by Tripadvisor; reviews older than your minimum date are skipped without charge.
- With **only new reviews** switched on, reviews you already received under the same memory name are skipped and not charged.
- The default run (one Bali hotel, 20 newest reviews) costs **$0.08** and finished in **12 seconds** in our test; an identical repeat came back in 4 seconds.

Example budgets (free plan):

| Job | Rows | Cost |
|---|---|---|
| 1 hotel × 20 newest reviews | 20 | $0.08 |
| 10 hotels × 100 reviews | 1,000 | $4.00 (Bronze: $1.52) |
| 1 restaurant × all 3,706 reviews | 3,706 | $14.82 (Gold: $2.67) |
| Daily monitoring, ~3 new reviews a day | ~90 a month | ~$0.36 a month |

### How to scrape Tripadvisor reviews with Tripadvisor Reviews Scraper

1. Open the Actor and click **Try for free** (an Apify account is free).
2. In **🔗 Tripadvisor place URLs**, paste one link per line — open the hotel, restaurant or attraction on Tripadvisor and copy the address. Any Tripadvisor domain works (.com, .co.uk, .de …).
3. No link? Type the place names in **🔍 Place names to search** and the city in **📍 Search location** (or write `Name, City`).
4. Set **💯 Max reviews per place** (20 by default, up to 4,490).
5. Optionally pick **⭐ Star ratings**, **🧳 Traveller types**, **🗓️ Months of visit** or **📅 Only reviews written on or after**.
6. Click **Start**. Reviews appear in the **Reviews** table; switch to **Owner responses** or **Reviewers & photos** for other column sets, and download as CSV, Excel, JSON or HTML.

### ⬇️ Input

#### Tripadvisor links (default)

```json
{
    "startUrls": [
        "https://www.tripadvisor.com/Hotel_Review-g297701-d610805-Reviews-The_Ubud_Village_Resort_Spa-Ubud_Gianyar_Regency_Bali.html",
        "https://www.tripadvisor.com/Restaurant_Review-g297701-d991554-Reviews-Bebek_Bengil_Ubud-Ubud_Gianyar_Regency_Bali.html",
        "https://www.tripadvisor.co.uk/Attraction_Review-g608497-d1515658-Reviews-Tegalalang_Rice_Terrace-Tegalalang_Gianyar_Regency_Bali.html"
    ],
    "maxReviewsPerPlace": 20
}
```

Links with a page offset (`-or2130-`) are cleaned automatically. A link to a single review (`ShowUserReviews-…`) gets a free error row asking for the place link.

#### Search by place name and city

```json
{
    "searchQueries": ["Ayana Resort"],
    "searchLocation": "Bali",
    "maxPlacesPerSearch": 1,
    "maxReviewsPerPlace": 50
}
```

The Actor finds the place on Tripadvisor (sponsored listings are skipped) and collects its reviews. In our test `Ayana Resort` + `Bali` found **Ayana Resort Bali** (5,731 reviews). `searchLocation` accepts a city, region or country — `Ubud`, `Paris, France`, `New York City`; add the country after a comma when a city name exists in several countries. You can also write the place as `Ayana Resort, Bali` and leave the location empty. Raise **Places per search** (up to 30) to take several top results of a search.

#### 🎯 Filters: stars, traveller type, months, date

```json
{
    "startUrls": ["https://www.tripadvisor.com/Hotel_Review-g297696-d302249-Reviews-Ayana_Resort_Bali-Jimbaran_South_Kuta_Badung_Regency_Bali.html"],
    "ratings": ["1", "2"],
    "travelerTypes": ["families", "couples"],
    "visitMonths": ["july", "august"],
    "minReviewDate": "1 year",
    "maxReviewsPerPlace": 100
}
```

- **Star ratings** — 5 = Excellent … 1 = Terrible.
- **Traveller types** — each selected type is collected separately and every row carries its `travelerType`; the review limit applies to each type.
- **Months of visit** — any year, useful for high-season analysis.
- **Minimum review date** — a date (`2026-01-01`) or a period (`30 days`, `6 months`, `1 year`). With *Most recent* order the Actor fetches in growing steps and stops once it reaches older reviews: in our test, 100 requested with `30 days` returned 13 reviews from the last month after one small step.
- **Sort** — *Most recent* (default), *Detailed reviews* (the longest, most informative first) or *Tripadvisor default*.

#### Translation

Off by default: every review comes in the language it was written in, and `language` tells you which. Switch **Translate reviews** on and reviews written in other languages arrive as Tripadvisor's machine translation into English — `isTranslated: true`, `language` keeps the original (it, fr, de, nl, pt in our restaurant test). Tripadvisor does not translate every review: in our 40-review hotel test 1 of 10 foreign reviews had no translation and came in Italian, with `isTranslated: false`, `textLanguage: it` and `translationMissing: true` — the data source itself returns that review untranslated, so we deliver the original text rather than nothing. Such reviews are counted in the run's status message; filter `translationMissing = true` to find them.

#### 🔁 Only new reviews (monitoring)

```json
{
    "startUrls": ["https://www.tripadvisor.com/Hotel_Review-g297701-d610805-Reviews-The_Ubud_Village_Resort_Spa-Ubud_Gianyar_Regency_Bali.html"],
    "maxReviewsPerPlace": 20,
    "onlyNewRowsStore": "my-hotel-reviews"
}
```

Name the memory once and put the Actor on a daily schedule. The first run delivers everything found and remembers it; every later run with the same name writes and charges **only reviews you have not received before**. In our test the second run delivered 0 of 10 already-known reviews and charged nothing for them.

### ⬆️ Output

```json
{
    "type": "review",
    "placeId": "302249",
    "placeName": "Ayana Resort Bali",
    "placeType": "hotel",
    "placeUrl": "https://www.tripadvisor.com/Hotel_Review-g297696-d302249-Reviews-Ayana_Resort_Bali-Jimbaran_South_Kuta_Badung_Regency_Bali.html",
    "placeAddress": "Jl. Karang Mas Sejahtera, Karang Mas Estate, 80364, ID",
    "placeRating": 4.6,
    "placeReviewsCount": 5731,
    "reviewId": "1079898625",
    "reviewUrl": "https://www.tripadvisor.com/ShowUserReviews-g297696-d302249-r1079898625-Ayana_Resort_Bali-Jimbaran_South_Kuta_Badung_Regency_Bali.html",
    "rating": 5,
    "title": "Why We Keep Coming Back to AYANA",
    "text": "This was our third stay at AYANA. The resort is modern, spacious and beautiful, with spectacular ocean views and so many restaurants and bars to choose from. …",
    "reviewDate": "2026-09-29",
    "visitMonth": "2026-09",
    "travelerType": "couples",
    "language": "en",
    "textLanguage": "en",
    "isTranslated": false,
    "translationMissing": null,
    "reviewerName": "Jerri",
    "reviewerProfileUrl": "https://www.tripadvisor.com/Profile/985jlcl",
    "reviewerLocation": null,
    "reviewerReviewCount": 25,
    "images": ["https://dynamic-media-cdn.tripadvisor.com/media/photo-o/34/c1/be/3d/caption.jpg", "… 6 more"],
    "imagesCount": 7,
    "hasOwnerResponse": true,
    "ownerResponse": "Dear Valued Guest, Three visits to AYANA is already special, but hearing that the resort …",
    "ownerResponseDate": "2026-09-29T00:00:00.000Z",
    "ownerResponseDelayDays": 0,
    "responderName": "David D",
    "subRatings": { "value": 5, "rooms": 5, "location": 5, "cleanliness": 5, "service": 5, "sleepQuality": 5 },
    "searchQuery": "Ayana Resort",
    "searchLocation": "Denpasar,Bali,Indonesia",
    "scrapedAt": "2026-10-02T00:46:38.411Z"
}
```

#### Table views

- **Reviews** — place, rating, title, text, review date, visit month, traveller type, language, reviewer, owner response, link.
- **Owner responses** — who answered, when, and how many days after the review: a response-time report in one click.
- **Reviewers & photos** — reviewer home town, review count, profile link, photos and sub-ratings.
- **Place summary ($)** — the optional `place` rows with the 1–5 star distribution.

#### Same fields as our other travel review scrapers

The column names follow [Agoda Reviews Scraper](https://apify.com/lergassy/agoda-reviews-scraper): `rating`, `title`, `text`, `reviewDate`, `reviewerName`, `reviewerReviewCount`, `images`, `ownerResponse`, `ownerResponseDate`, `responderName`, `scrapedAt` mean the same thing in both. The only rename is `hotelName` / `hotelUrl` → `placeName` / `placeUrl`, because Tripadvisor also covers restaurants and attractions. A pipeline built for one source reads the other with that one mapping.

### Use cases for Tripadvisor data

#### Hotel and restaurant reputation management

Pull every new review each morning with **only new reviews**, route 1–2 star reviews to the manager, and track `ownerResponseDelayDays` to see how fast the team answers.

#### Competitor benchmarking

Compare ratings, sub-ratings (rooms, service, value, food, atmosphere) and complaint themes across competing hotels or restaurants in the same city, month by month.

#### Seasonal and segment analysis

Combine **months of visit** with **traveller type** to see what families say in August versus couples in the low season.

#### Travel market research

Search a category in a destination, take the top places, and build a dataset of what travellers praise and criticise.

#### AI agents, RAG and sentiment models

One flat row per review with the original language and an optional English translation is ready for sentiment scoring, topic extraction and retrieval-augmented answers about a place.

### Integrations

#### Apify API (JavaScript)

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('lergassy/tripadvisor-reviews-scraper').call({
    startUrls: ['https://www.tripadvisor.com/Hotel_Review-g297701-d610805-Reviews-The_Ubud_Village_Resort_Spa-Ubud_Gianyar_Regency_Bali.html'],
    maxReviewsPerPlace: 50,
    ratings: ['1', '2', '3'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((r) => [r.reviewDate, r.rating, r.title, r.hasOwnerResponse]));
```

#### Apify API (Python)

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("lergassy/tripadvisor-reviews-scraper").call(run_input={
    "searchQueries": ["Ayana Resort"],
    "searchLocation": "Bali",
    "travelerTypes": ["couples"],
    "maxReviewsPerPlace": 30,
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row.get("travelerType"), row.get("rating"), row.get("title"), row.get("ownerResponseDelayDays"))
```

#### One HTTP call

`POST https://api.apify.com/v2/acts/lergassy~tripadvisor-reviews-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN` with the input JSON as the body returns the review rows directly.

#### No-code tools

Use the Apify integrations for **n8n**, **Make**, **Zapier**, **Google Sheets**, **Airtable**, **Slack** or a **webhook** after each run. A daily schedule with **only new reviews** becomes a review alert feed.

#### MCP server

Connect `https://mcp.apify.com` to Claude, ChatGPT, Cursor or any MCP client and ask for `lergassy/tripadvisor-reviews-scraper`. The agent sees the input fields and gets one flat row per review back.

### 🤖 For AI Agents & LLM Apps

Compact reference for agents calling `lergassy/tripadvisor-reviews-scraper` through the Apify MCP server or API.

**Purpose:** one row per Tripadvisor review of a hotel, restaurant or attraction: how many stars, what the guest wrote, when they wrote it and when they visited, who they are, and whether and how fast the owner replied.

**Minimal input:**

```json
{ "startUrls": ["https://www.tripadvisor.com/Hotel_Review-g…-d…-Reviews-….html"], "maxReviewsPerPlace": 20 }
```

or `{ "searchQueries": ["place name"], "searchLocation": "city" }`.

**Output:** type, placeId, placeName, placeType, placeUrl, placeAddress, placeRating, placeReviewsCount, reviewId, reviewUrl, rating, title, text, reviewDate, visitMonth, travelerType, language, textLanguage, isTranslated, translationMissing, reviewerName, reviewerProfileUrl, reviewerLocation, reviewerReviewCount, images, imagesCount, hasOwnerResponse, ownerResponse, ownerResponseDate, ownerResponseDelayDays, responderName, subRatings (object), searchQuery, searchLocation, scrapedAt. Optional `place` rows: type, placeId, placeName, placeType, placeUrl, placeAddress, placeRating, placeReviewsCount, rating5Count … rating1Count. Error rows: type = error, input, error.

**Behaviors an agent should know:**

- Links and place names can be mixed; a name needs `searchLocation` or the form `Name, City`.
- `maxReviewsPerPlace` default 20, max 4,490; with `travelerTypes` it applies per type.
- Use `ratings`, `travelerTypes`, `visitMonths`, `minReviewDate` instead of post-filtering — they cost nothing for excluded reviews.
- `travelerType` is null unless the traveller filter is used (Tripadvisor does not expose it per review otherwise).
- Text is in the original language unless `translateReviews` is true (then English where Tripadvisor has a translation, `isTranslated` = true; `textLanguage` always tells the language of `text`; `translationMissing` = true marks reviews Tripadvisor has no English version of).
- Billing: `review` per review row, `place` per summary row (off by default). Error rows are free. No start fee.

### Error items / Troubleshooting

Error rows look like `{ "type": "error", "input": "https://www.google.com/x", "error": "Not a Tripadvisor link — … Not charged.", "scrapedAt": "…" }` and are always free. They appear when:

- a link is not a Tripadvisor place page, or points to a single review;
- a search location does not exist on Tripadvisor (the message suggests a format) or a place name finds nothing;
- a place returns no data — it closed or moved (in our test a closed Ubud restaurant came back empty);
- no reviews match your filters (the row says how many reviews the place has in total);
- a filter value is not understood (stars outside 1–5, an unknown traveller type or month, a date in another format).

If several places in a row return far fewer reviews than requested, the Actor stops early to protect your budget: everything already found stays in the dataset and each remaining place gets a free error row.

### ❓ FAQ

#### Is it legal to scrape Tripadvisor reviews?

Tripadvisor reviews are public: anyone can read them without logging in, and the Actor returns only what such a visitor sees. Reviews contain reviewer display names and sometimes a home town — public profile data, which may still be personal data under GDPR and similar laws. Use it for analysis, keep only what you need, and ask a lawyer before republishing reviews.

#### Is there an official Tripadvisor API for reviews?

Tripadvisor's own Content API returns only a handful of the latest reviews per location. This Actor works as an unofficial **Tripadvisor reviews API**: up to 4,490 reviews per place, with filters and no partner approval.

#### How fresh are the reviews?

Each run reads Tripadvisor at the time of the run. An identical request (same place, filters and size) is reused for up to 20 hours to keep repeated runs cheap; the Actor keeps a small key-value store named `dfs-cache-tripadvisor-reviews-scraper` in your account for this. A daily schedule therefore always gets a fresh reading.

#### How many reviews can I get per place?

Up to 4,490 per place (and per traveller type when that filter is on) — the limit of the data source. Places with fewer reviews return what they have.

#### Does it scrape restaurants and attractions too?

Yes. Hotels, restaurants and attractions were all tested: The Ubud Village Resort & Spa, Ayana Resort Bali, Bebek Bengil (restaurant) and Tegalalang Rice Terrace (attraction).

#### Why is `travelerType` empty?

Tripadvisor shows the trip type only as a filter, not on each review in this source. Select traveller types in the input and every row carries the one it was collected under.

#### Why are `subRatings` sometimes null?

Reviewers rate individual aspects only optionally, and attractions have none. In our hotel test 14 of 20 reviews carried sub-ratings.

#### How much does it cost to scrape 1,000 Tripadvisor reviews?

$4 on the free plan (20% below the market leader), $1.52 on Bronze, $0.72 on Gold and above.

#### Can I use Tripadvisor Reviews Scraper with the Apify API?

Yes. Every run can be started, scheduled and read through the Apify API or the official JavaScript and Python clients — see Integrations above.

#### Can I use it through an MCP server?

Yes. Add `https://mcp.apify.com` to your MCP client (Claude Desktop, Claude Code, ChatGPT, Cursor) and the agent can call `lergassy/tripadvisor-reviews-scraper` with links or place names.

#### Can I integrate it with other apps?

Yes — n8n, Make, Zapier, Google Sheets, Airtable, Slack and webhooks are available from the Integrations tab of the Actor.

#### Do I get one row per review?

Yes. One row per review; photos and sub-ratings are nested in the same row. Place summaries are separate `place` rows and only when you switch them on.

### Your feedback

Found a field that is wrong, a link format that is not accepted, or a feature you need? Open an issue in the **Issues** tab — we read every one and reply quickly. If the Actor saves you time, a review on the Store page helps other buyers find it.

### You might also like

| Actor | What it does |
|---|---|
| [Agoda Reviews Scraper](https://apify.com/lergassy/agoda-reviews-scraper) | Agoda hotel guest reviews and ratings, including the Booking.com review pool on the same page |
| [Booking Reviews Scraper](https://apify.com/lergassy/booking-reviews-scraper) | Booking.com guest reviews: score, liked and disliked text, stay date, guest country and type |
| [Trip.com Scraper](https://apify.com/lergassy/tripcom-scraper) | Trip.com hotels with live room rates for your dates, availability and reviews |
| [Airbnb Reviews Scraper](https://apify.com/lergassy/airbnb-reviews-scraper) | Airbnb listing reviews: rating, full text, date, reviewer and host response |
| [Google Hotels Scraper](https://apify.com/lergassy/google-hotels-scraper) | Google Hotels prices by city and dates: nightly and total price, rating, review count |

**Also known as:** Tripadvisor scraper, Tripadvisor API, Tripadvisor review scraper, Tripadvisor reviews API, hotel reviews scraper, restaurant reviews scraper, attraction reviews, owner responses export, Tripadvisor review monitoring.

# Actor input Schema

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

Paste links to hotel, restaurant or attraction pages on <a href='https://www.tripadvisor.com' target='_blank'>Tripadvisor</a> — open the place and copy the address from your browser. Any Tripadvisor domain works (.com, .co.uk, .de …). Example: <code>https://www.tripadvisor.com/Hotel_Review-g297701-d610805-Reviews-The_Ubud_Village_Resort_Spa-Ubud_Gianyar_Regency_Bali.html</code>

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

No link? Type the place name — <code>Ayana Resort</code>, <code>Eiffel Tower</code>, <code>pizza restaurant</code> — and set <b>Search location</b> below, or write it as <code>Name, City</code> (<code>Ayana Resort, Bali</code>). The Actor finds the place on Tripadvisor and collects its reviews. Sponsored listings are skipped.

## `searchLocation` (type: `string`):

City, region or country to search the place names in: <code>Bali</code>, <code>Ubud</code>, <code>Paris, France</code>, <code>New York City</code>. Add the country after a comma when the city name exists in several countries.

## `maxPlacesPerSearch` (type: `integer`):

How many top Tripadvisor results to take for each place name. Keep 1 for a specific hotel or restaurant; raise it (up to 30) for a category search such as <code>sushi restaurant</code>.

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

How many reviews to collect from each place (up to 4,490 — Tripadvisor's own limit through this source). With traveller types selected, the limit applies to each traveller type separately.

## `sortBy` (type: `string`):

<b>Most recent</b> returns the newest reviews first (needed for the minimum date and for monitoring). <b>Detailed reviews</b> puts the longest, most informative reviews first. <b>Tripadvisor default</b> keeps the site's own order.

## `minReviewDate` (type: `string`):

Skip older reviews. Use a date <code>2026-01-01</code> or a relative period: <code>30 days</code>, <code>6 months</code>, <code>1 year</code>. With <b>Most recent</b> order the Actor stops fetching once it reaches older reviews.

## `ratings` (type: `array`):

Keep only reviews with these star ratings (5 = Excellent … 1 = Terrible). Leave empty for all ratings.

## `travelerTypes` (type: `array`):

Keep only reviews from these trip types. Each review row then carries its <code>travelerType</code>. Leave empty for all travellers.

## `visitMonths` (type: `array`):

Keep only reviews of visits in these months (any year) — for example the high season. Leave empty for all months.

## `translateReviews` (type: `boolean`):

Off: every review comes in the language it was written in (<code>language</code> column). On: reviews written in other languages come as Tripadvisor's machine translation into English; <code>isTranslated</code> marks them and <code>language</code> keeps the original language. A few reviews have no English version on Tripadvisor: they stay in their own language with <code>translationMissing</code> = true.

## `includePlaceSummary` (type: `boolean`):

Also write one <code>place</code> row per place: name, type, address, overall rating, total reviews and how many 5, 4, 3, 2 and 1-star reviews it has. Charged as a separate <b>place</b> event. Off by default, so the table holds reviews only.

## `onlyNewRowsStore` (type: `string`):

Give this monitoring a name — <code>my-hotel-reviews</code> — and the Actor remembers every review it delivered under that name. Every later run with the same name writes and charges <b>only reviews you have not received before</b>. Schedule the Actor daily to get a feed of new Tripadvisor reviews. Leave empty to get everything found, every time.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Hotel_Review-g297701-d610805-Reviews-The_Ubud_Village_Resort_Spa-Ubud_Gianyar_Regency_Bali.html"
  ],
  "maxPlacesPerSearch": 1,
  "maxReviewsPerPlace": 20,
  "sortBy": "most_recent",
  "translateReviews": false,
  "includePlaceSummary": false
}
```

# Actor output Schema

## `results` (type: `string`):

One row per Tripadvisor review: rating, title, text, review date, month of visit, language, reviewer, photos, owner response with date, review highlights, plus the place name, type, address, rating and review count. Optional place summary rows with the 1-5 star rating distribution.

# 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": [
        "https://www.tripadvisor.com/Hotel_Review-g297701-d610805-Reviews-The_Ubud_Village_Resort_Spa-Ubud_Gianyar_Regency_Bali.html"
    ],
    "maxReviewsPerPlace": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("blueskyscraper/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 = {
    "startUrls": ["https://www.tripadvisor.com/Hotel_Review-g297701-d610805-Reviews-The_Ubud_Village_Resort_Spa-Ubud_Gianyar_Regency_Bali.html"],
    "maxReviewsPerPlace": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("blueskyscraper/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 '{
  "startUrls": [
    "https://www.tripadvisor.com/Hotel_Review-g297701-d610805-Reviews-The_Ubud_Village_Resort_Spa-Ubud_Gianyar_Regency_Bali.html"
  ],
  "maxReviewsPerPlace": 20
}' |
apify call blueskyscraper/tripadvisor-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,blueskyscraper/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/bQPy9QnOmAAODpQqK/builds/E0mNV58dkJjzIMwAR/openapi.json
