Trip.com Hotels, Rooms & Reviews Scraper icon

Trip.com Hotels, Rooms & Reviews Scraper

Pull structured hotel listings from trip.com with prices, room types, amenities, policies, nearby places, and full guest reviews with ratings breakdown…

Start using this actor on Apify ↗Need a custom scraper?Contact us ↗

Trip.com Hotels, Rooms & Reviews Scraper at a glance

Trip.com Hotels, Rooms & Reviews Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes hotel id, name, url, stars and review score, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify.

Runs on
Apify cloud: console, API, schedules and integrations
Data type
Web data
Pricing
$2.00 per 1,000 results (Free plan), from $1.00 on paid plans
Output
Documented below · JSON, CSV, Excel
Inputs
29 options

Pull structured hotel listings from trip.com with prices, room types, amenities, policies, nearby places, and full guest reviews with ratings breakdown and an AI review summary. Search by destination or paste trip.com URLs directly.

What Trip.com Hotels, Rooms & Reviews Scraper can do

  • Real destination search. Type "Tokyo" or "New York" - no city ids to hunt for. Trip.com city ids and id|Name strings still work for power users.
  • Every Trip.com link works in URL mode. Hotel list links, hotel detail links, and the SEO links search engines show (like /hotels/tokyo-hotels-list-228/) all resolve - missing dates and guests are filled from your input automatically.
  • Full hotel record in one run. Price (current, original, with taxes and fees), star rating, guest review score, images, amenities, policies, nearby places and a description, all in a single dataset row per hotel.
  • Room level detail and the full guest review feed, not just an average. Rooms nest per hotel with cancellation terms and per room pricing; reviews carry per category ratings, traveler type and useful count, plus an aggregate breakdown and an AI generated summary. Cap the feed with Max reviews (default 20).
  • Filters that don't starve later pages. Minimum star rating and minimum guest review score are applied before any per page item cap, and each destination keeps being resampled until it stops producing hotels you haven't already collected.
  • Incremental mode for schedules. Let the actor remember what it already delivered and push only what is new or changed since the last run, with changeType on every row.

Choose what to collect

These inputs let you configure Trip.com Hotels, Rooms & Reviews Scraper. Open the actor on Apify to enter your values and review the current options.

Supported input fields
InputWhat it controls
modestring · requiredSearch: type a destination name, pick dates and filters below. URL: paste trip.com hotel links copied from your browser - every link shape works (search links, hotel detail links, and the /hotels/-hotels-list-/ links copied from a search engine).

Choices: search, url

locationsarrayOne destination per line - just the city name, e.g. "Tokyo" or "New York". Trip.com city ids also work: a bare id ("228") or "228|Tokyo". Names are matched against a built-in index of trip.com's own destinations; for smaller towns not in the index, switch to URL mode and paste a trip.com hotel link for that place.
checkInstringCheck-in date, format YYYY-MM-DD. Leave empty to default to 14 days from today.
checkOutstringCheck-out date, format YYYY-MM-DD. Leave empty to default to one night after check-in.
adultsintegerNumber of adult guests per room.
childrenintegerNumber of child guests per room.
roomsintegerNumber of rooms to search for.
Show 22 more inputs
More input fields
InputWhat it controls
currencystringCurrency prices are shown and pushed in.

Choices: USD, EUR, GBP, CNY, JPY, AUD, CAD, SGD, HKD, KRW

minStarRatingintegerKeep only hotels rated at or above this many stars. 0 = no filter. Applied client-side after fetching each page.
minReviewScoreintegerKeep only hotels scoring at or above this out of 10 from guest reviews. 0 = no filter. Applied client-side after fetching each page.
urlsarrayOne or more trip.com hotel URLs, any shape: a hotel list search URL (/hotels/list?city=...), a hotel detail URL (/hotels/detail/?hotelId=...), or the SEO links trip.com and search engines use (/hotels/tokyo-hotels-list-228/, /hotels/tokyo-hotel-detail-123456/hotel-name/, landmark and brand pages). Multi-URL supported, pagination walks forward, missing dates/guests are filled from the fields above. Non-hotel links (homepage, city directories) are skipped with a warning. Dates, guests and currency in a link win over the run-level fields above. Trip.com ignores page, sort and star in a plain list link (each fetch returns a fresh slice of the destination), so use Minimum star rating and Minimum guest review score, which are also applied to hotels from pasted links. A hotelUrl key is accepted as a single-link alias. Left untouched, this field scrapes the example links below, one per link shape; clear it and paste your own to scrape only those.
fetchDetailsbooleanWhen ON, also fetch each hotel's detail page for amenities, policies, nearby places, full description, and guest reviews with an AI summary. When OFF, only the listing-page fields are returned (name, price, rating, image, address). Default ON since most of the field set lives on the detail page.
maxReviewsintegerCap the guest reviews attached to each hotel (the most recent ones trip.com returns on the page). Default 20, 0 to skip reviews. Reviews bill on the existing detail-enrichment event in blocks: one extra unit per 10 delivered reviews (see the Pricing tab).
sortBystringOrder of the reviews attached to each hotel, applied to the reviews the page returns, before the cap. mostRelevant keeps the site order.

Choices: mostRelevant, mostRecent, ratingHighToLow, ratingLowToHigh

cutoffDatestringKeep only reviews written after this date (YYYY-MM-DD). Empty keeps all.
maxPagesintegerHow many list pages to walk per destination (or per pasted list URL). Does not cap the total, only how many pages are fetched, defers to Max listings. Leave empty to walk every result page.
maxListingsintegerStop after this many hotels across all destinations. This is the run's cap, defaulting to 20. Set to 0 to remove the cap entirely (an empty Max pages will then walk every result page).
resumeFromRunIdstringID of an interrupted run whose hotels should not be re-scraped: this run continues the previous one's dedup set. Leave empty to start fresh. For recurring diff runs (new/updated only on a schedule) you don't need this - turn on Incremental mode below instead.
incrementalModebooleanON: the actor remembers the hotels it delivered for this exact search scope (keyed automatically, or use State key below) and on each scheduled run classifies every hotel as NEW, UPDATED, UNCHANGED or EXPIRED - pushing only new and changed rows plus EXPIRED tombstones, and stamping each row with changeType, changedFields, firstSeenAt and lastSeenAt. UPDATED is decided by comparing the whole record: price, original price, taxes total, discount, rating and review counts, amenities, policies, rooms (room prices and remaining-room counts) and the reviews you requested. It does NOT compare scrapedAt, the image URLs, or any field you list under Ignore fields; list order is ignored. Use Change scope to compare only prices and room availability. OFF (default): every run returns the full result set like before.
stateKeystringName for the incremental baseline when Incremental mode is ON. Leave empty to key the baseline on a hash of the search scope automatically (recommended). Use the same key across runs to compare like with like; a different key starts a new baseline.
emitUnchangedbooleanWith Incremental mode ON, also push hotels that did not change (stamped changeType=UNCHANGED). Default OFF - unchanged hotels are only remembered, not pushed.
emitExpiredbooleanWith Incremental mode ON, push a tombstone row (changeType=EXPIRED, last known field values) for hotels from the previous run that this run's search no longer returns - only when the search ran to completion. Default ON.
changeScopestringWith Incremental mode ON. 'all' (default): any change in the compared fields makes a row UPDATED. 'priceAndStock': only price changes (current, original, total with taxes, discount, currency) and per-room price, room name and remaining-room count make a row UPDATED; descriptions, amenities, badges, reviews and images never do.

Choices: all, priceAndStock

compactUpdatesbooleanWith Incremental mode ON, UPDATED rows carry only ids, name, link, current prices, priceChanges {field: {old, new}} and roomChanges [{roomId, change: ADDED|REMOVED|CHANGED, changes}] instead of the full record (no detail or review payload, so no detail or review charge rides on a compact row). NEW rows stay full. Default OFF.
expireAfterMissedScansintegerWith Incremental mode and Push EXPIRED tombstones ON: a hotel is tombstoned only after it was missing from this many CONSECUTIVE complete scans (default 1 = the first complete scan that misses it). EXPIRED means the search no longer returned the hotel; it does not prove the hotel is unavailable, since a result-pool resample and a delisting look the same without a detail probe.
ignoreFieldsForChangesarrayWith Incremental mode ON, dataset fields listed here never count as a change (they are excluded from changeType/changedFields while staying in the output). Top-level names (e.g. badges) or dotted paths into a list (e.g. rooms.roomPromotions drops that key from every room, the rest of the room is still compared). Built-in defaults already cover the scrape timestamp and the image URLs (images, image), and lists whose order the site reshuffles are compared order-independently.
mcpConnectorsarrayOptionally send the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize a connector once under Apify -> Settings -> Integrations, then select it here. The connector receives a condensed, human-readable summary per item (title + key fields), not the full JSON, the complete record stays in the dataset. Leave empty to skip. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).
notionParentPageUrlstringURL (or id) of the Notion page under which item pages are created. Required to enable the Notion export, ignored by other connectors.
maxNotifyListingsintegerCap on items written to each connector per run. Does not affect the dataset.

Fields in the output

The documented dataset includes the fields below. Availability can depend on the source page and selected mode.

hotelIdHotel ID
nameName
detailUrlURL (link)
starRatingStars
reviewScoreReview score
reviewScoreLabelReview label
reviewCountReviews (site total)
addressAddress
latLat
lngLng
priceCurrentPrice
priceOriginalOriginal price
Show 29 more fields
priceTotalWithTaxesTotal incl. taxes
discountPercentDiscount %
currencyCurrency
propertyTagProperty type
medalMedal
imageImage (image)
contactPhoneContact phone
contactEmailContact email
aggregateAiSummaryAI review summary
roomCountRooms scraped
reviewCount_pushedReviews scraped
scrapedAtScraped
cityNameCity name
descriptionDescription
amenitiesAmenities (array)
policiesPolicies (object)
nearbyPlacesNearby places (array)
aggregateTotalReviewCountAggregate total review count
aggregateRatingBreakdownAggregate rating breakdown (object)
aggregateCommentTagsAggregate comment tags (array)
reviewTagsReview tags (array)
badgesBadges (array)
imagesImages (array)
reviewsreviews
roomsrooms
changeTypeChange
changedFieldsChanged fields
firstSeenAtFirst seen
lastSeenAtLast seen

Example output

An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.

{
  "hotelId": "0000000",
  "name": "Sample Grand Hotel",
  "starRating": 4,
  "reviewScore": 9.1,
  "reviewScoreLabel": "Great",
  "reviewCount": 1200,
  "reviewTags": [
    "Easy to get around",
    "Delicious breakfast"
  ],
  "address": "Sample District, Sample City",
  "lat": 35,
  "lng": 139,
  "priceCurrent": 120,
  "priceOriginal": 140,
  "priceTotalWithTaxes": 134,
  "discountPercent": 14,
  "discountLabel": "14% off",
  "currency": "USD",
  "images": [
    "https://example.com/photo1.jpg"
  ],
  "image": "https://example.com/photo1.jpg",
  "badges": [
    "Free Cancellation"
  ],
  "medal": null,
  "propertyTag": "Hotel",
  "detailUrl": "https://www.trip.com/hotels/detail/?hotelId=0000000&checkIn=2026-11-15&checkOut=2026-11-16&adult=2&children=0&curr=USD",
  "amenities": [
    "Free WiFi",
    "Fitness center",
    "Parking"
  ],
  "policies": {
    "checkin": "After 15:00",
    "checkout": "Before 11:00",
    "cancellation": "Free cancellation"
  },
  "nearbyPlaces": [
    {
      "name": "Sample Station",
      "type": "station",
      "distance": "400m"
    }
  ],
  "contactPhone": "+1-000-0000000",
  "contactEmail": "stay@samplegrandhotel.com",
  "rooms": [
    {
      "roomId": "0",
      "roomName": "Superior Queen Room",
      "roomPrice": {
        "current": 120,
        "original": 140,
        "currency": "USD",
        "taxesAndFeesTotal": 14
      }
    }
  ],
  "roomCount": 1,
  "reviews": [
    {
      "reviewId": "0",
      "reviewerNickname": "Jane Doe",
      "reviewRatingOverall": 9,
      "reviewContent": "Great location and clean room."
    }
  ],
  "reviewCount_pushed": 20,
  "aggregateTotalReviewCount": 1200,
  "aggregateRatingBreakdown": {
    "overall": 9.1,
    "location": 9.3,
    "facility": 8.9,
    "service": 9,
    "room": 9
  },
  "aggregateCommentTags": [
    "Clean and tidy",
    "Great location"
  ],
  "aggregateAiSummary": "Facilities: guests liked the range of amenities. Guest Suggestion: some guests wanted a quicker check-in process.",
  "cityId": 228,
  "cityName": "Tokyo",
  "scrapedAt": "2026-11-01T00:00:00.000Z"
}

Ways to use this data

  • Travel agencies and OTAs: benchmark Trip.com's pricing and availability against your own listings for a destination and date range.
  • Rate and demand analysts: track price, discount and occupancy signals across many hotels in a city over time - incremental mode makes the scheduled re-runs cheap to read.
  • Reputation and review teams: pull the full guest review feed and AI summary to spot recurring complaints or praised amenities.
  • Travel content and comparison sites: build destination pages with live pricing, star ratings and photos.
  • Revenue managers: compare your own property's room types and cancellation terms against nearby competitors listed on Trip.com.

Before you run

Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.

Questions about this actor

What data does Trip.com Hotels, Rooms & Reviews Scraper return?

The documented output for Trip.com Hotels, Rooms & Reviews Scraper includes hotel id, name, url, stars, review score, review label, reviews (site total) and address. Availability of each field depends on the source page and the selected mode.

How much does Trip.com Hotels, Rooms & Reviews Scraper cost?

It costs $2.00 per 1,000 results on the Apify Free plan and from $1.00 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.

Can I schedule this to only get new or changed hotels?

Yes - turn on Incremental mode. The actor remembers what it delivered for your search scope and each scheduled run pushes only new and changed hotels (plus EXPIRED tombstones for hotels that disappeared), each row stamped with changeType and changedFields. Without it, each run is an independent search returning the full current result set.

Why did I get fewer hotels than I expected from one destination?

Trip.com's hotel list page doesn't expose real page numbers to a plain fetch, so each page is a resampled slice of the destination's hotel pool and depth comes from repeated fetching, not from advancing a page counter. A run also stops a destination once several resamples in a row bring back nothing new, and Max listings is split evenly across all your destinations and links. If the same city appears twice in one run (listed twice, two link variants, or the same city with different dates or guests in URL mode), both entries share one dedup set keyed by hotel id: the second only returns hotels the first didn't, can stop after a few hotels, and stops after consecutive samples bring back no new hotels. List each city once and raise Max listings or Max pages instead, and use one run per date range to compare dates.

Why was my destination name not found?

Destination names resolve against a built-in index of Trip.com's own destinations - the major cities everywhere plus every destination Trip.com publishes in its directory. A small town may be missing: use the nearest bigger city, or switch to URL mode and paste any Trip.com hotel link for the town (links copied from a search engine carry its city id and work directly). The run log says exactly this whenever a name can't be resolved.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

Ready to collect with Trip.com Hotels, Rooms & Reviews Scraper?

Run it on Apify with your own input and export the results as JSON, CSV or Excel.