# Trip.com Attraction Reviews Scraper (`boncross/tripcom-reviews`) Actor

Scrape Trip.com reviews for any attraction. Just add an attraction URL and get every review with its rating, full text, language, photos, author, helpful count and exact post date, plus the Tripadvisor reviews shown alongside. It covers attractions, not hotels. $2.00 per 1,000 reviews.

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

## Pricing

from $1.40 / 1,000 review-scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

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

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

## How to integrate an Actor?

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

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

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

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

# README

## Trip.com Attraction Reviews Scraper

### What is Trip.com Attraction Reviews Scraper?

Trip.com Attraction Reviews Scraper collects what visitors wrote about a sight, a theme park or a museum on Trip.com. Paste the attraction's link and you get its reviews one per row: the rating out of five, the full text, the photos, and the exact time each was posted. Flip one switch and the Tripadvisor reviews Trip.com shows on the same page arrive in the same run, marked by source.

This one is for attraction pages. Reviews of Trip.com hotels come from [Trip.com Hotel Details Scraper](https://apify.com/boncross/tripcom-hotel-details), which is a different actor.

What you're getting, with the numbers behind it:

- Depth. 1,500 reviews of one attraction took 30 seconds, and you can ask for all of them. The attraction we measured holds 40,500.
- Breadth. 150 attractions at up to 50 reviews each returned 6,791 reviews in 110 seconds.
- Real dates. Each row has a timestamp such as `2026-10-06T05:17:40.000Z` next to Trip.com's "1 day ago".
- One spelling per language. Trip.com writes the same language several ways. Rows come out as `en`, `en-GB`, `zh-CN`, and you can group on that column straight away. A 241-review sample on 7 October 2026 held 13 of those codes.
- $2.00 per 1,000 reviews on the Free plan, $1.40 on Business. An attraction with no reviews costs you nothing.

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

- 28 of 28 live checks on its inputs and filters passed on 7 October 2026
- 14 attractions run the same day, large, small and unreviewed: 241 reviews, 4 uncharged error rows
- Charges matched the rows: 10 attractions, 241 reviews
- An attraction with no reviews gets an uncharged row saying so

More that's in the form:

- Read one of Trip.com's own review tabs: photos, verified bookings, positive or negative
- Keep only reviews written in one language, or at or above a rating
- Take only reviews posted after a date
- Collect the photos attached to each review, and replies where Trip.com publishes them
- Run it on a schedule and get only the reviews you haven't had before
- Export as JSON, CSV, Excel, XML or HTML

### How to scrape Trip.com attraction reviews

1. [Sign up for a free Apify account](https://console.apify.com/sign-up), then open [Trip.com Attraction Reviews Scraper](https://apify.com/boncross/tripcom-reviews).
2. Find the attraction on Trip.com and copy the address of its page. Paste it into Attractions. Add as many as you like.
3. Choose the order (most relevant or most recent) and how many reviews you want from each attraction.
4. Press Start.
5. Open the Output tab and download the reviews as a spreadsheet or as JSON.

You don't need code, a login or a proxy.

### What review data do you get?

| | |
|---|---|
| ⭐ Rating out of five | Rating wording ("Excellent") |
| 💬 Review text | Review title, on Tripadvisor rows |
| 🌐 Language | 📅 Date and time posted |
| 👤 Reviewer name | Reviewer avatar |
| 🔗 Reviewer profile | 📍 Reviewer location, on Tripadvisor rows |
| Trip type, on Tripadvisor rows | 👍 Helpful count |
| 📷 Review photos | Photo count |
| Replies | Reply count |
| Attraction rating | Attraction review count |
| Source: Trip.com or Tripadvisor | 🆔 Review id |
| ✅ Verified-booking tag | Attraction id and name |

### ⬇️ Input

All it needs is an attraction link, like `https://www.trip.com/travel-guide/attraction/bangkok/the-grand-palace-77012`. The number at the end is the attraction id, and a bare id works too.

For a long list, use Start URLs. It loads links from a file, a Google Sheet or a remote list, and adds them to whatever you pasted.

Two limits decide how much you get. "Max reviews per attraction" (default 200, and 0 means all of them) applies to each attraction on its own, so ten attractions at 50 each returns 500. "Maximum results for the whole run" caps the total across the run. Nothing past it is fetched or charged for.

#### The newest reviews of one attraction

```json
{
  "attractions": ["https://www.trip.com/travel-guide/attraction/bangkok/the-grand-palace-77012"],
  "sortBy": "recent",
  "maxReviewsPerAttraction": 500
}
```

#### English reviews with photos, two attractions

```json
{
  "attractions": [
    "https://www.trip.com/travel-guide/attraction/seoul/n-seoul-tower-83001",
    "https://www.trip.com/travel-guide/attraction/bangkok/the-grand-palace-77012"
  ],
  "language": "en",
  "withPhotosOnly": true,
  "maxReviewsPerAttraction": 200
}
```

#### Recent negative reviews, for a quality check

```json
{
  "attractions": ["83001"],
  "reviewFilter": "negative",
  "reviewedAfter": "2026-06-01",
  "maxReviewsPerAttraction": 100
}
```

#### Both sources, on a daily watch

```json
{
  "attractions": ["https://www.trip.com/travel-guide/attraction/bangkok/the-grand-palace-77012"],
  "includeTripadvisor": true,
  "maxTripadvisorReviews": 50,
  "dedupStoreName": "trip-seen-reviews"
}
```

| Field | Notes |
|---|---|
| `attractions`, `startUrls` | Attraction links or bare ids, pasted or loaded in bulk. |
| `maxReviewsPerAttraction`, `maxItems` | The per-attraction cap (default `200`) and the run-wide cap (default `0`, none). |
| `sortBy` | `relevant` (default), `recent`, `rating_desc` or `rating_asc`. |
| `reviewFilter` | One of Trip.com's tabs: `all` (default), `latest`, `photos`, `verified`, `positive`, `negative`. |
| `minRating` | Drops reviews below this rating out of 5. Default `0`, which keeps them all. |
| `withPhotosOnly` | Keeps only reviews with at least one photo. Default `false`. |
| `reviewedAfter` | Keeps reviews posted on or after this date, as YYYY-MM-DD. |
| `includeTripadvisor`, `maxTripadvisorReviews` | Adds the Tripadvisor reviews shown for the attraction, up to the cap (default `50`). |
| `locale` | The locale reviews and their translations are returned in. Default `en-XX`. |
| `language` | Keeps reviews written in one language: `zh`, `en`, `ja`, `ko` or `th`. Empty keeps all. |
| `dedupStoreName` | The only-new store for scheduled runs. |
| `delayMs`, `maxConcurrency` | Pacing. Defaults `700` and `8`. |

Reviews dropped by `minRating`, `withPhotosOnly` or the date are free.

#### For developers

- When a filter or the only-new store keeps nothing, the read stops early: after 5 pages in a row with no review kept, or after about three times the pages `maxReviewsPerAttraction` needs.
- On a newest-first order the read also stops at the `reviewedAfter` date and at the first review an earlier run returned. A scheduled run with `dedupStoreName` therefore returns the reviews posted since the last run. Older reviews that an earlier run didn't return aren't filled in later.
- Set `reviewedAfter` with the default `relevant` order and the actor reads newest first instead, and stops when it reaches the date. The log says when it has done this.
- `rating_desc` and `rating_asc` are arranged by the actor over the most relevant reviews it read, up to 10,000 per attraction. Trip.com has no rating order.
- `language` is a tab on Trip.com's side. The `language` column on each row is separate: it's the review's own language, written as a lowercase language with an uppercase region where Trip.com gives one.
- `delayMs` (default 700, up to 10,000) pauses between calls and `maxConcurrency` (default 8, from 1 to 8) sets how many run at once. The default is the fastest level we measured clean, and we'd only lower it if a run reports refusals or errors.
- Rows are saved as they arrive. A run that Apify interrupts and restarts continues where it stopped, without saving or charging a review twice.

### ⬆️ Output

Each review is one row, and each row says which source it came from. This is a real one, from the Grand Palace in Bangkok on 7 October 2026:

```json
{
  "input": "https://www.trip.com/travel-guide/attraction/bangkok/the-grand-palace-77012",
  "dataType": "review",
  "id": "850695273",
  "reviewId": "850695273",
  "url": "https://www.trip.com/review/the-grand-palace-77012-850695273?locale=en-XX",
  "source": "Trip.com",
  "poiId": "77012",
  "attractionName": "The Grand Palace",
  "rating": 4,
  "ratingScale": 5,
  "ratingText": "Excellent",
  "title": null,
  "text": "What was open to see was beautiful and well worth it but unfortunately alot wasnt open and some stuff was closed to 11am due to ceremonial reasons. But overall worth visiting if in bangkok",
  "language": "en-GB",
  "postedAt": "2026-10-06T05:17:40.000Z",
  "postedText": "1 day ago",
  "authorName": "Footballtrainstravel",
  "authorAvatar": "https://ak-d.tripcdn.com/images/0a25j424x9016jnupB4CC.jpg",
  "authorUrl": "https://www.trip.com/travel-guide/personal-home/BA376FE51D6F7BBB67CF386AD584C2330BCCC38257ECB2582CA261BB11092243",
  "helpfulCount": 0,
  "images": [
    "https://ak-d.tripcdn.com/images/0EQ2z224x9awr126799F7.jpg?proc=source%2ftrip",
    "https://ak-d.tripcdn.com/images/0EQ5j224x9awqwhad2360.jpg?proc=source%2ftrip"
  ],
  "imageCount": 6,
  "totalReplies": 0,
  "replyCount": 0,
  "replies": [],
  "tagName": "Verified booking",
  "isPicked": false,
  "attractionRating": 4.4,
  "attractionRatingScale": 5,
  "attractionReviewCount": 13550,
  "scrapedAt": "2026-10-07T18:52:19.700Z"
}
```

The `images` list is cut to two of its six links here.

#### Tripadvisor rows

Switch on "Include Tripadvisor reviews" and those rows use the same columns with `source: "Tripadvisor"`. They add a `title`, the reviewer's `authorLocation` and a `tripType`. Their photo, reply and helpful-count columns are empty. Their `text` is the excerpt Trip.com shows, about 200 characters and ending in "..." where the review is longer. On 7 October 2026 that was 11 of 20 rows.

#### Columns worth a note

- `attractionName` is read from the attraction's link, or from the reviews' own links when you give a bare id. It's the name as the link spells it, in English ("The Grand Palace").
- `tagName` is Trip.com's own tag, such as "Verified booking", where a review has one. That was 26 of the 241 reviews in the sample.
- `title` is null on Trip.com rows. Trip.com reviews don't have titles.
- `attractionReviewCount` is Trip.com's published total. It can be higher than the number of rows you can read (see Limitations).

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

Measured on 2 October 2026, three runs each. The time is the whole run, start-up included.

| Run | Rows | Time | Cost at the Free-plan price |
|---|---|---|---|
| One attraction, 10 reviews | 10 | 2.9 to 6.1 s | $0.024 |
| One attraction, 200 Trip.com reviews plus its Tripadvisor reviews | 231 | 8.0 to 9.0 s | $0.466 |
| One attraction, 1,500 reviews | 1,500 | 30 s | $3.004 |
| 60 attractions, up to 50 reviews each | 2,687 | 23 to 31 s | $5.496 |
| 150 attractions, up to 50 reviews each | 6,791 | 110 s | $13.884 |

A large run delivers roughly 3,700 to 7,000 reviews a minute. An hour holds about 200,000 reviews, or 5,000 attractions at 50 each.

Trip.com serves reviews fifty to a page, and the single attraction measured above holds 40,500. The Tripadvisor set is small by comparison: Trip.com shows about two dozen per attraction (24 for Universal Studios Japan on 26 September 2026), and you get all of them.

### How much does it cost to scrape Trip.com reviews?

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `actor-start`, per run | $0.002 | $0.002 | $0.002 | $0.002 |
| `attraction-resolved`, per attraction | $0.002 | $0.002 | $0.002 | $0.002 |
| `review-scraped`, per row returned | $0.002 | $0.0018 | $0.0016 | $0.0014 |

Enterprise plans pay the Business price.

**$2.00 per 1,000 reviews** on the Free plan, $1.40 on Business, and that's all you pay, with proxy usage and platform usage included.

You pay for reviews you receive. Filtered reviews and ones an earlier run already gave you are free.

An attraction with no reviews yet, or an id Trip.com has no attraction for, returns one row that says so. It costs nothing, and the attraction fee isn't charged either. The same goes for an attraction that couldn't be read: its row tells you what went wrong and whether to run it again. If a page fails part-way through a long list, you keep the reviews already read and a free row says where they stopped.

- A thousand reviews of a single attraction: $0.002 + $0.002 + 1,000 × $0.002 = **$2.004** ($1.404 on Business).
- A daily watch that finds 30 new reviews: $0.002 + $0.002 + 30 × $0.002 = **$0.064** ($0.046 on Business).

The $5 of monthly credits on Apify's Free plan covers about 2,400 reviews with this actor: twelve runs of 200 reviews at $0.404 each.

### New reviews every morning, or from your own code

Name an only-new store, put the run on an Apify Schedule, and each morning's dataset is just what was posted since the last run. From there a webhook or one of Apify's integrations can push it to Slack, a Google Sheet or your own endpoint. Review text in several languages, each row labelled, is also good raw material for a translation or sentiment model.

To call it from code, `POST https://api.apify.com/v2/acts/boncross~tripcom-reviews/run-sync-get-dataset-items` with the input JSON and the reviews are the response. Use `apify-client` (npm or PyPI) for longer runs. For an AI agent, add the Apify MCP server (`mcp.apify.com`). The actor appears there as `boncross/tripcom-reviews`, and an agent can hand it an attraction link and read the reviews back.

### Limitations

- Highest and lowest rating first are orders the actor builds over the most relevant reviews it read (up to 10,000 per attraction). To read only the poor reviews, the Negative review filter is the better tool.
- Trip.com shows a selection of an attraction's Tripadvisor reviews, about two dozen. It isn't the full Tripadvisor history, and those rows have no photos.
- "Only reviews with photos" drops all Tripadvisor rows for that reason.
- Replies are returned where Trip.com publishes them. None of the 241 reviews in the 7 October 2026 sample had one, so expect the reply columns to be empty most of the time.
- Trip.com withholds some reviews from its list. The attraction's own review count includes them, which is why it can exceed the rows you get.
- Most relevant is Trip.com's own ranking. We can't check it from the rows the way we check the date and rating orders.

### FAQ

#### How do I get only last month's reviews?

Set "Posted after" to the first day you want. The actor then reads newest first and stops at that date, so you aren't paying to page through years of older reviews.

#### Can I get the Tripadvisor reviews too?

Switch on "Include Tripadvisor reviews". You'll get the two dozen or so that Trip.com shows for the attraction, each marked `source: "Tripadvisor"` so you can keep the two sets apart or compare them.

#### Why is the review count higher than the rows I received?

Trip.com's published count includes reviews it withholds from the list. The actor reports that count on each row so you can see the gap.

#### What happens if an attraction has no reviews, or I mistype an id?

You get a row saying so, and you aren't charged for that attraction. If Trip.com reports reviews but hands back an empty list, the row asks you to run it again, also at no charge.

#### Does it cover hotels?

It doesn't. Hotel reviews live in a different part of Trip.com. Use Trip.com Hotel Details Scraper for those.

#### Which languages are the reviews in?

Whatever visitors wrote in. In the 241-review sample, `zh-CN` was the largest group with 146, followed by `en` and `en-US` with 24 each. Pick one language in the form if that's all you need.

#### Do I need proxies or a Trip.com account?

You need neither. There's no login, nothing to configure, and no proxy charge added to the price per review.

#### Is scraping Trip.com reviews legal?

These are public reviews that Trip.com shows to anyone without an account. Collecting public data is generally lawful. Reviews carry reviewer names, though, so treat them as personal data where your law says so, and respect Trip.com's terms in how you use them.

### More from BonCross

- [Trip.com Hotel Search Scraper](https://apify.com/boncross/tripcom-hotel-search): Every hotel Trip.com lists for a destination and your dates.
- [KKday Product Availability & Prices](https://apify.com/boncross/kkday-availability): KKday availability and prices for any product.
- [Klook Activity Details Scraper](https://apify.com/boncross/klook-activity-details): Full Klook activity records.
- [Klook Activity Availability & Prices](https://apify.com/boncross/klook-availability): Klook availability and prices.
- [Klook Activity Reviews Scraper](https://apify.com/boncross/klook-reviews): Every review Klook shows for an activity.
- [Accor Hotel Details Scraper](https://apify.com/boncross/accor-hotel-details): Full Accor hotel records.

### Your feedback

If a review is missing, cut short or filed under the wrong language, we want to know. Open an issue on the Issues tab in Apify Console with the attraction link. We read every one and answer there.

# Changelog

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

# Actor input Schema

## `attractions` (type: `array`):

Trip.com attraction URLs such as https://www.trip.com/travel-guide/attraction/bangkok/the-grand-palace-77012, or bare attraction ids.

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

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

## `maxReviewsPerAttraction` (type: `integer`):

Stop after this many reviews for each attraction. 0 means every review the attraction has.

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

A run-wide ceiling across every target. The per-target limit above applies to each one separately, so ten targets at 50 each returns 500; set this to cap the total. Zero means no run-wide limit. Rows that report an input the actor could not resolve are not counted here and are never charged for.

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

Order the reviews come back in. Most relevant and most recent cover reviews in every language. Trip.com has no rating order of its own, so both rating orders arrange the most relevant reviews that were read (up to 10,000 per attraction) by rating.

## `reviewFilter` (type: `string`):

Which of Trip.com's own review tabs to read.

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

Drop reviews below this rating out of 5. 0 keeps every review. Filtered reviews are free.

## `withPhotosOnly` (type: `boolean`):

Keep only reviews that carry at least one photo. Filtered reviews are free.

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

Keep only reviews posted on or after this date, as YYYY-MM-DD. Leave empty for all. With "Most relevant" order, setting a date reads the reviews newest first instead, so the run stops as soon as it reaches the date.

## `includeTripadvisor` (type: `boolean`):

Also return the Tripadvisor reviews Trip.com shows for the same attraction. Each row is marked with its source.

## `maxTripadvisorReviews` (type: `integer`):

Stop after this many Tripadvisor reviews per attraction. 0 means no limit.

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

Locale the reviews and their translations come back in.

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

Keep only reviews written in one language. Leave empty for every language.

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

Name a key-value store and the actor remembers which reviews it has already returned, so a scheduled run yields only new ones.

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

Pause between calls.

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

How many requests run at once, each one paced by the delay above. The default is the fastest level measured clean; lower it only if a run reports refusals or errors.

## Actor input object example

```json
{
  "attractions": [
    "https://www.trip.com/travel-guide/attraction/bangkok/the-grand-palace-77012"
  ],
  "startUrls": [],
  "maxReviewsPerAttraction": 200,
  "maxItems": 0,
  "sortBy": "relevant",
  "reviewFilter": "all",
  "minRating": 0,
  "withPhotosOnly": false,
  "reviewedAfter": "",
  "includeTripadvisor": false,
  "maxTripadvisorReviews": 50,
  "locale": "en-XX",
  "language": "",
  "dedupStoreName": "",
  "delayMs": 700,
  "maxConcurrency": 8
}
```

# Actor output Schema

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

Trip.com attraction reviews: every row the run returned.

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

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

# API

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

## JavaScript example

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

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

// Prepare Actor input
const input = {
    "attractions": [
        "https://www.trip.com/travel-guide/attraction/bangkok/the-grand-palace-77012"
    ]
};

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

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

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

```

## Python example

```python
from apify_client import ApifyClient

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

# Prepare the Actor input
run_input = { "attractions": ["https://www.trip.com/travel-guide/attraction/bangkok/the-grand-palace-77012"] }

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

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

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

```

## CLI example

```bash
echo '{
  "attractions": [
    "https://www.trip.com/travel-guide/attraction/bangkok/the-grand-palace-77012"
  ]
}' |
apify call boncross/tripcom-reviews --silent --output-dataset

```

## MCP server setup

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

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

## OpenAPI specification

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