# Trip.com Room Rates Scraper (`boncross/tripcom-room-rates`) Actor

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.

- **URL**: https://apify.com/boncross/tripcom-room-rates.md
- **Developed by:** [BonCross API](https://apify.com/boncross) (community)
- **Categories:** Travel
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 1,000 hotel-priceds

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 Room Rates Scraper

### 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. `priceTotal` is 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

1. [Sign up for Apify](https://console.apify.com/sign-up), which is free, and open [Trip.com Room Rates Scraper](https://apify.com/boncross/tripcom-room-rates).
2. Add hotel IDs or paste Trip.com hotel page links into Hotels. For a long list, bulk-load them with Start URLs.
3. Set check-in and check-out, or leave them empty and set how many days ahead the stay should start.
4. Add filters and limits if you want them, then press Start.
5. 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

```json
{
  "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

```json
{
  "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

```json
{
  "hotels": ["1565819"],
  "checkInDaysAhead": 45,
  "nights": 2,
  "freeCancellationOnly": true,
  "maxPricePerNight": 200,
  "includeRoomImages": false
}
```

#### Hotel links loaded through Start URLs, with both run-wide caps

```json
{
  "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

```json
{
  "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

- `maxItems` counts hotel-stays, not rows. A row reporting a request Trip.com didn't answer isn't counted and isn't charged.
- `maxRows` trims the last stay to fit, keeping its cheapest plans. The stay is still billed as one hotel-stay.
- Plans are sorted cheapest first before `maxRatePlansPerStay` is 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-checked` only.
- With `priceStoreName` set and `onlyNewOrChanged` on, a stay whose cheapest price equals the last run's writes nothing and pays `hotel-checked` only.
- `adults` is 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):

```json
{
  "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](https://apify.com/boncross/tripcom-hotel-details): The full Trip.com record for any hotel, with its guest reviews.
- [Trip.com Hotel Search Scraper](https://apify.com/boncross/tripcom-hotel-search): Every hotel Trip.com lists for a destination and your dates.
- [Trip.com Attraction Reviews Scraper](https://apify.com/boncross/tripcom-reviews): Trip.com reviews for any attraction.
- [Accor Hotel Details Scraper](https://apify.com/boncross/accor-hotel-details): Full Accor hotel records.
- [Accor Hotel Search Scraper](https://apify.com/boncross/accor-search): Accor hotel prices for any destination and dates.
- [Agoda Room Rates Scraper](https://apify.com/boncross/agoda-room-rates): 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.

# Changelog

This Actor's version history is a separate document: https://apify.com/boncross/tripcom-room-rates/changelog.md

# Actor input Schema

## `hotels` (type: `array`):

Trip.com hotel IDs or hotel page URLs. A hotel page URL looks like https://www.trip.com/hotels/detail/?hotelId=2193746: paste the whole link or just the number.

## `startUrls` (type: `array`):

Trip.com hotel page links, pasted or bulk-loaded from a file or Google Sheet. Use this instead of the list above when you have many hotels.

## `maxItems` (type: `integer`):

A run-wide ceiling on hotel-stays, across every hotel and stay. One hotel-stay is its whole room and rate-plan grid. Zero means no limit. Rows that report a request Trip.com did not answer are not counted here and are never charged for.

## `maxRows` (type: `integer`):

A run-wide ceiling on rows. A hotel-stay is one row per rate plan, so the last stay is cut to fit, keeping its cheapest plans, and is still charged as one hotel-stay. Works alongside Maximum hotel-stays: the run stops at whichever is reached first. Zero means no limit.

## `maxRatePlansPerStay` (type: `integer`):

Keep only the cheapest N rate plans for each hotel and stay, from 1 to 300. Defaults to 200, which keeps every plan most hotels offer; a very busy hotel can offer more.

## `checkIn` (type: `string`):

Check-in date as YYYY-MM-DD, for example 2026-11-12.

## `checkOut` (type: `string`):

Check-out date as YYYY-MM-DD, for example 2026-11-14.

## `checkInDaysAhead` (type: `integer`):

Used only when no check-in date is given. The stay starts this many days from the day the run starts, which keeps a scheduled run pointed at a moving window.

## `nights` (type: `integer`):

Length of the stay when the dates are computed from "days ahead".

## `stays` (type: `array`):

Price more than one date range per hotel. Each entry is "YYYY-MM-DD_YYYY-MM-DD", for example "2026-11-12_2026-11-14".

## `adults` (type: `integer`):

Adults per room. Applied the way Trip.com's own hotel page applies it (the adults of all rooms together); one adult or a larger party can change the plans offered. Check maxOccupancy on each plan.

## `rooms` (type: `integer`):

How many rooms to price as one booking. Prices cover every room.

## `childAges` (type: `array`):

One age per child, for example \[4, 9]. Leave empty for an adults-only stay. A child can change which plans are offered.

## `freeCancellationOnly` (type: `boolean`):

Keep only rate plans that can be cancelled free of charge.

## `mealIncludedOnly` (type: `boolean`):

Keep only rate plans where a meal is part of the rate, dropping plans that merely offer breakfast to buy.

## `maxPricePerNight` (type: `integer`):

Drop rate plans above this nightly price, in the currency selected below. 0 means no limit.

## `includeRoomImages` (type: `boolean`):

Add up to 12 photo URLs for the room each rate plan belongs to.

## `includeRoomFacilities` (type: `boolean`):

Add the amenity list of the room each rate plan belongs to, for example toiletries, bathtub, kettle and air conditioning (15 to 30 items a room).

## `currency` (type: `string`):

Three-letter currency code for every price in the output.

## `language` (type: `string`):

Locale for room names, meal and cancellation text, for example en-GB, en-US, de-DE or ja-JP.

## `priceStoreName` (type: `string`):

Name of a storage area that remembers the cheapest price seen for each hotel and stay, so a later run can tell what changed. Leave empty to remember nothing.

## `onlyNewOrChanged` (type: `boolean`):

Skip a hotel and stay whose cheapest price is the same as last run. Needs a price memory store.

## `delayMs` (type: `integer`):

Optional pause before each call, in milliseconds. 0 (the default) runs as fast as the parallel limit allows. Values above 2000 are treated as 2000.

## `maxConcurrency` (type: `integer`):

How many requests run at once across the whole run. The default is the fastest level measured clean; lower it only if a run reports refusals or errors.

## Actor input object example

```json
{
  "hotels": [
    "2193746",
    "https://www.trip.com/hotels/detail/?hotelId=1565819"
  ],
  "maxItems": 0,
  "maxRows": 0,
  "maxRatePlansPerStay": 200,
  "checkIn": "2026-11-12",
  "checkOut": "2026-11-14",
  "checkInDaysAhead": 30,
  "nights": 1,
  "stays": [
    "2026-11-12_2026-11-14",
    "2026-12-24_2026-12-26"
  ],
  "adults": 2,
  "rooms": 1,
  "childAges": [
    "4",
    "9"
  ],
  "freeCancellationOnly": false,
  "mealIncludedOnly": false,
  "maxPricePerNight": 0,
  "includeRoomImages": true,
  "includeRoomFacilities": false,
  "currency": "GBP",
  "language": "en-US",
  "priceStoreName": "tripcom-prices",
  "onlyNewOrChanged": false,
  "delayMs": 0,
  "maxConcurrency": 16
}
```

# Actor output Schema

## `dataset` (type: `string`):

Trip.com room rates: every row the run returned.

## `stats` (type: `string`):

Counts for the run: grids fetched, priced, sold out and unanswered.

# 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 = {
    "hotels": [
        "2193746"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/tripcom-room-rates").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 = { "hotels": ["2193746"] }

# Run the Actor and wait for it to finish
run = client.actor("boncross/tripcom-room-rates").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 '{
  "hotels": [
    "2193746"
  ]
}' |
apify call boncross/tripcom-room-rates --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,boncross/tripcom-room-rates"
        }
    }
}
```

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/b1a9c2xQc8KRLJ0DA/builds/f3n1clArrae9PHokb/openapi.json
