# Trip.com Hotel Search Scraper (`boncross/tripcom-hotel-search`) Actor

Scrape every hotel Trip.com lists for a destination and your dates. Just add city names and get hotel name, star rating, guest score, review count, address, coordinates, cheapest nightly price, stay total and a photo. Export to CSV or Excel, or run it on a schedule. $1.00 per 1,000 hotels.

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

## Pricing

from $0.70 / 1,000 hotel-listeds

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 Hotel Search Scraper

### What is Trip.com Hotel Search Scraper?

Type a city, set your dates, and Trip.com Hotel Search Scraper gives you the priced hotel list a guest would see on Trip.com: 1,000 hotels across five cities took 34 seconds in our own run. You don't look up any IDs first. "New York", "Paris" or "Singapore" is enough.

This is the market-wide actor of our three Trip.com hotel scrapers. It lists hotels with their cheapest price for your stay. For the full room and rate-plan grid of one hotel use Trip.com Room Rates Scraper, and for the property record and guest reviews use Trip.com Hotel Details Scraper. Trip.com's tours, tickets and attractions have their own actors, linked at the bottom.

Why choose it:

- You search by name, several cities in one run. Six destinations in five countries returned 120 hotels on 7 October 2026, and none came back empty.
- The price says what it covers. Each row has a per-night figure, a stay total, a flag for whether tax is inside, and Trip.com's own code for the price basis.
- Your party is priced the way Trip.com prices it: adults per room, number of rooms and each child's age.
- It's fast enough for a whole market. Three cities at 50 hotels each finish in about 6 seconds.
- $1.00 per 1,000 hotels on the Free plan and $0.70 on Business. There's no proxy to set up and no proxy charge.

**BonCross Verified** means we tested this actor against the live site before release and kept the record:

- 31 of 31 live checks on its inputs and filters passed on 8 October 2026
- 6 destinations run on 7 October 2026 in 5 countries: 120 hotels, none empty

What you can do with it:

- Search any city or area by name, or by Trip.com city ID if you already have one
- Get the cheapest available price for your exact dates, per night and per stay
- Read the star rating, guest score out of 10, review count and a review highlight
- Get coordinates, city, and how far the hotel is from the centre
- Sort by price, guest score or review count, and filter by star rating, guest score or a price ceiling
- Have a scheduled run return only hotels an earlier run hasn't already given you
- Read numbers as numbers, with Trip.com's wording kept beside them
- If a destination can't be reached, get a row that says why

People use it to build a priced hotel index for a city and a date range, to track how a market's cheapest price moves as a date approaches, to find the four-star hotels in a city above a guest score, and to assemble a shortlist of hotel IDs to price room by room afterwards.

### What hotel data do you get?

| | |
|---|---|
| 🏨 Hotel name | Name in English |
| Hotel ID | Property category |
| ⭐ Star rating | Guest score out of 10 |
| Score wording | Review count |
| 💬 Review highlight | 📍 Address |
| City and city ID | Country ID |
| Distance from the centre | 🗺 Latitude and longitude |
| 💵 Price per night | Stay total |
| Price as displayed | Crossed-out price, where there is one |
| Currency | 🛏 Cheapest room name |
| Availability wording | Price note (taxes and fees) |
| 🖼 Photograph | 📅 Check-in and check-out |
| 🔗 Link to the hotel page | Timestamp of the run |

### How to scrape Trip.com hotel search

There's no code to write. You fill in a form and download a spreadsheet.

1. [Create a free Apify account](https://console.apify.com/sign-up) and open [Trip.com Hotel Search Scraper](https://apify.com/boncross/tripcom-hotel-search).
2. Type one or more city names into Destinations.
3. Set the check-in and check-out dates. For a scheduled run, leave them empty and use "Or: days ahead to check in".
4. Choose how many hotels you want per destination and add any filters.
5. Press Start, then download the hotels as Excel, CSV or JSON.

### How much does it cost to search Trip.com hotels?

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `actor-start`, per run | $0.002 | $0.002 | $0.002 | $0.002 |
| `destination-resolved`, per destination resolved | $0.0005 | $0.0005 | $0.0005 | $0.0005 |
| `hotel-listed`, per hotel returned | $0.001 | $0.0009 | $0.0008 | $0.0007 |

Enterprise plans pay the Business price.

**$1.00 per 1,000 hotels** on the Free plan, $0.70 on Business. That is the whole price: platform usage and proxy are included.

You pay for hotels returned. A destination that resolves but has no hotels costs its $0.0005 and nothing more. A destination that never resolved costs nothing and shows up as an error row.

- Three cities at 100 hotels each: $0.002 + 3 × $0.0005 + 300 × $0.001 = **$0.3035** ($0.2135 on Business).
- One city a day for a month at 50 hotels: 30 × ($0.002 + $0.0005 + 50 × $0.001) = **$1.575** ($1.125 on Business).

The $5 of credits in Apify's Free plan each month is about 95 runs of one city at 50 hotels, or roughly 4,700 hotels, before you pay anything.

### ⬇️ Input

Give it destinations and dates. A destination is a city or area name, which is matched to a Trip.com destination before the search runs. If you already know a Trip.com city ID you can give that instead.

You have two limits. "Maximum hotels per destination" (default 50, at most 1,000) caps each city separately. "Maximum rows for the whole run" stops the run once that many rows have been returned across all destinations, and 0 means no limit.

Leave the dates empty and the stay starts 30 days ahead and lasts one night. Adults (2 per room by default), rooms and children's ages all change the prices you get back, so set them to the party you care about.

#### One city, one night

```json
{
  "destinations": ["New York"],
  "checkIn": "2026-11-12",
  "checkOut": "2026-11-13",
  "maxHotelsPerDestination": 50,
  "currency": "USD"
}
```

#### Several cities, four-star and up, well reviewed

```json
{
  "destinations": ["New York", "Paris", "Singapore"],
  "checkIn": "2026-11-12",
  "checkOut": "2026-11-15",
  "minStars": 4,
  "minRating": 8,
  "maxHotelsPerDestination": 100
}
```

#### A moving window on a daily schedule, new hotels only

```json
{
  "destinations": ["Paris"],
  "checkInDaysAhead": 30,
  "nights": 2,
  "dedupStoreName": "tripcom-seen",
  "onlyNew": true
}
```

#### By city ID, cheapest first, in pounds

```json
{
  "cityIds": ["338"],
  "checkIn": "2026-12-24",
  "checkOut": "2026-12-26",
  "sortBy": "price_low",
  "currency": "GBP"
}
```

338 is London. New York is 633 and Paris is 192.

| Field | Notes |
|---|---|
| `destinations`, `cityIds` | City or area names, or Trip.com city IDs. Either alone works. |
| `maxHotelsPerDestination`, `maxItems` | The per-destination cap (default 50, at most 1,000) and the run-wide cap (0 means no limit). |
| `checkIn`, `checkOut` | The stay, as YYYY-MM-DD. |
| `checkInDaysAhead`, `nights` | Used when no check-in date is given: the stay starts this many days ahead (default 30) and lasts `nights` (default 1). |
| `adults`, `rooms`, `childAges` | Adults per room (default 2), rooms priced as one booking (default 1), and one age per child, for example `[4, 9]`. |
| `sortBy` | `recommended` (default), `price_low`, `price_high`, `rating` or `most_reviewed`. The per-destination limit is applied after sorting. |
| `minStars`, `minRating`, `maxPricePerNight` | Floors on star rating (0 to 5) and guest score (out of 10), and a ceiling on the nightly price in your currency. 0 means no limit on each. |
| `currency`, `language` | Currency for every price (default `USD`) and the locale for names and text (default `en-GB`). |
| `dedupStoreName`, `onlyNew` | A named store that remembers the hotels you've had, and the switch that skips them. |
| `maxConcurrency`, `delayMs` | How many requests run at once, and an optional pause before each one. |

#### For developers

- `minStars`, `minRating` and `maxPricePerNight` are applied to each page after it's fetched. They return fewer rows. They don't make a run cheaper per hotel returned.
- With `sortBy: "price_low"` and a limit of 20 you get the 20 cheapest. Trip.com places a few featured hotels among the cheapest, as it does on its own site.
- Trip.com repeats some hotels from one results page to the next. Repeats are dropped and further pages are read until each destination reaches its limit.
- `dedupStoreName` names the store that remembers which hotels have been returned. With `onlyNew` on, a hotel an earlier run returned is skipped.
- `maxConcurrency` (default 8, from 1 to 32) is how many requests run at once. Lower it only if a run reports errors.
- `delayMs` (default 0) adds a pause in milliseconds before each call. Values above 2000 are treated as 2000. We'd leave both alone.
- Rows are saved as they arrive. If Apify restarts a run part-way, the hotels already delivered are neither repeated nor charged again.

### ⬆️ Output

One row per hotel, per destination, per stay. The Overview view in the Output tab shows the columns most people want, and the full record has everything in the table above.

```json
{
  "id": 133835362,
  "hotelId": 133835362,
  "url": "https://www.trip.com/hotels/detail/?hotelId=133835362&checkIn=2026-11-12&checkOut=2026-11-13",
  "name": "Nester Finn Financial District",
  "nameEn": "Nester Finn Financial District",
  "category": "Hotel",
  "stars": 3,
  "rating": 9.3,
  "ratingScale": 10,
  "ratingText": "Great",
  "reviewCount": 100,
  "reviewCountText": "100 reviews",
  "reviewHighlight": "The staff was very friendly, and the room was very comfortable.",
  "address": "Wall Street/Financial District",
  "cityId": 633,
  "cityName": "New York",
  "countryId": 66,
  "positionText": "New York | 760m from city centre (straight-line distance)",
  "lat": 40.707517,
  "lng": -74.006202,
  "priceTotal": 309,
  "pricePerNight": 309,
  "priceText": "US$309",
  "priceListedTotal": 450,
  "priceNote": "Incl. taxes & fees",
  "pricesIncludeTax": true,
  "priceTypeCode": 3,
  "currency": "USD",
  "cheapestRoomName": "Standard Queen Studio",
  "isSoldOut": false,
  "availabilityText": "Check Availability",
  "isAd": false,
  "thumbnail": "https://ak-d.tripcdn.com/images/0220612000k6bas8e3C95_R_600_600_R5_D.jpg",
  "checkIn": "2026-11-12",
  "checkOut": "2026-11-13",
  "destination": "New York",
  "scrapedAt": "2026-10-07T20:26:24.282Z"
}
```

`isAd` is `true` when Trip.com placed the hotel in the list as an advertised listing, `false` when it is an ordinary result, and null when Trip.com says neither.

#### What the price includes depends on the language

Trip.com prices a search differently by region, and the language you choose picks the region. Read `pricesIncludeTax` before you compare markets.

| Language | What the price is | `pricesIncludeTax` |
|---|---|---|
| English (UK), German, French, English (Australia) | The whole stay with every tax and fee, including charges due at the hotel | `true` |
| Japanese | A nightly price with tax. `priceTotal` is that times the nights | `true` |
| English (US), English (Canada), Chinese (Hong Kong) | A nightly price before taxes and fees. `priceTotal` is the nightly price times the nights, also before tax | `false` |

`priceTypeCode` is Trip.com's own code for the basis: 3 or 1 the stay with tax, 2 a night with tax, 0 a night before tax. A code we haven't seen leaves the prices and the flag empty, because a guessed price is worse than a missing one. If you need a tax-inclusive price in every market, use a language from the first group or price the stay with Trip.com Room Rates Scraper.

### How many hotels can you get, and how fast?

| Destinations | Hotels returned | Time |
|---|---|---|
| 1 | 20 | 5 to 7 s |
| 3 | 150 | 6 s |
| 4 | 400 | 16 s |
| 5, 200 each | 1,000, every city filled to 200 | 34 s |

These are whole runs on Apify with the default settings, start-up included, measured on 1 and 2 October 2026. Adding a city adds little time. At that rate a one-hour run lists well over 50,000 hotels.

### Limits to know before you rely on it

- You get the cheapest available price per hotel. The room-by-room grid is Trip.com Room Rates Scraper's job.
- Prices are the public ones a guest sees without signing in. Member rates aren't available.
- About half of rows have a street address, because Trip.com doesn't always publish one in search results. Coordinates and a distance-from-centre line are on each row, and Trip.com Hotel Details Scraper returns the full address.
- Five of Trip.com's orders are offered: recommended, lowest price, highest price, guest score and most reviewed. Each page of ten is in order, but Trip.com can repeat or re-order a few hotels where one page meets the next. A long sorted list is in order page by page, not strictly row by row.
- Trip.com leaves a fully booked hotel out of the results. `isSoldOut` is almost always false, and the list shows what can be booked.
- Prices move through the day. Two runs hours apart will differ, and that's the market, not an error.
- In English (US), English (Canada) and Chinese (Hong Kong) the search price is before taxes and fees. Trip.com gives no tax-inclusive stay total as a number there.
- Depths beyond about 200 hotels per destination haven't been measured.
- Trip.com may list the same hotels for a larger party. The price changes with the party and covers every room booked.

### FAQ

#### Do I need proxies or a Trip.com account?

Neither. You get the listings Trip.com shows a guest who isn't signed in, and there's no proxy to configure or pay for.

#### I searched "New York" and got hotels in New Jersey. Why?

Trip.com's recommended order for a city includes the area around it. In a run on 7 October 2026, nine of the first ten hotels for New York were across the river, in places such as Jersey City and Weehawken. Each row has `cityName` and a distance line ("5.2 km from New York centre"), so you can keep only the ones you want. Paris behaved the same way with its inner suburbs.

#### How do I search a city when I don't know its ID?

Type the name. The actor matches it to a Trip.com destination for you, and city IDs are optional. If you'd like to pin a run to an exact city, the `cityId` on each returned row is the number to reuse.

#### How do I track a market every day?

Schedule the run and use "Or: days ahead to check in" in place of fixed dates. The window then moves with each run. If you only care about hotels that are new to the list, name a seen-hotels store and switch on "Only hotels not seen before".

#### Why is the cheapest-first list not strictly cheapest first?

Trip.com puts a few featured hotels among the cheapest on its own site, and the actor returns its order as it is. With a limit of 20 you still get Trip.com's 20 cheapest for that order.

#### Can I get every room and price for a hotel?

Take the `hotelId` from these rows and give it to Trip.com Room Rates Scraper. That actor returns one row per rate plan.

#### Why do some rows have no address?

Trip.com doesn't publish a street address for every hotel in search results. The coordinates and the distance line are there on each row.

#### Is scraping Trip.com legal?

Scraping publicly available information is generally lawful in the EU, UK and US. This actor reads only what Trip.com shows any visitor, and no personal data. You're responsible for how you use the results.

### Schedules, the API and AI agents

A daily schedule with a moving date window is the common setup for price tracking. From there the hotel list can go to Google Sheets, Slack or a webhook through Apify's integrations.

From code, `POST https://api.apify.com/v2/acts/boncross~tripcom-hotel-search/run-sync-get-dataset-items` with the input JSON as the body returns the hotels in one call for short runs. The standard run endpoints handle longer ones, and the `apify-client` package covers JavaScript and Python.

An AI agent can call it through the Apify MCP server at `https://mcp.apify.com`: ask for hotels in a city for given dates and let it work over the rows.

### More from BonCross

- [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.
- [Agoda Room Rates Scraper](https://apify.com/boncross/agoda-room-rates): Every room type and rate plan Agoda shows for a hotel and stay.
- [Agoda Search Scraper](https://apify.com/boncross/agoda-search): Agoda search results for any destination and dates.
- [Booking.com Hotel Search Scraper](https://apify.com/boncross/booking-hotel-search): Every hotel Booking.com is selling for a destination and your dates.
- [Expedia Hotel Search Scraper](https://apify.com/boncross/expedia-hotel-search): Every hotel Expedia and Hotels.com list for a destination and your dates.

### Your feedback

Is a city resolving to the wrong place, or a price that doesn't match what Trip.com shows you? Tell us on the Issues tab in Apify Console, with the destination and dates. BonCross reads each report and replies there.

# Changelog

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

# Actor input Schema

## `destinations` (type: `array`):

City or area names to search, for example New York, Paris or Singapore. Each one is matched to a Trip.com destination before the search runs.

## `cityIds` (type: `array`):

Skip the name lookup by giving Trip.com city IDs directly, for example 633 for New York. Useful when you already know the ID and want the run to be exact.

## `maxHotelsPerDestination` (type: `integer`):

How many hotels to return for each destination. At most 1,000.

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

Stop once this many rows have been returned, across all destinations. 0 means no limit.

## `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-13.

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

Used only when no check-in date is given. The stay starts this many days from the day the run starts.

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

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

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

Adults per room. Prices change with occupancy.

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

How many rooms to price as one booking. The price covers every room.

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

One age per child, for example \[4, 9]. Leave empty for an adults-only stay.

## `sortBy` (type: `string`):

Order the hotels come back in, using Trip.com's own orders. The per-destination limit is applied after sorting, so "Lowest price" with a limit of 20 returns the 20 cheapest. Trip.com places a few featured hotels among the cheapest, as it does on its own site.

## `minStars` (type: `integer`):

Keep only hotels at or above this official star rating. 0 means no limit.

## `minRating` (type: `number`):

Keep only hotels at or above this guest score. Trip.com scores hotels out of 10. 0 means no limit.

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

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

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

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

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

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

## `dedupStoreName` (type: `string`):

Name of a storage area that remembers which hotels have already been returned. Leave empty to remember nothing.

## `onlyNew` (type: `boolean`):

Skip hotels that an earlier run already returned. Needs a seen-hotels 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
{
  "destinations": [
    "New York",
    "Paris"
  ],
  "cityIds": [
    "633",
    "192"
  ],
  "maxHotelsPerDestination": 50,
  "maxItems": 0,
  "checkIn": "2026-11-12",
  "checkOut": "2026-11-13",
  "checkInDaysAhead": 30,
  "nights": 1,
  "adults": 2,
  "rooms": 1,
  "childAges": [
    "4",
    "9"
  ],
  "sortBy": "recommended",
  "minStars": 0,
  "minRating": 0,
  "maxPricePerNight": 0,
  "currency": "GBP",
  "language": "en-US",
  "dedupStoreName": "tripcom-seen",
  "onlyNew": false,
  "delayMs": 0,
  "maxConcurrency": 8
}
```

# Actor output Schema

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

Trip.com hotels: every row the run returned.

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

Counts for the run: destinations resolved, pages fetched, rows filtered and returned.

# 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 = {
    "destinations": [
        "New York"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/tripcom-hotel-search").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 = { "destinations": ["New York"] }

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

```

## MCP server setup

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

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/Ao9TpTfEuDppQR4ix/builds/MGoNAdLEYOdqhiiFM/openapi.json
