Trip.com Reviews Scraper
Pricing
from $0.49 / 1,000 results
Trip.com Reviews Scraper
Extracts the aggregate rating and latest guest reviews for any hotel listed on Trip.com by hotel review-page URL.
Pricing
from $0.49 / 1,000 results
Rating
0.0
(0)
Developer
Ibnu Adzim
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Extracts the aggregate rating and latest guest reviews for any hotel listed on Trip.com — just give it the hotel's review-page URL.
Why use this actor
- No account, no login, no API key — works on public hotel pages only.
- Returns the hotel's aggregate rating (score, best-possible score, total review count) plus the platform's most recent guest reviews, each with rating, full text, reviewer name, and publish date.
- Every hotel you submit gets at least one output row — including a clear diagnostic reason on the rare rows that couldn't be fetched, so nothing silently disappears from your results.
How it works
- You give the actor one or more Trip.com hotel review-page URLs.
- For each hotel, it reads the rating and reviews directly out of the page's own structured data — no separate API call, no pagination to manage.
- Results are streamed to your dataset as they finish.
- You export the finished dataset as JSON, CSV, or Excel straight from the Apify Console.
Input
{"hotelUrls": ["https://us.trip.com/hotels/singapore-hotel-detail-995074/hotel-royal-singapore/review.html"],"maxConcurrency": 5}
| Field | Type | Description |
|---|---|---|
hotelUrls | array of strings | Trip.com hotel review page URLs — look for the "Reviews" tab/link on a hotel's page; the URL ends in /review.html. |
maxConcurrency | integer | How many hotels to process at the same time. Default 5. |
proxyConfiguration | object | Optional. Not required — no bot-mitigation was found on this page tier. |
Output
Each hotel produces one summary row plus one review row per guest review. Real examples from a live run:
Summary row (recordType: "SUMMARY"):
{"_input": "https://us.trip.com/hotels/singapore-hotel-detail-995074/hotel-royal-singapore/review.html","_source": "S1-review-page-jsonld","_scrapedAt": "2026-08-10T12:50:00Z","recordType": "SUMMARY","hotelUrl": "https://us.trip.com/hotels/singapore-hotel-detail-995074/hotel-royal-singapore/review.html","name": "Hotel Royal Singapore","aggregateRating": { "ratingValue": 8.4, "ratingCount": 1582, "bestRating": 10, "worstRating": 0 },"_reviewsInDataset": 15,"_reviewsTotalOnPlatform": 1582,"_note": "Trip.com's review page publishes only its 15 most recent reviews as structured data; 1582 exist on the platform in total."}
Review row (recordType: "REVIEW"):
{"_input": "https://us.trip.com/hotels/singapore-hotel-detail-995074/hotel-royal-singapore/review.html","_source": "S1-review-page-jsonld","_scrapedAt": "2026-08-10T12:50:00Z","recordType": "REVIEW","hotelName": "Hotel Royal Singapore","reviewRating": { "ratingValue": 10, "bestRating": 10, "worstRating": "0" },"reviewBody": "Bday staycation love staying at the hotel thank you enjoying the place with my friends thank you tripe.com","author": { "name": "Phoebe Baita" },"datePublished": "2026-08-10 18:08:23"}
When a hotel can't be found or the input isn't a Trip.com URL, the actor still emits one row for that input with a clear reason:
{"_input": "https://us.trip.com/hotels/singapore-hotel-detail-999999999999/nonexistent-hotel/review.html","_source": "none","_scrapedAt": "2026-08-10T12:50:00Z","recordType": "ERROR","_error": "not_found","_errorDetail": "No Hotel structured data on ... -- likely a removed/invalid hotel ID."}
| Field | Type | Description |
|---|---|---|
_input | string | The hotel URL you submitted. |
_source | string | Which internal strategy produced this row. "none" on a failed row. |
_scrapedAt | string | UTC timestamp of when this row was produced. |
recordType | string | "SUMMARY", "REVIEW", or "ERROR". |
_reviewsInDataset / _reviewsTotalOnPlatform / _note | — | Present on a SUMMARY row only when the platform has more reviews than are published in this dataset — see Notes / limits below. |
_error | string | Present only on rows that couldn't be fetched, e.g. not_found, invalid_input. |
_errorDetail | string | Human-readable detail for the error, present only alongside _error. |
| (all other fields) | — | On a successful row, every field Trip.com's own structured data provides is passed through unchanged. |
Notes / limits
- Reviews are a snapshot, not full history. Trip.com's review pages publish only their 15 most recent reviews as structured data (confirmed across hotels with 470 to 1,582 total reviews) — there is no pagination available for this data source.
aggregateRating.ratingCountalways reflects the true total; thereviewrows in this dataset are the latest slice of it, flagged explicitly on the SUMMARY row whenever the total exceeds what's included. - Make sure you're using the hotel's review page (
/review.html), not its general detail page — the detail-page URL format doesn't carry review data.
Other actors in this collection
| Actor | What it returns |
|---|---|
| Agoda Reviews Scraper | Guest reviews for hotels listed on Agoda.com |
| GetYourGuide Reviews Scraper | Guest reviews for tours/activities listed on GetYourGuide |
| Booking.com Reviews Scraper | Guest reviews for hotels listed on Booking.com |
| Orbitz Hotel Reviews Scraper | Guest reviews for hotels listed on Orbitz.com |