Export bounded public Trip.com and Ctrip hotel review snapshots with ratings, guest text, stay details, owner replies, public media URLs, and explicit completeness warnings.
The Actor accepts hotel URLs or IDs and writes one paid dataset row per saved review. It is designed for small, permissioned public-page snapshots—not complete historical pagination.
What does this Actor do?
- Input: Up to 100 public hotel URLs or numeric hotel IDs.
- Output: Review text, scores, stay and reviewer context, replies, media signals, source links, and snapshot completeness fields.
- Public-page limit: Trip.com normally embeds only a bounded newest-review page.
maxReviewsPerHotellimits that page; it does not unlock older pages. - Diagnostics:
RUN_SUMMARYrecords every hotel outcome.RUN_CHECKPOINTpreserves pending hotels before the safe deadline. - Access: No login, cookies, CAPTCHA handling, or private account data. New runs use Apify's standard proxy by default and can retry directly once after a route-specific failure.
Who is it for?
- Hotel operators and agencies exporting a small, permissioned hotel-review snapshot for service-quality analysis.
- Travel market researchers monitoring newly embedded reviews with
sortBy: "newest"and asinceDatecutoff. - Data teams adding public rating, stay, reply, and media context to an authorized hotel dataset.
Example output
{
"hotelId": "129054778",
"hotelName": "KOKO HOTEL Tokyo Nishikasai",
"hotelUrl": "https://www.trip.com/hotels/tokyo-hotel-detail-129054778/koko-hotel-tokyo-nishikasai/",
"sourceDomain": "www.trip.com",
"reviewId": "2022013946",
"reviewText": "A public guest review...",
"translatedReviewText": null,
"rating": 10,
"ratingScale": 10,
"ratingText": "Outstanding",
"subRatings": { "cleanliness": 10, "service": 9.5 },
"reviewDate": "2026-07-15",
"stayDate": "2026-07-01",
"travelType": "Business traveler",
"roomType": "Standard Twin Room",
"reviewerName": "Guest User",
"reviewerCountry": "United States",
"reviewerLevel": null,
"reviewerContributionCount": 4,
"ownerResponseText": null,
"ownerResponseDate": null,
"imageUrls": [],
"videoUrls": [],
"helpfulVotes": 2,
"scrapedAt": "2026-07-20T00:00:00.000Z",
"sourceUrl": "https://www.trip.com/hotels/tokyo-hotel-detail-129054778/koko-hotel-tokyo-nishikasai/",
"pageNumber": 1,
"sortBy": "newest",
"reviewsAvailable": 922,
"reviewsExtracted": 10,
"hasMoreReviews": true,
"warnings": [
"Trip.com reports 922 reviews, but this public page exposed 15; output is a bounded page snapshot, not complete history."
]
}
Input settings
| Setting | JSON key | Default | Description |
|---|---|---|---|
| Hotel URLs | hotelUrls |
None | Public HTTPS Trip.com/Ctrip hotel URLs containing a numeric hotel ID. |
| Hotel IDs | hotelIds |
None | Numeric hotel IDs with at least five digits. |
| Maximum reviews | maxReviewsPerHotel |
20 |
Saves at most this many rows from each bounded public-page snapshot. Range: 1–1,000. |
| Sort | sortBy |
recommended |
Client-side order: recommended, newest, ratingHigh, or ratingLow. |
| Since date | sinceDate |
None | Keeps embedded reviews on or after a valid YYYY-MM-DD date. |
| Include hotel summary | includeHotelSummary |
true |
Includes the public hotel name on review rows. Stable IDs and diagnostics remain present. |
| Include media URLs | includeImages |
true |
Includes public image and video URLs when present. No files are downloaded. |
| Locale | locale |
en-US,en;q=0.9 |
Accept-Language value used for the public page request. |
| Currency | currency |
USD |
Compatibility field retained for existing workflows; review extraction does not depend on price currency. |
| Proxy configuration | proxyConfiguration |
Standard Apify Proxy | Uses the standard proxy automatically, with one direct retry after a route-specific failure. Disable it to force direct access or provide an explicit custom route. |
| Resume checkpoint | resumeFromCheckpoint |
false |
Reads pending hotels from RUN_CHECKPOINT in the same key-value store. |
| Work time | maxRuntimeSecs |
270 |
Actor work budget from 31–270 seconds; at least 30 seconds remain for persistence and cleanup. |
At least one hotel URL or ID is required unless resumeFromCheckpoint is enabled. Missing input fails before the start charge or any network request.
Run outcomes and completeness
The dataset contains paid review rows only. Hotel-level errors and legitimate empty outcomes stay in the unpaid RUN_SUMMARY record.
- Confirmed empty: Trip.com reports zero reviews. The hotel can finish with no rows and a successful summary.
- Filtered empty: The public page exposed reviews, but none matched
sinceDate. - Incomplete snapshot:
hasMoreReviewsis true andwarningsexplains the gap between the aggregate count and embedded rows. - Unexpected empty: Trip.com reports reviews but exposes no recognized rows. That hotel is marked failed instead of silently succeeding.
- Partial run: Valid hotels retain their paid rows when another hotel fails.
- Deadline stop: Pending hotels and saved review keys are written to
RUN_CHECKPOINTfor idempotent resume. - Charge-limit stop: Only rows accepted by the paid dataset operation count as saved. Remaining work is checkpointed when
maxTotalChargeUsdis reached.
Tips for reliable snapshots
- Start with one known public hotel and 5–10 reviews.
- Use
sortBy: "newest"withsinceDatefor repeat monitoring. - Deduplicate appended snapshots downstream on
hotelIdplusreviewId. - Inspect
hasMoreReviewsandwarnings; never treat the dataset as complete review history when the public page exposes only a subset. - If both the standard proxy and bounded direct fallback return an access challenge, retry later with a smaller workload. The Actor does not solve CAPTCHAs or use residential proxy escalation automatically.
Legality: is it legal to scrape Trip.com reviews?
- This release supports the public server-rendered first-page snapshot only. It does not claim historical pagination.
- Trip.com/Ctrip can change page content, omit optional fields, return regional variants, or temporarily challenge requests.
- Hotel IDs and public payload availability vary between Trip.com and Ctrip surfaces. Check
RUN_SUMMARYfor each hotel outcome. - The Actor does not use login sessions, private APIs, partner credentials, cookies, or account-only data.
- Trip.com’s current terms restrict commercial use of Website content without a licence. Use this Actor only when you have permission or another lawful basis covering your collection, export, retention, and commercial use. Public visibility alone is not permission.
- Review text is user-generated. Minimize retained personal data and use human review for consequential decisions.
API usage
Node.js:
import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("fetch_cat/trip-com-reviews-scraper").call({
hotelIds: ["129054778"],
maxReviewsPerHotel: 10,
sortBy: "newest"
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
Python:
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("fetch_cat/trip-com-reviews-scraper").call(run_input={
"hotelIds": ["129054778"],
"maxReviewsPerHotel": 10,
"sortBy": "newest",
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
cURL:
curl -X POST \
"https://api.apify.com/v2/acts/fetch_cat~trip-com-reviews-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"hotelIds":["129054778"],"maxReviewsPerHotel":10,"sortBy":"newest"}'
Use with MCP and AI agents
Use the official Apify MCP server with a focused single-Actor URL:
claude mcp add --transport http apify \
"https://mcp.apify.com?tools=fetch_cat/trip-com-reviews-scraper"
Claude Desktop, Cursor, or VS Code configuration:
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=fetch_cat/trip-com-reviews-scraper"
}
}
}
Example prompts:
- “Export the newest 10 public reviews for hotel ID 129054778 and include completeness warnings.”
- “Compare the lowest-rating rows in these permissioned Trip.com hotel snapshots.”
- “Show which hotels returned incomplete snapshots by checking
hasMoreReviews.”
Schedule hotel review monitoring
Run a small input daily or weekly with sortBy: "newest". Append each dataset to long-term storage and compare stable reviewId values. Use a webhook to notify your workflow when a new review meets your own score or text criteria.
Support
If a run fails or the output looks wrong, open an issue or report a bug from the Actor page. Include:
- the Apify run ID or run URL;
- the input JSON;
- the expected output;
- the actual output or
RUN_SUMMARYerror; - one reproducible public URL that you are permitted to test.