# Trip.com & Ctrip Reviews Scraper - Hotel Ratings & Text (`haketa/trip-com-reviews-scraper`) Actor

Scrape Trip.com and Ctrip hotel reviews worldwide. Extract guest ratings, full review text with AI translations, category scores, traveler type, room booked, reviewer photos and videos, plus hotel rating summary and AI overview by hotel URL or ID. Export JSON, CSV, Excel.

- **URL**: https://apify.com/haketa/trip-com-reviews-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Travel, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

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

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Trip.com & Ctrip Reviews Scraper — Hotel Ratings, AI Translations, Category Scores & Photos

> **The most complete Trip.com and Ctrip hotel-review extractor on Apify.** Pull real guest reviews from **Trip.com Group** — the largest online travel company in Asia and one of the biggest in the world — with the full review text plus its **AI translation**, a 0–10 rating, per-review **category scores**, traveler type, the exact **room** stayed in, reviewer **photos and videos**, and each hotel's overall score, review distribution and AI summary. One API covers **both Trip.com and Ctrip** reviews.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-blue)](https://apify.com/haketa/trip-com-reviews-scraper)
[![Live Data](https://img.shields.io/badge/Data-Live%20at%20Run%20Time-orange)]()
[![Pricing](https://img.shields.io/badge/Pricing-Pay%20Per%20Result-yellow)]()
[![Coverage](https://img.shields.io/badge/Trip.com%20%2B%20Ctrip-Worldwide%20%F0%9F%8C%8F-red)]()
[![Reviews](https://img.shields.io/badge/Reviews-Millions-purple)]()
[![Translations](https://img.shields.io/badge/Includes-AI%20Translations-success)]()
[![Media](https://img.shields.io/badge/Includes-Photos%20%26%20Video-brightgreen)]()
[![Category Scores](https://img.shields.io/badge/Scores-Per%20Category-blueviolet)]()
[![Export](https://img.shields.io/badge/Export-JSON%20%C2%B7%20CSV%20%C2%B7%20Excel-lightgrey)]()

***

### 🎯 What this actor does

The **Trip.com & Ctrip Reviews Scraper** extracts live guest reviews from **Trip.com** and **Ctrip** (携程) — the two flagship hotel-booking brands of Trip.com Group, dominant across China and Asia-Pacific and used by travelers worldwide. Give it a hotel URL or ID and it returns **every guest review**, one clean row per review, enriched with the hotel's full rating breakdown.

Trip.com reviews are exceptionally rich, and this actor captures all of it — including the on-platform **AI translation** of every foreign-language review, so Chinese, Korean and Japanese guest feedback becomes readable English (or the language of your choice) automatically.

Each record can include:

- ⭐ **Rating** — 0–10 overall score plus the reviewer's own location / facilities / service sub-scores
- 💬 **Review text** — original content **and** its AI translation
- 🌏 **Traveler context** — traveler type (Business, Family, Couple, Solo…), reviewer region and reviewer grade
- 🛏️ **Room booked** — the exact room type the guest stayed in
- 📸 **Media** — reviewer photos and videos, with counts
- 🗓️ **Dates** — review date and check-in date
- 🏨 **Hotel summary** — overall score, category scores, review distribution (positive / negative / with media) and an AI review summary
- 🕒 **Metadata** — `scrapedAt` ISO timestamp on every row

Whether you manage a hotel, run a travel-analytics product, or research the Asian hospitality market, this actor is the **fastest path from Trip.com to a usable dataset** — no scraping code required.

***

### ✨ Why this actor

| ✅ This actor handles | ❌ What you'd fight doing it yourself |
|---|---|
| **Both Trip.com & Ctrip** from one input | Two brands, one review pool — needs the right API |
| **AI translations** captured with originals | Chinese/Korean/Japanese reviews need translating |
| **Full pagination** — every review | Popular hotels have thousands of reviews |
| **Per-review category scores** | Sub-scores are nested and easy to miss |
| **Traveler type, room & media** mapped | Encoded fields that need decoding |
| **Hotel summary + AI overview** attached | Lives on the page, not in the review |
| **Clean deduplicated rows** | Reviews repeat across pages and need de-duping |

***

### 🚀 Quick start

#### One-click run

1. Open the actor on the [Apify Store](https://apify.com/haketa/trip-com-reviews-scraper) and click **Try for free**
2. Paste one or more Trip.com/Ctrip hotel URLs into **Hotel URLs** — e.g. `https://www.trip.com/hotels/bangkok-hotel-detail-1735479/`
3. Pick a **locale**, optional **language / traveler-type filters**, and set **Max reviews per hotel** (`0` for everything)
4. Hit **Start** — reviews stream into your dataset, ready to export as JSON, CSV, Excel, HTML or RSS

#### Run via API (Python)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run_input = {
    "startUrls": [
        "https://www.trip.com/hotels/bangkok-hotel-detail-1735479/"
    ],
    "locale": "en-US",
    "maxReviewsPerHotel": 200,
    "includeHotelInfo": True,
}

run = client.actor("haketa/trip-com-reviews-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["rating"], item["travelType"], "|", item["translatedContent"] or item["content"])
```

#### Run via API (JavaScript)

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('haketa/trip-com-reviews-scraper').call({
    startUrls: ['https://www.trip.com/hotels/bangkok-hotel-detail-1735479/'],
    locale: 'en-US',
    maxReviewsPerHotel: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

***

### ⚙️ Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `startUrls` | array | – | Trip.com / Ctrip hotel page URLs. All reviews are collected for each hotel. |
| `hotelIds` | array | – | *(Advanced)* Numeric hotel IDs — the number in `...-hotel-detail-{id}/`. |
| `locale` | enum | `en-US` | Trip.com locale (interface language & default translation target). |
| `reviewLanguage` | enum | `all` | Only collect reviews originally written in this language. Translations are always included. |
| `travelType` | enum | `all` | Only collect reviews from this traveler type (Business, Couple, Family, Friends, Solo). |
| `maxReviewsPerHotel` | integer | `200` | Max reviews per hotel. `0` = all available. |
| `includeHotelInfo` | boolean | `true` | Fetch the hotel name and attach overall score, category scores, distribution and AI summary. |
| `proxyConfiguration` | object | Apify Proxy | Proxy settings — recommended for reliable results at scale. |

#### 📋 How to get a hotel URL

1. Open **trip.com** (or **ctrip.com**) and open any hotel
2. Copy the address-bar URL — it looks like `.../hotels/bangkok-hotel-detail-1735479/`
3. Paste it into **Hotel URLs**. Add as many as you like.

***

### 📤 Output

One clean record per review, enriched with hotel context:

```json
{
  "reviewId": "2034833812",
  "hotelId": "1735479",
  "hotelName": "Ploy Hostel",
  "userName": "Guest User",
  "userRegion": "Hong Kong, China",
  "userGrade": "Review Specialist",
  "userReviewCount": "15",
  "rating": "10",
  "ratingLocation": "10",
  "ratingFacility": "10",
  "ratingService": "10",
  "recommend": "true",
  "content": "酒店就在市中心，步行可達各大商圈和景點...",
  "translatedContent": "The hotel is right in the city center, within walking distance to major shopping areas...",
  "language": "zh",
  "travelType": "Solo traveler",
  "roomName": "Bed in Mixed Dormitory Room (Mixed Gender)",
  "createDate": "2026-07-24 18:39:53",
  "checkinDate": "2026-07-01 00:00:00",
  "usefulCount": "0",
  "imageCount": "2",
  "images": "https://ak-d.tripcdn.com/images/... | ...",
  "videoCount": "0",
  "hotelScore": "6.6",
  "scoreLocation": "7.3",
  "scoreFacility": "6.1",
  "scoreService": "6.6",
  "hotelTotalReviews": "1389",
  "positiveReviews": "1125",
  "negativeReviews": "264",
  "withMediaReviews": "471",
  "aiSummary": "Location: Conveniently located near city center... | Service: ...",
  "hotelUrl": "https://www.trip.com/hotels/bangkok-hotel-detail-1735479/",
  "scrapedAt": "2026-08-10T17:02:50.249Z"
}
```

#### 💬 Review fields

| Field | Description |
|-------|-------------|
| `reviewId` | Unique review identifier |
| `userName` · `userRegion` · `userGrade` | Reviewer nickname, region and level (e.g. Review Specialist) |
| `userReviewCount` | How many reviews the user has written |
| `rating` | ⭐ Overall rating out of 10 |
| `ratingLocation` · `ratingFacility` · `ratingService` | Reviewer's own sub-scores |
| `recommend` | Whether the guest recommends the hotel |
| `content` | Original review text |
| `translatedContent` | 🌏 AI-translated review text |
| `language` | Original review language |
| `travelType` | Traveler type (Business, Family, Couple, Solo…) |
| `roomName` | 🛏️ Room the guest stayed in |
| `createDate` · `checkinDate` | Review date and check-in date |
| `usefulCount` | How many users found the review useful |
| `imageCount` · `images` · `videoCount` | 📸 Reviewer photos ( `|` separated) and video count |

#### 🏨 Hotel fields *(when `includeHotelInfo` is on)*

| Field | Description |
|-------|-------------|
| `hotelName` · `hotelScore` | Hotel name and overall score /10 |
| `scoreLocation` · `scoreFacility` · `scoreService` · `scoreCleanliness` | Hotel category scores |
| `hotelTotalReviews` | Total reviews for the hotel |
| `positiveReviews` · `negativeReviews` · `withMediaReviews` | Review distribution |
| `aiSummary` | 🤖 AI-generated review summary by aspect |
| `hotelUrl` · `scrapedAt` | Source URL and timestamp |

Export everything to **JSON, CSV, Excel, HTML or RSS**, or pull it through the Apify API and integrations.

***

### 💡 Use cases

| Use case | How this actor helps |
|----------|----------------------|
| 🏨 **Hotel reputation monitoring** | Track your Trip.com/Ctrip reviews, scores and photos over time; catch recurring complaints early. |
| 📊 **Competitor benchmarking** | Pull reviews and category scores for rival hotels and compare location, service and value. |
| 🌏 **Asian-market insight** | Read Chinese, Korean and Japanese guest feedback in English via built-in AI translation. |
| 💬 **Sentiment & voice-of-customer** | Feed translated review text and ratings into your NLP or LLM pipeline. |
| 📈 **Travel market research** | Study traveler-type preferences, room-level feedback and seasonal trends. |
| 🤖 **ML / NLP training data** | Build large multilingual labeled review datasets (rating, type, room, media). |

***

### ❓ FAQ

**Does it cover both Trip.com and Ctrip?**
Yes. Trip.com and Ctrip share a review pool, and this actor pulls both — including reviews originally posted on Ctrip, with AI translation.

**Are foreign-language reviews translated?**
Yes. Every review carries its original `content` plus a `translatedContent` field (AI translation into your chosen locale).

**How many reviews can I get per hotel?**
All of them. Set `maxReviewsPerHotel` to `0` and the actor paginates to the last page. Popular hotels have thousands of reviews.

**Do reviews include photos and videos?**
Yes — reviewer photo URLs are captured in `images` with counts in `imageCount` and `videoCount`.

**Do I need a proxy?**
Apify Proxy is enabled by default and recommended for reliable results at scale.

**Which export formats are supported?**
JSON, CSV, Excel, HTML and RSS, plus programmatic access via the Apify API and integrations (Google Sheets, Zapier, Make, Airbyte and more).

***

### 🔗 Integrations

Send results wherever you work: **Google Sheets / Excel**, **Zapier · Make · n8n**, **Airbyte / databases / webhooks**, and the **Apify API** for any language.

***

### ⚖️ Legal & responsible use

This actor collects **publicly available** hotel review information — the same content any visitor can read on a hotel page without logging in. It does not access private data and does not require any user account.

You are responsible for how you use the data. Please:

- Use the output for lawful purposes such as research, analytics, reputation monitoring and benchmarking.
- Respect the reviewed platform's Terms of Service and robots directives.
- Comply with applicable data-protection laws (e.g. GDPR, CCPA) when handling personal data such as reviewer names — aggregate or anonymize where appropriate.
- Do not republish scraped content in a way that infringes copyright or database rights.

*This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Trip.com Group, Trip.com or Ctrip. All product names, logos and brands are property of their respective owners.*

***

### 🛟 Support

Need another locale, an extra field, or hit a hotel that won't parse? Open an issue from the actor's **Issues** tab and we'll take a look.

# Actor input Schema

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

Paste Trip.com or Ctrip hotel page URLs (e.g. https://www.trip.com/hotels/bangkok-hotel-detail-1735479/). All guest reviews are collected for each hotel, including translations.

## `hotelIds` (type: `array`):

Optional. Provide Trip.com numeric hotel IDs directly — the number in '...-hotel-detail-{id}/'.

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

Trip.com locale used for the request. Controls the interface language and default translation target.

## `reviewLanguage` (type: `string`):

Only collect reviews originally written in this language. 'All languages' collects every review (translations are included regardless).

## `travelType` (type: `string`):

Only collect reviews from this traveler type.

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

Maximum number of reviews to collect per hotel. Set to 0 for all available reviews.

## `includeHotelInfo` (type: `boolean`):

Fetch the hotel name and attach the overall score, category scores, review distribution and AI summary to every review.

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

Proxy configuration. Apify Proxy is enabled by default and recommended for reliable results at scale.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.trip.com/hotels/bangkok-hotel-detail-1735479/"
  ],
  "hotelIds": [
    "1735479"
  ],
  "locale": "en-US",
  "reviewLanguage": "all",
  "travelType": "all",
  "maxReviewsPerHotel": 200,
  "includeHotelInfo": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `reviewId` (type: `string`):

Unique review ID

## `hotelId` (type: `string`):

Trip.com hotel ID

## `hotelName` (type: `string`):

Hotel name

## `userName` (type: `string`):

Reviewer nickname

## `userRegion` (type: `string`):

Reviewer region/country

## `userGrade` (type: `string`):

Reviewer level (e.g. Review Specialist)

## `userReviewCount` (type: `string`):

How many reviews the user has written

## `rating` (type: `string`):

Guest rating out of 10

## `ratingLocation` (type: `string`):

Reviewer location score

## `ratingFacility` (type: `string`):

Reviewer facilities score

## `ratingService` (type: `string`):

Reviewer service score

## `recommend` (type: `string`):

Whether the guest recommends the hotel

## `content` (type: `string`):

Original review text

## `translatedContent` (type: `string`):

AI-translated review text

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

Original review language

## `travelType` (type: `string`):

Trip type (Business, Family, Solo, Couple...)

## `roomName` (type: `string`):

Room type the guest stayed in

## `createDate` (type: `string`):

When the review was posted

## `checkinDate` (type: `string`):

Guest check-in date

## `usefulCount` (type: `string`):

How many users found the review useful

## `imageCount` (type: `string`):

Number of reviewer photos

## `images` (type: `string`):

Reviewer photo URLs ( | separated)

## `videoCount` (type: `string`):

Number of reviewer videos

## `hotelScore` (type: `string`):

Hotel overall score out of 10

## `scoreLocation` (type: `string`):

Hotel location category score

## `scoreFacility` (type: `string`):

Hotel facilities category score

## `scoreService` (type: `string`):

Hotel service category score

## `scoreCleanliness` (type: `string`):

Hotel cleanliness category score

## `hotelTotalReviews` (type: `string`):

Total reviews for the hotel

## `positiveReviews` (type: `string`):

Count of positive reviews

## `negativeReviews` (type: `string`):

Count of negative reviews

## `withMediaReviews` (type: `string`):

Count of reviews with photos/video

## `aiSummary` (type: `string`):

AI-generated review summary

## `hotelUrl` (type: `string`):

Hotel page URL

## `scrapedAt` (type: `string`):

Extraction timestamp

# 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.trip.com/hotels/bangkok-hotel-detail-1735479/"
    ],
    "maxReviewsPerHotel": 200,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/trip-com-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.trip.com/hotels/bangkok-hotel-detail-1735479/"],
    "maxReviewsPerHotel": 200,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/trip-com-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.trip.com/hotels/bangkok-hotel-detail-1735479/"
  ],
  "maxReviewsPerHotel": 200,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call haketa/trip-com-reviews-scraper --silent --output-dataset

```

## MCP server setup

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