# Tripadvisor Reviews Scraper & API (`quarra/tripadvisor-reviews-scraper`) Actor

Tripadvisor reviews and place details for hotels, restaurants and attractions in any country, from listing links: rating, title, text, date, trip type, travel date, owner response, photos, language. Full history, filters by language, rating, date and keyword. No reviewer names.

- **URL**: https://apify.com/quarra/tripadvisor-reviews-scraper.md
- **Developed by:** [Quarra Labs](https://apify.com/quarra) (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

from $0.83 / 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

## Tripadvisor Reviews Scraper & API

Get the reviews of any hotel, restaurant, attraction or tour on Tripadvisor, in bulk, without an account or API key.
Paste the links of the places, from any Tripadvisor site (tripadvisor.com, .co.uk, .fr, .de…). Each review comes back
with its rating, title, text, date, travel date, trip type, detailed ratings, photos, helpful votes, language, and the
owner's response with its date. Full history, filters by language, rating, date and keyword, and an optional place
record (address, coordinates, phone, website, rating per star, reviews per language). Export as JSON, CSV or Excel, or
read it through the Apify API.

**No reviewer name, profile or ID; the reviewer's name is removed from owner replies.** We deliver what was said
about the place, not who said it. The owner's reply is kept in full, except the name it uses for the reviewer, which
becomes `[reviewer]`, in any language: in the greeting ("Dear Justin K,", "Hello, Frank,", "Bonjour Madame Dupont,",
"Здравствуйте, Иван!", "张三先生您好", "hirotoshi様"), at the start of a paragraph ("Chris, thank you…"), after a thank
you ("Thank you Liza,", "…for your review, Chris.") and wherever the reviewer's own screen name appears. A distinctive
screen name (such as `travelbug2019`) is removed from the review title and text too. Ordinary words stay: "Dear Valued
Guest" and "Bonjour à tous" are not touched, and a reviewer called "Happy" does not turn "Happy hour" into
"\[reviewer] hour".

### Quick start

1. Paste one or more Tripadvisor links into **Tripadvisor links**, for example
   `https://www.tripadvisor.com/Hotel_Review-g60763-d93450-Reviews-Hyatt_Grand_Central_New_York-New_York_City_New_York.html`.
2. Set **Max reviews per place**.
3. Click **Start** and read the reviews in the run's **Output** tab.

Like any Apify Actor, it can also be run and read through the Apify API, scheduled, and connected to webhooks, Make,
Zapier, n8n or Apify's MCP server for AI agents.

### What it is used for

- **Reputation monitoring**: the newest reviews of your hotels or restaurants since a date, every day, with the owner
  responses, to see what still has no answer.
- **Competitor analysis**: what guests praise or complain about at the places around yours, star by star.
- **Market research**: the same city or chain across languages and countries.
- **Sentiment analysis and AI agents**: one clean record per review, with a stable ID to deduplicate between runs.

### What you get

| | |
|---|---|
| Review ID (stable: use it to deduplicate between runs) | yes |
| Rating, title and text | yes |
| Date of the review (UTC, ISO 8601) and month of the stay or visit | yes / when given |
| Trip type (family, couples, solo, business, friends) | when given |
| Detailed ratings (service, value, rooms…) | when given |
| Photos of the review (links) and photo count | yes |
| Helpful votes | yes |
| Owner response (the reviewer's name replaced by `[reviewer]`) and its date | when there is one |
| Language, original language, translation flags (by machine or by a human translator) | yes |
| Link of the review and of the place | yes |
| Reviewer name, screen name, ID, avatar, profile, home town | **no, never** |

With **Add place details**, one more record per place: name, type, average rating, number of reviews, reviews per
star, reviews per language, address, latitude and longitude, phone and website of the business, opening hours, rank in
its city, description, the Tripadvisor distinction of the year, whether it is closed, cuisines and price range
(restaurants), amenities (hotels) and main photo.

A field Tripadvisor does not give for a review is `null`, never missing.

### Inputs

- **Tripadvisor links**: links of hotels (`Hotel_Review`), restaurants (`Restaurant_Review`), attractions
  (`Attraction_Review`) and tours (`AttractionProductReview`), from any Tripadvisor country site. A link to a single
  review (`ShowUserReviews`) reads the whole place. Up to 500 place and language pairs per run.
- **Max reviews per place** and **Max results in total**: counted exactly. **Max results in total** is 1,000 by
  default: raise it when you want more (5 places × 2,000 reviews = 10,000).
- **Languages**: language codes (`en`, `fr`, `de`, `zh-TW`…). Left empty, every review of the place is read once,
  mostly in the language it was written in; Tripadvisor gives some in English translation (about 1 in 10 at New York
  hotels), flagged `translated: true` with their `originalLanguage`. With languages, each place is read once per language, and only reviews written in that language
  are delivered, unless **Include translations** is on (see Limits). Regional codes (`pt-BR`, `en-GB`, `nb-NO`…)
  are read as their language.
- **Sort**: newest first, most detailed, or Tripadvisor's default order. With **Since** or **Until**, the reviews are
  always read newest first, so the reading stops at the date you set (the run says so if you chose another sort).
- **Minimum rating**, **Maximum rating**, **Since**, **Until** (a date such as `2026-01-31`, or a duration such as
  `30 days`) and **Review contains** (up to 50 words, one per line, matched as whole words: `rat` does not match
  `rate`; in Chinese, Japanese, Korean or Thai, where words are not separated by spaces, any text that contains it).
  Ratings and words are searched by Tripadvisor itself (one search per word, merged without repeats), so rare words
  or a one-star filter do not read the whole place (see Limits for the exceptions).
- **Add place details** and **Place details only**.

Example, through the API:

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Hotel_Review-g60763-d93450-Reviews-Hyatt_Grand_Central_New_York-New_York_City_New_York.html"
  ],
  "languages": ["en"],
  "sort": "newest",
  "maxRating": 2,
  "since": "90 days",
  "maxReviewsPerPlace": 1000,
  "scrapePlaceDetails": true
}
```

### Output

One record per review in the dataset. A shortened review:

```json
{
  "type": "review",
  "status": "ok",
  "reviewId": "1081854929",
  "placeId": "4418144",
  "placeName": "Reichenbach Hall",
  "placeType": "restaurant",
  "languageFilter": null,
  "rating": 5,
  "title": "Great beber and bartender",
  "text": "I was taken care very well. Sarita has great energy!",
  "language": "en",
  "originalLanguage": "en",
  "machineTranslated": false,
  "translated": false,
  "date": "2026-10-15T01:14:36Z",
  "travelDate": "2026-10",
  "tripType": "SOLO",
  "subratings": null,
  "helpfulVotes": 0,
  "photoCount": 0,
  "photoUrls": null,
  "ownerResponse": null,
  "ownerResponseDate": null,
  "reviewUrl": "https://www.tripadvisor.com/ShowUserReviews-g60763-d4418144-r1081854929-Reichenbach_Hall-New_York_City_New_York.html",
  "placeUrl": "https://www.tripadvisor.com/Restaurant_Review-g60763-d4418144-Reviews-Reichenbach_Hall-New_York_City_New_York.html",
  "position": 1,
  "scrapedAt": "2026-10-18T19:00:40Z"
}
```

A shortened place record:

```json
{
  "type": "place",
  "status": "ok",
  "placeId": "93450",
  "placeName": "Hyatt Grand Central New York",
  "placeType": "hotel",
  "rating": 3.5,
  "reviewCount": 15041,
  "ratingHistogram": {"1": 1678, "2": 1708, "3": 2953, "4": 4330, "5": 4372},
  "languageCounts": {"en": 12802, "es": 5779, "fr": 3521, "…": 0},
  "address": {"street": "109 East 42nd Street", "street2": "Grand Central Terminal", "postalCode": "10017-8500",
              "city": "New York City", "area": "New York City, New York",
              "fullAddress": "109 East 42nd Street Grand Central Terminal, New York City, NY 10017-8500"},
  "latitude": 40.752064,
  "longitude": -73.9763,
  "phone": "+1 212-883-1234",
  "website": "https://www.hyatt.com/hyatt-hotels/en-US/nycgh-hyatt-grand-central-new-york",
  "amenities": ["Free Internet", "Free Wifi", "Air conditioning", "…"],
  "rankPosition": 420,
  "rankTotal": 529,
  "rankText": "#420 of 529 hotels in New York City",
  "isClosed": false
}
```

- `status`: `ok` (delivered, charged) or `error` (free; `errorCode` and `error` say why, `retryable` says if a later
  run may work). A link to a place that no longer exists gets a free `place_not_found` record; when Tripadvisor merged
  the listing into another one, the record gives the link of that other listing.
- `position` is the rank of the review in the chosen sort for that place (and language); with **Review contains**,
  its rank among the reviews that contain your words.
- `translated` is `true` when the text is a translation of a review written in `originalLanguage`, by machine
  (`machineTranslated: true`) or by a human translator.
- `languageCounts` counts the reviews readable in each language, translations included, as Tripadvisor does.

The run summary (counts per place, name, rating, why the run stopped, notes) is the `OUTPUT` record of the run's
key-value store. With **Since** or **Review contains**, and without **Until**, **Add place details** or
**Languages**, the summary leaves out each place's rating: those runs stay as cheap as possible (add place details to
get it).

### What we measured

On 18 October 2026, on Apify:

- **Full history, without gaps**: reviews were read 2,400 at a time per place without a single refusal, down to
  offset 14,000 on a hotel with 15,041 reviews.
- **Duplicates**: Tripadvisor lists a pinned review at the top and again at its date, about 1 in 2,400 reviews. It
  is delivered and charged once.
- **Languages**: on the Empire State Building, of the first 80 reviews Tripadvisor lists under French, 43 are English
  reviews machine-translated into French. So by default a language filter returns only reviews written in that
  language, and the run says how many translations it skipped.
- **A real run**: three places (a New York hotel, the Empire State Building, a German restaurant), up to 3,000
  reviews each, with place details: 6,130 reviews and 3 place records in 104 seconds, every review ID distinct, every
  review with a rating, a date and a text.
- **Old links**: of three links taken from old pages, one was a listing Tripadvisor had merged into another place and
  two no longer existed. Each got a free error record saying so, instead of the reviews of a different place.

### Pricing

Pay per event. Reviews cost less on higher Apify plans:

| Apify plan | Review | Place record |
|---|---|---|
| Free | $4.60 per 1,000 | $4.60 per 1,000 |
| Starter (Bronze) | $1.75 per 1,000 | $2.70 per 1,000 |
| Scale (Silver) | $1.40 per 1,000 | $2.30 per 1,000 |
| Business (Gold) and above | $0.83 per 1,000 | $1.80 per 1,000 |

A place record is delivered only with **Add place details** or **Place details only**. On every plan, the run start
is $0.005 per GB of memory (1 GB minimum; $0.005 at the default 256 MB). So 1,000 reviews of one place come to $4.605
on the Free plan and $0.835 on Business.

Never charged: reviews that do not match your filters, translations you did not ask for, error records,
repeats (a review already delivered in the same run is skipped). Set **Maximum cost per run** in the run options and
the run stops before going over it, with the results delivered so far. If a place record no longer fits under that
maximum but a review does, the place record is skipped (not charged, said in the place's `note`) and the reviews keep
coming until the maximum is reached.

### Limits

- **Translations.** For a language, Tripadvisor lists the reviews written in it and reviews translated into it,
  mostly by machine, a few by a human translator. Off by default; with **Include translations** they are delivered
  too, flagged `translated: true` (and `machineTranslated: true` when done by machine) with their `originalLanguage`.
  Tripadvisor offers no way to list only the originals, so when nearly all the reviews it lists in a language are
  translations (Korean or Japanese at a big New York hotel), the reading of that place in that language stops once it
  costs more than the originals it finds; the place's `note` says so and the other places go on. With translations on
  and several languages asked for, a review comes once, under the language it was written in.
- **Dates and sort.** With "Since" or "Until", the reviews are read newest first whatever the sort you chose: it is the
  only order where the reading can stop at a date. With "Until" far in the past, the start of the window is found with
  a few small requests (7 in all for a 2015 date at a hotel of 15,000 reviews), not by reading every newer review; the
  same with **Review contains**.
- **Keyword search by Tripadvisor**: each word is searched by Tripadvisor (for an expression, its longest word), then
  the whole word or expression is checked while reading. Words in Chinese, Japanese and Korean are searched by
  Tripadvisor too; words in Thai, Lao, Khmer or Burmese, and expressions with no word of 3 letters or more (`tv`,
  `ac`), are matched while reading every review of the place: at a big place with few matches, that reading can stop
  at the run's cap on unpaid reading, and the run says so. Tripadvisor searches the review's original text:
  with **Include translations**, a translated review is found only when its original text contains your words.
- **1,000 results per searched word**: Tripadvisor's search lists at most 1,000 reviews containing a word. Sorted by
  newest (or with "Since" or "Until"), the older reviews are then read without the search and checked here: you get
  them all, the ones without your words are not charged, the run just takes longer. With another sort, only those
  1,000 can be found, and the place's `note` says so.
- **A language with no reviews at a place** (per the place's own count) is not read at all: watching many places in one
  language costs nothing for the places that have none.
- **Watching many places with "Since"**: on a day with no new review anywhere, one run checks about 300 places for the
  price of the start alone; beyond that it stops, says so, and gives the places it did not check a free `not_read`
  record. Every new review delivered raises that number, so a day with news covers more places. With **keywords**,
  each place needs one more check, so a quiet day covers about 150 places.
- **Removed or merged places**: an old link can lead to another place or to a list page; it then gets a free
  `place_not_found` record instead of reviews of the wrong place.
- **Price range** is given for restaurants ($ to $$$$); hotel room prices change by date and are not included.
- If a run stops early (your maximum cost, Max results in total, its timeout), every place it did not read in full
  and gave nothing for gets a free `not_read` record, so no input is ever left without an answer (beyond 25 such
  places, the others are listed in the `OUTPUT` record only).
- Anything missing from a result is said: in the run's status, in the `note` of each place in the `OUTPUT` record, or
  in a free error record. If Tripadvisor limits access during a run, the run says so and keeps what it delivered;
  running it again later gives the rest.

### FAQ

**Do I need a Tripadvisor account or API key?** No.

**Why are reviewer names not included?** They are personal data and most uses (reputation, sentiment, research) do not
need them. There is no reviewer name, profile or ID in the results; the reviewer's name is removed from owner replies,
whose text is kept. The review ID and link let you find any review on Tripadvisor.

**Why do I get fewer reviews than the place's review count?** The count covers all languages; with a language filter you
get the reviews written in that language. The `languageCounts` of the place record counts the reviews readable in each
language, translations included, so it can be higher than what you get when **Include translations** is off.

**What if the run is restarted by the platform (migration or reboot)?** It resumes where it was: results already in
the dataset are not delivered or charged again. If it cannot (its saved progress is missing), it stops at once and says
so: what is in the dataset is not charged again, and a new run gives the rest.

**Is it legal?** It collects public reviews shown to any visitor of Tripadvisor, without reviewer names. Check the
rules that apply to your use of the data.

**Does the Actor send anything to Quarra?** Only when a run fails or runs out of time: the Actor, its build, the error
type, the line of our code where it happened, and the memory and time the run was given, so we can fix it fast. Never
your input, your results, your account or the run ID.

# Actor input Schema

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

One per line: links of hotels, restaurants, attractions or tours, from any Tripadvisor site (tripadvisor.com, .co.uk, .fr, .de…). Example: https://www.tripadvisor.com/Hotel_Review-g60763-d93450-Reviews-Hyatt_Grand_Central_New_York-New_York_City_New_York.html

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

Stop a place after this many reviews (per language when you set several).

## `maxItems` (type: `integer`):

Stop the run after this many charged records (reviews and place records), all places together. Default 1,000: raise it when you want more (for example 5 places × 2,000 reviews = 10,000).

## `languages` (type: `array`):

Review languages, one per line (en, fr, de, es, it, ja, zh-CN, zh-TW…). Empty: all languages, each review once, mostly in the language it was written in (some in English translation, flagged 'translated'). Each place is read once per language.

## `includeMachineTranslations` (type: `boolean`):

With 'Languages': also deliver reviews that Tripadvisor shows translated into that language (machine or human translations). Off: only reviews written in it (the others are skipped, not charged).

## `sort` (type: `string`):

Order of the reviews. With 'Since' or 'Until', the reviews are always read newest first.

## `scrapePlaceDetails` (type: `boolean`):

Also deliver one record per place: address, coordinates, phone, website, rating, number of reviews per star and per language, ranking in its city, opening hours, cuisines and price range (restaurants), amenities (hotels), description. Charged once per place.

## `placeDetailsOnly` (type: `boolean`):

Deliver only the place records, no reviews.

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

Keep only reviews with at least this many stars (1 to 5). Empty keeps all.

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

Keep only reviews with at most this many stars. Set both to 1 for one-star reviews only.

## `since` (type: `string`):

Only reviews from this date on: 2026-01-31, or a duration such as '30 days', '3 months'. Empty keeps all.

## `until` (type: `string`):

Only reviews up to this date (included). Empty keeps all.

## `keywords` (type: `array`):

Keep only reviews whose title or text contains one of these words, as a whole word (not case-sensitive: 'rat' does not match 'rate'). One per line, 50 at most.

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

Connection. Keep the default (automatic). Costs are included in the price.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Restaurant_Review-g60763-d4418144-Reviews-Reichenbach_Hall-New_York_City_New_York.html"
  ],
  "maxReviewsPerPlace": 20,
  "maxItems": 1000,
  "includeMachineTranslations": false,
  "sort": "newest",
  "scrapePlaceDetails": false,
  "placeDetailsOnly": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Every record with all its fields, and free error records.

## `overview` (type: `string`):

One line per review.

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

Counts per place, why the run stopped, errors.

# 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/Restaurant_Review-g60763-d4418144-Reviews-Reichenbach_Hall-New_York_City_New_York.html"
    ],
    "maxReviewsPerPlace": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("quarra/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/Restaurant_Review-g60763-d4418144-Reviews-Reichenbach_Hall-New_York_City_New_York.html"],
    "maxReviewsPerPlace": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("quarra/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/Restaurant_Review-g60763-d4418144-Reviews-Reichenbach_Hall-New_York_City_New_York.html"
  ],
  "maxReviewsPerPlace": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call quarra/tripadvisor-reviews-scraper --silent --output-dataset

```

## MCP server setup

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