# TripAdvisor Reviews Scraper - Hotels, Restaurants, Attractions (`epctex/tripadvisor-reviews-scraper`) Actor

TripAdvisor Reviews Scraper extracts hotel, restaurant and attraction reviews by URL. At $0.50 per 1,000 reviews, all in with the per-place query charge, it returns 22 structured fields per review across 20 locale domains.

- **URL**: https://apify.com/epctex/tripadvisor-reviews-scraper.md
- **Developed by:** [epctex](https://apify.com/epctex) (community)
- **Categories:** Travel
- **Features:** Limited permissions
- **Stats:** 403 total users, 8 monthly users, 100.0% runs succeeded, 29 bookmarks
- **User rating**: 4.04 out of 5 stars

## Pricing

from $0.50 / 1,000 dataset items

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

## TripAdvisor Reviews Scraper

TripAdvisor Reviews Scraper is an Apify actor that extracts reviews from TripAdvisor hotel, restaurant and attraction listings by start URL. TripAdvisor Reviews Scraper charges $0.005 per place plus $0.0005 per review, or $0.50 per 1,000 reviews beyond each place's free allowance.

The TripAdvisor Reviews Scraper accepts 12 input fields, reads from 20 TripAdvisor locale domains, returns 22 top-level fields per review, and bills through 2 pay-per-event charge events. Every price below is a per-event charge with no subscription and no monthly minimum. The TripAdvisor Reviews Scraper runs on the Apify platform and needs only a list of TripAdvisor URLs to start.

### What Does the TripAdvisor Reviews Scraper Extract?

The TripAdvisor Reviews Scraper returns 22 top-level fields per review, grouped into 8 categories. Seven of the 22 fields are nested objects or arrays that carry further detail.

| Category            | Top-level field                                                                                                                                                      | Nested detail                                                                                       |
| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
| Review content      | `id`, `createdDate`, `publishedDate`, `publishPlatform`, `rating`, `language`, `originalLanguage`, `translationType`, `title`, `text`, `url`, `helpfulVotes`, `mcid` | 13 flat fields                                                                                      |
| Trip context        | `tripInfo`                                                                                                                                                           | 2 fields: `stayDate`, `tripType`                                                                    |
| Sub-ratings         | `additionalRatings`                                                                                                                                                  | array, 2 fields per entry: `ratingLabel`, `rating`                                                  |
| Photos              | `photos`                                                                                                                                                             | array, 2 fields per entry: `id`, `url`                                                              |
| Reviewer profile    | `userProfile`                                                                                                                                                        | 7 fields, including a nested `contributionCounts` object of 2 fields                                |
| Management response | `ownerResponse`                                                                                                                                                      | 7 fields: `id`, `publishedDate`, `language`, `text`, `username`, `responder`, `connectionToSubject` |
| Listing details     | `location`                                                                                                                                                           | 4 fields: `locationId`, `placeType`, `parentGeoId`, `name`                                          |
| Source metadata     | `inputSource`                                                                                                                                                        | 4 fields: `startUrl`, `placeId`, `pageNumber`, `filters`                                            |

`translationType` is set to `MACHINE` and `originalLanguage` holds the source language whenever the `languages` filter caused TripAdvisor to return a machine-translated review.

### Which TripAdvisor Listing Types Does the TripAdvisor Reviews Scraper Accept?

The TripAdvisor Reviews Scraper accepts 3 TripAdvisor listing types through the `startUrls` field: `Hotel_Review`, `Restaurant_Review` and `Attraction_Review` detail pages. Each URL must use the `http` or `https` protocol and resolve to a hostname that contains `tripadvisor`, and it must carry a place ID in the `-d<digits>-` segment of its path. A URL that fails either check is logged and skipped rather than stopping the run.

- `startUrls` takes an array of TripAdvisor detail URLs, such as `https://www.tripadvisor.com/Hotel_Review-g60763-d15288822-Reviews-...html`, and queues one review query per unique place ID found in the array.
- Two start URLs that resolve to the same place ID are deduplicated: only the first is queued, and the TripAdvisor Reviews Scraper logs the later one as already queued.

### Who Uses the TripAdvisor Reviews Scraper?

Listed below are the 4 roles that run the TripAdvisor Reviews Scraper against TripAdvisor listing data.

- **Market analysts and researchers** read `rating`, `additionalRatings` and `tripInfo` across every place in `startUrls` to compare listings on price-independent, structured sub-ratings such as Value, Rooms, Location and Cleanliness.
- **Hospitality teams** filter with `since` and `ratings` to pull recent low-scoring reviews, then read `text`, `ownerResponse` and `helpfulVotes` to prioritize which guest complaints already have a management reply and which do not.
- **Content creators and bloggers** read `text`, `photos` and `userProfile.displayName` to source quotable, attributable guest feedback for destination and accommodation write-ups.
- **Academic and tourism researchers** use `languages` and `locale` together with `customMapFunction` to build multi-language datasets of guest-generated content across hotels, restaurants and attractions.

### What Does the TripAdvisor Reviews Scraper Cost?

The TripAdvisor Reviews Scraper charges 2 pay-per-event types. **A** `review-query` **costs $0.005** and **a** `dataset-item` **costs $0.0005**.

| Event          | Price   | Charged for                                                                                                                                 |
| -------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `review-query` | $0.005  | Once per unique place in `startUrls`, charged up front regardless of how many pages of reviews that place needs.                            |
| `dataset-item` | $0.0005 | Once per review written to the dataset. On paid plans, the first 10 reviews of every place are free; on free plans every review is charged. |

#### TripAdvisor Reviews Scraper Cost Examples

The table below prices 4 scenarios against the rate card above.

| Scenario                             | Charge events                                             | Calculation                    | Total cost |
| ------------------------------------ | --------------------------------------------------------- | ------------------------------ | ---------- |
| 1 place, 100 reviews, paid plan      | 1 `review-query` + 90 `dataset-item` (10 free)            | $0.005 + (90 x $0.0005)        | **$0.05**  |
| 3 places, 10 reviews each, paid plan | 3 `review-query` + 0 `dataset-item` (all 30 free)         | 3 x $0.005                     | **$0.015** |
| 1 place, 10 reviews, free plan       | 1 `review-query` + 10 `dataset-item` (no free allowance)  | $0.005 + (10 x $0.0005)        | **$0.01**  |
| 5 places, 50 reviews each, paid plan | 5 `review-query` + 200 `dataset-item` (10 free per place) | (5 x $0.005) + (200 x $0.0005) | **$0.125** |

#### TripAdvisor Reviews Scraper Unit Economics

The 4 figures below are derived from the rate card above. None of them include the `review-query` charge unless stated.

| Metric                                                             | Value |
| ------------------------------------------------------------------ | ----- |
| Reviews per $1, `dataset-item` charges only                        | 2,000 |
| Cost per 1,000 reviews beyond a place's free allowance (paid plan) | $0.50 |
| Ratio between a `review-query` charge and a `dataset-item` charge  | 10x   |
| Free reviews per place, paid plan only                             | 10    |

A run also checks its budget before it starts. If `ACTOR_MAX_TOTAL_CHARGE_USD` cannot cover one `review-query` per place, or, on a free plan, leaves no room for at least one `dataset-item` charge afterward, the TripAdvisor Reviews Scraper stops before queuing any request. In that case a non-paying account is charged for 10 `dataset-item` events as a minimum charge before the run exits; a paid account is not, since its per-place free allowance can still cover output on a query-only budget.

#### Does the TripAdvisor Reviews Scraper Offer a Free Demo Mode?

Yes. Free-plan accounts can run the TripAdvisor Reviews Scraper without a subscription, capped at 5 runs per month and 10 items per run. This cap overrides any `maxItems` value passed in the input: a Free-plan run does not scrape past 10 items per run, regardless of what `maxItems` requests. The Apify API is not available on the Free plan. Subscribing to a paid plan removes both caps and enables API access.

### How Is the TripAdvisor Reviews Scraper Configured?

The TripAdvisor Reviews Scraper exposes 8 input fields covering start URLs, date and rating filters, language and locale, pagination and output shaping.

![TripAdvisor Reviews Scraper start URL input](https://cdn.epctex.com/actors/tripadvisor-reviews/1.png)
![TripAdvisor Reviews Scraper optional filters](https://cdn.epctex.com/actors/tripadvisor-reviews/2.png)

| Field               | Type                   | Required | Description                                                                                                                                                                                        |
| ------------------- | ---------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`         | array                  | Yes      | TripAdvisor detail URLs to scrape. Only `Hotel_Review`, `Restaurant_Review` and `Attraction_Review` URLs are accepted.                                                                             |
| `since`             | string                 | No       | Only return reviews published on or after this date, as `YYYY-MM-DD`.                                                                                                                              |
| `ratings`           | array of `1` to `5`    | No       | Only return reviews with these star ratings.                                                                                                                                                       |
| `languages`         | array                  | No       | Target language for the reviews, as a language code such as `en`. Only the first value is applied; reviews not written in it come back machine-translated with `translationType` set to `MACHINE`. |
| `locale`            | string, 1 of 20 values | No       | TripAdvisor domain the reviews are read from, such as `tr` for tripadvisor.com.tr. It does not translate on its own; translation follows `languages`.                                              |
| `endPage`           | integer                | No       | Final page to scrape, applied per start URL.                                                                                                                                                       |
| `maxItems`          | integer                | No       | Maximum reviews to output, applied across all start URLs combined.                                                                                                                                 |
| `customMapFunction` | string                 | No       | A single synchronous JavaScript function that takes each output object and returns the object that gets pushed. It runs in a sandbox with plain JavaScript only (no network requests, `require` or `console`) and about 1 second per item; date operations are rejected - use `since` instead. |
| `outputConnector`   | string                 | No       | MCP connector to deliver the results to — pick one (see [How Do You Send TripAdvisor Reviews Scraper Results to Notion, Todoist and More?](#how-do-you-send-tripadvisor-reviews-scraper-results-to-notion-todoist-and-more)). |
| `deliverTarget`     | string                 | No       | Where the connector writes — paste the URL or ID (Notion example: `https://www.notion.so/My-Posts-24f8a1b2c3d44e5f8a9b0c1d2e3f4a5b`); some services need none.                                     |
| `deliverMode`       | string                 | No       | `perPost` (one record per item) or `summary` (one roll-up per run).                                                                                                                                |
| `deliverMaxItems`   | integer                | No       | Optional cap on how many records `perPost` delivers (ignored in `summary`).                                                                                                                        |

The `locale` field accepts 20 values: `fr`, `de`, `it`, `es`, `pt`, `nl`, `sv`, `da`, `no`, `tr`, `ru`, `he`, `th`, `ko`, `zh`, `ja`, `el`, `vi`, `id` and `ar`.

### Which Input Rules Does the TripAdvisor Reviews Scraper Enforce?

The TripAdvisor Reviews Scraper enforces 9 input rules covering URL validation, deduplication, filter scope and output shaping.

| #   | Rule                                                                                                                                                                        |
| --- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1   | At least one entry in `startUrls` is required; an empty or missing list fails the run before any charge.                                                                    |
| 2   | Each start URL must use `http` or `https` and resolve to a hostname containing `tripadvisor`; anything else is logged and skipped.                                          |
| 3   | Each start URL must contain a place ID in its path; one that does not is logged as error `C001` and skipped.                                                                |
| 4   | Two start URLs pointing at the same place ID are deduplicated to a single `review-query` charge.                                                                            |
| 5   | `languages` applies only its first value; further entries in the array are ignored downstream.                                                                              |
| 6   | `endPage` limits pages per start URL; `maxItems` limits total reviews across every start URL.                                                                               |
| 7   | The `months` and `types` inputs from the previous, non pay-per-event version of the actor are no longer supported. Passing them logs a warning and does not affect the run. |
| 8   | If `customMapFunction` is not a usable function, uses date operations (`new Date`, `Date.now`, `1970`), throws, returns a non-object or a Promise, or runs longer than about 1 second on one review, the TripAdvisor Reviews Scraper logs a warning, ignores the function for the rest of the run and pushes the untransformed reviews instead of failing the run. |
| 9   | A free-plan run additionally needs budget headroom for at least one `dataset-item` charge after its `review-query` charges, or it stops before starting.                    |

The `proxy` and `extendOutputFunction` inputs from the previous, non pay-per-event version of the actor were removed from the input schema; passing them does not break a run, they are simply ignored.

### How Do You Run a Basic Scrape with the TripAdvisor Reviews Scraper?

The TripAdvisor Reviews Scraper needs only `startUrls` to run: queue one or more TripAdvisor detail URLs and leave every other field unset to pull every review for those places, page by page, in the language it was written in.

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Restaurant_Review-g60763-d25324283-Reviews-Allora_Fifth_Ave-New_York_City_New_York.html",
    "https://www.tripadvisor.com/Hotel_Review-g60763-d15288822-Reviews-SpringHill_Suites_New_York_Manhattan_Times_Square_South-New_York_City_New_York.html"
  ]
}
```

### How Do You Run a Filtered Scrape with the TripAdvisor Reviews Scraper?

The TripAdvisor Reviews Scraper narrows to recent, high-rated, English-language reviews when `since`, `ratings`, `languages`, `endPage` and `maxItems` are added: this example caps the first page of each place at 20 reviews total and reshapes each item with `customMapFunction` before it is pushed.

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Restaurant_Review-g60763-d25324283-Reviews-Allora_Fifth_Ave-New_York_City_New_York.html",
    "https://www.tripadvisor.com/Hotel_Review-g60763-d15288822-Reviews-SpringHill_Suites_New_York_Manhattan_Times_Square_South-New_York_City_New_York.html"
  ],
  "since": "2024-01-01",
  "ratings": ["4", "5"],
  "languages": ["en"],
  "endPage": 1,
  "maxItems": 20,
  "customMapFunction": "(object) => { return {...object} }"
}
```

### How Do You Send TripAdvisor Reviews Scraper Results to Notion, Todoist and More?

Skip the manual exports — the TripAdvisor Reviews Scraper can deliver its results directly into the tools you already work in, through [Apify MCP Connectors](https://apify.com/store/collections/mcp-connectors):

1. Authorize a connector (Notion, Todoist, or any service whose MCP server offers non-destructive write tools) once in [Console → Settings → API & Integrations → MCP connectors](https://console.apify.com/settings/integrations).
2. Pick it from the **Send results to Notion, Todoist, …** dropdown.
3. Fill in where and how to write:
   - **Destination target** — paste the URL or ID (Notion example: `https://www.notion.so/My-Posts-24f8a1b2c3d44e5f8a9b0c1d2e3f4a5b`); share it with your connector first via Notion's **•••  → Connections** menu. For structured columns use a **page** URL (the Actor builds the database for you) or a database that **already has columns** — an empty database only receives titles. (Some services need no target.)
   - **Write mode** — `perPost` writes one record per review; `summary` writes a single roll-up for the run.
   - **Max records to deliver** *(optional)* — cap on how many records `perPost` delivers.

**Notion, structured like a spreadsheet:** for a table of typed columns, point the target at a Notion **page** — the Actor auto-creates a database from the data, one matching, correctly-typed column per field (URL, number, date, text). Pointing at an **existing database** fills the columns it already has (matched by name); an **empty database** receives only the title, and the rest of each record goes to the row body — the connector can't add columns to an existing database without destructive access it never requests. Nested fields are flattened into columns too — a `userProfile` object becomes `userProfile.username`, `userProfile.hometown`, … — so everything is sortable and filterable in the grid. Fields that don't fit a column go to the row's page body, so nothing is lost.

Your credentials stay yours: the Actor talks to your services exclusively through your own authorized connector and only ever uses non-destructive write tools — it cannot delete or overwrite anything you already have. Delivery is best-effort and runs after the scrape: if a connector is misconfigured or a delivery fails, your run still finishes normally with all results intact — the failure is reported in the run log, never by failing the run. If the run is about to hit its timeout, delivery stops early so the run still succeeds, and the log tells you how many records were delivered.

### Which Fields Does the TripAdvisor Reviews Scraper Output?

The TripAdvisor Reviews Scraper outputs 22 top-level fields per review, listed in the capability table above, plus an `inputSource` object that records which `startUrl`, `placeId`, `pageNumber` and filter set produced the item. A real dataset item looks like this:

```json
{
  "id": 1071727142,
  "locationId": 1469038,
  "createdDate": "2026-08-05",
  "publishedDate": "2026-08-05",
  "publishPlatform": "OTHER",
  "rating": 1,
  "language": "en",
  "originalLanguage": "en",
  "translationType": null,
  "title": "SEVERE HYGIENE ISSUES - fleas and black mold",
  "text": "Our stay at Hotel Cosmopolitan Bologna was an absolute nightmare...",
  "url": "https://www.tripadvisor.com/ShowUserReviews-g187801-d1469038-r1071727142-Hotel_Cosmopolitan_Bologna-Bologna_Province_of_Bologna_Emilia_Romagna.html",
  "helpfulVotes": 0,
  "mcid": 0,
  "tripInfo": {
    "stayDate": "2026-08-31",
    "tripType": "COUPLES"
  },
  "additionalRatings": [
    { "ratingLabel": "Value", "rating": 1 },
    { "ratingLabel": "Rooms", "rating": 1 },
    { "ratingLabel": "Location", "rating": 4 },
    { "ratingLabel": "Cleanliness", "rating": 1 },
    { "ratingLabel": "Service", "rating": 2 },
    { "ratingLabel": "Sleep Quality", "rating": 1 }
  ],
  "location": {
    "locationId": 1469038,
    "placeType": "ACCOMMODATION",
    "parentGeoId": null,
    "name": "Hotel Cosmopolitan Bologna"
  },
  "provider": null,
  "photos": [
    { "id": 874047470, "url": "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/34/18/e7/ee/caption.jpg?w=2252&h=-1&s=1" }
  ],
  "userProfile": {
    "userId": "033CD45E8168DFF759DEE83BE8A69697",
    "displayName": "Lucie M",
    "username": "LucieKatM",
    "avatar": "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/1a/f6/ef/9c/default-avatar-2020-14.jpg?w=1200&h=-1&s=1",
    "route": "/Profile/LucieKatM",
    "hometown": null,
    "contributionCounts": {
      "sumAllUgc": 1,
      "helpfulVote": null
    }
  },
  "ownerResponse": {
    "id": 1072666621,
    "publishedDate": "2026-08-11",
    "language": "en",
    "text": "Dear Mrs Maredova, thank you for sharing your feedback...",
    "username": "Daniele Scagliotti",
    "responder": "Daniele Scagliotti",
    "connectionToSubject": "Direttore generale"
  },
  "inputSource": {
    "startUrl": "https://www.tripadvisor.com/Hotel_Review-g187801-d1469038-Reviews-Hotel_Cosmopolitan_Bologna-Bologna_Province_of_Bologna_Emilia_Romagna.html",
    "placeId": "1469038",
    "pageNumber": 1,
    "filters": { "endPage": 1 }
  }
}
```

### Which Errors Does the TripAdvisor Reviews Scraper Report?

The TripAdvisor Reviews Scraper reports 6 error codes. **3 of the 6 codes are non-terminal**, skipping one URL, place or page while the rest of the run continues. **3 codes terminate the run**: `C098`, `C099` and `C100`.

The 3 non-terminal codes split into 3 recovery behaviors:

- **1 code** (`C001`) skips a single start URL whose path carries no extractable place ID; every other start URL still runs.
- **2 codes** (`C005`, `C006`) skip a single place's page after the request layer's retries (10 by default) are exhausted or return a response without a `reviews` array; the TripAdvisor Reviews Scraper moves on to the next queued page.

| Code   | Meaning                                                                                | Terminal |
| ------ | -------------------------------------------------------------------------------------- | -------- |
| `C001` | No place ID was found in a start URL's path.                                           | No       |
| `C005` | The reviews request for a place failed after retrying.                                 | No       |
| `C006` | The reviews response for a place and page was missing its `reviews` array.             | No       |
| `C098` | An unhandled promise rejection occurred during the run.                                | Yes      |
| `C099` | An uncaught exception occurred during the run.                                         | Yes      |
| `C100` | The run failed to initialize against the TripAdvisor Reviews Scraper's policy service. | Yes      |

### Which TripAdvisor Reviews Scraper Questions Come Up Most Often?

#### Does the TripAdvisor Reviews Scraper support Hotel, Restaurant and Attraction pages?

Yes. The TripAdvisor Reviews Scraper accepts `Hotel_Review`, `Restaurant_Review` and `Attraction_Review` detail URLs in the same `startUrls` array.

#### Can the TripAdvisor Reviews Scraper filter reviews by date and rating?

Yes. The `since` field filters by a `YYYY-MM-DD` lower bound and the `ratings` field filters to the selected 1 to 5 star values; both are optional and combine with each other.

#### Does the TripAdvisor Reviews Scraper translate reviews?

No. The TripAdvisor Reviews Scraper does not translate on its own. Setting `languages` returns reviews machine-translated by TripAdvisor into that language, with `originalLanguage` and `translationType: "MACHINE"` marking the ones that were translated.

#### What happens when a TripAdvisor Reviews Scraper start URL is invalid?

The TripAdvisor Reviews Scraper logs the URL as invalid and skips it; the run continues with the remaining start URLs and no charge is made for the skipped one.

#### Are duplicate place URLs charged twice by the TripAdvisor Reviews Scraper?

No. The TripAdvisor Reviews Scraper deduplicates start URLs by place ID before queuing, so a place listed twice is charged one `review-query`.

#### Can `maxItems` be set per URL in the TripAdvisor Reviews Scraper?

No. `maxItems` caps the total reviews across every start URL in the run; `endPage` is the field that applies per start URL.

#### Is there a keyword-search version of the TripAdvisor Reviews Scraper?

Yes. The [TripAdvisor Scraper](https://apify.com/epctex/tripadvisor-scraper?fpr=yhdrb) actor runs keyword and location searches to discover place URLs, descriptions and ratings, which then feed into the TripAdvisor Reviews Scraper's `startUrls`.

### Where Do You Get TripAdvisor Reviews Scraper Support?

The TripAdvisor Reviews Scraper is published and maintained by epctex. General product questions go through [epctex.com](https://epctex.com), and direct support is available at <business@epctex.com>. A video walkthrough of the TripAdvisor Reviews Scraper is available on [YouTube](https://www.youtube.com/watch?v=tAJ9JZIUNqE\&ab_channel=epctex).

# Actor input Schema

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

URLs you want to retrieve the reviews from. TripAdvisor detail URLs is only accepted.

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

Only return reviews published on or after this date, as YYYY-MM-DD. By default there is no date limit.

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

Only return reviews with these star ratings. By default all ratings are returned.

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

Target language for the reviews, as a language code (e.g. 'en'). Reviews that were not written in it are returned machine-translated, with the original language kept in originalLanguage. Only the first value is applied. By default reviews come back in the language they were written in.

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

TripAdvisor domain the reviews are read from (e.g. 'tr' reads from tripadvisor.com.tr). It does not translate on its own — translation follows the languages filter.

## `endPage` (type: `integer`):

The page number that you want to end with. By default there is no end page. This applies to each start URL individually.

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

Maximum number of reviews that you want as output, across all start URLs. Default is all

## `customMapFunction` (type: `string`):

Function that takes each of the objects as argument and returns data that will be mapped by the function itself. This function is not intended for filtering. Must be a single synchronous function, e.g. (object) => { return {...object} }. It runs in a sandbox with plain JavaScript only (no network or require) and about 1 second per item. Date operations are rejected - use the since filter instead. Leave empty if you do not need to transform the output - an unusable function is ignored and the original items are saved instead.

## `outputConnector` (type: `string`):

Pick an MCP connector you authorized in Console → Settings → API & Integrations → MCP connectors (e.g. Notion, Todoist — any service whose MCP server offers non-destructive write tools works best-effort). The scraped results are written through your own connector — the Actor never sees your third-party credentials. Only non-destructive write tools are used; it can never delete or overwrite your existing data.

## `deliverTarget` (type: `string`):

Where to write into the connector — paste the URL or ID. Notion example: https://www.notion.so/My-Posts-24f8a1b2c3d44e5f8a9b0c1d2e3f4a5b. Leave empty for services that need no target (e.g. Todoist Inbox, Slack). For Notion, share the page or database with your connector first (Notion's ••• → Connections menu), and point at a PAGE for structured columns (the Actor builds the database for you) — an empty database receives only the title (the rest of each record goes to the row's body).

## `deliverMode` (type: `string`):

perPost writes one record per scraped item; summary writes a single roll-up for the run.

## `deliverMaxItems` (type: `integer`):

Cap on how many records perPost mode writes to the connector; ignored in summary mode. Leave empty to deliver everything scraped.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.tripadvisor.com/Restaurant_Review-g60763-d25324283-Reviews-Allora_Fifth_Ave-New_York_City_New_York.html",
    "https://www.tripadvisor.com/Hotel_Review-g60763-d15288822-Reviews-SpringHill_Suites_New_York_Manhattan_Times_Square_South-New_York_City_New_York.html?spAttributionToken=MjMyMTAzMzg"
  ],
  "since": "2024-01-01",
  "languages": [
    "en"
  ],
  "endPage": 1,
  "maxItems": 20,
  "customMapFunction": "(object) => { return {...object} }",
  "deliverMode": "perPost"
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrls": [
        "https://www.tripadvisor.com/Restaurant_Review-g60763-d25324283-Reviews-Allora_Fifth_Ave-New_York_City_New_York.html",
        "https://www.tripadvisor.com/Hotel_Review-g60763-d15288822-Reviews-SpringHill_Suites_New_York_Manhattan_Times_Square_South-New_York_City_New_York.html?spAttributionToken=MjMyMTAzMzg"
    ],
    "since": "2024-01-01",
    "languages": [
        "en"
    ],
    "endPage": 1,
    "maxItems": 20,
    "customMapFunction": (object) => { return {...object} }
};

// Run the Actor and wait for it to finish
const run = await client.actor("epctex/tripadvisor-reviews-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [
        "https://www.tripadvisor.com/Restaurant_Review-g60763-d25324283-Reviews-Allora_Fifth_Ave-New_York_City_New_York.html",
        "https://www.tripadvisor.com/Hotel_Review-g60763-d15288822-Reviews-SpringHill_Suites_New_York_Manhattan_Times_Square_South-New_York_City_New_York.html?spAttributionToken=MjMyMTAzMzg",
    ],
    "since": "2024-01-01",
    "languages": ["en"],
    "endPage": 1,
    "maxItems": 20,
    "customMapFunction": "(object) => { return {...object} }",
}

# Run the Actor and wait for it to finish
run = client.actor("epctex/tripadvisor-reviews-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://www.tripadvisor.com/Restaurant_Review-g60763-d25324283-Reviews-Allora_Fifth_Ave-New_York_City_New_York.html",
    "https://www.tripadvisor.com/Hotel_Review-g60763-d15288822-Reviews-SpringHill_Suites_New_York_Manhattan_Times_Square_South-New_York_City_New_York.html?spAttributionToken=MjMyMTAzMzg"
  ],
  "since": "2024-01-01",
  "languages": [
    "en"
  ],
  "endPage": 1,
  "maxItems": 20,
  "customMapFunction": "(object) => { return {...object} }"
}' |
apify call epctex/tripadvisor-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/vjPBUmIq9Dzcip2XI/builds/E6IymzCdQExQS4RLF/openapi.json
