# Trip.com Hotels Scraper — Prices, Ratings & Amenities (`yugenox/trip-com-hotels-scraper`) Actor

Scrape Trip.com hotels by city, area, landmark or country: name, stars, guest score, review count, nightly 'from' price, address, coordinates, amenities. Optional hotel page details: check-in/out, policies, every facility, room types, nearby places. US$, £, C$, A$ and more. No login.

- **URL**: https://apify.com/yugenox/trip-com-hotels-scraper.md
- **Developed by:** [Yugenox Corp](https://apify.com/yugenox) (community)
- **Categories:** Travel, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 hotels

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Hotels Scraper: prices, ratings and amenities

Scrape hotels from **Trip.com** by city, area, landmark or whole country. Every hotel comes with its **name, star rating, guest score, review count, nightly "from" price, address and photo**. Hotels found on area and landmark pages also include **coordinates, district, amenities, the price with taxes and the check-in date it is for**. Turn on hotel page details to add **check-in and check-out times, children, pets, deposit and breakfast policies, every facility, room types, nearby stations and attractions, sub-scores, number of rooms, year opened and hotel group**. You can choose prices in US$, £, C$, A$, NZ$, S$, ₹, AED or ₱. No login, no cookies and no Trip.com account needed.

### What you get

| | |
|---|---|
| **Hotel** | Name, Trip.com hotel ID, URL, star rating (official, or Trip.com's own estimate), main photo and more photos |
| **Guest score** | Score out of 10 with its label ("Very Good"), review count, % of guests who recommend it, and sub-scores for cleanliness, amenities, location and service |
| **Price** | Lowest nightly "from" price in your market's currency. On area pages you also get the price with taxes, the price before discount, the check-in date, free cancellation and breakfast flags. On hotel pages you get Trip.com's average price |
| **Location** | Address (with postcode from the hotel page), district, area, city, province, country, latitude and longitude, distance to the city centre, nearest airport, train and metro station with distances, and nearby attractions |
| **Hotel page details** (optional) | Check-in and check-out times, front desk hours, children, extra bed, breakfast, deposit, pets and age policies; every facility grouped by category; languages spoken; room types (size, beds, max guests, room facilities); number of rooms, year opened and renovated, hotel group, and when it was last booked |
| **City statistics** | For each city: total properties, review count, average weekday and weekend nightly price, and the average by star class (3★, 4★, 5★). These are saved in the run's `CITY_STATS` record at no charge |

### How to use it

1. Enter one or more **cities**, e.g. `London`, `Toronto`, `Paris`. For a smaller city, add the country: `Kelowna, Canada`.
2. Or enter **whole countries** (`Canada`, `United Kingdom`) to get hotels from the 20 cities Trip.com lists for each one.
3. Or paste **Trip.com URLs**: hotel pages, city pages, area or landmark pages, or country pages.
4. Set **Max hotels**, pick a **market** for the currency, and run.

A city's own Trip.com page lists about 30–50 hotels. When you ask for more, the scraper also reads that city's area and landmark pages, such as "Hotels in Earls Court" or "Hotels near the London Eye", until it has enough.

#### Input examples

The 100 best-known hotels in London, in pounds:

```json
{
  "cities": ["London"],
  "maxItems": 100,
  "market": "uk"
}
```

Full hotel details for 4- and 5-star hotels rated 8.5 or higher in two cities:

```json
{
  "cities": ["Toronto", "Vancouver, Canada"],
  "maxItems": 50,
  "includeDetails": true,
  "minStars": 4,
  "minRating": 8.5,
  "market": "ca"
}
```

Specific hotels, an area and a landmark page:

```json
{
  "startUrls": [
    { "url": "https://www.trip.com/hotels/toronto-hotel-detail-2195242/chelsea-hotel-toronto/" },
    { "url": "https://www.trip.com/hotels/london-hotels-list-338/zone14554/" },
    { "url": "https://www.trip.com/hotels/london-the-london-eye/hotels-c338m6789972/" }
  ]
}
```

### Output example

A hotel found on an area page (list data):

```json
{
  "hotelId": 2230120,
  "name": "London Heathrow Marriott Hotel",
  "starRating": 4,
  "rating": 9.2,
  "ratingText": "Great",
  "reviewCount": 123,
  "priceFrom": 135,
  "priceWithTaxes": 162,
  "priceBeforeDiscount": 163,
  "priceDate": "2026-10-05",
  "currency": "USD",
  "freeCancellation": true,
  "breakfastIncluded": true,
  "address": "Bath Road Heathrow, Airport",
  "district": "Hillingdon",
  "area": "Heathrow, London",
  "city": "London",
  "latitude": 51.481484,
  "longitude": -0.438123,
  "amenities": ["Indoor swimming pool", "Sauna", "Executive lounge", "Gym", "Public parking", "EV charging station"],
  "lastBooked": "17 hours ago",
  "detailsFetched": false
}
```

The same kind of row with **Include hotel page details** (shortened):

```json
{
  "hotelId": 2195252,
  "name": "Best Western Plus Travel Hotel Toronto Airport",
  "url": "https://www.trip.com/hotels/toronto-hotel-detail-2195252/best-western-plus-travel-hotel-toronto-airport/",
  "starRating": 3,
  "starType": "official",
  "rating": 8.8,
  "reviewCount": 197,
  "recommendPercent": 80,
  "subRatings": { "cleanliness": 9, "amenities": 8.6, "location": 8.9, "service": 8.6 },
  "priceFrom": 96,
  "averagePrice": 157,
  "currency": "USD",
  "address": "5503 Eglinton Ave W, Etobicoke, Toronto, Ontario, M9C 5K5, Canada",
  "province": "Ontario",
  "country": "Canada",
  "latitude": 43.652962,
  "longitude": -79.600676,
  "checkIn": "After 14:00",
  "checkOut": "Before 11:00",
  "petsPolicy": "Pets are not allowed",
  "ageRequirement": "The main guest checking in must be at least 21 years old",
  "depositPolicy": ["Deposit: Deposit required", "Deposit Collection Methods: A fixed amount of CAD 250.00 (approx. US$175.80) is charged."],
  "facilitiesByCategory": { "Internet": ["Wi-Fi in public areas"], "Parking": ["Public parking (Free)"] },
  "languagesSpoken": ["English", "Korean", "Hindi"],
  "roomCount": 80,
  "openYear": 2010,
  "renovationYear": 2015,
  "brandGroup": "Best Western Hotels & Resorts",
  "nearestAirport": "Toronto Pearson International Airport",
  "airportDistanceKm": 9.74,
  "roomTypes": [{ "name": "Suite with Whirlpool", "beds": "1 King bed", "maxAdults": 2, "maxChildren": 1, "smoking": "Non-smoking" }],
  "detailsFetched": true
}
```

Every row has the same columns. If Trip.com doesn't show a value, the column is `null`.

### Use cases

- **Hotel market research**: compare star ratings, guest scores and price levels across cities, districts and landmarks.
- **Rate benchmarking**: track a competitive set's "from" prices over time, in the currency of your market.
- **Travel and booking sites**: build destination guides and hotel lists with coordinates, amenities and policies.
- **Hospitality sales**: find hotels by area, group and size (number of rooms, year opened) for B2B outreach to properties.
- **City price indexes**: use the free `CITY_STATS` record for average weekday and weekend prices by star class.

### FAQ

**Do I need a Trip.com account, cookies or a login?** No. The scraper reads the same public pages any visitor sees. It never logs in, and all it needs from you is a city, a country or a URL.

**Which dates are the prices for?** City pages show each hotel's lowest price for one night, without a date. Area and landmark pages show the price for a specific upcoming night (`priceDate`), with and without taxes. These prices are good for comparing hotels and tracking price levels. They are not a quote for a particular stay. Prices for dates you choose come from Trip.com's booking search, which this scraper doesn't use.

**How do I get prices in my currency?** Pick a **market**. Trip.com's UK site shows pounds, the Canadian site Canadian dollars, and so on. Every row says which currency it's in. Each market also picks its own featured hotels, so the hotels you get can differ slightly between markets.

**How many hotels can I get for a city?** Trip.com's public city page lists about 30–50 hotels. Its area and landmark pages list more. The scraper reads up to 60 of them per city, and stops early when they stop adding new hotels. That gives a few hundred hotels for a big city. For every property in a city, Trip.com's own booking search is the only complete list. If a city's pages run out before **Max hotels**, the run's status message says so.

**Why was a city skipped?** Trip.com city pages need an ID, so the scraper knows the best-known cities by name. It finds other cities on Trip.com's page for their country, which lists that country's 20 most popular cities. If a city isn't there, the run says so and doesn't charge for it. In that case, paste the city's Trip.com URL, e.g. `https://www.trip.com/hotels/kelowna-hotels-list-1398/`.

**How fast is it?** A city page loads in about 1 second, and each area page takes about 1 second more and adds 10–40 new hotels, so 100 hotels for a city take around 5–10 seconds. Hotel page details add one request per hotel; three run in parallel, which works out to roughly 2 hotels a second.

**Does it scrape guest reviews?** No. It returns each hotel's score, sub-scores, review count, "% recommended" and the topics guests praise most. It never returns individual reviews, reviewer names, countries or stay dates. Hotel cards that quote a guest's review are left out of the description.

**What about private apartments?** Some Trip.com listings are private homes. When a listing looks like one, the scraper removes the street and postcode from the address and rounds the coordinates to about 100 m. Such rows have `addressPrecision: "area"`. The scraper doesn't output phone numbers or e-mail addresses for any property.

**Which proxy should I use?** Keep the default (Apify Proxy, datacenter). It comes with every Apify plan, including the free one. If Trip.com refuses datacenter IPs for a while, the run switches to residential proxies when your account has them. When it doesn't, the run carries on without them.

**What does a run cost?** You pay a small fee per run, plus a charge per hotel saved and per city or area page searched. When details are on, there's also a charge per hotel page read. See the Pricing tab. You're never charged for hotels left out by your filters or for cities Trip.com doesn't have.

**Is it legal to scrape Trip.com?** This Actor only collects publicly available data: hotel listings that anyone can see on Trip.com without an account, such as a hotel's name, address, prices, ratings, facilities and policies. Collecting publicly available data is generally legal, but you're responsible for how you use it. Hotels are businesses. The scraper doesn't collect guest reviews or anything about individual travellers, and it removes personal e-mail addresses and phone numbers from descriptions. You must follow privacy laws such as GDPR, PIPEDA and CCPA, as well as Trip.com's terms. If you're unsure, check with a lawyer. More on this: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

**Does it access any private data?** No. Everything comes from pages Trip.com shows to any visitor without logging in. It never uses a login, never touches bookings or accounts, and follows the site's robots.txt.

This Actor is not affiliated with, endorsed by or sponsored by Trip.com or Trip.com Group. All trademarks belong to their owners.

# Actor input Schema

## `cities` (type: `array`):

City names, e.g. "London", "Toronto, Canada", "Paris". Add the country when a city is not one of Trip.com's best-known ones ("Kelowna, Canada") — the scraper then finds it on Trip.com's page for that country. You can also paste Trip.com city URLs (…/hotels/london-hotels-list-338/).

## `countries` (type: `array`):

The cities Trip.com lists for a country (its 20 most popular), e.g. "Canada", "United Kingdom", "Japan". Max hotels is shared fairly between them.

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

Optional: Trip.com hotel pages (…/hotels/london-hotel-detail-2196184/…/), city pages (…/hotels/london-hotels-list-338/), area or landmark pages (…/zone14554/, …/hotels-c338m6789972/) or country pages (…/hotels/country/canada.html). Any Trip.com market works (www, uk, ca…).

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

Maximum number of hotels for the whole run, shared fairly between your cities and countries. For a big city the scraper reads its city page and then its area and landmark pages until it has enough. 0 = everything.

## `includeDetails` (type: `boolean`):

Also open every hotel's own page for the full address with postcode, coordinates, check-in and check-out times, children / pets / deposit / breakfast policies, every facility (grouped), languages spoken, room types, nearby stations and attractions, sub-scores, number of rooms, year opened and the hotel group. One extra request per hotel, charged separately.

## `market` (type: `string`):

Which Trip.com site to read. Prices come in that site's currency, and each site picks its own featured hotels.

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

Only hotels with at least this guest score (0–10), e.g. 8. Hotels without a score are left out when this is set. Left-out hotels are not charged.

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

Only hotels with at least this many stars (1–5).

## `minReviews` (type: `integer`):

Only hotels with at least this many guest reviews.

## `proxyConfiguration` (type: `object`):

Apify Proxy (datacenter) is the default and comes with every Apify plan. If Trip.com refuses datacenter IPs for a while, the run switches to residential proxies when your account has them.

## Actor input object example

```json
{
  "cities": [
    "London"
  ],
  "maxItems": 30,
  "includeDetails": false,
  "market": "www",
  "minRating": 0,
  "minStars": 0,
  "minReviews": 0,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All scraped hotels.

## `cityStats` (type: `string`):

CITY_STATS: per city, total properties, review count, average weekday / weekend nightly price and the average by star class.

## `run` (type: `string`):

Status and statistics for this run.

## `report` (type: `string`):

RUN_REPORT: how the run ended, counts, requests and proxy use.

# 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 = {
    "cities": [
        "London"
    ],
    "maxItems": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("yugenox/trip-com-hotels-scraper").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 = {
    "cities": ["London"],
    "maxItems": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("yugenox/trip-com-hotels-scraper").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 '{
  "cities": [
    "London"
  ],
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call yugenox/trip-com-hotels-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,yugenox/trip-com-hotels-scraper"
        }
    }
}
```

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/ez3BXLyJXK1V6fUvh/builds/ygD6aIrVL8n8WU41F/openapi.json
