# Tripadvisor Scraper: Places, Reviews, Hotel Prices (`cliqtomedia/tripadvisor-scraper`) Actor

Get Tripadvisor hotels, restaurants, attractions and reviews from a search or link. Compare places in a city and study guest feedback. No login or API key.

- **URL**: https://apify.com/cliqtomedia/tripadvisor-scraper.md
- **Developed by:** [Cliqto Media](https://apify.com/cliqtomedia) (community)
- **Categories:** Travel
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.89 / 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 Scraper turns a search, a place link or a place ID into rows of hotels, restaurants, attractions and reviews from public [Tripadvisor](https://www.tripadvisor.com) pages, with no login. Use the rows to compare places in a city or to study guest feedback. A first run with 10 places takes about 20 to 35 seconds and costs about $0.03.

![Tripadvisor Scraper: a search for Pattaya restaurants returns places with rank and rating, plus reviews and hotel offers](https://api.apify.com/v2/key-value-stores/hvfSiCcCEtUVtrGLW/records/tripadvisor-hero-20261104.png)

### Table of contents

- [What it does](#what-it-does)
- [How it works](#how-it-works)
- [Quick start](#quick-start)
- [Use cases](#use-cases)
- [Input](#input)
- [Output](#output)
- [Pricing](#pricing)
- [Limits](#limits)
- [API, export and integrations](#api-export-and-integrations)
- [Troubleshooting](#troubleshooting)
- [FAQ](#faq)
- [Related Actors](#related-actors)
- [Support](#support)

### What it does

This Actor reads public Tripadvisor pages and saves clean rows in an Apify dataset. It has three modes:

- **Search for places** finds hotels, restaurants and attractions from a search like `Pattaya restaurants`.
- **Place details** reads one place or a list of places.
- **Reviews** collects reviews of the places you choose, with filters.

A place row can hold the rating, review count, rank, address, phone, website, coordinates, opening hours, awards and hotel offers. A review row can hold the text, rating, dates, trip type, language, helpful votes and the owner's reply.

#### Good fit

- You compare restaurants, hotels or attractions in one city.
- You read what guests say about your place or a competitor.
- You check hotel prices for your stay dates.
- You feed fresh place data to a spreadsheet, a database or an AI agent.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/OsYO8hpbixO91Uuqs/input)**

### How it works

1. You give a search, links, place IDs or a dataset with links.
2. The Actor opens the public pages and reads up to one page per second. It applies your place types and review filters.
3. It saves place rows or review rows in the dataset. It also saves a run summary with the counts and the reason the run stopped.

If an input finds nothing, you get a free status row that explains why. You never get a silent empty result.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/OsYO8hpbixO91Uuqs/input)**

### Quick start

[![Input form with What to collect, Search query and Maximum places marked](https://api.apify.com/v2/key-value-stores/hvfSiCcCEtUVtrGLW/records/quick-start-form-202611041900.png)](https://console.apify.com/actors/OsYO8hpbixO91Uuqs/input)

1. Open the **Input** tab and keep **What to collect** on **Search for places** (box 1).

2. Keep **Pattaya restaurants** in **Search query or place ID**, or type your own city and place type (box 2).

3. Keep **Maximum places** at **10** (box 3).

4. Click **Start** at the bottom of the page (below the form, not in the picture).

5. When the run ends, open the **Output** tab and keep the **Places** view (box 5).

   [![Output table with place name, type, rating, review count and ranking marked](https://api.apify.com/v2/key-value-stores/hvfSiCcCEtUVtrGLW/records/output-table-20261104.png)](https://api.apify.com/v2/key-value-stores/hvfSiCcCEtUVtrGLW/records/output-table-20261104.png)

6. Check `name`, `type`, `rating` and `reviewsCount` (box 6).

7. Check `ranking` to see the place's position in its city (box 7).

**Expected result:** 10 place rows in about 20 to 35 seconds, for about $0.03.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/OsYO8hpbixO91Uuqs/input)**

### Use cases

| Buyer job | Input path | Output entity | Key fields | Next integration |
| --- | --- | --- | --- | --- |
| Compare restaurants in a city | `mode: search`, `query` | Place | `name`, `rating`, `reviewsCount`, `ranking`, `priceLevel` | CSV or Excel export |
| Study guest feedback | `mode: reviews`, `placeUrls` | Review | `rating`, `title`, `text`, `publishedDate`, `tripType` | Spreadsheet or AI agent |
| Check hotel prices for your dates | `mode: place`, `placeUrls`, `checkInDate`, `checkOutDate` | Place | `name`, `offers`, `priceRange`, `roomCount` | API |
| Find top attractions for a trip plan | `mode: search`, `query`, `placeTypes` | Place | `name`, `ranking`, `tags`, `openingHours`, `awards` | Slack or Notion summary |
| Watch new reviews of your place | `mode: reviews`, `placeUrls`, `recentDays` | Review | `publishedDate`, `rating`, `text`, `ownerResponse` | Apify schedule |

> **👉 [Try it now: open the input form](https://console.apify.com/actors/OsYO8hpbixO91Uuqs/input)**

### Input

#### Input fields

You must give at least one of `query`, `placeUrls`, `startUrls` or `sourceDatasetId`. Empty lists mean "no filter". Repeated places are read once.

| Field | Plain name | Type | Required | Default / prefill | Allowed values | Effect | Example | Recommendation |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| `mode` | What to collect | string | no | default `search` | `search`, `place`, `reviews` | Picks place rows or review rows | `reviews` | Start with `search` |
| `query` | Search query or place ID | string | one input needed | prefill `Pattaya restaurants` | City, business name, numeric ID or URL, up to 300 characters | Finds places | `Lyon hotels` | Add the place type to the city |
| `placeUrls` | Place or listing URLs | array | one input needed | empty | Up to 100 place, city list or public trip links, or numeric IDs. Each is up to 2,048 characters | Reads these pages | `["186338"]` | Use for known places |
| `startUrls` | Start URLs | array | one input needed | empty | Up to 100 Tripadvisor links, each up to 2,048 characters | Same as `placeUrls` | a place link | Use when you move from another scraper |
| `sourceDatasetId` | Source dataset | string | one input needed | empty | A dataset you can read, up to 100 rows | Reads place links from its rows | a dataset ID | Use to chain runs |
| `maxItems` | Maximum places | integer | no | default and prefill `10` | 1 to 1,000,000 | Stops after this many unique place checks | `50` | Keep low on a first run |
| `maxReviews` | Maximum reviews per place | integer | no | default `100` | 1 to 1,000,000 | Limits reviews from each place | `300` | Controls the cost |
| `maxResults` | Maximum reviews in total | integer | no | default `1000` | 1 to 1,000,000 | Limits reviews across all places | `5000` | Raise it for big jobs |
| `placeTypes` | Place types | array | no | all three types | `restaurants`, `hotels`, `attractions` | Limits a city search | `["hotels"]` | Pick one for a clean list |
| `reviewLanguages` | Review languages | array | no | empty | Up to 10 language codes | Keeps these original languages | `["en","fr"]` | Leave empty for all |
| `reviewRatings` | Review ratings | array | no | empty | `"1"` to `"5"` | Keeps these ratings | `["1","2"]` | Use to read complaints |
| `travelerTypes` | Traveler types | array | no | empty | `FAMILIES`, `COUPLES`, `SOLO`, `BUSINESS`, `FRIENDS` | Keeps these groups | `["FAMILIES"]` | Leave empty for all |
| `monthsOfVisit` | Months of visit | array | no | empty | `"1"` to `"12"` | Keeps these visit months | `["7"]` | Use for season checks |
| `keyword` | Review keyword | string | no | empty | An English word or phrase, up to 200 characters | Searches inside reviews | `breakfast` | Use one short word |
| `since` | Reviews since | string | no | empty | `YYYY-MM-DD` | Keeps reviews from this date | `2026-01-01` | Use for a fixed period |
| `until` | Reviews until | string | no | empty | `YYYY-MM-DD` | Keeps reviews up to this date | `2026-06-30` | Use with `since` |
| `recentDays` | Recent days | integer | no | default `0` (off) | 0 to 36,500 | Keeps reviews from the last days | `30` | Use on a schedule |
| `sortBy` | Review order | string | no | default `mostRecent` | `mostRecent`, `mostHelpful`, `detailed` | Sets the review order | `mostHelpful` | Keep the default |
| `scrapeReviewerInfo` | Include reviewer information | boolean | no | default `true` | true, false | Adds public reviewer data | `false` | Turn off if you do not need names |
| `includeAiReviewsSummary` | Include AI review summary | boolean | no | default `false` | true, false | Adds the summary shown on the page | `true` | Not all places have one |
| `includeNearbyResults` | Include nearby places | boolean | no | default `false` | true, false | Adds nearby places | `true` | Use for area checks |
| `includeTags` | Include tags | boolean | no | default `true` | true, false | Adds cuisine, amenity and type tags | `false` | Keep on |
| `maxPhotosPerPlace` | Maximum place photos | integer | no | default `0` (off) | 0 to 100 | Adds photo links | `5` | Keep low |
| `photosType` | Photo contributors | string | no | default `fromEveryone` | `fromEveryone`, `fromTravelers`, `fromManagement` | Picks whose photos to add | `fromTravelers` | Use with photos on |
| `checkInDate` | Hotel check-in date | string | no | empty | `YYYY-MM-DD` | Asks for offers on these dates | `2026-12-10` | Set both dates |
| `checkOutDate` | Hotel check-out date | string | no | empty | `YYYY-MM-DD`, after check-in | Asks for offers on these dates | `2026-12-12` | Set both dates |
| `currency` | Currency | string | no | default `USD` | Currency code | Sets the offer currency | `EUR` | Use with hotel dates |
| `language` | Language | string | no | default `en` | Language code | Sets review labels | `fr` | Keep the default |
| `locale` | Site locale | string | no | default `en-US` | Site locale | Sets labels and review responses | `fr-FR` | Keep the default |
| `outputShape` | Review output | string | no | default `flat` | `flat`, `nested` | One row per review, or reviews inside a place row. A place with more than about 2,500 reviews takes several rows | `nested` | Keep `flat` for tables |
| `deliveryConnector` | Send results to (optional) | string | no | empty | Your MCP connector, up to 200 characters | Posts a short summary | your Slack connector | Optional |
| `deliveryTarget` | Notion page or channel (optional) | string | no | empty | Notion page link or Slack channel ID, up to 2,048 characters | Sets where it posts | a channel ID | Optional |
| `maxPages` | Maximum pages per listing or place | integer | no | default `50000` | 1 to 1,000,000 | Stops a long scan | `100` | Keep the default |
| `proxyMode` | Connection route | string | no | default `auto` | `auto`, `direct`, `datacenter` | Picks the connection | `direct` | Keep `auto` |
| `proxyGroups` | Datacenter proxy groups | array | no | empty | Up to 5 datacenter group names | Picks proxy groups | `["SHADER"]` | Leave empty |

#### Interacting settings

| When | Input A | Input B | Effective behavior | Example | Cost/result effect |
| --- | --- | --- | --- | --- | --- |
| Both are set | `placeUrls` | `query` | Links win, and the search is ignored | A link plus a city | Only the links are charged |
| Both are set | `since` | `recentDays` | `since` wins | A date plus 30 days | Fewer or more reviews |
| A date filter is set | `since` or `until` | `sortBy` | Reviews run from most recent first | `mostHelpful` plus a date | Order changes |
| Reviews mode | `maxReviews` | `maxResults` | The first limit reached stops the run | 100 per place, 1,000 in total | Caps review charges |
| Only one date is set | `checkInDate` | `checkOutDate` | The run stops before work with a clear message | Check-in only | Start fee only |
| Nested output | `outputShape` | `maxReviews` | One place row holds its reviews | 3 reviews inside 1 row | Each review is still charged |
| Search with a city | `query` | `placeTypes` | Only chosen types are read | `Lyon`, hotels only | Fewer place checks |

#### Input examples

##### Search for places

```json
{
  "mode": "search",
  "query": "Pattaya restaurants",
  "maxItems": 10
}
```

Expected behavior: the Actor opens the restaurant list for Pattaya and reads 10 place pages.
Expected output: 10 place rows with `name`, `rating`, `reviewsCount`, `ranking` and `phone`.
Limit or cost note: about 20 to 35 seconds and about $0.03.

##### Reviews with filters

```json
{
  "mode": "reviews",
  "placeUrls": ["https://www.tripadvisor.com/Hotel_Review-g187147-d207742-Reviews-Intercontinental_Paris_Le_Grand_By_IHG-Paris_Ile_de_France.html"],
  "maxReviews": 300,
  "reviewRatings": ["1", "2"],
  "maxResults": 300
}
```

Expected behavior: the Actor reads the review pages of this hotel and keeps only 1 and 2 star reviews.
Expected output: up to 300 review rows with `rating`, `title`, `text` and `publishedDate`.
Limit or cost note: without filters, 300 reviews of one place took 21 to 27 seconds and cost about $0.82.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/OsYO8hpbixO91Uuqs/input)**

### Output

#### Output fields

Fields depend on the row type and the place type. An empty field means the source did not show that value for this place.

| Field | Meaning | Type | Can be empty? | Example / enum | Source / notes |
| --- | --- | --- | --- | --- | --- |
| `recordType` | Row type | string | no | `place`, `review` | Missing on status rows |
| `status` | Row state | string | no | `complete`, `not_found`, `failed`, `invalid_url` | Status rows are free |
| `reason` | Why a status row exists | string | on data rows | `NO_RESULTS`, `NO_MATCHING_REVIEWS` | Status rows only |
| `placeId`, `locationId` | Place ID | number | on some status rows | `12283373` | From the place link |
| `name` | Place name | string | conditional | `Longhorn Steakhouse & Grill` | Place and review rows |
| `type` | Place type | string | conditional | `restaurant`, `hotel`, `attraction` | Place rows |
| `rating` | Rating of the place or review | number | conditional | `4.7` | 1 to 5 |
| `reviewsCount` | Number of reviews | number | conditional | `597` | As the page shows it |
| `ranking` | Position in the city | string | conditional | `#30 of 1,515 Restaurants in Pattaya` | Text from the page |
| `address`, `phone`, `website` | Contact details on the page | string | conditional | `+66 81 860 1575` | Public values only |
| `latitude`, `longitude` | Coordinates | number | conditional | `12.930813` | Place rows |
| `priceLevel` | Price band | string | yes, often on attractions | `$$ - $$$` | Text from the page |
| `priceRange` | Hotel price range | object | yes | `{minimum: 94, maximum: 156, currency: "USD"}` | Empty when the source shows no range |
| `offers` | Hotel offers | array | yes | price text, amount, provider, currency, dates | Offers for your dates have no provider name |
| `roomCount` | Number of rooms | number | yes | `390` | Some hotels |
| `description` | Place description | string | yes | | Some places |
| `cuisines` | Cuisines | array | yes | `["Steakhouse"]` | Restaurants only |
| `amenities` | Amenities | array | yes | | Hotels only |
| `tags` | Cuisine, amenity and type tags | array | yes | `["European"]` | With `includeTags` |
| `openingHours` | Opening times | array | yes | `{day, opens, closes}` | Restaurants and attractions; the day format differs by type |
| `awards` | Awards of this place | array | yes | `{type: "COE", year: 2026}` | `COE` is Travelers' Choice; `BOTB` is Best of the Best |
| `subratings` | Ratings by topic | array | yes | `{name: "food", rating: 4.5}` | Rare on attractions |
| `ratingHistogram` | Count per star | object | yes | `{five: 488}` | Place rows |
| `neighborhoods` | Area names | array | yes | | Some places |
| `menuUrl` | Menu link | string | yes | | Some restaurants |
| `aiReviewSummary` | Summary shown on the page | string | yes | | With `includeAiReviewsSummary` |
| `nearbyPlaces` | Nearby places | array | yes | | With `includeNearbyResults` |
| `photos` | Photo links | array | yes | | With `maxPhotosPerPlace` |
| `url` | Page link | string | no on data rows | a Tripadvisor link | |
| `id` | Review ID | number | on place rows | `1079747211` | Review rows |
| `title`, `text` | Review title and text | string | conditional | `Mixed` | Review rows |
| `publishedDate`, `date` | Date and time of the review | string | conditional | `2026-09-28T22:09:55.062Z` | Review rows |
| `travelDate` | Month of the visit | string | yes | `2026-09` | Review rows |
| `tripType` | Traveler group | string | yes | `FRIENDS` | Review rows |
| `language`, `lang`, `originalLanguage` | Row language and original language | string | yes | `en`, `fr` | Review rows |
| `isMachineTranslated` | Text was translated by the source | boolean | yes | `true` | Review rows |
| `helpfulVotes` | Helpful votes | number | yes | `1` | Review rows |
| `user` | Public reviewer data | object | yes | | With `scrapeReviewerInfo` |
| `ownerResponse` | The owner's reply | object | yes | | When the place replied |
| `placeInfo` | Short place data on a review | object | yes | | Review rows |
| `reviews` | Reviews inside a place row | array | yes | | With `nested` output |
| `query`, `sourceDatasetId` | Input of a status row | string | yes | | Status rows |
| `source`, `fetchedAt` | Source name and read time | string | no on data rows | `Tripadvisor` | |

Compared with some other scrapers, `id` is a number, `publishedDate` holds a date and a time, and an empty `subratings` is `null` or `[]`.

#### Output entities and surfaces

The dataset has three views: **Places**, **Reviews** and **Places with reviews**.

| Situation | Dataset/API/KVS/live view | Result shape | User action |
| --- | --- | --- | --- |
| Normal item | Dataset | One row per place or per review | Open a view or export the rows |
| Domain-empty result | Dataset | A free status row with `status: not_found` and `reason` | Check the search or relax the filters |
| Partial result | Dataset and `RUN_SUMMARY` | The saved rows, and a summary with the stop reason | Raise the limit or the timeout and run again |
| Technical failure or retry | Status message and `RUN_SUMMARY` | Saved rows are kept, and the run shows as failed | Try later, or open an issue with the run ID |

#### Output example

This example is trimmed and comes from the first search example above.

```json
{
  "recordType": "place",
  "status": "complete",
  "placeId": 12283373,
  "name": "Longhorn Steakhouse & Grill",
  "type": "restaurant",
  "rating": 4.7,
  "reviewsCount": 597,
  "ranking": "#30 of 1,515 Restaurants in Pattaya",
  "address": "216/47-48 Pattaya 2nd Rd Inside Plaza Arcade, 20150, TH",
  "phone": "+66 81 860 1575",
  "latitude": 12.930813,
  "longitude": 100.88198,
  "priceLevel": "$$ - $$$",
  "cuisines": ["Steakhouse", "European"],
  "awards": [{ "type": "COE", "year": 2026 }],
  "description": null,
  "menuUrl": null,
  "source": "Tripadvisor"
}
```

`null` means the page did not show this value for this place. Some fields fit only one place type. For example, `cuisines` fits restaurants, and `amenities` and `offers` fit hotels.

#### Send results to Slack or Notion

Choose your connector in the optional `deliveryConnector` field. When the run has saved its rows, the Actor posts a short summary there: up to 25 rows and a link to the full dataset. Put a Notion page link or a Slack channel ID in `deliveryTarget`. In Notion, each run goes on top of that one page, so you do not get a new page each time. If delivery fails, the run still succeeds, and delivery has no extra fee. Connect a service once in Apify Console → MCP connectors.

#### Use case → fields

| Buyer job | Input path | Output entity | Key fields | Next integration |
| --- | --- | --- | --- | --- |
| Rank places in a city | `query` | Place | `name`, `ranking`, `rating` | CSV export |
| Read complaints | `placeUrls`, `reviewRatings` | Review | `rating`, `text`, `ownerResponse` | Spreadsheet |
| Check stay prices | `placeUrls`, `checkInDate`, `checkOutDate` | Place | `offers`, `priceRange` | API |

> **👉 [Try it now: open the input form](https://console.apify.com/actors/OsYO8hpbixO91Uuqs/input)**

### Pricing

#### Pricing unit

You pay per event. Tripadvisor and Apify proxy use is included in the event price.

| Event | When charged | No plan or Free | Bronze | Silver | Gold and above |
| --- | --- | ---: | ---: | ---: | ---: |
| Review | Each saved review | $0.0027 | $0.00243 | $0.00216 | $0.00189 |
| Place | Each saved place row | $0.0017 | $0.00153 | $0.00136 | $0.00119 |
| Place check | Each unique place the Actor opens | $0.001 | $0.0009 | $0.0008 | $0.0007 |
| Review page | Each page of reviews read | $0.0005 | $0.00045 | $0.0004 | $0.00035 |
| Start | Each run | $0.0036 | $0.00324 | $0.00288 | $0.00252 |

Bronze saves 10%. Silver saves 20%. Gold, Platinum and Diamond save 30%. The start fee scales with run memory, per GB. Runs up to 1 GB pay it once, and this Actor's maximum is 512 MB.

- **Search with no results:** you pay the start fee only. The status row is free.
- **Filter with no match:** you pay the start fee, the place check and the review pages read. The status row is free.
- **Partial and failed runs:** you pay for what was saved or checked before the stop. You can set a maximum cost per run, and the Actor stops there.
- **Platform use:** it is included in these prices.

#### Cost examples

Prices below are for No plan or Free.

| Scenario | Input scope | Expected item/event count | Base charge | Optional charge | Stop/cap behavior |
| --- | --- | ---: | ---: | ---: | --- |
| First run | 10 restaurants in Pattaya | 10 places, 10 checks | about $0.03 | none | Stops at `maxItems` |
| City list | 100 restaurants in London | 100 places, 100 checks | about $0.27 | none | Set a 900-second timeout |
| 300 reviews | 1 attraction | 300 reviews, 15 pages | about $0.82 | none | Stops at `maxReviews` |
| 700 reviews | 1 hotel | 700 reviews, 36 pages | about $1.91 | none | Stops at `maxReviews` |
| No match | 1 place, strict filter | 1 check, 1 page | about $0.005 | none | Free status row |
| Not found | A search with no result | start only | $0.0036 | none | Free status row |

> **👉 [Try it now: open the input form](https://console.apify.com/actors/OsYO8hpbixO91Uuqs/input)**

### Limits

- **Public pages only:** there is no login, no private data and no email search.
- **Speed:** up to one request per second. A place usually takes 2 to 7 seconds, and reviews come at 11 to 16 per second. When Tripadvisor refuses a page, retries can stretch one place to about 45 seconds.
- **Time limit:** the Actor stops 20 seconds before your timeout and keeps the saved rows. The default 300 seconds fits about 40 places. 100 London restaurants took from 200 to 534 seconds, and one run saved only 94 places in 600 seconds. Tripadvisor pages load at different speeds, so use a 900-second timeout for 100 places.
- **Direct inputs:** up to 100 links in `placeUrls`, up to 100 in `startUrls`, and up to 100 rows in `sourceDatasetId`. A link can have up to 2,048 characters. You need read access to this dataset.
- **City lists:** the Actor reads the list as the source shows it. It does not split a big city into smaller areas, so a list can end before all places are read.
- **Hotel offers:** the list can be empty on a complete row. Offers for your dates have no provider name. Occupancy is fixed at 2 adults and 1 room.
- **Page size:** a single response over 8 MB is refused.
- **Failures:** 3 failed inputs in a row stop the run, and saved rows stay in the dataset. If no input works, the run shows as failed.
- **Nested rows:** one row holds up to 8 MB of reviews, about 2,500. A place with more reviews takes several rows. 300 reviews made a row of 0.84 MB.
- **Connection:** a direct connection comes first, and an Apify datacenter proxy follows after a block. Residential, Unblocker and SERP groups are not supported.
- **Not included:** Standby mode, a list of only new items, and custom scripts. Use `recentDays` on a schedule for recent reviews.
- **Missing values:** the source does not show every field for every place.
- **Terms:** Tripadvisor's terms restrict automated collection without permission, so check that your use is allowed. This Actor is not made or approved by Tripadvisor.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/OsYO8hpbixO91Uuqs/input)**

### API, export and integrations

- **API:** start the Actor through the Apify API with the same JSON input, then read rows from its dataset. This is not a Tripadvisor API.
- **Export:** download the dataset as CSV, Excel, JSON or XML.
- **Scheduling:** run a saved task on an Apify schedule, for example with `recentDays` for recent reviews.
- **Webhooks / no-code:** an Apify webhook or integration can start the next step when the run ends. It reads the rows from the default dataset.
- **SDK / MCP / agent:** use the Apify client for JavaScript or Python, or the MCP server below.

#### Use with AI agents (MCP)

MCP server URL with only this Actor: `https://mcp.apify.com?tools=cliqtomedia/tripadvisor-scraper`

The smallest useful input:

```json
{ "mode": "search", "query": "Pattaya restaurants", "maxItems": 10 }
```

Key output fields:

- `name`: the place name.
- `rating`: the average rating, from 1 to 5.
- `reviewsCount`: the number of reviews.
- `ranking`: the position of the place in its city.
- `url`: the link to the place page.

This run takes about 20 to 35 seconds and costs about $0.03. Each place usually takes 2 to 7 seconds. Reviews cost $0.0027 each on the Free plan, so set `maxReviews` and a maximum cost.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/OsYO8hpbixO91Uuqs/input)**

### Troubleshooting

| Symptom | Likely reason | Check | Action |
| --- | --- | --- | --- |
| One row with `status: not_found` and `NO_RESULTS` | The search found no places | The words in `query` | Use a city plus a place type, or a link |
| A place that does not look like your search | Tripadvisor search matched one word of your `query` | The words in `query` | Use a city plus a place type, or a link |
| `status: not_found` and `NOT_FOUND` | The place link or ID does not exist | Open the link in a browser | Fix the link or the ID |
| `status: not_found` and `NO_MATCHING_REVIEWS` | No review passes your filters | Your review filters | Remove a filter |
| `status: invalid_url` | The link is not from Tripadvisor | The link in the row | Use a Tripadvisor link |
| "An input field has a wrong value: placeUrls." | The field breaks a limit, such as over 100 links in `placeUrls` or `startUrls`. A name such as `placeUrls.1` points to one item, counted from 0 | The field or item named in the message | Split the links into smaller runs, or shorten that item |
| "Add a search query, a Tripadvisor URL, or a source dataset." | All inputs are empty | The input form | Fill in one input |
| "The run reached its time limit." | The timeout was too short | The run options | Raise the timeout, and run again |
| "The run stopped at your maximum cost per run." | Your cost limit was reached | The run options | Raise the limit, and run again |
| "Maximum pages was reached, so more results may exist." | `maxPages` stopped the scan | `maxPages` | Raise it |
| One row with `status: failed`, or "Some inputs failed." | Tripadvisor refused or timed out on this place | `url` and `reason` in the row | Run that link again. The other rows are kept |
| "Tripadvisor refused the requests." or "asked to slow down" | The source is blocking for now | `RUN_SUMMARY` | Keep `proxyMode` on `auto`, and try later |
| "The source dataset could not be read." | Wrong ID or no access | The dataset ID | Use a dataset you can read |
| "The source dataset has over 100 rows." | The dataset is too large | The dataset size | Use up to 100 rows |
| "The Tripadvisor page format has changed." | The source page changed | The run log | Open an issue with the run ID |
| `offers` is empty | The source shows no offers for this hotel | `checkInDate`, `checkOutDate` | Try other dates |

> **👉 [Try it now: open the input form](https://console.apify.com/actors/OsYO8hpbixO91Uuqs/input)**

### FAQ

#### Do I need a Tripadvisor account or an API key?

No. The Actor reads public pages. You need only an Apify account.

#### Is this a Tripadvisor API?

No. It is a scraper that you can start through the Apify API. It does not use a Tripadvisor key.

#### Why are some fields empty?

The source does not show every value for every place. Some fields also fit only one place type. For example, attractions have no `cuisines`.

#### Can I get all reviews of a place?

Set `maxReviews` and `maxResults` above the review count, and set a long enough timeout. We measured up to 700 reviews from one place in one run. The count on the page can differ from the rows you get.

#### What do I pay when nothing is found?

You pay the start fee. If a place was opened, you also pay the place check and the review pages. Status rows are free.

#### How fresh is the data?

Each row shows the read time in `fetchedAt`. The Actor does not keep history between runs.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/OsYO8hpbixO91Uuqs/input)**

### Related Actors

- [OpenTable Reviews & Restaurants Scraper, No Login](https://apify.com/cliqtomedia/opentable-reviews-scraper): add restaurant reviews from another source.
- [Trustpilot Reviews Scraper - Ratings & Replies, No Login](https://apify.com/cliqtomedia/trustpilot-reviews-scraper): compare guest feedback with company reviews.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/OsYO8hpbixO91Uuqs/input)**

### Support

For a bug, a question or a feature request, open the **Issues** tab of this Actor on Apify. Include the run ID, the mode and the error text. Never send tokens, cookies or private data.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/OsYO8hpbixO91Uuqs/input)**

# Changelog

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

# Actor input Schema

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

Search for places, read place details, or collect reviews.

## `query` (type: `string`):

Enter a city, business name, numeric place ID, or Tripadvisor URL, up to 300 characters. For example, Pattaya restaurants.

## `placeUrls` (type: `array`):

Add up to 100 hotel, restaurant, attraction, city listing, or public trip URLs, or numeric place IDs, such as 186338. These take priority over the search query. A URL that is not from Tripadvisor gets a status row and is skipped.

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

Use this field when moving from another Tripadvisor scraper. Accepts up to 100 Tripadvisor URLs, such as https://www.tripadvisor.com/Hotel_Review-g187147-d207742-Reviews-Intercontinental_Paris_Le_Grand_By_IHG-Paris_Ile_de_France.html.

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

Read up to 100 Tripadvisor place URLs from an existing Apify dataset. Enter the dataset ID from its page in Apify Console. You must have access to it.

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

Stop after this many unique place checks across all inputs, including places with no matching reviews. Use 1 to 1,000,000, such as 50. The default is 10.

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

Collect up to this many matching reviews from each place. Use 1 to 1,000,000, such as 300. The default is 100.

## `maxResults` (type: `integer`):

Stop after this many matching reviews across all places. Use 1 to 1,000,000, such as 5000. The default is 1000.

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

Choose restaurants, hotels, attractions, or several, when the query is a city. All three are searched by default.

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

Collect reviews in these original languages, such as en, fr, or es. Leave empty for all languages.

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

Include these star ratings. Leave empty for all ratings.

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

Filter reviews by the traveler group reported on Tripadvisor. Leave empty for all groups.

## `monthsOfVisit` (type: `array`):

Filter by the month of the visit. Leave empty for all months.

## `keyword` (type: `string`):

Search for an English word or phrase within reviews, up to 200 characters, such as breakfast. Leave empty to collect all matching reviews.

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

Include reviews on or after this date, in YYYY-MM-DD format, such as 2026-01-01. This uses most recent sorting.

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

Include reviews on or before this date, in YYYY-MM-DD format, such as 2026-06-30.

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

Use a rolling review date cutoff. A value of 0 disables this filter. Reviews since takes priority.

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

Choose the source review order. Date filters always use most recent first.

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

Include public reviewer names, profile links, avatars, and contribution counts.

## `includeAiReviewsSummary` (type: `boolean`):

Include the summary published by Tripadvisor when it is present on the place page.

## `includeNearbyResults` (type: `boolean`):

Include the nearby places shown on a place page.

## `includeTags` (type: `boolean`):

Include cuisine, amenity, and attraction type tags from place details.

## `maxPhotosPerPlace` (type: `integer`):

Include up to this many public photo URLs for each place. A value of 0 skips photos.

## `photosType` (type: `string`):

Choose whose photos to include.

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

Check-in date for hotel offers, in YYYY-MM-DD format, such as 2026-12-10. Set a check-out date as well.

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

Check-out date for hotel offers, in YYYY-MM-DD format, such as 2026-12-12. Must be after check-in.

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

Currency code to request for hotel offers, such as USD or EUR. Historical price ranges keep the currency reported by the source.

## `language` (type: `string`):

Language code used for review labels when the site locale is not set, such as en or fr. Review language filters are separate.

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

Tripadvisor locale for labels and review responses, such as en-US or fr-FR.

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

Use one row per review, or group the matching reviews inside a place row. A place with more than about 2,500 reviews takes several rows.

## `deliveryConnector` (type: `string`):

Your Slack, Notion or other MCP connector. After the run the Actor posts a short summary there. Connect services once in Apify Console → MCP connectors.

## `deliveryTarget` (type: `string`):

Where to post the summary: a Notion page link (each run is added on top of that page) or a Slack channel ID. Leave empty to let the connector decide.

## `maxPages` (type: `integer`):

Stop scanning when this page limit is reached. The run summary shows when this limit leaves more results.

## `proxyMode` (type: `string`):

Automatic tries a direct connection first and uses Apify datacenter proxy after a block. Choose direct to disable proxy use. Proxy use is included in the event price.

## `proxyGroups` (type: `array`):

Optional names of Apify datacenter proxy groups available in your account. Leave empty to use the default pool. Residential, Unblocker, and SERP groups are not supported.

## Actor input object example

```json
{
  "mode": "search",
  "query": "Pattaya restaurants",
  "maxItems": 10,
  "maxReviews": 100,
  "maxResults": 1000,
  "placeTypes": [
    "restaurants",
    "hotels",
    "attractions"
  ],
  "reviewRatings": [],
  "travelerTypes": [],
  "monthsOfVisit": [],
  "recentDays": 0,
  "sortBy": "mostRecent",
  "scrapeReviewerInfo": true,
  "includeAiReviewsSummary": false,
  "includeNearbyResults": false,
  "includeTags": true,
  "maxPhotosPerPlace": 0,
  "photosType": "fromEveryone",
  "currency": "USD",
  "language": "en",
  "locale": "en-US",
  "outputShape": "flat",
  "maxPages": 50000,
  "proxyMode": "auto"
}
```

# Actor output Schema

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

No description

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

No description

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "query": "Pattaya restaurants",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("cliqtomedia/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 = {
    "query": "Pattaya restaurants",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("cliqtomedia/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 '{
  "query": "Pattaya restaurants",
  "maxItems": 10
}' |
apify call cliqtomedia/tripadvisor-scraper --silent --output-dataset

```

## MCP server setup

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