# Trip.com & Ctrip Hotel Reviews Scraper (`scrapewise/tripcom-hotel-reviews`) Actor

Scrape hotel reviews from Trip.com and Ctrip (携程) without login: text, overall and sub-ratings, date, stay month, traveler type, room, reviewer country, photos and hotel replies, plus the hotel's rating summary. Sort, date, rating and language filters. Error rows are free.

- **URL**: https://apify.com/scrapewise/tripcom-hotel-reviews.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (community)
- **Categories:** Travel, E-commerce
- **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 delivereds

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 & Ctrip Hotel Reviews Scraper: every review, sub-ratings and the hotel summary

Scrape hotel reviews from [Trip.com](https://www.trip.com) and Ctrip (携程) **without an account,
cookies or a browser**: review text, overall rating and the four sub-ratings, date, stay month,
traveler type, room, reviewer country, guest photos and hotel replies, plus one summary row per
hotel with the rating breakdown, review tags and Trip.com's AI review summary.

Built for hotel and travel analytics, reputation monitoring, competitor benchmarking across Asia,
and review datasets for sentiment analysis and LLMs. Trip.com and Ctrip share hotel ids, so a
Ctrip hotel gives you its Chinese guest reviews through the same run.

### At a glance

- **Fee per run start:** None
- **Trip.com and Ctrip links:** Yes, plus bare hotel ids

### One real row

From a test run on 2026-09-27 (Marina Bay Sands, Singapore):

```json
{
  "type": "review",
  "hotelId": 687592,
  "hotelName": "Marina Bay Sands",
  "hotelUrl": "https://www.trip.com/hotels/singapore-hotel-detail-687592/marina-bay-sands/",
  "reviewId": 2109823308,
  "rating": 10,
  "ratingScale": 10,
  "ratingLabel": "Outstanding",
  "ratingLocation": 10,
  "ratingAmenities": 10,
  "ratingService": 10,
  "ratingCleanliness": 10,
  "text": "Loved everything! The cleanliness, the facilities, the complimentaries were all top notched and it's expected. The Infinity pool was not crowded. Staff were all friendly and accomodating.",
  "language": "en",
  "reviewDate": "2026-09-20",
  "reviewDateTime": "2026-09-20 17:38:55",
  "stayDate": "2026-09",
  "travelType": "Solo traveler",
  "roomName": "Sands Premier Double Queen",
  "reviewerName": "Guest User",
  "reviewerCountry": "Singapore",
  "helpfulCount": 0,
  "photos": ["https://ak-d.tripcdn.com/images/0230b224x9aqtiwjn3BFC_W_1280_853_R5_Q70.jpg?proc=autoorient"],
  "photoCount": 6,
  "videoCount": 0,
  "hotelResponses": [],
  "languageName": "English",
  "scrapedAt": "2026-09-27T19:40:12Z",
  "errorCode": null,
  "error": null
}
```

And the hotel summary row (`type: "hotel"`): `rating` 9.7 of 10 ("Amazing"), `reviewCount` 1807,
location 9.8, amenities 9.6, service 9.6, cleanliness 9.8, 7 review tags ("Clean pool": 461),
traveler types, languages and 4 AI summary topics such as "Service Quality".

### Input

| Field | Type | What it does |
|---|---|---|
| `hotelUrls` (also `startUrls`, `hotelUrl`, `urls`, `hotelIds`) | list | Trip.com hotel pages from any country site, Ctrip pages (`hotels.ctrip.com/hotels/1286148.html`) or numeric hotel ids. |
| `maxReviewsPerHotel` (also `maxReviews`) | integer, default 20 | Reviews per hotel. `0` = every review. |
| `sortBy` | `mostRelevant`, `mostRecent`, `ratingHighToLow`, `ratingLowToHigh` | The hotel page's own orders. |
| `fromDate` (also `cutoffDate`) | `YYYY-MM-DD` or days | Only reviews posted on or after the date. Without a sort, reads newest first and stops early. |
| `minRating`, `maxRating` | 1 to 10 | Trip.com's 10-point scale. `maxRating: 6` collects complaints. |
| `reviewFilter` | `all`, `positive`, `negative`, `withPhotos` | Trip.com's own review type filter. |
| `language` | text | `English`, `Chinese`, `Japanese`, `Korean`... or a code such as `zh`. |
| `includeHotelSummary` | boolean, default true | One `type: "hotel"` row per hotel, charged as one item. |
| `proxyConfiguration` | proxy | Apify datacenter proxy by default. |

### Price

**US$ 2.00 per 1,000 rows** on the Free plan (a review or a hotel summary), no start fee.
Rows with an `errorCode` are free; reviews outside your date, rating or language filters are
skipped and not charged; a review is never charged twice in a run.

### Errors you may see

| `errorCode` | Meaning | Charged |
|---|---|---|
| `INVALID_URL` | not a Trip.com or Ctrip hotel link or id | no |
| `NO_REVIEWS` | wrong hotel id, or a hotel without reviews | no |
| `BLOCKED` | Trip.com did not answer after five attempts on new IPs; run again | no |
| `NOT_REACHED` | the run timeout arrived before this hotel | no |
| `INVALID_INPUT` | `fromDate` or a rating is not valid | no |
| `ITEM_UNREADABLE`, `UNEXPECTED` | a review came in a shape we did not expect; the rest of the run goes on | no |

### Good to know

- **Every review, not a sample.** Trip.com serves 100 reviews per request and pages to the end:
  1,596 of 1,596 in our test hotel, 4,000 in a row from a Ctrip hotel with 13,047.
- **"Most recent" is Trip.com's order, and it is approximate.** Trip.com mixes a few older reviews
  into the newest pages. `fromDate` filters every review by its own date, so nothing older than
  your date is delivered, and the run stops only when a whole page is older.
- **Reviewer data is the display name and country only.** Never a user id, avatar or profile link.
- **Photo links** point to Trip.com's CDN and work without login.
- Something broke? Open an issue on the Actor page.

### FAQ

**Do I need a Trip.com or Ctrip account?** No. Nothing to log in to, no cookies to paste.

**Can I get Chinese reviews from Ctrip?** Yes. Paste the Ctrip hotel link or its id; Chinese
reviews come through Trip.com's public review service, which shares Ctrip's hotel ids. Use
`language: "zh"` to keep only those.

**How fast is it?** About 100 reviews per second-long request; 4,000 reviews took 86 seconds in a
test. Three hotels are read in parallel.

**Can I use it from n8n, Make, Zapier or an AI agent?** Yes, through the Apify app or the Apify
MCP server. Error rows are free, so an agent can explore cheaply.

**What if a run is cut by its timeout?** The Actor stops 45 seconds before the limit and ends
successfully with what it delivered, telling you in the status message how to get the rest.

### Changelog

- **0.1 (2026-09-27)**: first version. Trip.com and Ctrip links and ids, sort, date, rating,
  language and review type filters, hotel summary row, free error rows.

# Actor input Schema

## `hotelUrls` (type: `array`):

One per line: a Trip.com hotel page (any country site, such as www.trip.com, us.trip.com or th.trip.com), a Ctrip hotel page (hotels.ctrip.com/hotels/1286148.html) or just the numeric hotel id. Trip.com and Ctrip share hotel ids, so Ctrip hotels return their Chinese reviews too.

## `maxReviewsPerHotel` (type: `integer`):

Stop after this many reviews for each hotel. 0 = all reviews (Trip.com pages through every review, 100 per request).

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

Order in which reviews are read, as on the hotel page. With a per-hotel limit it also decides which reviews you get.

## `fromDate` (type: `string`):

Keep only reviews posted on or after this date (YYYY-MM-DD) or in the last N days (for example 30). Good for incremental syncs. If you leave 'Sort by' untouched, reviews are read newest first so the run stops as soon as it passes this date.

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

Keep only reviews rated at least this much, on Trip.com's 10-point scale (1 to 10). Skipped reviews are not charged.

## `maxRating` (type: `integer`):

Keep only reviews rated at most this much, on the 10-point scale. For example 6 to collect complaints.

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

Trip.com's own filter: all reviews, only positive, only negative, or only reviews with photos or video.

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

Only reviews written in this language: English, Chinese, Japanese, Korean, Thai, French... (name or two-letter code, such as zh). Empty = every language.

## `includeHotelSummary` (type: `boolean`):

Add one row per hotel with the overall rating, the four sub-ratings, total reviews, review tags, traveler types, languages and Trip.com's AI review summary. Charged as one item.

## `proxyConfiguration` (type: `object`):

The default Apify Proxy (datacenter) works; tested with 4,000 reviews in a row without a block.

## Actor input object example

```json
{
  "hotelUrls": [
    "https://www.trip.com/hotels/singapore-hotel-detail-687592/marina-bay-sands/"
  ],
  "maxReviewsPerHotel": 20,
  "sortBy": "mostRelevant",
  "reviewFilter": "all",
  "includeHotelSummary": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (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 = {
    "hotelUrls": [
        "https://www.trip.com/hotels/singapore-hotel-detail-687592/marina-bay-sands/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/tripcom-hotel-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 = { "hotelUrls": ["https://www.trip.com/hotels/singapore-hotel-detail-687592/marina-bay-sands/"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/tripcom-hotel-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 '{
  "hotelUrls": [
    "https://www.trip.com/hotels/singapore-hotel-detail-687592/marina-bay-sands/"
  ]
}' |
apify call scrapewise/tripcom-hotel-reviews --silent --output-dataset

```

## MCP server setup

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