Trip.com Room Rates Scraper
Pricing
from $2.10 / 1,000 hotel-priceds
Trip.com Room Rates Scraper
Scrape every room and rate plan Trip.com is selling for a hotel and your dates. Just add hotel IDs or Trip.com hotel URLs and get room name, bed setup, size, floor, nightly price, stay total, meals, cancellation deadline, payment terms and photos. $3.50 per 1,000 priced hotel-stays.
Pricing
from $2.10 / 1,000 hotel-priceds
Rating
0.0
(0)
Developer
BonCross API
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
What is Trip.com Room Rates Scraper?
A hotel on Trip.com rarely sells a room one way. The same King Room turns up prepaid, refundable until a date, with breakfast and without, and each of those is a rate plan with its own price. Trip.com Room Rates Scraper gets you all of them for a hotel and your dates, one row per rate plan, and you pay per hotel-stay however long the grid is.
Paste Trip.com hotel IDs or hotel page links and set the dates. If you don't have IDs yet, Trip.com Hotel Search Scraper lists a city's hotels with theirs. (This actor is for hotels. Trip.com's tours and attraction tickets are covered by a separate set of actors, listed under "More from BonCross".)
What you get here that a cheapest-price scraper can't give you:
- The whole grid. Measured runs returned from a few dozen to 186 rate plans for one hotel and one night, about 94 on average.
- A flat price per stay. $0.0035 on the Free plan for a hotel-stay with rates, whether it has 12 plans or 186.
- Totals you can compare.
priceTotalis the stay with every tax and fee, including charges due at the hotel, on the same basis in every language. - Refundability you can filter on in any language: a true or false flag, Trip.com's own cancellation code, and the deadline as text.
- An answer when there's nothing to sell. A sold-out stay returns its own row and costs $0.0005.
- Speed at volume: 32 hotel-stays, 2,480 rate plans, in 9 seconds.
BonCross Verified means we tested this actor against the live site before release and kept the record:
- 33 of 33 live checks on its inputs and filters passed on 8 October 2026
- 5 hotels run on 7 October 2026 on 2 stays each: 194 rates, 2 sold-out answers
- A sold-out stay, or one your filters empty, gets a row saying so
More of what it does:
- Show the room each plan belongs to, with its bed setup, size, floor and window
- Add the room's amenity list and up to 12 photos when you want them
- Read meal terms, payment terms and confirmation type on each plan
- Price several hotels across several date ranges in one run
- Keep only free-cancellation plans, plans with a meal included, or plans under a nightly price
- Remember the lowest price between runs and return only the stays that moved
- If a hotel can't be reached, return a row that says why
One thing to know up front: rows identify the hotel by its Trip.com hotel ID and link. They don't include the hotel's name. Join on hotelId with the rows from Trip.com Hotel Search Scraper or Trip.com Hotel Details Scraper when you need it.
What data is on each rate row?
| 🏨 Hotel ID | 📅 Check-in, check-out and nights |
| 🛏 Room name | Bed setup and bed count |
| Room size | Window |
| Floor | 🚭 Smoking policy |
| 📶 Wi-Fi terms | 👥 Maximum occupancy |
| 💵 Price per night | Stay total |
| Price as displayed | Crossed-out price, where there is one |
| Whether taxes and fees are included | Currency |
| 🍳 Meal terms | Cancellation deadline |
| Free cancellation flag and code | 💳 Payment terms |
| Amount the hotel holds | Instant confirmation flag |
| 🖼 Room photographs | Rate plan and room IDs |
| Room amenities (optional) | Sold-out flag |
| 🔗 Link to the booking page | Timestamp of the run |
How to scrape Trip.com room rates
- Sign up for Apify, which is free, and open Trip.com Room Rates Scraper.
- Add hotel IDs or paste Trip.com hotel page links into Hotels. For a long list, bulk-load them with Start URLs.
- Set check-in and check-out, or leave them empty and set how many days ahead the stay should start.
- Add filters and limits if you want them, then press Start.
- Download the rates as Excel, CSV or JSON.
No coding is needed. The hotel ID is the number after hotelId= in the address bar of a Trip.com hotel page.
⬇️ Input
Hotels and dates are all it needs. A hotel is a Trip.com hotel ID or any Trip.com hotel page link, and you can mix the two.
For dates you have three choices: an explicit check-in and check-out, a number of days ahead with a number of nights (which keeps a scheduled run pointed at a moving window), or "Several stays at once" for more than one date range per hotel. With nothing set, the stay starts 30 days ahead and lasts one night.
There are three limits, and they count different things:
- "Maximum rate plans per hotel and stay" keeps the cheapest plans of each stay: 200 by default, up to 300.
- "Maximum hotel-stays for the whole run" caps how many stays the run prices.
- "Maximum rows for the whole run" caps rows. The run stops at whichever of the last two is reached first, and a stay cut short by the row cap keeps its cheapest plans and is charged as one hotel-stay.
Start URLs takes the same hotel links, pasted or loaded from a file, a Google Sheet or a remote list. Anything it yields is added to the Hotels list.
One hotel, two nights
{"hotels": ["2193746"],"checkIn": "2026-11-12","checkOut": "2026-11-14","currency": "USD"}
2193746 is the Sheraton Lincoln Harbor Hotel, across the Hudson from Manhattan.
Three hotels on two stays, cheapest ten plans each
{"hotels": ["2193746", "https://www.trip.com/hotels/detail/?hotelId=1565819", "687592"],"stays": ["2026-11-12_2026-11-14", "2026-12-24_2026-12-26"],"maxRatePlansPerStay": 10,"adults": 2,"currency": "GBP"}
The second is the Hôtel Mercure Paris Porte d'Orléans and the third is Marina Bay Sands Singapore.
Refundable plans only, under a price ceiling
{"hotels": ["1565819"],"checkInDaysAhead": 45,"nights": 2,"freeCancellationOnly": true,"maxPricePerNight": 200,"includeRoomImages": false}
Hotel links loaded through Start URLs, with both run-wide caps
{"startUrls": [{ "url": "https://www.trip.com/hotels/detail/?hotelId=2193746" },{ "url": "https://www.trip.com/hotels/detail/?hotelId=687592" }],"checkIn": "2026-11-12","checkOut": "2026-11-14","maxItems": 50,"maxRows": 2000}
A daily watch that returns only price changes
{"hotels": ["2193746"],"checkInDaysAhead": 30,"nights": 1,"priceStoreName": "tripcom-prices","onlyNewOrChanged": true}
| Field | Notes |
|---|---|
hotels, startUrls | Trip.com hotel IDs or hotel page links. Either alone works. |
maxItems, maxRows, maxRatePlansPerStay | Hotel-stays for the run (0 means no limit), rows for the run (0 means no limit), and plans kept per stay (default 200, from 1 to 300). |
checkIn, checkOut | The stay, as YYYY-MM-DD. |
checkInDaysAhead, nights | Used when no check-in date is given: default 30 days ahead, 1 night. |
stays | Several date ranges per hotel, each written "YYYY-MM-DD_YYYY-MM-DD". |
adults, rooms, childAges | Adults (default 2), rooms priced as one booking (default 1), and one age per child, for example [4, 9]. Each can change which plans are offered. |
freeCancellationOnly | Keep plans that can be cancelled free of charge. |
mealIncludedOnly | Keep plans where a meal is part of the rate. A plan that only offers breakfast to buy is dropped. Off by default. |
maxPricePerNight | Drop plans above this nightly price in your currency. 0 means no limit. |
includeRoomImages, includeRoomFacilities | Up to 12 photo URLs per room (on by default) and the room's amenity list (off by default). |
currency, language | Price currency (default USD) and the locale of room names, meal and cancellation text (default en-GB). |
priceStoreName, onlyNewOrChanged | A named store that remembers the cheapest price per hotel and stay, and the switch that skips stays whose cheapest price hasn't changed. |
maxConcurrency, delayMs | How many requests run at once, and an optional pause before each one. |
For developers
maxItemscounts hotel-stays, not rows. A row reporting a request Trip.com didn't answer isn't counted and isn't charged.maxRowstrims the last stay to fit, keeping its cheapest plans. The stay is still billed as one hotel-stay.- Plans are sorted cheapest first before
maxRatePlansPerStayis applied. The default of 200 keeps every plan most hotels offer, and a very busy hotel can offer more. - Filters run on the grid after it's fetched. A stay whose plans they all remove returns one row and pays
hotel-checkedonly. - With
priceStoreNameset andonlyNewOrChangedon, a stay whose cheapest price equals the last run's writes nothing and payshotel-checkedonly. adultsis applied the way Trip.com's hotel page applies it, as the adults of all rooms together.maxConcurrency(default 16, from 1 to 32) sets how many stays are priced at once. We'd only turn it down for a run that shows errors.delayMs(default 0) is an optional wait before each request, in milliseconds, with 2000 as the most it will apply.- Rows are saved as they arrive. If Apify restarts a run part-way, the stays already delivered are neither fetched nor charged again.
⬆️ Output
Each row is one rate plan for one hotel and one stay. This one is a refundable Queen Room at the Sheraton Lincoln Harbor Hotel, two nights, from a run on 7 October 2026 (two of the room's photo links shown):
{"id": "2193746-20261112-2243167253_BBCITWG-W6Y5-9-B","hotelId": 2193746,"url": "https://www.trip.com/hotels/detail/?hotelId=2193746&checkIn=2026-11-12&checkOut=2026-11-14","checkIn": "2026-11-12","checkOut": "2026-11-14","nights": 2,"physicalRoomId": 273095558,"ratePlanId": "2243167253","roomCode": "BBCITWG-W6Y5-9-B","subHotelId": 135290218,"roomName": "Queen Room","bedType": "1 queen bed","windowText": "Has window(s)","hasWindow": true,"areaText": "35㎡","floorText": null,"smokingText": "Non-smoking","wifiText": "Wi-Fi (additional charge)","bedCount": 1,"roomImages": ["https://ak-d.tripcdn.com/images/0221v12000tom3ww2C769.jpg","https://ak-d.tripcdn.com/images/0224w12000to89rnb7427.jpg"],"maxOccupancy": 1,"priceTotal": 573.42,"pricePerNight": 286.71,"priceText": "US$573","priceListedTotal": null,"priceNote": "1 room × 2 nights incl. taxes & fees","pricesIncludeTax": true,"taxesIncluded": true,"taxesAndChargesPrepaid": 73.16,"currency": "USD","mealText": null,"isMealIncluded": null,"cancellationText": "Free cancellation before 23:59, Nov 8, 2026 (hotel's local time)","cancellationCode": 2,"isFreeCancellation": true,"paymentText": "Prepay online","guaranteeAmount": 286.71,"confirmationText": "Confirmed within 5 mins","isInstantConfirmation": false,"isSoldOut": false,"scrapedAt": "2026-10-07T20:26:51.757Z"}
Three kinds of answer for a stay
| What Trip.com said | What you get | What it costs on the Free plan |
|---|---|---|
| Rates are on sale | One row per rate plan | $0.0035 for the stay |
| Sold out | One row whose id ends -soldout, with isSoldOut: true, ratePlanCount: 0 and error: null | $0.0005 |
| Rates exist, but your filters removed them all | One row whose id ends -nomatch, with isSoldOut: false, ratePlanCount: 0, ratePlansFound (how many there were) and an error saying none passed the filters | $0.0005 |
A sold-out row is written every time. There's no switch for it. If Trip.com marks a stay sold out but still sends a few leftover room rows, you get the sold-out row, because those rooms can't be booked.
Columns that need a word
| Column | Meaning |
|---|---|
ratePlanId | Trip.com's id for the rate plan. With hotelId and the dates it makes up id |
physicalRoomId, roomCode, subHotelId | Trip.com's ids for the physical room, its room code and the sub-property that sells it |
floorText | The floors the room is on, as Trip.com words it ("Floor: 2-13"), where it says |
priceTotal, pricePerNight | The stay total with every tax and fee, including any charge due at the hotel (a resort fee, a city tax), and that total over the nights. The same basis in every language |
pricesIncludeTax | true on every priced plan. taxesIncluded is kept for compatibility and always matches it |
taxesAndChargesPrepaid | Trip.com's "Taxes & fees" amount charged with the booking, where Trip.com gives it as a number. Charges due at the hotel aren't in it. Empty in some languages, such as Japanese, where Trip.com shows the room price with tax already inside |
priceText | The price as Trip.com displays it in the chosen language. It follows Trip.com's regional display, and can be a nightly price before tax (English US) or a nightly price with tax (Japanese) while priceTotal stays the full stay |
priceListedTotal | The stay total before Trip.com's discounts, only when the plan is discounted |
priceNote | Trip.com's note on what the price covers ("1 room × 2 nights incl. taxes & fees") |
cancellationCode | Trip.com's code for the cancellation terms, beside the flag: 1 is free cancellation with no deadline, 2 and 3 are free cancellation before a deadline, 5 is non-refundable |
isFreeCancellation | true or false from the code, whatever the language of cancellationText |
roomFacilities | With "Include room amenities" on: the room's amenity list as Trip.com shows it ("Toothbrushes", "Bathtub", "Electric kettle"), the same for each plan of that room |
How big is a grid, and how fast is a run?
| Hotel-stays | Rows returned | Time |
|---|---|---|
| 1 (cheapest 8 plans) | 8 rate plans | 6 s |
| 15 (5 hotels × 3 stays) | 1,348 rate plans | 6 s |
| 32 (8 hotels × 4 stays) | 2,480 rate plans | 9 s |
| 80 (40 hotels × 2 stays, photos on) | 2,955 rate plans | 12 s |
Whole runs on Apify, start-up included, on 1 and 2 October 2026, with default settings and room photos off unless the row says otherwise. A bigger run takes little longer than a small one, and at this rate an hour prices tens of thousands of hotel-stays.
The size of a grid is the hotel's doing. One Tokyo hotel offered over 160 rate plans for a single night, while a London hotel offered 38 to 72. If you only want the cheapest few, lower "Maximum rate plans per hotel and stay", and turn off room photos to shrink the dataset sharply.
How much does it cost to scrape Trip.com room rates?
| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
actor-start, per run | $0.002 | $0.002 | $0.002 | $0.002 |
hotel-checked, per hotel-stay answered | $0.0005 | $0.0005 | $0.0005 | $0.0005 |
hotel-priced, per hotel-stay with rates | $0.003 | $0.0027 | $0.0024 | $0.0021 |
Enterprise plans pay the Business price.
$3.50 per 1,000 priced hotel-stays on the Free plan, $2.60 on Business, with every room and rate plan in the price. Platform usage and proxy are included, and there's nothing else to pay.
hotel-checked is charged once for each hotel and stay Trip.com answers. hotel-priced is added only when rate plans are delivered. A sold-out stay, a stay your filters emptied and a stay skipped as unchanged by "Only new or changed prices" all pay hotel-checked alone. A hotel-stay Trip.com never answered pays nothing and appears as an error row.
- 100 hotel-stays that all return rates: $0.002 + 100 × $0.0005 + 100 × $0.003 = $0.352 ($0.262 on Business), whatever the number of rate plans.
- Ten hotels on a daily schedule for a month: 30 × $0.002 + 300 × ($0.0005 + $0.003) = $1.11 ($0.84 on Business).
Apify's Free plan comes with $5 of credits a month, which here is about 135 runs of ten hotels, or roughly 1,350 priced hotel-stays.
FAQ
Why is there no hotel name on the rows?
Trip.com's rate grid identifies the hotel by ID, and that's what the rows have: hotelId and the hotel's url. For the name, address and stars, run the same IDs through Trip.com Hotel Details Scraper, or keep the rows from Trip.com Hotel Search Scraper and join on hotelId.
How do I get only the refundable rates?
Switch on "Free cancellation only". It reads Trip.com's cancellation code, not the wording, so it behaves the same in German or Japanese as in English. If you'd rather keep everything and filter later, isFreeCancellation and cancellationCode are on each row.
What happens when a hotel is sold out for my dates?
You get one row for that stay with isSoldOut: true and no price, and you pay the $0.0005 check fee. For a rate monitor that's a real data point, so it's always written.
My filters were too tight and a stay returned one odd row. What is it?
That's the -nomatch row. It tells you how many plans Trip.com had (ratePlansFound) and that none passed the filters on this run. Loosen the price ceiling or drop a filter and run that stay again.
How do I watch prices without paying for the same grid every day?
Name a price memory store and switch on "Only new or changed prices". A stay whose cheapest price hasn't moved since the last run writes nothing and costs the check fee. When the cheapest price moves, you get the stay's full grid.
Where do I find a hotel ID?
Open the hotel on Trip.com and read hotelId in the address bar, or paste the whole link. To collect IDs for a city, run Trip.com Hotel Search Scraper first.
Does the party size change the rates?
One adult, a second room or a child changes the plans and prices offered, and prices cover every room booked. On the hotels measured, three adults in one room returned the same plans as two, so check maxOccupancy on each plan for a larger party.
Do I need proxies or a Trip.com account?
No proxies and no account. Prices are what Trip.com shows a guest who isn't signed in, and there are no proxy charges.
What can't it do?
- Member-only and signed-in prices aren't returned.
- There's no loyalty points pricing. Trip.com prices in money only.
- Room photos are the room's own gallery, not photos of that specific rate plan.
- The number of rate plans varies by hotel and date, and there is no fixed count.
- Rate plans and prices move through the day. Two runs hours apart will differ.
- Rows don't include the hotel's name.
Is scraping Trip.com legal?
Room rates on Trip.com are public: anyone who opens the hotel page for those dates sees them, and that is all this actor reads. There is no personal data in a rate grid. Collecting public pricing is generally lawful in the EU, UK and US, and what you do with it afterwards is on you, Trip.com's terms included.
Rate monitoring from a schedule or your own code
Most rate work is a schedule: the same hotels, a moving window, every morning. Set the days-ahead inputs, add a price memory store, and send the changed stays on to a sheet, a webhook or your revenue tool through Apify's integrations.
To call it from code, POST https://api.apify.com/v2/acts/boncross~tripcom-room-rates/run-sync-get-dataset-items with the input JSON as the body. Short runs return their rows in that one call. Use the standard run endpoints or the apify-client package (JavaScript and Python) for longer ones.
AI agents reach it through the Apify MCP server at https://mcp.apify.com, where it appears as a tool that takes hotels and dates and returns the grid.
More from BonCross
- Trip.com Hotel Details Scraper: The full Trip.com record for any hotel, with its guest reviews.
- Trip.com Hotel Search Scraper: Every hotel Trip.com lists for a destination and your dates.
- Trip.com Attraction Reviews Scraper: Trip.com reviews for any attraction.
- Accor Hotel Details Scraper: Full Accor hotel records.
- Accor Hotel Search Scraper: Accor hotel prices for any destination and dates.
- Agoda Room Rates Scraper: Every room type and rate plan Agoda shows for a hotel and stay.
Your feedback
If a rate here doesn't match the hotel's page on Trip.com, we want to see it. Open an issue on the Issues tab in Apify Console with the hotel ID and the dates. We read every one, and a fix ships as a new build.