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

Scrape every Tripadvisor review for any hotel, restaurant, attraction or tour. Just add URLs and get the rating, title, full text, language, stay date, trip type, photos, helpful votes, owner responses and reviewer profile. Filter by language, rating or keyword. $0.40 per 1,000 reviews.

- **URL**: https://apify.com/boncross/tripadvisor-reviews.md
- **Developed by:** [BonCross API](https://apify.com/boncross) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.28 / 1,000 review-scrapeds

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

### What is Tripadvisor Reviews Scraper?

Tripadvisor Reviews Scraper gets you the reviews for any Tripadvisor hotel, restaurant, attraction or tour. Paste the page's link and you get what travellers wrote about the place, back to the very first review, at $0.40 per 1,000.

It's the one to use when you already know which places you want. If you still need to find them, the Tripadvisor Hotels, Restaurants and Attractions scrapers list a whole city, and Tripadvisor Place Details returns the record for a single place.

What sets it apart:

- **Depth.** One run reads up to 100,000 reviews per place. Eight places with up to 400 reviews each returned 2,808 reviews in 5.5 seconds.
- **Price.** $0.40 per 1,000 reviews on the Free plan and $0.28 on Business, with proxy usage and platform usage included. The fixed fees on a one-place run add up to $0.0015.
- **Questions and tips too.** Switch them on and you get each traveller question with all of its answers, and the short tips people leave. On 4 October 2026 the Louvre's 825 questions and a large Times Square hotel's 1,772 tips all came back.
- **Filters that save you money.** You pay for the reviews you keep. Language, rating, keyword, trip type, month of visit and date all narrow the list before anything is charged.
- **An answer for each input.** A mistyped id, a city page or a place nobody has reviewed yet gets a row that says why.

**BonCross Verified** means we tested this actor against the live site before release and kept the record:

- 38 of 38 live checks on its inputs and filters passed on 7 October 2026
- 15 places run the same day across hotels, restaurants and attractions: 241 reviews, 6 error rows
- Charges matched the rows: 13 places, 241 reviews
- An unknown id or an unreviewed place gets a row saying why

More of what you can do with it:

- Read the rating, title and full review text, with the language it was written in
- See the month the traveller visited and their trip type, for seasonal and segment analysis
- Collect the owner's reply next to the review it answers, with its date
- Narrow by language, star rating, keyword, trip type, month of visit or publication date
- Get the sub-ratings a traveller gave, such as value, rooms, location and cleanliness
- Get review photos at full resolution
- Leave reviewer names and profiles out when you don't want personal data in your dataset
- Schedule it and receive only the reviews that appeared since the last run
- Download the result as JSON, CSV, Excel, XML or HTML

People mostly use it to track how a hotel's rating moves month by month, to read a competitor's complaints before a repositioning, to find the phrases guests repeat about breakfast, noise or check-in, to measure how quickly a business answers its reviews, and to build labelled review text for sentiment work.

### What data do you get for each review?

| Field | Description |
|---|---|
| ⭐ Rating | The traveller's score out of five |
| 📝 Title | The review headline |
| 💬 Review text | The full text, never truncated |
| 🗓️ Published date | When the review went live |
| 🛏️ Stay month | The month the traveller visited |
| 👪 Trip type | Family, couples, business, friends or solo |
| 🌍 Language | The language the review was written in |
| 🙋 Reviewer name | Display name and username |
| 🏠 Reviewer hometown | Where the traveller is from |
| Reviewer contributions | How many reviews and helpful votes they have |
| 👍 Helpful votes | How many people found the review useful |
| 💼 Owner response | The business reply and its date |
| 📊 Sub-ratings | Value, rooms, location, cleanliness and more |
| 📷 Photos | Full resolution images attached to the review |
| 🔗 Review URL | A direct link to the review on Tripadvisor |
| 🏨 Place name and rating | The place's name, overall score and review total |
| ❓ Questions and answers | Optional: each traveller question, its language and asker, and all its answers with their dates and upvotes |
| 💡 Tips | Optional: travellers' short tips, with the month of the visit and the review they came with |

A review row also has these columns:

| Column | Meaning |
|---|---|
| `originalLanguage`, `isMachineTranslated` | The language the review was written in, and whether the text you receive is Tripadvisor's translation of it |
| `createdAt` | When the review was submitted. `postedAt` is when it went live |
| `stayDate` | The stay month as Tripadvisor stores it (the last day of that month). `stayMonth` is the same as YYYY-MM |
| `authorUsername`, `authorId`, `authorUrl`, `authorAvatar` | The reviewer's profile identity |
| `isVerifiedAuthor` | Tripadvisor's verified-reviewer badge |
| `hasOwnerResponse`, `ownerResponseAt` | Whether the business replied, and when |
| `productName` | The tour or ticket the review is about, on tours and experiences only |
| `status` | Tripadvisor's publication status, `PUBLISHED` on public reviews |
| `locationType` | How Tripadvisor classes the place: `ACCOMMODATION`, `EATERY`, `ATTRACTION` or, for a tour, `ACTIVITY` |
| `locationUrl` | The place's Tripadvisor page |
| `input`, `error` | What you asked for and, on a row for an input that could not be read, why |

### How to scrape Tripadvisor reviews

You don't need to write code. It's a form, and the result opens as a spreadsheet.

1. [Create a free Apify account](https://console.apify.com/sign-up) and open [Tripadvisor Reviews Scraper](https://apify.com/boncross/tripadvisor-reviews).
2. Open the place on Tripadvisor, copy the address from your browser and paste it into "Tripadvisor URLs or location ids". Add as many places as you like.
3. Set "Maximum reviews per place". The default is 100. Set it high if you want the lot.
4. Add a language, rating or keyword filter if you only want part of the list.
5. Press Start. When the run finishes, download the reviews as Excel, CSV or JSON.

### ⬇️ Input

Paste Tripadvisor page addresses, or just the numeric location ids. That's the only thing you have to give it. A long list can go in "Start URLs (bulk upload)" instead, which loads links from a file, a Google Sheet or a remote list. The two are combined.

You have two limits. "Maximum reviews per place" applies to each place separately: ten places at 50 each returns 500. "Maximum results for the whole run" caps the total, and you aren't charged for anything past it.

#### All the reviews for one hotel

```json
{
  "locations": ["https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html"],
  "maxReviewsPerLocation": 100000
}
```

#### Recent English complaints only

```json
{
  "locations": ["93589"],
  "sortBy": "recent",
  "recentDays": 90,
  "reviewLanguages": ["en"],
  "ratings": ["1", "2"],
  "maxReviewsPerLocation": 500
}
```

#### Summer family stays, with no personal data

```json
{
  "locations": ["93589"],
  "tripTypes": ["FAMILY"],
  "stayMonths": ["6", "7", "8"],
  "includeReviewerProfile": false,
  "maxReviewsPerLocation": 300
}
```

#### What travellers say about one topic

```json
{
  "locations": ["188151"],
  "containsText": "queue",
  "maxReviewsPerLocation": 300
}
```

#### A daily watch that returns only new reviews

```json
{
  "locations": ["93589", "1073239"],
  "reviewedAfter": "2026-01-01",
  "onlyNewReviews": true,
  "dedupStoreName": "my-tripadvisor-watch"
}
```

A few switches the examples don't show:

- "Only reviews with an owner response" (off by default) keeps only reviews the business has replied to.
- "Start from review number" (default 0) skips that many reviews before collecting, which lets you resume a large job.
- "Include Tripadvisor's translations" (on by default) returns reviews in other languages with Tripadvisor's translation applied. Turn it off to keep the original wording only.
- "Add the place's own rating and review count" (on by default) puts the place's name, overall rating and total review count on each review row.

#### Questions, answers and tips

Switch on "Add questions and answers" or "Add traveller tips" and the place's questions and tips arrive as extra rows after its reviews. They have their own limits, 100 per place each unless you change them. Review rows don't change. The extra rows have `dataType` (`question` or `tip`) and the place columns `locationId`, `locationName`, `locationType` and `locationUrl`, and the dataset has a Questions and answers view and a Tips view.

A place's questions with their answers, and its tips, beside the newest reviews:

```json
{
  "locations": ["188757"],
  "maxReviewsPerLocation": 20,
  "includeQuestions": true,
  "maxQuestionsPerLocation": 1000,
  "includeTips": true,
  "maxTipsPerLocation": 1000
}
```

For questions or tips with no reviews at all, set the review limit to 0. You then pay for the start, each place, and the question and tip rows.

```json
{
  "locations": ["188757"],
  "maxReviewsPerLocation": 0,
  "includeQuestions": true,
  "maxQuestionsPerLocation": 100
}
```

| Column | On | Meaning |
|---|---|---|
| `id` | both | `question-…` or `tip-…`, unique across the dataset |
| `questionId` / `tipId` | question / tip | Tripadvisor's id |
| `url` | both | The place page where the question or tip is shown |
| `text` | both | The question, or the tip, in full |
| `language` | both | The language it was written in. On tips, set when **Languages** is used, otherwise empty |
| `postedAt` | both | When it was posted |
| `authorName`, `authorId`, `authorUrl`, `authorAvatar` | both | Who asked the question or wrote the tip |
| `authorHometown`, `authorContributions` | question | The asker's hometown and contribution count |
| `answerCount` | question | How many answers the question has |
| `answers` | question | All the answers: `id`, `questionId`, `text`, `postedAt`, `upvotes`, `isTopAnswer` and who answered (`authorName`, `authorId`, `authorUrl`, `authorHometown`, `authorContributions`). The top answer comes first, the rest oldest first |
| `reviewId` | tip | The review the tip was left with |
| `stayMonth` | tip | The month of the visit, as YYYY-MM |

#### For developers

- `maxReviewsPerLocation` (default 100) is the per-place limit and `maxItems` (default 0, no cap) the run-wide one. `maxItems` counts each charged row: a place's reviews first, then its questions (`maxQuestionsPerLocation`), then its tips (`maxTipsPerLocation`).
- When a filter or the de-duplication store keeps nothing, the read stops early: after 5 pages in a row with no review kept, or after about three times the pages the per-place limit needs.
- On the newest-first order the read also stops at the `reviewedAfter` date, and at the first few reviews an earlier run returned. A scheduled run with `onlyNewReviews` and a `dedupStoreName` returns the reviews posted since the last run. Older reviews that an earlier run didn't return are not filled in later.
- `maxReviewsPerLocation: 0` with `includeQuestions` and `includeTips` both off stops the run at once with an error row explaining why, and nothing is charged.
- `maxConcurrency` (default 32, from 1 to 32) is how many requests run at once across the run. It's worth lowering only when a run reports errors. At 1 the run is strictly one request at a time, and the rows and their order are the same either way.
- `delayMs` (default 0) adds a pause before each request, in milliseconds. We'd leave it at 0.
- Rows are saved as they arrive. If Apify restarts a run part-way through, it carries on where it stopped and no review is saved or charged twice.

### ⬆️ Output

You get one row per review in the run's dataset. The Overview view shows the rating, text, dates and reviewer at a glance.

```json
{
  "id": "1076642082",
  "url": "https://www.tripadvisor.com/ShowUserReviews-g60763-d93589-r1076642082-The_Michelangelo_New_York-New_York_City_New_York.html",
  "scrapedAt": "2026-09-12T17:41:08.402Z",
  "locationId": "93589",
  "locationName": "The Michelangelo New York",
  "locationType": "ACCOMMODATION",
  "title": "Great Broadway Hotel!",
  "text": "Spacious! Great Location! Super friendly staff! Enjoyed immensely!",
  "rating": 5,
  "ratingScale": 5,
  "language": "en",
  "postedAt": "2026-09-06",
  "stayDate": "2026-08-31",
  "stayMonth": "2026-08",
  "tripType": "COUPLES",
  "authorName": "R D",
  "authorHometown": "Houston, Texas",
  "authorContributions": 3,
  "helpfulVotes": 0,
  "subRatings": [{ "name": "Value", "rating": 5 }, { "name": "Rooms", "rating": 5 }],
  "photos": [],
  "photoCount": 0,
  "hasOwnerResponse": true,
  "ownerResponseText": "We are delighted that your room gave you plenty of space…",
  "ownerResponseAt": "2026-09-08",
  "locationRating": 4.5,
  "locationReviewCount": 5211
}
```

A question row, with "Add questions and answers" on (shortened):

```json
{
  "dataType": "question",
  "id": "question-10245992",
  "questionId": "10245992",
  "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html",
  "locationId": "93589",
  "locationName": "The Michelangelo New York",
  "text": "Is there a mini mart or supermarket within close walking distance, say 10 minutes.  Thanks.",
  "language": "en",
  "postedAt": "2025-02-09",
  "authorName": "Lisa P",
  "authorContributions": 6,
  "answerCount": 2,
  "answers": [
    { "id": "20509537", "questionId": "10245992", "text": "Yes, there is multiple options. CVS was very close.", "postedAt": "2025-07-23", "upvotes": 0, "isTopAnswer": true, "authorName": "Heath B" }
  ]
}
```

A tip row, with "Add traveller tips" on:

```json
{
  "dataType": "tip",
  "id": "tip-50212563",
  "tipId": "50212563",
  "reviewId": "1075399379",
  "locationId": "93589",
  "locationName": "The Michelangelo New York",
  "text": "A very Italian style hotel in west midtown near shopping, theaters, MOMA and not too far from Central Park",
  "postedAt": "2026-08-29",
  "stayMonth": "2026-08",
  "authorName": "Papalotillo"
}
```

Two more columns on a review row: `authorHelpfulVotes` is the total helpful votes the reviewer has received across all their contributions (null where their profile doesn't show it), and `locationRatingScale` is the scale of `locationRating`, which is `5` when the place's overall rating is known and null otherwise.

### How many reviews can you get, and how fast?

A run pages through a place's reviews until the list ends or your limit is reached, up to 100,000 reviews per place.

| Run | Reviews | Time | Charge on the Free plan |
|---|---|---|---|
| One hotel, newest 10 | 10 | 2 s | $0.0055 |
| Four places, up to 150 each | 458 | 3 s | $0.1862 |
| Eight places, up to 400 each | 2,808 | 5.5 s | $1.1282 |
| 25 places, up to 40 each | 800 | 6 s | $0.3335 |

These are whole runs on Apify, measured on 2 and 3 October 2026, start-up included. Several places are read at once, which is why a longer list adds little time.

Questions and tips reach the end of a place's list too. Three places (a hotel, a restaurant and the Louvre) with 5 reviews, up to 150 questions and 30 tips each returned 15 reviews, 330 questions with 1,378 answers between them, and 90 tips in 13 to 20 seconds. Each question had its language and 89% had at least one answer. 60% of askers and 79% of answerers gave a hometown. The tips all had a visit month and the review they came with.

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

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `actor-start`, per run | $0.001 | $0.001 | $0.001 | $0.001 |
| `location-resolved`, per place resolved | $0.0005 | $0.0005 | $0.0005 | $0.0005 |
| `review-scraped`, per review returned | $0.0004 | $0.00036 | $0.00032 | $0.00028 |
| `question-scraped`, per question returned | $0.0004 | $0.00036 | $0.00032 | $0.00028 |
| `tip-scraped`, per tip returned | $0.0002 | $0.00018 | $0.00016 | $0.00014 |

Enterprise plans pay the Business price.

**$0.40 per 1,000 reviews** on the Free plan, $0.28 on Business. That's the whole price. Proxy usage and platform usage are included, and there's no proxy for you to set up.

- One hotel with 1,000 reviews: $0.001 + $0.0005 + 1,000 × $0.0004 = **$0.4015** ($0.28 on Business).
- Ten places at 200 reviews each: $0.001 + 10 × $0.0005 + 2,000 × $0.0004 = **$0.806** ($0.57 on Business).
- One place with 1,000 reviews, 100 questions and 100 tips: $0.001 + $0.0005 + $0.40 + $0.04 + $0.02 = **$0.4615** ($0.32 on Business).

Questions and tips are billed only when you switch them on. Small runs stay cheap because the fixed fees are a tenth of a cent per run and a twentieth of a cent per place.

Apify's Free plan gives you $5 of credits a month, which is about 12,000 reviews with this actor: twelve hotels at 1,000 reviews each before you pay anything.

### Keep watch on a place, or call it from your own code

For a review monitor, create an Apify Schedule, switch on "Only reviews not seen in earlier runs" and give the de-duplication store a name. Each run then hands you the reviews posted since the last one, and a webhook or one of Apify's integrations can pass them on to Slack or a Google Sheet.

From code, `POST https://api.apify.com/v2/acts/boncross~tripadvisor-reviews/run-sync-get-dataset-items` with the input JSON as the body returns the reviews of a short run in one call. Longer runs go through the standard run endpoints or the `apify-client` package for Node.js or Python.

An AI agent can call it through the Apify MCP server (`mcp.apify.com`), where the actor appears as the tool `boncross/tripadvisor-reviews`. Give the agent a place and a filter and it can summarise the complaints, or draft owner replies from the review text.

### FAQ

#### Do I need proxies or a Tripadvisor account?

Neither. There's no login, and proxy usage is part of the price.

#### How do I get all the reviews a place has, not the first page?

Set "Maximum reviews per place" high, up to 100,000. The run keeps reading until it reaches the oldest review.

#### Why did a place return one row with an error and no reviews?

Tripadvisor lists no reviews for it yet. You get one row that names the place and says so in `error`, with no review columns. The place fee still applies, and the row itself is free. A city or region page, an id Tripadvisor doesn't know, or an input with no Tripadvisor id in it also gets a row with `input` and `error`. Those cost nothing.

#### Which filters make a run cheaper?

All of them. You pay per review returned, and a review a filter drops isn't charged. Trip type and month of visit are applied by Tripadvisor itself. A "published after" date on the newest-first order ends the run as soon as it has passed the date.

#### Can I leave reviewer names out?

Turn off "Include reviewer details". The name, username, id, avatar and hometown are then left empty.

#### Are reviews in other languages translated?

By default, yes. Tripadvisor's translation is applied, the row is flagged with `isMachineTranslated`, and `originalLanguage` holds the language it was written in. Turn "Include Tripadvisor's translations" off for the original wording. Questions and answers are returned as written, never translated.

#### Why are there tour reviews in an attraction's list?

Tripadvisor shows reviews of the tours and tickets sold at an attraction on the attraction's page, and you get the list as it's shown. Those rows have the tour's `locationId` and its `productName`. `input` names the place you asked for.

#### What won't it do?

- City and region pages have no review list. Use the page of a specific hotel, restaurant, attraction or tour.
- You can sort newest first or in Tripadvisor's order. Tripadvisor offers no other. In newest first, Tripadvisor pins one older review near the top of the first page, and the rest follow in date order. Date filters account for the pinned one.
- One run reads at most 100,000 reviews per place.
- Tripadvisor records a stay as a month. `stayMonth` is the field to use, and `stayDate` falls on that month's last day.
- Trip type and stay month are filled only where the traveller supplied them. The same goes for sub-ratings and photos: on one 40-review sample, sub-ratings were on 21 reviews and photos on 5.
- The month filter is checked a second time on each review, because Tripadvisor's version of it is approximate. The rows you get match the months you asked for exactly.
- Tour and activity products have a name on their rows but no separate overall rating.
- The rating, keyword, trip type and month filters apply to reviews only. The publication date applies to questions and tips too, and **Languages** applies to tips. Questions come in all languages, each labelled.
- On tips, `language` is filled only when **Languages** is set. With none set you get tips in all languages, unlabelled.
- Questions and tips are added after a place's reviews. For questions or tips alone, set the review limit to 0.
- If a page of reviews can't be read after its retries, that place's list stops there and a row says where.

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

The actor reads only what Tripadvisor publishes to any visitor who isn't signed in. Collecting public data is broadly lawful, but reviewer names are personal data, and what you do with them is your responsibility under GDPR and similar rules. Take legal advice if you're unsure.

### More from BonCross

- [Tripadvisor Place Details Scraper](https://apify.com/boncross/tripadvisor-location-details): The full Tripadvisor record for any hotel, restaurant or attraction.
- [Agoda Reviews Scraper](https://apify.com/boncross/agoda-reviews): Agoda hotel reviews, including the Booking.com reviews Agoda shows.
- [Booking.com Reviews Scraper](https://apify.com/boncross/booking-reviews): Every Booking.com guest review for any hotel.
- [Expedia Reviews Scraper](https://apify.com/boncross/expedia-reviews): Expedia guest reviews for any hotel, including hotels given as Hotels.com links.
- [Google Maps Reviews Scraper](https://apify.com/boncross/google-maps-reviews): Google Maps reviews for any place using URLs, Place IDs or names.
- [Accor Hotel Details Scraper](https://apify.com/boncross/accor-hotel-details): Full Accor hotel records.

### Your feedback

Is a review missing, or does a field look wrong against the Tripadvisor page? Tell us on the Issues tab in Apify Console, with the place's link if you can. We read each report and reply there.

# Changelog

This Actor's version history is a separate document: https://apify.com/boncross/tripadvisor-reviews/changelog.md

# Actor input Schema

## `locations` (type: `array`):

The places to scrape. Paste the address of any Tripadvisor hotel, restaurant, attraction or tour page, or just the numeric location id. Destination pages (the ones with a g-number and no place) have no review list of their own.

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

Tripadvisor page addresses, with the option to load them in bulk from a file, a Google Sheet or a remote list. Use this when you have more links than you want to paste. Combined with anything in the list above.

## `maxReviewsPerLocation` (type: `integer`):

Stop after this many reviews for each place. Set it high to take everything; the scraper reaches the last review a place has. Set 0 for no reviews at all when you only want questions or tips (turn on includeQuestions or includeTips below); 0 with both off stops the run straight away.

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

A run-wide ceiling across every target. The per-target limits apply to each one separately, so ten targets at 50 each returns 500; set this to cap the total. It counts every row charged for: reviews, and questions and tips when those are switched on (reviews come first for each place). Zero means no run-wide limit. Rows that report an input the actor could not resolve are not counted here and are never charged for.

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

Newest first reads the review list in date order. Tripadvisor's own order leads with the reviews it promotes.

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

Keep only reviews written in these languages, as two-letter codes such as en, fr, de, es, it, pt, ja. Tips follow the same list when they are switched on. Leave empty for every language.

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

Keep only reviews with these star ratings, from 1 to 5. Leave empty for all ratings.

## `containsText` (type: `string`):

Keep only reviews mentioning this word or phrase, for example breakfast or rooftop bar.

## `reviewedAfter` (type: `string`):

Keep only reviews published on or after this date, as YYYY-MM-DD. Questions and tips, when switched on, follow the same date. Pair it with newest first and the run stops as soon as it has passed the date.

## `onlyWithOwnerResponse` (type: `boolean`):

Keep only reviews the business has replied to.

## `tripTypes` (type: `array`):

Keep only reviews from these kinds of trip: FAMILY, COUPLES, SOLO, BUSINESS or FRIENDS. Applied by Tripadvisor itself, so filtered runs cost less. Leave empty for all.

## `stayMonths` (type: `array`):

Keep only reviews whose visit fell in these months, as numbers from 1 to 12. Applied by Tripadvisor itself, so filtered runs cost less. Useful for seasonal comparisons.

## `recentDays` (type: `integer`):

A shortcut for the published-after date. Set 30 to take only the last month of reviews.

## `startOffset` (type: `integer`):

Skip this many reviews before collecting. Use it to resume a large job.

## `machineTranslate` (type: `boolean`):

When on, reviews written in other languages come back with Tripadvisor's translation applied. Turn it off to keep the original wording only.

## `includeReviewerProfile` (type: `boolean`):

When off, reviewer name, username, id, avatar and hometown are left empty. Turn it off if you do not want personal data in your dataset.

## `includeLocationFacts` (type: `boolean`):

Adds one extra request per place so every review row also carries the place's name, overall rating and total review count.

## `includeQuestions` (type: `boolean`):

Adds one row per traveller question asked about the place, newest first, each carrying every answer it received (text, date, upvotes and who answered), the asker and the question's language. Question rows carry dataType "question" and are charged per question; review rows are unchanged.

## `maxQuestionsPerLocation` (type: `integer`):

Stop after this many questions for each place when questions are switched on. Set it high to take every question a place has.

## `includeTips` (type: `boolean`):

Adds one row per short tip travellers left with their review ("go early", "book the river-view room"), newest first, with the month of the visit, the tip's author and the id of the review it came with. Tip rows carry dataType "tip" and are charged per tip; review rows are unchanged.

## `maxTipsPerLocation` (type: `integer`):

Stop after this many tips for each place when tips are switched on. Set it high to take every tip a place has.

## `onlyNewReviews` (type: `boolean`):

Skip reviews already returned by a previous run. Needs a de-duplication store name.

## `dedupStoreName` (type: `string`):

Name of a key-value store that remembers which reviews have already been returned, so a scheduled run gives you only what is new.

## `delayMs` (type: `integer`):

Optional pause before each call, in milliseconds. 0 (the default) runs as fast as the parallel limit allows.

## `maxConcurrency` (type: `integer`):

How many requests run at once across the whole run. The default is the fastest level measured clean; lower it only if a run reports refusals or errors.

## Actor input object example

```json
{
  "locations": [
    "93589"
  ],
  "startUrls": [],
  "maxReviewsPerLocation": 100,
  "maxItems": 0,
  "sortBy": "recent",
  "reviewLanguages": [],
  "ratings": [],
  "containsText": "",
  "reviewedAfter": "",
  "onlyWithOwnerResponse": false,
  "tripTypes": [],
  "stayMonths": [],
  "recentDays": 0,
  "startOffset": 0,
  "machineTranslate": true,
  "includeReviewerProfile": true,
  "includeLocationFacts": true,
  "includeQuestions": false,
  "maxQuestionsPerLocation": 100,
  "includeTips": false,
  "maxTipsPerLocation": 100,
  "onlyNewReviews": false,
  "dedupStoreName": "",
  "delayMs": 0,
  "maxConcurrency": 32
}
```

# Actor output Schema

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

Tripadvisor reviews: every row the run returned.

## `stats` (type: `string`):

Counts for the run: what was resolved, fetched, filtered and returned.

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

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/tripadvisor-reviews").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 = { "locations": ["https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html"] }

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

```

## MCP server setup

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

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/3LkqGb8sY1dkd5kTG/builds/3RHhdA2qtX0oZ0AQ5/openapi.json
