# TripAdvisor Scraper 💰$0.45/1k | Hotels Restaurants Reviews (`memo23/tripadvisor-scraper`) Actor

TripAdvisor reviews, place data & hotel prices at $0.45/1k, 4x below the leader. Hotels, restaurants, attractions, tours & cruises: search a city or paste URLs or IDs. Filter reviews by rating, language & date, hotels by stars & price. Original text, Q\&A, only new reviews. JSON, CSV.

- **URL**: https://apify.com/memo23/tripadvisor-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Travel, Automation, Agents
- **Features:** Limited permissions
- **Stats:** 120 total users, 29 monthly users, 99.9% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $0.45 / 1,000 results

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

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

## What's an Apify Actor?

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

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

## How to integrate an Actor?

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

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

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

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

# README

<p align="center">
  <img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/tripadvisor-logo.png" alt="TripAdvisor Scraper" width="140" height="140" />
</p>

## TripAdvisor Scraper: Hotels, Restaurants, Attractions & Reviews

**Scrape TripAdvisor reviews and place data at $0.45 per 1,000 results, about 4x below the category leader's entry price, from one actor.**
Paste any hotel, restaurant, attraction, or tour URL, a bare TripAdvisor location ID, a city's listing page, or just a city name. Get review rows that already carry the place's metadata (rating, address, geo, ranking, rating histogram), or one rich row per place with amenities, category scores, hours, and nearby venues. Filter by star rating, language, date range, trip type, month, and keyword, keep only reviews in their original language, schedule it to collect only new reviews, and export JSON, CSV, or Excel.

<p align="center">
  <img src="https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/tripadvisor-card.png" alt="TripAdvisor Scraper card" width="720" />
</p>

### Why Use This Scraper?

- ✅ **Cheapest serious option — $0.45/1,000 results.** The category leader charges around $1.90/1,000 at its entry tier. Same review data, a fraction of the bill.
- ✅ **One actor, not two.** Reviews **and** place snapshots come from the same run — no separate "find places" actor feeding a separate "reviews" actor.
- ✅ **Hotels, restaurants, attractions, tours, and cruise ships** — every place type, all through one input.
- ✅ **Review + place metadata in every row.** Each review already carries `placeInfo` (rating, address, lat/lng, ranking, histogram). No follow-up enrichment step.
- ✅ **Review filters** for star rating, language, trip type, month of visit, keyword in the text, and sort order, plus a from/to date range (absolute or relative).
- ✅ **Original text or translation, your call.** TripAdvisor shows many reviews as machine translations. Every row says so in `isMachineTranslated` and `originalLanguage`, and one switch keeps only reviews in the words the reviewer wrote.
- ✅ **Hotel prices from booking sites.** Every hotel comes with nightly prices from Booking.com, Expedia, Hotels.com, the hotel's own site and others, for your dates and in your currency, before and with taxes. Narrow a city's hotels down by stars, traveler rating and nightly price.
- ✅ **URLs or location IDs.** Already have TripAdvisor IDs in a spreadsheet? Paste `208453` or `d208453` and the actor finds the place, whatever its type.
- ✅ **Search-query → geo expansion.** Type `"Chicago"` and let the actor discover hotels, restaurants, and attractions for that location.
- ✅ **Optional reviewer profiles and contact-email enrichment.**
- ✅ **Flat, nested, or place-only output** for whatever your pipeline expects, plus an optional Markdown version of every row (`markdownContent`) ready for an LLM or a RAG index.
- ✅ **Monitoring mode.** Schedule it with `onlyNewReviews: true` and every run returns only the reviews published since the previous one, so you never pay twice for the same review.
- ✅ **Any TripAdvisor country site.** Links from tripadvisor.co.uk, .de, .fr, .it, .es, .com.au and the rest are accepted as they are.

### Overview

The TripAdvisor Scraper is built for reputation teams, market analysts, researchers, and agencies who need structured review data from TripAdvisor without stitching together multiple tools.

By default the output is **review-shaped**: one dataset row per review, each carrying a compact `placeInfo` block for the parent hotel/restaurant/attraction. That means even if you start from a *listing* URL (a city's restaurants hub) or a *search query*, the run still resolves down to a stream of review rows — not separate "listing" rows.

Two other shapes are available when you need them:

- **Place-only snapshots** (`scrapeReviews: false`) — one rich row per place (ranking, amenities, category scores, nearby venues) and no reviews. Fast and low-cost for competitor monitoring.
- **Nested** (`outputShape: "nested"`) — one row per place with a `reviews[]` array inside.

### Supported Inputs

#### URL types

| URL type | Pattern | Example |
|---|---|---|
| Hotel place | `Hotel_Review-g{geo}-d{id}-Reviews-{slug}.html` | `https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html` |
| Restaurant place | `Restaurant_Review-g{geo}-d{id}-Reviews-{slug}.html` | `https://www.tripadvisor.com/Restaurant_Review-g60763-d25324283-Reviews-Allora_Fifth_Ave-New_York_City_New_York.html` |
| Attraction place | `Attraction_Review-g{geo}-d{id}-Reviews-{slug}.html` | `https://www.tripadvisor.com/Attraction_Review-g60763-d105123-Reviews-Statue_of_Liberty-New_York_City_New_York.html` |
| Tour / activity | `AttractionProductReview-g{geo}-d{id}-{slug}.html` | `https://www.tripadvisor.com/AttractionProductReview-g60763-d11451132-Statue_of_Liberty_Ellis_Island_Tour_with_Reserved_Ferry_Entry-New_York_City_New_Yor.html` |
| Single review | `ShowUserReviews-g{geo}-d{id}-r{review}-{slug}.html` | `https://www.tripadvisor.com/ShowUserReviews-g60763-d208453-r1083675907-Hilton_New_York_Times_Square-New_York_City_New_York.html` |
| Cruise ship | `Cruise_Review-d{id}-Reviews-{ship}` | `https://www.tripadvisor.com/Cruise_Review-d15611482-Reviews-Oasis_of_the_Seas` |
| Cruise listing | `Cruises-g{geo}-{region}-Cruises` | `https://www.tripadvisor.com/Cruises-g147237-Caribbean-Cruises` (81 ships, from every cruise line it lists) |
| Vacation rentals | `VacationRentals-g{geo}-…` | `https://www.tripadvisor.com/VacationRentals-g60763-Reviews-New_York_City_New_York-Vacation_Rentals.html` (read as the city's apartments and villas) |
| Restaurants GEO hub | `Restaurants-g{geo}-…{City}.html` | `https://www.tripadvisor.com/Restaurants-g35805-Chicago_Illinois.html` |
| Hotels GEO hub | `Hotels-g{geo}-…-Hotels.html` | `https://www.tripadvisor.com/Hotels-g60763-New_York_City_New_York-Hotels.html` |
| Attractions GEO hub | `Attractions-g{geo}-Activities-…html` | `https://www.tripadvisor.com/Attractions-g60763-Activities-New_York_City_New_York.html` |
| Restaurant finder | `FindRestaurants?geo=…&establishmentTypes=…` | `https://www.tripadvisor.com/FindRestaurants?geo=188673&establishmentTypes=10591&broadened=false` |

Listing/hub URLs expand into individual place URLs (up to `maxPlacesPerSearch` venues each, 300 by default), then each is scraped like a standalone place. `maxItems` applies **per resolved place**.

Links from TripAdvisor's country sites (`tripadvisor.co.uk`, `tripadvisor.de`, `tripadvisor.com.au`, …) work the same way as `www.tripadvisor.com` links.

#### Copy-pasteable startUrls

```json
{
  "startUrls": [
    { "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html" },
    { "url": "https://www.tripadvisor.com/Restaurant_Review-g60763-d25324283-Reviews-Allora_Fifth_Ave-New_York_City_New_York.html" },
    { "url": "https://www.tripadvisor.com/Restaurants-g35805-Chicago_Illinois.html" }
  ]
}
```

#### Location IDs

The number after `-d` in a place URL is its location ID. Hotels, restaurants, attractions, and tours all work, with or without the `d`:

```json
{
  "locationIds": ["208453", "d25324283", "11451132"],
  "maxItems": 20
}
```

IDs pasted into `startUrls` are picked up too. An ID that matches no place is named in the run log and skipped.

#### Search / keyword mode

```json
{
  "searchQuery": "Chicago",
  "includeHotels": true,
  "includeRestaurants": true,
  "includeThingsToDo": true,
  "maxItems": 20
}
```

#### Unsupported inputs

- ❌ Flights. TripAdvisor lists apartments and villas among its hotels, so get them with `hotelTypes` (`condo`, `villa`).
- ❌ Non-TripAdvisor hosts and login-gated content.

### Use Cases

| Audience | Use case |
|---|---|
| **Hotel & restaurant ops** | Daily review monitoring and owner-response SLA tracking |
| **Reputation managers** | Multi-property dashboards with rating-histogram drift over time |
| **Market analysts** | Competitive benchmarks across cities or chains using `placeInfo.rating` + `numberOfReviews` |
| **Content / NLP teams** | Multilingual review corpora for sentiment and topic models, filtered by language and rating, with machine translations left out |
| **Guest experience leads** | Complaint mining: 1- and 2-star reviews from the last quarter, broken down by `subratings` (cleanliness, service, value…) |
| **Owner-response audits** | Which negative reviews never got a reply (`ownerResponse: null`), per property or per chain |
| **Seasonality analysis** | Reviews by month of visit (`months`) and traveler type (`tripTypes`) to see who comes when and what they think |
| **Researchers** | One-shot dataset exports for BI, lake, or warehouse ingestion |
| **Agencies** | Client-ready TripAdvisor datasets without writing or maintaining a scraper |

### How It Works

![How TripAdvisor Reviews Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-tripadvisor.png)

1. **Input** — provide one or more TripAdvisor URLs, location IDs, or a free-text `searchQuery` (a city name).
2. **Resolve** — a `searchQuery` becomes a geoId, then expands into hotels, restaurants, attractions, and tours per the `include*` toggles. Listing/hub URLs expand into place URLs. Location IDs are looked up to their place. Plain place URLs are used directly.
3. **Place data** — read each place's public data into `placeInfo` (rating, review count, address, geo, ranking, and more).
4. **Reviews** — collect reviews page by page, with your rating, language, trip-type, month, and keyword filters applied by TripAdvisor; the date range and original-language filter are applied as pages arrive, and paging stops once reviews fall before `lastReviewDate`.
5. **Optional enrichment** — attach reviewer profiles (`scrapeReviewerInfo`) and contact emails (`enrichEmails`).
6. **Output** — emit flat review rows (default), nested place rows, or place-only snapshots. Locations that yield 0 reviews or fail land in a side `tripadvisor-failures` dataset.

### Input Configuration

| Field | Type | Default | Notes |
|---|---|---|---|
| `searchQuery` | string | — | Free-text location (e.g. `"Chicago"`). Resolved to a geoId, then expanded by the `include*` toggles. Use with or instead of `startUrls`. |
| `startUrls` | array of `{ url }` | `[]` | Place URLs and/or listing/hub URLs. Listing URLs expand to venues; place URLs are scraped directly. |
| `locationIds` | array | `[]` | TripAdvisor location IDs (`208453` or `d208453`) for any place type. Each is looked up to its place URL. |
| `maxPlacesPerSearch` | integer | `300` | How many places one listing URL or `searchQuery` category expands to. `0` = up to 3,000. |
| `maxItems` | integer | `50` | Max reviews **per place / per URL**. `0` = as many as TripAdvisor serves. |
| `scrapeReviews` | boolean | `true` | `true` → fetch reviews. `false` → emit one place-only snapshot row per place (no reviews). |
| `scrapeReviewerInfo` | boolean | `true` | Populate each review's `user` object (username, hometown, contributions, avatar, profile link). `false` → `user: null`. |
| `includeReviewTags` | boolean | `true` | Include `placeInfo.reviewTags` (theme phrases + counts) when TripAdvisor embeds them. |
| `includeHotels` | boolean | `true` | With `searchQuery`, include hotels for the resolved geo. |
| `includeRestaurants` | boolean | `true` | With `searchQuery`, include restaurants for the resolved geo. |
| `includeThingsToDo` | boolean | `true` | With `searchQuery`, include attractions for the resolved geo. |
| `includeTours` | boolean | `false` | With `searchQuery`, also include the city's tours and activities (boat tours, museum passes, food tours…). |
| `includeNearby` | boolean | `false` | After each place, add up to 5 nearby venues as place-only snapshot rows (`isNearbyResult: true`). Depth capped at 1. |
| `outputShape` | enum `flat` / `nested` | `flat` | `flat` = one row per review. `nested` = one row per place with `reviews[]`. No effect when `scrapeReviews: false`. |
| `checkInDate` | string | a week from today | Check-in date for hotel prices (`YYYY-MM-DD`). |
| `checkOutDate` | string | one night later | Check-out date for hotel prices. With several nights, prices are the average per night. |
| `currency` | string | `USD` | 3-letter code for hotel and tour prices: `EUR`, `GBP`, `CHF`, `JPY`, … |
| `hotelClass` | array | `[]` | City searches and `Hotels-g…` listings: only hotels with these stars, `"2"`–`"5"`. |
| `hotelTypes` | array | `[]` | Same listings: only these property types, such as `hotel`, `bed_and_breakfast`, `condo`, `villa`, `hostel`, `resort`. |
| `hotelMinRating` | string | — | Same listings: minimum traveler rating, `"5"`, `"4"`, `"3"` or `"2"` (and up). |
| `hotelPriceMin` / `hotelPriceMax` | integer | — | Same listings: nightly price range in `currency`, for the dates above. |
| `includeMarkdown` | boolean | `false` | Add `markdownContent` to every row: the review, or the whole place, as Markdown for LLM prompts and RAG. No extra charge. |
| `lastReviewDate` | string | — | Skip reviews before this date. Absolute `YYYY-MM-DD` or relative `22 days` / `3 weeks` / `6 months` / `1 year`. |
| `reviewsUntilDate` | string | — | Skip reviews after this date (the day itself counts). Same formats. With `lastReviewDate` it gives a date range. |
| `reviewRatings` | array | `["ALL_REVIEW_RATINGS"]` | Filter by star rating: `"1"`–`"5"` or `ALL_REVIEW_RATINGS`. |
| `reviewsLanguages` | array | `["ALL_REVIEW_LANGUAGES"]` | Filter by ISO 639-1 language codes, or `ALL_REVIEW_LANGUAGES`. Several languages are read one after another and share `maxItems`. TripAdvisor also returns reviews machine-translated into each language. It filters by 29 languages (`en`, `it`, `es`, `fr`, `de`, `pt`, `nl`, `ru`, `ja`, `zh`, `ko` and more); a language it cannot filter by is skipped with a note in the log. |
| `excludeMachineTranslated` | boolean | `false` | Keep only reviews whose text is what the reviewer wrote. |
| `sortBy` | enum | `default` | Review order: `default`, `most_recent`, `oldest`, `detailed`, `insightful`. |
| `includeOriginalText` | boolean | `false` | Add `originalTitle` and `originalText` to machine-translated reviews. $0.001 per review that gets its original text. Slower. |
| `includeQuestionAnswers` | boolean | `false` | Add the place's visitor questions, newest first, each with every answer, on place-only and nested rows. $0.001 per question saved with its answers. Slower. |
| `maxQuestionsPerPlace` | integer | `10` | With `includeQuestionAnswers`: questions per place. `0` saves all of them. |
| `includeHotelClassAndRooms` | boolean | `false` | Add `hotelClass`, `hotelClassAttribution` and `numberOfRooms` to every hotel. $0.001 per hotel where TripAdvisor shows them. Slower. |
| `tripTypes` | array | `[]` | Keep reviews from these traveler types: `Families`, `Couples`, `Solo`, `Business`, `Friends`. |
| `months` | array | `[]` | Keep reviews from these months of visit (`1`–`12`). |
| `searchKeyword` | array | `[]` | Keep reviews that mention these words. |
| `onlyNewReviews` | boolean | `false` | Monitoring: return only reviews published since the previous run, per place. Remembered in the `tripadvisor-seen-reviews` key-value store in your account. |
| `newReviewsStateKey` | string | — | Optional name that gives a task its own monitoring memory when several tasks watch the same place. |
| `sourceDatasetId` | string | — | Dataset of a finished listing or search run; every place URL in it is added to `startUrls`. |
| `proxy` | object | Apify Residential | Proxy configuration. Residential is strongly recommended. |
| `enrichEmails` | boolean | `false` | Find a contact email per place (from its website or by discovery). Adds `contactEmail`, `contactWebsite`, and an `emailEnrichment` object. Billed only when an email is found. |

#### Common scenarios

**1. All reviews for a single hotel, with reviewer info**

```json
{
  "startUrls": [{ "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html" }],
  "maxItems": 0,
  "scrapeReviewerInfo": true
}
```

**2. Recent 5-star English reviews across a city's restaurants**

```json
{
  "startUrls": [{ "url": "https://www.tripadvisor.com/Restaurants-g35805-Chicago_Illinois.html" }],
  "reviewRatings": ["5"],
  "reviewsLanguages": ["en"],
  "lastReviewDate": "6 months",
  "maxItems": 30
}
```

**3. Place-only competitor snapshots (no reviews)**

```json
{
  "searchQuery": "Brooklyn",
  "includeHotels": true,
  "includeRestaurants": true,
  "includeThingsToDo": false,
  "scrapeReviews": false
}
```

**4. Daily monitoring of new reviews (run it on a schedule)**

```json
{
  "startUrls": [{ "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html" }],
  "onlyNewReviews": true,
  "maxItems": 200
}
```

The first run returns the latest reviews. Every later run returns only reviews published after them, and a run with nothing new ends successfully with "No new reviews since the last run" and no charge for results.

**5. Complaints from one quarter, in the reviewers' own words**

```json
{
  "startUrls": [{ "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html" }],
  "reviewRatings": ["1", "2"],
  "lastReviewDate": "2026-07-01",
  "reviewsUntilDate": "2026-09-30",
  "excludeMachineTranslated": true,
  "maxItems": 0
}
```

**6. 4- and 5-star hotels under €300 a night, with prices for your dates**

```json
{
  "searchQuery": "Paris",
  "includeHotels": true,
  "includeRestaurants": false,
  "includeThingsToDo": false,
  "scrapeReviews": false,
  "checkInDate": "2026-12-07",
  "checkOutDate": "2026-12-09",
  "currency": "EUR",
  "hotelClass": ["4", "5"],
  "hotelPriceMax": 300,
  "maxPlacesPerSearch": 50
}
```

Each hotel row lists every booking site's nightly price (`offers[]`) and the spread (`priceRange`, e.g. `€329 - €333`). When fewer hotels match than `maxPlacesPerSearch`, you get only the ones that match.

**7. A list of location IDs from a spreadsheet, place data only**

```json
{
  "locationIds": ["208453", "25324283", "103887"],
  "scrapeReviews": false
}
```

### Output Overview

Each dataset item is, by default, one **review** row containing:

- **Core** — `id`, `url`, `title`, `text`, `rating`, `publishedDate`, `travelDate`, `tripType`, `lang`, `originalLanguage`, `isMachineTranslated`
- **Reviewer** — `user` object (username, hometown, contributions, avatar, profile link) when `scrapeReviewerInfo: true`
- **Owner response** — `ownerResponse` (text + date) when the property replied
- **Extras** — `subratings[]`, `photos[]`, `helpfulVotes`
- **Parent place** — `placeInfo` (name, type, rating, web URL, and more)

When `scrapeReviews: false`, rows are `{ placeDetailOnly: true, placeInfo: {…} }` with a much richer `placeInfo` (ranking, amenities, category scores, awards, opening hours, AI review summary, visitor questions, nearby venues and transport, histogram).

### Output Samples

#### Flat review row (default)

```jsonc
{
  "rating": 5,
  "title": "Was wonderful bravo to Kayla",
  "text": "Kayla was amazing and gave us great service",
  "publishedDate": "2026-04-26",
  "travelDate": "2026-04",
  "tripType": "COUPLES",
  "helpfulVotes": 0,
  "subratings": [],
  "photos": [],
  "ownerResponse": null,
  "user": {
    "name": "Dubi Shoshan",
    "username": "OnAir02493636276",
    "userLocation": { "name": "Yehud, Israel" },
    "contributions": { "totalContributions": 1 },
    "link": "www.tripadvisor.com/Profile/OnAir02493636276"
  },
  "lang": "en",
  "publishedPlatform": "MOBILE",
  "url": "https://www.tripadvisor.com/ShowUserReviews-g60763-d208453-r1058000050-Hilton_New_York_Times_Square-New_York_City_New_York.html",
  "id": "1058000050",
  "placeInfo": {
    "id": "208453",
    "name": "Hilton New York Times Square",
    "locationString": "New York City New York",
    "type": "HOTEL",
    "webUrl": "https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews.html"
  }
}
```

#### Place-only snapshot (`scrapeReviews: false`)

```jsonc
{
  "placeDetailOnly": true,
  "placeInfo": {
    "type": "HOTEL",
    "name": "LondonHouse Chicago, Curio Collection by Hilton",
    "rating": 4.7,
    "numberOfReviews": 4941,
    "rankingString": "#4 of 215 hotels in Chicago",
    "address": "85 E Wacker Drive, Chicago, IL 60601",
    "latitude": 41.887833,
    "longitude": -87.62543,
    "ratingHistogram": { "count1": 62, "count2": 62, "count3": 150, "count4": 502, "count5": 4166 },
    "categoryReviewScores": [
      { "categoryName": "Cleanliness", "roundedScore": 4.8 },
      { "categoryName": "Location", "roundedScore": 4.9 }
    ],
    "amenities": ["Valet parking", "Free High Speed Internet (WiFi)", "Rooftop bar", "Spa"],
    "id": "9145578",
    "webUrl": "https://www.tripadvisor.com/Hotel_Review-g35805-d9145578-Reviews.html"
  }
}
```

### Key Output Fields

#### Review core

- `id`, `url`, `title`, `text`, `rating`, `lang`, `helpfulVotes`
- `language` (the language the text is in), `originalLanguage` (the language the reviewer wrote in), `isMachineTranslated`, and with `includeOriginalText` `originalTitle` and `originalText` on translated reviews

#### Dates & trip

- `publishedDate`, `publishedPlatform`, `travelDate`, `stayDate`, `tripType`

#### Reviewer (`scrapeReviewerInfo: true`)

- `user.name`, `user.username`, `user.isVerified`, `user.userLocation.name`, `user.contributions.totalContributions`, `user.avatar.image`, `user.link`

#### Owner response & extras

- `ownerResponse.text`, `ownerResponse.publishedDate`, `subratings[]`, `photos[]`

#### Parent place (`placeInfo`)

- `placeInfo.name`, `placeInfo.type` (`HOTEL` / `EATERY` / `ATTRACTION` / `ACTIVITY` / `CRUISE`), `placeInfo.rating`, `placeInfo.webUrl`, `placeInfo.geoId`
- Place-only and nested rows add: `numberOfReviews`, `rankingString`, `locationString`, `ancestorLocations[]` (city, region or state, country), `address`, `latitude`, `longitude`, `phone`, `website`, `ratingHistogram`, `categoryReviewScores[]`, `photos[]`, `awards[]`, `aiReviewsSummary`, `questions[]` (visitor Q\&A with answer counts, plus `answers[]` with `includeQuestionAnswers`), `nearestMetroStations[]`, `nearbyAirports[]`, `roomTips[]`, `nearbyLocations[]`, `isClaimed`
- Hotels: `amenities[]`, `languagesSpoken[]`, `hotelClass` (`"4.0"`, when the listing was filtered by stars or with `includeHotelClassAndRooms`), `numberOfRooms` (with `includeHotelClassAndRooms`), `priceRange`, `checkInDate`, `checkOutDate`, and `offers[]` with `vendor`, `pricePerNight` (before taxes), `tax`, `priceWithTaxes`, `priceText` (as TripAdvisor shows it), `currency`, `priceBeforeSale`, `details` (e.g. free cancellation). Review rows carry `priceRange` and the dates only. Restaurants: `cuisines[]`, `mealTypes[]`, `priceLevel`, `menuWebUrl`, `hours[]`, `openNowText`. Attractions and tours: `suggestedDuration`; tours also `priceFrom`

#### Markdown for AI (`includeMarkdown: true`)

- `markdownContent`: a review row becomes title, rating, dates, reviewer, text, sub-ratings, owner response, and the place it belongs to. A place row becomes a document with ratings, category scores, the AI review summary, amenities, hours, awards, transport, visitor questions, and traveler tips. A nested row is the place document followed by its reviews.

#### Email enrichment (`enrichEmails: true`)

- `contactEmail`, `contactWebsite`, `emailEnrichment`

### How This Compares

| Capability | Category leader (two-actor funnel) | This actor |
|---|---|---|
| Price per 1,000 results | ~$1.90/1k at entry tier | **$0.45/1k** (~4x cheaper) |
| Places + reviews | Separate "find places" actor feeding a separate "reviews" actor | **One actor** does both |
| Hotels / restaurants / attractions | Split across actors | All three, one input |
| Review + place metadata in one row | Usually separate outputs | **Yes** — `placeInfo` on every review |
| Search-query → geo expansion | Varies | **Built in** (`searchQuery`) |
| Rating / language / date filters | Partial | **Yes**, pushed server-side |
| Reviewer profiles | Add-on | Optional (`scrapeReviewerInfo`) |
| Contact-email enrichment | No | Optional (`enrichEmails`, pay-on-hit) |
| Only new reviews on a schedule | Re-scrape and dedupe yourself | **Built in** (`onlyNewReviews`) |
| Trip type, month, keyword, sort filters | Partial | **Yes** |
| From/to date range | Usually "since" only | **Yes** (`lastReviewDate` + `reviewsUntilDate`) |
| Original vs machine-translated reviews | Not flagged | **Flagged on every row**, optional filter |
| TripAdvisor location IDs as input | Varies | **Yes** (`locationIds`) |

> Honest scope: this actor does **not** cover flights. If you need those, it isn't the right tool.

### FAQ

#### Which TripAdvisor URLs are supported?

Hotel, restaurant, and attraction place pages (`…-g{geo}-d{id}-Reviews-…`), tour and activity pages (`AttractionProductReview-…`), plus GEO listing hubs (`Restaurants-g…`, `Hotels-g…`, `Attractions-g…`) and the `FindRestaurants?geo=…` finder. Listing URLs expand to individual venues. Links from country sites such as `tripadvisor.co.uk` or `tripadvisor.de` work too. A single review link (`ShowUserReviews-…`) returns just that review.

#### Do I get review rows or place rows?

Review rows by default — one per review, each carrying a compact `placeInfo`. Set `scrapeReviews: false` for one place-only snapshot per place, or `outputShape: "nested"` for one place row with `reviews[]` nested.

#### How does `maxItems` work?

It caps reviews **per place**, applied independently to each URL and each venue discovered from a listing. Use `0` for as many as TripAdvisor serves.

#### Can I get every review of a huge place?

On most places, yes. On a few of TripAdvisor's largest places (the Colosseum, with over 150,000 reviews) the full list ends after about 9,000 reviews. The actor then carries on one language at a time from the date where the full list stopped: English first, then the other languages with the reviews written in them. Each review is saved once. Pages that fail to load are read again at the end of each list, so a passing error does not cost you reviews. A full run of the Colosseum saved 146,901 of its 151,328 reviews (97%), back to 2004, and took about 27 hours. Give such a run a long timeout (Console: Run options, Timeout), or set `maxItems` to what you need. The run log says how many were saved of the total. `sortBy: "oldest"` works the same way: it merges the language lists by date, so the Colosseum starts from its 2004 reviews.

#### Can I filter by rating, language, or date?

Yes. Star rating, language, trip type, month of visit, keyword, and sort order are applied by TripAdvisor itself, so you only pay for matching reviews. `lastReviewDate` and `reviewsUntilDate` (absolute or relative) give a date range; paging stops once reviews get older than `lastReviewDate`.

#### Are hotel prices per night? Do they include taxes?

Per night, for 2 adults in one room. With a stay of several nights it is the average night. `pricePerNight` is before taxes and fees, `tax` is the taxes and fees, and `priceWithTaxes` is the two together. `priceText` is the price as TripAdvisor shows it, which for some sites includes taxes and for others does not, so compare offers on the numbers. Leave the dates empty for one night a week from today.

#### Can I get only certain hotels from a city?

Yes. With a city `searchQuery` or a `Hotels-g…` listing URL, `hotelClass` keeps hotels with the given stars, `hotelTypes` keeps property types such as condos and villas, `hotelMinRating` sets a minimum traveler rating, and `hotelPriceMin` / `hotelPriceMax` set a nightly price range in `currency` for your dates. TripAdvisor applies them, so you only pay for hotels that match. They do not apply to single hotel URLs or location IDs.

#### Why do some reviews read like translations?

Because they are. TripAdvisor shows reviews written in other languages as machine translations, and a language filter brings in reviews translated into that language as well. Each row carries `isMachineTranslated` and `originalLanguage`. Turn on `includeOriginalText` to get the reviewer's own words next to the translation (`originalTitle`, `originalText`), or `excludeMachineTranslated` to keep only reviews that were not translated; add a language filter to keep one language.

#### Can I use TripAdvisor location IDs instead of URLs?

Yes. Put them in `locationIds` (`208453` or `d208453`), or paste them into `startUrls`. The actor works out whether each one is a hotel, restaurant, attraction, or tour.

#### Doesn't TripAdvisor have an official API for this?

TripAdvisor's Content API is aimed at partners, needs an API key, and returns only a handful of the most recent reviews per location. This actor reads a place's public review list, with filters, and needs no key.

#### Are reviewer profiles and emails always present?

`user` is populated when `scrapeReviewerInfo: true` (the default). Contact emails require `enrichEmails: true` and only appear when one is actually found — you are never charged for a miss.

#### What isn't supported?

Flights. This actor covers hotels (with booking-site prices), restaurants, attractions, tours, and cruise ships: their reviews and place data. TripAdvisor lists apartments and villas among its hotels: a `VacationRentals-g…` link reads them, and `hotelTypes` picks them on any hotel listing.

#### Can I scrape private or login-gated content?

No. The actor only reads publicly available TripAdvisor pages.

#### What about blocks and rate limits?

Failed pages are retried automatically, and a place that could not be read is listed in the `tripadvisor-failures` dataset instead of being dropped. If TripAdvisor changes how its reviews load, the run fails with a clear message instead of finishing empty, so a scheduled pipeline notices.

#### How do I collect only new reviews on a schedule?

Set `onlyNewReviews: true` and run the actor (or a saved task) on an Apify schedule. Each run remembers the newest review per place and returns only reviews published after it. Keep `maxItems` above the number of reviews a place gets between runs, because reviews past the cap in one run are not picked up later.

### Support

Found a bug or need a new feature? Open an issue on the [Issues tab](https://apify.com/memo23/tripadvisor-scraper/issues) or email **muhamed.didovic@gmail.com**.

### Additional Services

Need a custom output shape, a new URL type, extra fields, or scheduled monitoring? I build tailored scrapers and data pipelines — email **muhamed.didovic@gmail.com**.

### Explore More Scrapers

If you found this useful, you might also like:

- [**Capterra Scraper**](https://apify.com/memo23/capterra-scraper) — software listings + reviews
- [**TrustRadius Scraper**](https://apify.com/memo23/trustradius-scraper) — B2B product reviews
- [**Google Maps Reviews**](https://apify.com/memo23) — local business reviews and place data

Full list at [apify.com/memo23](https://apify.com/memo23).

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/tripadvisor-scraper`).

**Purpose:** Scrape TripAdvisor hotel, restaurant, and attraction reviews (plus place snapshots) from any place/listing URL or a city search query — every review row carries parent-place metadata.

**Minimal input:**

```json
{
  "startUrls": [{ "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html" }],
  "maxItems": 10
}
```

**Output:** one dataset row per review — `id`, `title`, `text`, `rating`, `lang`, `originalLanguage`, `isMachineTranslated`, `publishedDate`, `travelDate`, `tripType`, `helpfulVotes`, `user {name, username, isVerified, userLocation, contributions, link}`, `ownerResponse`, `subratings[]`, `photos[]`, `placeInfo {id, name, type, rating, webUrl, geoId}`. With `scrapeReviews:false`, rows are `{placeDetailOnly:true, placeInfo{…}}`.

**Behaviors an agent should know:**

- Always set `maxItems` (it caps reviews **per place**); `maxItems:0` means as many as TripAdvisor serves and can be very large. On its very largest places the full list ends after about 9,000 reviews, and the actor carries on one language at a time from there. Several languages in `reviewsLanguages` share `maxItems`.
- `startUrls`, `locationIds`, and `searchQuery` can be combined; `searchQuery` expands via `includeHotels` / `includeRestaurants` / `includeThingsToDo` / `includeTours`, up to `maxPlacesPerSearch` places per category.
- `lastReviewDate` + `reviewsUntilDate` select a date range; `excludeMachineTranslated:true` drops reviews TripAdvisor translated.
- `includeMarkdown:true` adds `markdownContent` (the row as Markdown) to every row, so the text can go into a prompt or a vector store without a formatter. It costs nothing extra.
- `outputShape:"nested"` returns one row per place with `reviews[]`; `scrapeReviews:false` returns place-only snapshots.
- `onlyNewReviews:true` returns only reviews newer than the previous run per place; a run with nothing new succeeds with 0 rows.
- Billing: **$0.45 / 1,000 results**, where a result is one review (flat rows) or one place snapshot. A nested row bills each review it holds at the same rate. Plus **$0.007** actor start (per GB of memory). `enrichEmails` is billed only when an email is found.
- Tour pages (`AttractionProductReview-…`) work like any place; `includeTours:true` adds a city's tours to a `searchQuery` run.
- A single review link (`ShowUserReviews-…-r{id}-…`) in `startUrls` returns that one review as a normal review row.
- Hotels carry `placeInfo.offers[]` (one per booking site: `vendor`, `pricePerNight` before taxes, `tax`, `priceWithTaxes`, `currency`) and `priceRange`, per night for 2 adults, for `checkInDate`..`checkOutDate` (default: one night a week ahead) in `currency` (default USD).
- City searches and `Hotels-g…` listings take `hotelClass` (`["4","5"]`), `hotelMinRating` (`"4"` = 4 and up) and `hotelPriceMin` / `hotelPriceMax` (per night, in `currency`).
- `sortBy:"oldest"` starts from a place's first reviews. `includeOriginalText:true` adds `originalTitle` / `originalText` to translated reviews. `includeQuestionAnswers:true` adds the visitor questions with their answers (`maxQuestionsPerPlace`, default 10) and `includeHotelClassAndRooms:true` the hotel class and room count. Each costs $0.001 per item found (review, question, hotel), nothing when nothing is found, and makes runs slower.
- Cruise ships (`Cruise_Review-…`) and listings (`Cruises-g…`) work like any place, with `placeInfo.type` `CRUISE`.
- Not supported: flights.

### ⚠️ Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Tripadvisor LLC or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.

The scraper accesses only publicly available TripAdvisor pages — no authenticated endpoints, paid features, or content behind the tripadvisor.com login wall. Users are responsible for ensuring their use complies with TripAdvisor's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any contractual obligations of their own organization.

### SEO Keywords

tripadvisor scraper, tripadvisor reviews scraper, tripadvisor hotel prices scraper, 5 star hotels scraper, tripadvisor location id scraper, tripadvisor reviews by date range, tripadvisor reviews for llm, tripadvisor rag dataset, tripadvisor hotels scraper, tripadvisor restaurants scraper, tripadvisor attractions scraper, tripadvisor review monitoring, new tripadvisor reviews, scrape tripadvisor, tripadvisor api, tripadvisor.com scraper, Apify tripadvisor, hotel reviews scraper, restaurant reviews scraper, attraction reviews scraper, tripadvisor hotel data, tripadvisor restaurant data, reviewer profile scraper, review sentiment data, reputation monitoring data, hospitality market research, travel reviews export, tripadvisor json export, tripadvisor csv export, competitive review intelligence, place metadata scraper

# Actor input Schema

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

TripAdvisor links to scrape. Mix any of these in one run:

- **Places:** hotel, restaurant, attraction and tour pages (`Hotel_Review-…`, `Restaurant_Review-…`, `Attraction_Review-…`, `AttractionProductReview-…`).
- **City listings:** `Hotels-g…`, `Restaurants-g…`, `Attractions-g…` and `FindRestaurants?geo=…` pages. Each brings in its places, up to **Max places per city or listing**.
- **Single reviews:** `ShowUserReviews-…` links return that one review.
- **Cruise ships:** `Cruise_Review-…` ship pages and `Cruises-g…` listings.

Links from country sites such as tripadvisor.co.uk or tripadvisor.de work too.

Examples:

- `https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html`
- `https://www.tripadvisor.com/Restaurants-g35805-Chicago_Illinois.html`

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

A city or area, e.g. `Chicago`, `Brooklyn`, `Sarajevo`. The actor finds its hotels, restaurants, attractions and tours; choose which under **Places from a city search or listing**. Use it instead of, or together with, Start URLs.

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

TripAdvisor location IDs, the number after `-d` in a place URL (`208453` or `d208453`). Hotels, restaurants, attractions and tours all work; the actor finds each place's page for you. Handy when your list comes from another tool or a spreadsheet.

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

Reviews to collect from each place. 0 means as many as TripAdvisor serves, which can be many thousands. On a few of its largest places the full list ends after about 9,000 reviews; the actor then carries on one language at a time, and the run log says so.

## `scrapeReviews` (type: `boolean`):

Turn off to get one row per place with its details (ratings, ranking, address, amenities, hours, hotel prices, visitor questions…) and no reviews. Faster and cheaper when you only need place data.

## `includeHotels` (type: `boolean`):

Add the city's hotels. Narrow them down by stars, rating and price under **Hotel prices and filters**.

## `includeRestaurants` (type: `boolean`):

Add the city's restaurants.

## `includeThingsToDo` (type: `boolean`):

Add the city's attractions: museums, landmarks, parks and the like.

## `includeTours` (type: `boolean`):

Also add the city's tours and activities: boat tours, museum passes, food tours. Off by default.

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

How many places each category of a city search, or each listing URL, adds. 0 means as many as TripAdvisor lists, up to 3,000. **Max reviews per place** still applies to each place.

## `reviewRatings` (type: `array`):

Filter reviews by overall rating. Leave empty to include every rating.

## `reviewsLanguages` (type: `array`):

Filter reviews by language (ISO 639-1 codes). Leave empty to include every language. Pick several and they are read one after another, sharing **Max reviews per place**. TripAdvisor adds reviews machine-translated into each language; turn on "Only reviews in their original language" to drop them. TripAdvisor filters by 29 of these languages (English, Italian, Spanish, French, German, Portuguese, Dutch, Russian, Japanese, Chinese, Korean and more); one it cannot filter by is skipped with a note in the run log.

## `excludeMachineTranslated` (type: `boolean`):

TripAdvisor shows many reviews as a machine translation: into English by default, and into the chosen language when you filter by language (a French filter also returns English reviews translated into French). Turn this on to keep only reviews whose text is what the reviewer wrote. Every review carries `isMachineTranslated` and `originalLanguage` either way.

## `lastReviewDate` (type: `string`):

Skip reviews published before this date. Pick a date (YYYY-MM-DD) or a relative duration like `22 days`, `2 weeks`, `3 months`, `1 year`.

## `reviewsUntilDate` (type: `string`):

Skip reviews published after this date. Together with `Published on or after` it gives a date range. Pick an absolute date (YYYY-MM-DD, the whole day counts) or a relative duration like `30 days`. Reviews come newest first, so a date far in the past makes the run read more pages before it reaches the range.

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

Keep reviews from these kinds of trips, such as Families or Business. Empty keeps every trip type.

## `months` (type: `array`):

Keep reviews of stays or visits in these months, in any year. Empty keeps every month.

## `searchKeyword` (type: `array`):

Only reviews that mention these words, e.g. `breakfast`, `staff`, `wifi`. Leave empty for all reviews.

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

Order of the reviews. `Most recent first` works best with the date filters; `Oldest first` starts from a place's first reviews, on its very largest places too; `Default` lets TripAdvisor decide. **Only new reviews since the last run** always reads newest first.

## `checkInDate` (type: `string`):

Check-in date for hotel prices (`YYYY-MM-DD`). Leave empty for a one-night stay a week from today.

## `checkOutDate` (type: `string`):

Check-out date for hotel prices (`YYYY-MM-DD`). Leave empty for one night after check-in. With several nights, prices are the average per night.

## `currency` (type: `string`):

Currency for hotel prices and tour prices, as a 3-letter code. Pick one or type any other, such as `BAM` or `PLN`.

## `hotelClass` (type: `array`):

Only hotels with these star ratings, for city searches and `Hotels-g…` listing URLs. Leave empty for all.

## `hotelTypes` (type: `array`):

Only these kinds of property, for city searches and `Hotels-g…` listing URLs. TripAdvisor lists apartments and villas here, so `Condo` and `Villa` are the way to get rentals. Leave empty for all.

## `hotelMinRating` (type: `string`):

Only hotels rated at least this much by travelers, for city searches and `Hotels-g…` listing URLs.

## `hotelPriceMin` (type: `integer`):

Only hotels from this nightly price, in the currency above, for the dates above. For city searches and `Hotels-g…` listing URLs.

## `hotelPriceMax` (type: `integer`):

Only hotels up to this nightly price, in the currency above, for the dates above. For city searches and `Hotels-g…` listing URLs.

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

For scheduled monitoring. The actor remembers the newest review it returned for each place and, on the next run, returns only reviews published after it. The first run returns reviews as usual. Reviews are sorted newest first while this is on. The memory lives in the key-value store `tripadvisor-seen-reviews` in your account. **Max reviews per place** still caps each run, and reviews past that cap are not picked up later, so set it above the number of reviews a place gets between runs.

## `newReviewsStateKey` (type: `string`):

Optional. Give each task its own name when several tasks watch the same place with different filters, so each one keeps its own memory. Letters, digits, `-` and `_`.

## `scrapeReviewerInfo` (type: `boolean`):

Fill each review's `user` object: name, username, hometown, contributions, avatar, profile link and verified badge. Off: `user` is null.

## `outputShape` (type: `string`):

- **Flat** (default): one row per review, each with the place in `placeInfo`. Best for spreadsheets.
- **Nested**: one row per place, with its reviews in `reviews[]`.

No effect when **Collect reviews** is off. Billing is the same in both shapes: each review counts as one result.

## `includeReviewTags` (type: `boolean`):

Include `placeInfo.reviewTags`, the topics TripAdvisor lists as often mentioned in reviews. Turn off for smaller rows.

## `includeMarkdown` (type: `boolean`):

Adds `markdownContent` to every row: the review, or the whole place with its ratings, scores, amenities, hours and visitor questions, written out as Markdown. Paste it into an LLM prompt or a RAG index as is. Rows get bigger; nothing extra is charged.

## `includeOriginalText` (type: `boolean`):

TripAdvisor shows many reviews as a machine translation. Turn this on to add what the reviewer wrote as `originalTitle` and `originalText` next to the translation. Costs $0.001 per review that gets its original text; reviews written in English, and those whose original is not found, cost nothing extra. Runs are slower. An old review may stay without it when a language has many thousands of reviews.

## `includeQuestionAnswers` (type: `boolean`):

Add the place's visitor questions, newest first, with every answer, to `placeInfo.questions[]`. For place-only and nested rows. Costs $0.001 per question saved with its answers. Runs are slower.

## `maxQuestionsPerPlace` (type: `integer`):

With **Add visitor questions and answers**: how many questions to save per place. 0 saves all of them (the Colosseum has over 1,400).

## `includeHotelClassAndRooms` (type: `boolean`):

Add `hotelClass` (`4.0`), `hotelClassAttribution` and `numberOfRooms` to every hotel. Costs $0.001 per hotel where TripAdvisor shows them. Runs are slower.

## `includeNearby` (type: `boolean`):

After each place, add up to 5 places nearby as place-only rows tagged `isNearbyResult: true`, without their reviews.

## `enrichEmails` (type: `boolean`):

If enabled, finds a contact email for each result from its own website (or by discovering it from the name). Adds contactEmail + contactWebsite columns plus a detailed emailEnrichment object. Billed per contact email found; only charged when an email is returned, never for misses.

## `sourceDatasetId` (type: `string`):

Dataset ID of a finished run. Every TripAdvisor place URL in its items (`url`, `webUrl`, `locationUrl`, `placeInfo.webUrl`, `urlN`) is added to Start URLs, so a search run can feed a reviews run without copy-pasting.

## `proxy` (type: `object`):

Proxy settings. The default works out of the box; residential proxies are recommended.

## `locale` (type: `string`):

TripAdvisor locale code. Kept for saved inputs: TripAdvisor currently returns the same reviews for every locale. To get reviews as they were written, use "Only reviews in their original language", with a language filter if you want one language.

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

Maximum number of pages that can be processed at the same time.

## `minConcurrency` (type: `integer`):

Minimum number of pages that will be processed at the same time.

## `maxRequestRetries` (type: `integer`):

Number of times each failed request is retried before giving up. Lower values surface persistent failures quickly; higher values ride out temporary errors at the cost of a longer run.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html"
    }
  ],
  "locationIds": [],
  "maxItems": 20,
  "scrapeReviews": true,
  "includeHotels": true,
  "includeRestaurants": true,
  "includeThingsToDo": true,
  "includeTours": false,
  "maxPlacesPerSearch": 300,
  "reviewRatings": [
    "ALL_REVIEW_RATINGS"
  ],
  "reviewsLanguages": [
    "ALL_REVIEW_LANGUAGES"
  ],
  "excludeMachineTranslated": false,
  "tripTypes": [],
  "months": [],
  "searchKeyword": [],
  "sortBy": "default",
  "currency": "USD",
  "hotelClass": [],
  "hotelTypes": [],
  "onlyNewReviews": false,
  "scrapeReviewerInfo": true,
  "outputShape": "flat",
  "includeReviewTags": true,
  "includeMarkdown": false,
  "includeOriginalText": false,
  "includeQuestionAnswers": false,
  "maxQuestionsPerPlace": 10,
  "includeHotelClassAndRooms": false,
  "includeNearby": false,
  "enrichEmails": false,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "locale": "en_US",
  "maxConcurrency": 100,
  "minConcurrency": 1,
  "maxRequestRetries": 15
}
```

# Actor output Schema

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

Direct link to the run's default dataset items.

## `failures` (type: `string`):

Locations that produced 0 reviews or failed mid-pagination. Empty if the run was perfect.

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html"
        }
    ],
    "maxItems": 20,
    "currency": "USD",
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/tripadvisor-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": [{ "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html" }],
    "maxItems": 20,
    "currency": "USD",
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/tripadvisor-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": [
    {
      "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html"
    }
  ],
  "maxItems": 20,
  "currency": "USD",
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call memo23/tripadvisor-scraper --silent --output-dataset

```

## MCP server setup

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