# 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
- **Features:** Limited permissions
- **Stats:** 1 total users, 0 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/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 Reviews Scraper — Hotel Ratings, AI Translations, Category Scores & Photos

> **The most complete Trip.com and Ctrip hotel-review extractor on Apify.** This **Trip.com scraper** extracts real guest feedback, numerical ratings, and customer sentiment from [Trip.com](https://www.trip.com) and **Ctrip** (携程) — Asia's premier online travel booking platform and flagship brand of Trip.com Group. Retrieve complete review content, **AI translations**, 0–10 satisfaction scores, per-review **category ratings**, traveler categories, room types booked, traveler photos and videos, and property-level rating distributions. Export cleanly to **JSON, CSV, Excel, or API**.

[![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)]()
[![Coverage](https://img.shields.io/badge/Trip.com%20%2B%20Ctrip-Worldwide%20%F0%9F%8C%8F-red)]()
[![Translations](https://img.shields.io/badge/Includes-AI%20Translations-success)]()
[![Media](https://img.shields.io/badge/Includes-Photos%20%26%20Video-brightgreen)]()
[![Export](https://img.shields.io/badge/Export-JSON%20%C2%B7%20CSV%20%C2%B7%20Excel-lightgrey)]()

> Designed specifically for **hotel revenue managers, hospitality reputation consultants, OTA market researchers, travel sentiment analysts, data teams training NLP engines, and travel tech aggregators** requiring reliable, structured Trip.com and Ctrip guest feedback at scale.

***

### ⚡ At a glance

| Feature | Specification |
|---|---|
| **Data source** | Trip.com & Ctrip official guest review network |
| **Output formats** | JSON, CSV, Excel (XLSX), XML, RSS, HTML table |
| **Pagination model** | Cursor-based deep pagination (50 reviews/page, unlocks 1,000+ per property) |
| **Multilingual AI translation** | Built-in (translates Chinese, Japanese, Korean, Thai, Russian into target locale) |
| **Media extraction** | High-resolution reviewer photos + user video attachments |
| **Sub-category scores** | Location, facilities, service, room comfort & cleanliness |
| **Traveler segmentation** | Solo, Couple, Family, Friends, Business traveler tags |
| **Rate limits / Proxies** | Apify Proxy integration supported (datacenter or residential) |
| **Typical throughput** | ~150–300 reviews per second |
| **Authentication required** | None (public endpoint data extraction) |

***

### 🔎 Why scrape Trip.com & Ctrip?

**Trip.com** and **Ctrip** share an interconnected global review database, creating the single largest repository of verified hotel reviews in the Asia-Pacific region and a rapidly growing footprint in the Americas and Europe. Major properties routinely carry **1,000 to 25,000+ guest reviews**. Each review includes rich metadata: sub-ratings for specific amenities, traveling companion context, room names, reviewer loyalty tiers, and translated commentary.

Extracting this data manually is impossible at scale. Feedback is paginated behind dynamic requests, Asian-language characters require robust encoding and translation, and reviewer media links are deeply nested. This **Trip.com reviews scraper** resolves all hurdles into normalized, deduplicated tabular datasets.

#### Strategic Use Cases & Business Value

- 🏨 **Hospitality Reputation & Brand Monitoring**:
  Hotels and hospitality management groups use this scraper to track customer perceptions daily. Identifying negative sentiment shifts early—such as repeated complaints about noisy air conditioning or sluggish Wi-Fi—enables immediate remediation before guest satisfaction scores drop permanently on major OTAs.

- 📊 **Competitive Benchmarking & Pricing Strategy**:
  Compare competitor hotel performance across your specific geographic cluster. Evaluate how rival properties score on cleanliness, staff friendliness, and breakfast quality compared to room rates, identifying market opportunities to adjust seasonal rates or upsell premium rooms.

- 🌏 **Cross-Border Asian Tourism Intelligence**:
  For hoteliers catering to international travelers from China, Japan, South Korea, Thailand, and Singapore, understanding cross-cultural preferences is paramount. The actor's built-in translation engine allows Western hospitality operators to analyze authentic Asian feedback without language barriers.

- 💬 **Voice-of-Customer (VoC) Pipelines & NLP**:
  Feed native and translated review feedback directly into large language models (LLMs) and sentiment analysis classifiers. Categorize guest sentiment across hundreds of individual property dimensions (e.g., bedding comfort, pool cleanliness, breakfast variety) to build automated executive reporting dashboards.

- 🤖 **Multilingual Training Datasets for Machine Learning**:
  Data science teams utilize the dual-language output (original text alongside localized machine translations) paired with numerical ratings (0–10) to train and evaluate aspect-based sentiment analysis (ABSA) and recommendation models.

- 📈 **Travel Analytics, Seasonality & Occupancy Forecasting**:
  Track historical review volumes and traveler composition (business versus leisure, family versus solo) across different calendar quarters. Correlate booking seasonality with local events and holidays to forecast occupancy demand.

***

### ✨ Features & Capabilities

- ✅ **Unified Trip.com + Ctrip Coverage**: Extracts reviews shared across both Trip.com international portals and Ctrip domestic platforms from any regional property page.
- ✅ **Unlocked 1,000+ Deep Pagination**: Seamlessly navigates beyond basic limits to fetch hundreds or thousands of historical reviews per hotel without artificial truncation.
- ✅ **Native AI Translation**: Provides original review text (`content`) alongside an AI-translated version (`translatedContent`) in your specified language.
- ✅ **Granular Category Sub-Scores**: Extracts individual scores for location, facilities, service, and room quality alongside the overall rating.
- ✅ **Comprehensive Reviewer Metadata**: Captures reviewer nickname, home region, reviewer grade/title, review count, and helpful vote counts.
- ✅ **Booking & Stay Context**: Retrieves exact room type booked, traveler category (Business, Couple, Family, Friends, Solo), and check-in dates.
- ✅ **High-Resolution Photo & Video Links**: Collects full-size media URLs uploaded by guests with media counters.
- ✅ **Property-Level Score Breakdown**: Optionally attaches aggregate hotel scores, total review volumes, positive/negative distributions, and AI summary conclusions to each record.
- ✅ **Zero-Config Default Run**: Runs smoothly out-of-the-box with prefilled defaults or empty input to demonstrate instant output.
- ✅ **Flexible Export Options**: Streamline integrations via CSV, Excel, NDJSON, or JSON formats ready for analytical workflows.

***

### 📥 Input Parameters

The scraper accepts the following configuration parameters. All fields are optional and configured with sensible defaults for immediate execution:

| Parameter | Type | Default | Description |
|---|---|---|---|
| `startUrls` | Array | `["https://www.trip.com/hotels/bangkok-hotel-detail-1735479/"]` | List of Trip.com or Ctrip hotel URLs to scrape. |
| `hotelIds` | Array | `[]` | Numeric hotel IDs (e.g. `1735479`) extracted from hotel URLs. |
| `locale` | String | `"en-US"` | Target locale interface language for review translations. |
| `reviewLanguage` | String | `"all"` | Filter reviews by original language (`all`, `en`, `zh`, `ja`, `ko`, `th`, `de`, `fr`, `es`, `ru`). |
| `travelType` | String | `"all"` | Filter reviews by traveler type (`all`, `business`, `couple`, `family`, `friends`, `solo`). |
| `maxReviewsPerHotel` | Integer | `0` | Max reviews per hotel. Set to `0` for unlimited (deep historical scrape). Prefill `50`. |
| `includeHotelInfo` | Boolean | `true` | When true, attaches hotel-level aggregate ratings, sentiment distributions, and AI conclusions. |
| `proxyConfiguration` | Object | `{"useApifyProxy": true}` | Apify Proxy configuration for high-throughput pagination. |

***

### 📤 Output Data Fields

Every record pushed to the dataset represents an individual guest review with complete stay details and hotel metadata:

#### 👤 Reviewer & Rating Data

| Field | Type | Coverage | Description |
|---|---|---|---|
| `reviewId` | String | 🟢 High | Unique identifier for the individual guest review. |
| `hotelId` | String | 🟢 High | Numeric Trip.com property identifier. |
| `hotelName` | String | 🟢 High | Full hotel title (e.g., `Grande Centre Point Hotel Terminal 21`). |
| `userName` | String | 🟢 High | Reviewer nickname or anonymized guest display handle. |
| `userRegion` | String | 🟡 Conditional | Country or home region specified on the reviewer's profile. |
| `userGrade` | String | 🟡 Conditional | Reviewer status badge (e.g., `Review Specialist`, `Level 5 Contributor`). |
| `userReviewCount` | String | 🟡 Conditional | Total lifetime reviews authored by the reviewer. |
| `rating` | String | 🟢 High | Primary guest score on a 0–10 scale (or 1–5 equivalent converted). |
| `ratingLocation` | String | 🟡 Conditional | Sub-score for hotel neighborhood and transit convenience. |
| `ratingFacility` | String | 🟡 Conditional | Sub-score for on-site amenities, pool, gym, and elevator facilities. |
| `ratingService` | String | 🟡 Conditional | Sub-score for front desk, housekeeping, and concierge hospitality. |
| `ratingRoom` | String | 🟡 Conditional | Sub-score for room spaciousness, bed comfort, and acoustic isolation. |
| `recommend` | String | 🟢 High | Boolean flag (`true`/`false`) indicating if the guest recommends this stay. |

#### 📝 Review Content & Media

| Field | Type | Coverage | Description |
|---|---|---|---|
| `content` | String | 🟢 High | Full unedited review text in the original language posted. |
| `translatedContent` | String | 🟡 Conditional | AI-translated review text in the requested locale language. |
| `language` | String | 🟢 High | ISO language code of the original review (e.g., `zh`, `en`, `ko`). |
| `travelType` | String | 🟡 Conditional | Guest travel category (`Solo traveler`, `Couples`, `Family`, `Business`). |
| `roomName` | String | 🟡 Conditional | Exact room name booked by the reviewer (e.g., `Deluxe King Room with City View`). |
| `createDate` | String | 🟢 High | Submission date of the review. |
| `checkinDate` | String | 🟡 Conditional | Month and year of guest check-in. |
| `usefulCount` | String | 🟢 High | Number of other travelers who marked this review helpful. |
| `imageCount` | String | 🟢 High | Number of photos uploaded by the guest. |
| `images` | String | 🟡 Conditional | Pipe-separated list (`\|`) of absolute reviewer photo URLs. |
| `videoCount` | String | 🟢 High | Count of attached user review video clips. |

#### 🏨 Hotel Aggregates & Sentiment

| Field | Type | Coverage | Description |
|---|---|---|---|
| `hotelScore` | String | 🟢 High | Overall property average score (0–10). |
| `scoreLocation` | String | 🟡 Conditional | Aggregate property location index. |
| `scoreFacility` | String | 🟡 Conditional | Aggregate property facility rating index. |
| `scoreService` | String | 🟡 Conditional | Aggregate property staff service index. |
| `scoreCleanliness` | String | 🟡 Conditional | Aggregate property hygiene and housekeeping index. |
| `hotelTotalReviews` | String | 🟢 High | Total all-time reviews recorded for the property. |
| `positiveReviews` | String | 🟡 Conditional | Count of reviews tagged as positive sentiment. |
| `negativeReviews` | String | 🟡 Conditional | Count of reviews tagged as critical or negative sentiment. |
| `withMediaReviews` | String | 🟡 Conditional | Count of reviews containing user photos or video clips. |
| `aiSummary` | String | 🟡 Conditional | Algorithmic summary synthesized from recent guest feedback. |
| `hotelUrl` | String | 🟢 High | Canonical Trip.com hotel web address. |
| `scrapedAt` | String | 🟢 High | UTC ISO timestamp when the review record was retrieved. |

***

### 💻 Sample Output Record

```json
{
  "reviewId": "784912048",
  "hotelId": "1735479",
  "hotelName": "Grande Centre Point Hotel Terminal 21",
  "userName": "GlobetrotterAsia",
  "userRegion": "Singapore",
  "userGrade": "Review Specialist",
  "userReviewCount": "48",
  "rating": "9.6",
  "ratingLocation": "10",
  "ratingFacility": "9",
  "ratingService": "10",
  "ratingRoom": "9.5",
  "recommend": "true",
  "content": "酒店位置无敌，直接连通BTS和Terminal 21商场。前台服务热情周到，房间宽敞干净，早餐种类非常丰富，无边际泳池景观很棒！下次来曼谷还会入住。",
  "translatedContent": "The hotel location is unbeatable, directly connected to BTS and Terminal 21 shopping mall. Front desk service was welcoming and thorough, room was spacious and clean, breakfast variety was outstanding, and infinity pool view was amazing! Will definitely stay here again next time in Bangkok.",
  "language": "zh",
  "travelType": "Couples",
  "roomName": "Deluxe Premium King Room",
  "createDate": "2026-10-18 14:22:10",
  "checkinDate": "2026-10",
  "usefulCount": "12",
  "imageCount": "4",
  "images": "https://ak-d.tripcdn.com/images/hotel/review/img_01.jpg | https://ak-d.tripcdn.com/images/hotel/review/img_02.jpg",
  "videoCount": "0",
  "hotelScore": "9.4",
  "scoreLocation": "9.8",
  "scoreFacility": "9.3",
  "scoreService": "9.5",
  "scoreRoom": "9.4",
  "scoreCleanliness": "9.6",
  "hotelTotalReviews": "14280",
  "positiveReviews": "13650",
  "negativeReviews": "210",
  "withMediaReviews": "3420",
  "aiSummary": "Guests consistently praise the direct BTS station connection, superb infinity pool, polite staff hospitality, and comfortable luxury beds.",
  "hotelUrl": "https://www.trip.com/hotels/bangkok-hotel-detail-1735479/",
  "scrapedAt": "2026-11-10T14:15:30.000Z"
}
```

***

### 🛠️ Step-by-Step API Integration

You can trigger and integrate the Trip.com Reviews Scraper programmatically in Python, Node.js, or cURL.

#### Python Example

```python
from apify_client import ApifyClient

## Initialize the Apify client with your API token
client = ApifyClient("YOUR_APIFY_TOKEN")

## Prepare actor input
run_input = {
    "startUrls": ["https://www.trip.com/hotels/bangkok-hotel-detail-1735479/"],
    "maxReviewsPerHotel": 100,
    "reviewLanguage": "all",
    "travelType": "all",
    "includeHotelInfo": True,
}

## Run the actor and wait for it to finish
run = client.actor("haketa/trip-com-reviews-scraper").call(run_input=run_input)

## Fetch results from the run's default dataset
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"[{item.get('rating')}/10] {item.get('userName')}: {item.get('content')[:60]}...")
```

#### Node.js Example

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

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

const runInput = {
    startUrls: ['https://www.trip.com/hotels/bangkok-hotel-detail-1735479/'],
    maxReviewsPerHotel: 100,
    locale: 'en-US',
};

const run = await client.actor('haketa/trip-com-reviews-scraper').call(runInput);
const { items } = await client.dataset(run.defaultDatasetId).listItems();

console.log(`Retrieved ${items.length} reviews.`);
items.forEach(review => {
    console.log(`${review.userName} (${review.travelType}): ${review.rating} / 10`);
});
```

#### cURL Execution

```bash
curl "https://api.apify.com/v2/acts/haketa~trip-com-reviews-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": ["https://www.trip.com/hotels/bangkok-hotel-detail-1735479/"],
    "maxReviewsPerHotel": 50
  }'
```

***

### 📊 Complete Field Definitions & Extraction Rules

Understanding the nuances of review fields helps downstream data pipelines process customer sentiment effectively:

- **`rating` (Overall Satisfaction Score)**:
  Trip.com uses a native 1–5 or 1–10 scale depending on regional display. This scraper standardizes all ratings to a clean decimal string (e.g., `"9.6"`, `"10"`, `"8.4"`), matching the official hotel score scale.

- **`ratingLocation`, `ratingFacility`, `ratingService`, `ratingRoom`**:
  Individual sub-ratings given by reviewers for specific stay aspects. When a reviewer leaves overall feedback without scoring specific aspects, these fields gracefully fall back to empty strings rather than misleading zeroes.

- **`travelType` (Traveler Segments)**:
  Categorizes guests into standardized personas:
  - `Solo traveler`: Single business or leisure guest.
  - `Couples`: Romantic getaways and duo travel.
  - `Family`: Family vacations with children or multi-generational groups.
  - `Friends`: Group trips and friend vacations.
  - `Business`: Corporate bookings and conference attendees.

- **`images` & `videoCount`**:
  High-resolution image URLs are sanitized to strip thumbnail resize parameters, giving you access to the highest available resolution uploaded by the user. URLs are pipe-separated (`|`) for direct import into spreadsheets or cloud storage download scripts.

- **`hotelScore` & Aspect Summaries**:
  Attached property-level metadata provides instant context. The `aiSummary` field reflects Trip.com's synthesized conclusion across thousands of historical guest opinions (e.g. highlighting exceptional breakfast, proximity to public transit, or modern fitness centers).

***

### 🔄 Supported Export Formats & Automated Pipelines

Apify provides native export endpoints and integrations for every dataset produced by this actor:

| Destination | Integration Method | Common Application |
|---|---|---|
| **JSON / NDJSON** | REST API direct fetch | Programmatic ingestion into data lakes, Elasticsearch, or MongoDB |
| **CSV / Excel** | One-click Console download | Spreadsheet analysis, Tableau, or Power BI reporting |
| **Google Sheets** | Apify Google Sheets integration | Real-time shared reputation dashboards for hotel managers |
| **Webhook / Make / Zapier** | On run completion trigger | Instant Slack alerts for critical low-rating reviews |
| **PostgreSQL / Snowflake** | Airbyte / Singer connectors | Long-term historical trend warehousing and sentiment modeling |

***

### 💡 Troubleshooting & Best Practices

- **Zero Reviews Returned for a Given URL**:
  Verify that the URL links to a hotel detail page (e.g., `https://www.trip.com/hotels/...-hotel-detail-1735479/`). If a hotel is brand new or recently onboarded to Trip.com, it may not have any public reviews yet.
- **Handling Multi-Language Properties**:
  If you only want native English reviews, set `reviewLanguage: "en"`. However, leaving `reviewLanguage: "all"` is strongly recommended because the actor automatically provides the `translatedContent` field, ensuring you capture maximum guest volume without missing non-English sentiment.
- **Scaling Up to Thousands of Reviews**:
  When extracting reviews for huge resort complexes (5,000+ reviews), set `maxReviewsPerHotel: 0` and ensure your Apify run timeout is set appropriately (e.g., 600–1200 seconds).

***

1. **Unlocking 1,000+ Reviews**:
   Set `maxReviewsPerHotel: 0` to enable full pagination. The scraper automatically walks through 50-item pages until the entire historical review archive is exhausted.

2. **Language-Specific Inbound Analysis**:
   If analyzing Japanese or Korean tourist expectations for European properties, set `reviewLanguage: "ja"` or `reviewLanguage: "ko"`. The actor filters target reviews directly at the request level, saving bandwidth and processing time while still providing English translations.

3. **Multi-Property Benchmarking**:
   Submit an array of hotel URLs in `startUrls`. The scraper processes properties sequentially with intelligent delay jitter to maintain persistent session stability.

4. **Fast Validation & Monitoring Runs**:
   For regular daily or weekly heartbeat runs, use `maxReviewsPerHotel: 50` or `100` to capture only newly posted guest entries in seconds.

5. **Proxy Optimization**:
   Apify Proxy is enabled by default. Datacenter proxies offer exceptional speed and throughput for Trip.com's endpoints, providing cost efficiency at scale.

***

### ❓ Frequently Asked Questions (FAQ)

**Can I scrape Ctrip hotel URLs directly?**
Yes. Ctrip and Trip.com operate on the same unified hotel review infrastructure. You can provide standard Trip.com or Ctrip hotel URLs and the actor will extract reviews seamlessly.

**How does AI translation work?**
Trip.com generates real-time translations for foreign-language reviews. The actor extracts both the untouched raw native review text (`content`) and the AI-translated text (`translatedContent`) aligned with your chosen `locale` setting.

**Is authentication or login required?**
No login, credentials, or cookies are required. All scraped data is publicly visible feedback on Trip.com's public hotel listings.

**How fast is the scraper?**
Because the actor interacts directly with high-performance JSON endpoints, a typical run fetches 50 reviews in under 1 second. Scraping 1,000 reviews generally completes in under 15–20 seconds.

**Can I export the dataset to Google Sheets, CSV, or an external database?**
Yes. Every Apify Actor run provides direct export endpoints for JSON, CSV, and XLSX. You can also automate data ingestion using Apify webhooks, Zapier, Make.com, n8n, or direct REST API calls.

**How does deduplication work?**
The scraper tracks review identifiers (`reviewId`) in memory per target property. Even if network latency causes retried page responses, duplicate reviews are automatically eliminated before pushing to the Apify dataset.

**What happens if a hotel has no reviews?**
If a newly listed property has zero reviews or is temporarily delisted, the actor logs a clear informational note and proceeds cleanly to the next property in your input list without crashing.

**Can I run this scraper on a recurring schedule?**
Yes. Through Apify's scheduling feature, you can trigger runs daily, weekly, or monthly to keep your reputation monitoring database continuously synchronized.

***

### 🔗 Related Travel & Hospitality Scrapers

Expand your travel intelligence coverage with complementary scrapers:

- [Trustpilot Reviews Scraper](https://apify.com/haketa/trustpilot-reviews-scraper) — Extract customer trust scores, ratings, and feedback for global travel agencies.
- [Klook Reviews Scraper](https://apify.com/haketa/klook-reviews-scraper) — Gather ratings, tour reviews, and experience feedback across Asia-Pacific attractions.
- [Despegar Reviews Scraper](https://apify.com/haketa/despegar-reviews-scraper) — Scrape Latin American hotel ratings, packages, and guest testimonials.
- [Google Maps Scraper](https://apify.com/haketa/google-maps-scraper) — Extract business details, contact information, and coordinates worldwide.
- [Turo Scraper](https://apify.com/haketa/turo-scraper) — Peer-to-peer car sharing prices, ratings, and vehicle availability.

***

### 📋 Changelog

- **v1.2 (2026-11)**
  - Unlocked unlimited 1,000+ deep review pagination by removing artificial page caps.
  - Standardized zero-config demo execution with fast 50-review prefill (< 20s run time).
  - Enhanced field normalization for sub-ratings, user grade tiers, and localized translations.
  - Streamlined retry resiliency against transient proxy network disconnections.
- **v1.1 (2026-09)**
  - Added AI translation capture for multi-lingual hotel reviews.
  - Implemented aspect summary extraction and category rating distributions.
- **v1.0 (2026-08)**
  - Initial public release supporting Trip.com and Ctrip hotel review extraction with photo/video links.

# Changelog

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

# 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 unlimited (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": 50,
  "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

## `ratingRoom` (type: `string`):

Reviewer room 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, absolute and pipe ( | ) 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

## `scoreRoom` (type: `string`):

Hotel room category score

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

Hotel cleanliness category score (present when available)

## `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": 50,
    "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": 50,
    "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": 50,
  "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/cWkGDhchXLdJkHOjA/openapi.json
