# Trip.com Scraper - Hotels, Prices & Reviews (`scrapesage/trip-com-scraper`) Actor

Scrape Trip.com hotels with live room prices, star ratings, review scores & sub-ratings, amenities, photos, full address & geo, policies, AI review summaries and guest reviews (with English translations). Search any destination by name, city ID or URL. Export JSON, CSV, Excel.

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

## Pricing

from $3.00 / 1,000 hotel scrapeds

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Trip.com Scraper — Hotels, Prices & Reviews

Extract **complete Trip.com hotel data** for any destination — **live room prices** (with taxes and the crossed-out "was" price), **star class**, **review scores and sub-ratings**, the **full amenities list**, photos, **address + map coordinates + nearest transit**, every **hotel policy**, the **AI review summary**, and **guest reviews with English translations**. Search by destination name, city ID or URL.

No login, no cookies, no browser, no API key — fast JSON extraction with 99%+ reliability.

### Why this Trip.com scraper?

Most hotel scrapers give you a name, a star count and maybe a price. This actor pulls the **complete** record Trip.com renders for each property and ships the **richest dataset in the category**:

| Data | Typical scrapers | This actor |
|---|---|---|
| Live lowest room price + currency | ✅ | ✅ |
| Total price incl. taxes & fees + "was" price | ❌ | ✅ |
| Overall review score + review count | partial | ✅ |
| Sub-ratings (cleanliness, location, service, amenities) | ❌ | ✅ |
| Full amenities list (not just "wifi/pool") | ❌ | ✅ all + highlights |
| Address, zone, latitude/longitude, nearest transit | partial | ✅ |
| Hotel policies (check-in/out, children, pets, deposit, breakfast) | ❌ | ✅ |
| Comment-tag breakdown ("Delicious breakfast" ×21) | ❌ | ✅ |
| AI review summary by aspect | ❌ | ✅ |
| Guest reviews **with English translation** + sub-ratings + photos | ❌ | ✅ opt-in |
| Hotel's response to a review | ❌ | ✅ |
| Quality score (0–100) | ❌ | ✅ |

### Use cases

- **Travel & price intelligence** — track hotel prices, taxes, discounts and availability across cities and dates for revenue management, comparison sites and meta-search.
- **Market research** — benchmark a property against competitors by star class, review score, sub-ratings, amenities and price band in any market.
- **Review & reputation analytics** — pull guest reviews (with English translations), sub-ratings, comment tags and AI summaries to mine sentiment and service themes.
- **Travel content & aggregation** — feed booking sites, trip planners, newsletters and apps with structured, photo-rich hotel data for thousands of destinations.
- **Hospitality monitoring** — schedule recurring runs to watch a destination for newly listed hotels, price drops or rating changes.

### How to use

1. [Sign up for Apify](https://console.apify.com/sign-up) — the free plan is enough to try this actor.
2. Open the **Trip.com Scraper**, type a destination (e.g. `Tokyo`), pick your dates, and click **Start**.
3. Watch hotels and reviews stream into the dataset table.
4. **Export** as JSON, CSV, Excel, XML or RSS — or pull results programmatically via the [Apify API](https://docs.apify.com/api/v2).

### Input

```json
{
    "searchDestinations": ["Tokyo", "Singapore"],
    "checkInDate": "2026-09-10",
    "checkOutDate": "2026-09-12",
    "adults": 2,
    "rooms": 1,
    "maxHotelsPerSearch": 30,
    "maxHotels": 100,
    "minRating": 8,
    "includeHotelDetails": true,
    "includeReviews": true,
    "maxReviewsPerHotel": 10
}
````

- **searchDestinations** — destination names (`Tokyo`, `Singapore`, `New York`, `Dubai`, `London`, …). Popular destinations resolve automatically.
- **cityIds** — numeric Trip.com city IDs for any other destination. Read an ID from the hotels URL: `.../hotels/list?city=`**`73`**.
- **searchUrls** — paste Trip.com hotel **list** URLs (`https://us.trip.com/hotels/list?city=73`). Every hotel on the page is scraped.
- **hotelUrls / hotelIds** — scrape specific hotels (full detail + reviews) by detail URL or numeric hotel ID.
- **checkInDate / checkOutDate / adults / children / rooms** — used to price rooms (defaults to tomorrow, 2 adults, 1 room).
- **minRating / minReviews / starRatings / maxPrice** — filters applied to the rich record.
- **includeHotelDetails** *(default true)* — fetch each hotel's detail page for the full record (amenities, policies, address, AI review summary, sub-ratings).
- **includeReviews** *(default true)* — output guest reviews as separate records (rating, English translation, photos, hotel response).
- **monitorMode** — output only hotels that are **new** since the last run (for scheduled monitoring).

### Output

One record per hotel (`type: "hotel"`), plus optional guest-review records (`type: "review"`):

```json
{
    "type": "hotel",
    "hotelId": "3801236",
    "name": "Hotel Boss",
    "url": "https://us.trip.com/hotels/detail/?hotelId=3801236&cityId=73",
    "category": "Hotel",
    "starRating": 4,
    "reviewScore": 8.4,
    "reviewScoreDescription": "Very good",
    "reviewCount": 6861,
    "subRatings": { "Cleanliness": 8.5, "Amenities": 8, "Location": 8.8, "Service": 8.4 },
    "reviewHighlight": "The hotel features an outdoor swimming pool and a fitness center…",
    "lowestPrice": 92,
    "priceCurrency": "USD",
    "priceTotalWithTaxes": 100.12,
    "priceWasBefore": 110,
    "lowestRoomName": "Superior Twin Room",
    "city": "Singapore",
    "zone": "Kampong Glam",
    "address": "500 Jalan Sultan Road, 199020, Singapore",
    "latitude": 1.30541,
    "longitude": 103.8604,
    "nearestTransit": "1,200 ft from metro station (Lavender), approx. 6 mins on foot",
    "openYear": 2015,
    "description": "With a stay at Hotel Boss in Singapore (Kallang)…",
    "amenitiesHighlights": ["Outdoor swimming pool", "Gym", "Private parking"],
    "amenities": ["Outdoor swimming pool", "Gym", "Luggage storage", "Conference room", "..."],
    "amenitiesCount": 38,
    "policies": { "checkIn": "After 15:00 | Before 12:00", "children": "Children can stay…", "pets": "Pets are not allowed" },
    "reviewTags": [{ "name": "Convenient location", "count": 412 }],
    "aiReviewSummary": {
        "headline": "Ratings are higher than 80% of similar properties.",
        "aspects": [{ "aspect": "Service Quality", "summary": "Guests praised the attentive staff…", "basedOnReviews": 69, "positive": true }]
    },
    "images": ["https://ak-d.tripcdn.com/images/…"],
    "qualityScore": 84,
    "scrapedAt": "2026-06-17T01:43:55.515Z"
}
```

```json
{
    "type": "review",
    "hotelId": "3801236",
    "hotelName": "Hotel Boss",
    "rating": 9,
    "ratingMax": 10,
    "ratingDescription": "Great",
    "subRatings": { "Location": 10, "Amenities": 8, "Service": 10, "Cleanliness": 8 },
    "content": "Near Kampong Glam, convenient, near MRT and behind the bus stop. Great stay, cool aircon.",
    "contentEnglish": null,
    "language": "en",
    "roomName": "Superior Room With Balcony",
    "travelType": "Traveling with friends",
    "checkInDate": "2026-06-01",
    "postedDate": "2026-06-15 14:36:00",
    "photos": ["https://ak-d.tripcdn.com/images/…"],
    "ownerResponse": "Dear Guest, thank you for choosing to stay with us…"
}
```

### Automate & schedule

Run this actor on autopilot and pull results into your own stack:

- **[Apify API](https://docs.apify.com/api/v2)** — start runs, fetch datasets, and manage schedules over REST.
- **[apify-client for JavaScript](https://docs.apify.com/api/client/js/)** and **[apify-client for Python](https://docs.apify.com/api/client/python/)** — official SDKs.
- **[Schedules](https://docs.apify.com/platform/schedules)** — run hourly/daily/weekly to track prices or watch a destination for new hotels; perfect for price feeds and dashboards.
- **[Webhooks](https://docs.apify.com/platform/integrations/webhooks)** — trigger downstream actions (price-alert email, Slack message, database import) the moment a run finishes.

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });

const run = await client.actor('scrapesage/trip-com-scraper').call({
    searchDestinations: ['Tokyo'],
    checkInDate: '2026-09-10',
    checkOutDate: '2026-09-12',
    maxHotels: 50,
    includeReviews: true,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} hotels & reviews`);
```

### Integrate with any app

Connect the dataset to 5,000+ apps — no code required:

- **[Make](https://docs.apify.com/platform/integrations/make)** — multi-step automation scenarios.
- **[Zapier](https://docs.apify.com/platform/integrations/zapier)** — push hotels and prices straight into your sheets or CRM.
- **[Slack](https://docs.apify.com/platform/integrations/slack)** — get notified when a monitored destination has new hotels or price drops.
- **[Google Drive / Sheets](https://docs.apify.com/platform/integrations/drive)** — auto-export every run to a spreadsheet.
- **[Airbyte](https://docs.apify.com/platform/integrations/airbyte)** — pipe results into your data warehouse.
- **[GitHub](https://docs.apify.com/platform/integrations/github)** — trigger runs from commits or releases.

### Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. Call this actor from Claude, ChatGPT or any agent framework through the **[Apify MCP server](https://docs.apify.com/platform/integrations/mcp)** — ask your assistant to "find 4-star hotels in Tokyo under $200 with a 9+ review score" and let it run this scraper for you.

### More scrapers from scrapesage

Build a complete **travel & experiences** data stack:

- **[Airbnb Scraper](https://apify.com/scrapesage/airbnb-scraper)** — vacation rentals: listings, prices, and availability.
- **[GetYourGuide Scraper](https://apify.com/scrapesage/getyourguide-scraper)** — tours, activities and experiences with prices and ratings.
- **[Tours & Activities Scraper](https://apify.com/scrapesage/tours-activities-scraper)** — attraction tickets and things to do across Civitatis and Tiqets.
- **[Eventbrite Scraper](https://apify.com/scrapesage/eventbrite-scraper)** — events with ticket prices and organizer contacts.
- **[Luma Scraper](https://apify.com/scrapesage/luma-scraper)** — Luma events, hosts and attendee-facing details.
- **[Meetup Scraper](https://apify.com/scrapesage/meetup-scraper)** — local meetups, groups and events.

### Tips

- **Any destination**: only popular cities resolve by name. For everything else, open the city on Trip.com, copy the number after `?city=` in the URL into **City IDs**, or paste the whole list URL into **Search URLs**.
- **Prices need dates**: set `checkInDate`/`checkOutDate` to price for your exact stay. Without dates the actor prices tomorrow night.
- **Fast & cheap sweep**: turn `includeHotelDetails` off to collect price + rating + geo only (one fetch per page, no per-hotel detail call).
- **More hotels per city**: raise `maxHotelsPerSearch`; the actor pages through the listing and deduplicates. Very large markets are best split by area (use several `searchUrls` with neighbourhood filters).
- **Recurring monitoring**: combine [Schedules](https://docs.apify.com/platform/schedules) with `monitorMode` to capture only newly listed hotels each run.
- **Proxies**: the default Apify datacenter (US) proxy works well; switch to residential if you scrape at high volume.

### FAQ

**How do I scrape hotels for a specific city?** Put the city in `searchDestinations` (e.g. `Bangkok`). If it isn't recognised, copy its numeric ID from the Trip.com hotels URL (`?city=ID`) into `cityIds`, or paste the list URL into `searchUrls`.

**Does it return live prices?** Yes — the lowest available room rate for your dates, plus the total including taxes & fees and any crossed-out "was" price. Prices come from the search/list pages; direct hotel-ID lookups return the full profile and reviews without a live nightly rate.

**Can I get guest reviews?** Yes. With `includeReviews` on, each hotel's most-relevant reviews are output as separate records with the rating, sub-ratings, original text **and an English translation**, room, travel type, dates, photos and the hotel's response.

**Can I export to Google Sheets, CSV or Excel?** Yes — one click in the dataset view, or automatically on every run via the [Google Drive integration](https://docs.apify.com/platform/integrations/drive).

**How do I monitor a destination automatically?** Create a [Schedule](https://docs.apify.com/platform/schedules) (e.g. daily) and turn on `monitorMode` to emit only new hotels; optionally add a [webhook](https://docs.apify.com/platform/integrations/webhooks) to push them downstream.

**Is scraping Trip.com legal?** This actor collects publicly available data only. You are responsible for using the data in compliance with applicable laws (e.g. GDPR/CCPA for any personal data in reviews) and Trip.com's terms.

**A field is null — why?** Some hotels genuinely don't publish a field (e.g. brand-new hotels with no reviews, or properties without published policies). Fields are `null` only when the data doesn't exist, not because the scraper skipped them.

### Need help?

Open an issue on the actor's **Issues** tab, or visit the [Apify help center](https://help.apify.com/). Feature requests are welcome — this actor is actively maintained.

# Actor input Schema

## `searchDestinations` (type: `array`):

City / destination names to search hotels in, e.g. <code>Tokyo</code>, <code>Singapore</code>, <code>New York</code>, <code>Dubai</code>, <code>London</code>. The actor resolves popular destinations automatically. For any other city, pass its numeric Trip.com city ID in <b>City IDs</b> (read it from a Trip.com hotels URL: <code>.../hotels/list?city=<u>123</u></code>) or paste the list URL in <b>Search URLs</b>.

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

Numeric Trip.com city IDs to search (e.g. <code>73</code> = Singapore, <code>228</code> = Tokyo). Use this for any destination not covered by the built-in name list. Find an ID in the hotels list URL: <code>.../hotels/list?city=<u>ID</u></code>.

## `searchUrls` (type: `array`):

Paste Trip.com hotel <b>list</b> URLs (e.g. <code>https://us.trip.com/hotels/list?city=73</code>). Every hotel on the page is scraped. Used in addition to the destinations above.

## `hotelUrls` (type: `array`):

Paste Trip.com hotel <b>detail</b> URLs (e.g. <code>https://us.trip.com/hotels/detail/?hotelId=687474</code>) to scrape specific hotels with full details and reviews.

## `hotelIds` (type: `array`):

Numeric Trip.com hotel IDs to scrape directly (full detail + reviews).

## `checkInDate` (type: `string`):

Check-in date (YYYY-MM-DD) used to price rooms. Defaults to tomorrow.

## `checkOutDate` (type: `string`):

Check-out date (YYYY-MM-DD) used to price rooms. Defaults to the day after check-in.

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

Number of adults (per room) for pricing.

## `children` (type: `integer`):

Number of children for pricing.

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

Number of rooms for pricing.

## `maxHotelsPerSearch` (type: `integer`):

Maximum hotels to collect for each destination / search URL.

## `maxHotels` (type: `integer`):

Maximum number of hotels to scrape across all destinations.

## `minRating` (type: `integer`):

Only keep hotels with a review score (0–10) at or above this value.

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

Only keep hotels with at least this many guest reviews.

## `starRatings` (type: `array`):

Only keep hotels with these star classes. Leave empty for all.

## `maxPrice` (type: `integer`):

Only keep hotels whose lowest room price is at or below this amount (in the site currency, USD). 0 = no limit.

## `includeHotelDetails` (type: `boolean`):

Fetch each hotel's detail page for the full record: description, complete amenities list, address & nearby transit, all policies, comment-tag breakdown, AI review summary and sub-ratings. One extra page fetch per hotel.

## `includeReviews` (type: `boolean`):

Output the most-relevant guest reviews for each hotel as separate review records — rating, sub-ratings, original text plus an English translation, room, travel type, dates, photos and the hotel's response. Requires hotel details.

## `maxReviewsPerHotel` (type: `integer`):

Maximum guest reviews to output for each hotel.

## `deduplicateHotels` (type: `boolean`):

Skip a hotel if it was already emitted in this run (e.g. when a hotel appears in two searches).

## `monitorMode` (type: `boolean`):

Remember hotels returned in previous runs (in a named key-value store) and output only hotels that are NEW since the last run. Pair with Apify Schedules to watch a destination for newly listed properties. This does not conflict with the scheduler — the schedule triggers the run; monitor mode dedupes a run's results against earlier runs.

## `monitorStoreName` (type: `string`):

Named key-value store used to remember seen hotels across runs. Use different names to track different destinations independently (lowercase letters, digits and hyphens).

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

How many hotel pages to fetch in parallel.

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

Proxies to use. Apify Proxy (datacenter, US) works well for Trip.com; switch to residential if you hit rate limits at high volume.

## Actor input object example

```json
{
  "searchDestinations": [
    "Singapore"
  ],
  "adults": 2,
  "children": 0,
  "rooms": 1,
  "maxHotelsPerSearch": 30,
  "maxHotels": 100,
  "minRating": 0,
  "minReviews": 0,
  "maxPrice": 0,
  "includeHotelDetails": true,
  "includeReviews": true,
  "maxReviewsPerHotel": 10,
  "deduplicateHotels": true,
  "monitorMode": false,
  "monitorStoreName": "tripcom-monitor",
  "maxConcurrency": 6,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

All scraped hotel records and optional guest-review records as JSON items in the default dataset.

# 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 = {
    "searchDestinations": [
        "Singapore"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/trip-com-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 = {
    "searchDestinations": ["Singapore"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/trip-com-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchDestinations": [
    "Singapore"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyCountry": "US"
  }
}' |
apify call scrapesage/trip-com-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapesage/trip-com-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Trip.com Scraper - Hotels, Prices & Reviews",
        "description": "Scrape Trip.com hotels with live room prices, star ratings, review scores & sub-ratings, amenities, photos, full address & geo, policies, AI review summaries and guest reviews (with English translations). Search any destination by name, city ID or URL. Export JSON, CSV, Excel.",
        "version": "1.0",
        "x-build-id": "yjmrU7fre9ax6byjv"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapesage~trip-com-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapesage-trip-com-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/scrapesage~trip-com-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapesage-trip-com-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/scrapesage~trip-com-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapesage-trip-com-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchDestinations": {
                        "title": "Search destinations",
                        "type": "array",
                        "description": "City / destination names to search hotels in, e.g. <code>Tokyo</code>, <code>Singapore</code>, <code>New York</code>, <code>Dubai</code>, <code>London</code>. The actor resolves popular destinations automatically. For any other city, pass its numeric Trip.com city ID in <b>City IDs</b> (read it from a Trip.com hotels URL: <code>.../hotels/list?city=<u>123</u></code>) or paste the list URL in <b>Search URLs</b>.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "cityIds": {
                        "title": "City IDs",
                        "type": "array",
                        "description": "Numeric Trip.com city IDs to search (e.g. <code>73</code> = Singapore, <code>228</code> = Tokyo). Use this for any destination not covered by the built-in name list. Find an ID in the hotels list URL: <code>.../hotels/list?city=<u>ID</u></code>.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "searchUrls": {
                        "title": "Search URLs",
                        "type": "array",
                        "description": "Paste Trip.com hotel <b>list</b> URLs (e.g. <code>https://us.trip.com/hotels/list?city=73</code>). Every hotel on the page is scraped. Used in addition to the destinations above.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "hotelUrls": {
                        "title": "Hotel URLs",
                        "type": "array",
                        "description": "Paste Trip.com hotel <b>detail</b> URLs (e.g. <code>https://us.trip.com/hotels/detail/?hotelId=687474</code>) to scrape specific hotels with full details and reviews.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "hotelIds": {
                        "title": "Hotel IDs",
                        "type": "array",
                        "description": "Numeric Trip.com hotel IDs to scrape directly (full detail + reviews).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "checkInDate": {
                        "title": "Check-in date",
                        "type": "string",
                        "description": "Check-in date (YYYY-MM-DD) used to price rooms. Defaults to tomorrow."
                    },
                    "checkOutDate": {
                        "title": "Check-out date",
                        "type": "string",
                        "description": "Check-out date (YYYY-MM-DD) used to price rooms. Defaults to the day after check-in."
                    },
                    "adults": {
                        "title": "Adults",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Number of adults (per room) for pricing.",
                        "default": 2
                    },
                    "children": {
                        "title": "Children",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Number of children for pricing.",
                        "default": 0
                    },
                    "rooms": {
                        "title": "Rooms",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Number of rooms for pricing.",
                        "default": 1
                    },
                    "maxHotelsPerSearch": {
                        "title": "Max hotels per destination",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum hotels to collect for each destination / search URL.",
                        "default": 30
                    },
                    "maxHotels": {
                        "title": "Max hotels (total)",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of hotels to scrape across all destinations.",
                        "default": 100
                    },
                    "minRating": {
                        "title": "Minimum review score",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Only keep hotels with a review score (0–10) at or above this value.",
                        "default": 0
                    },
                    "minReviews": {
                        "title": "Minimum number of reviews",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only keep hotels with at least this many guest reviews.",
                        "default": 0
                    },
                    "starRatings": {
                        "title": "Star ratings",
                        "type": "array",
                        "description": "Only keep hotels with these star classes. Leave empty for all.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "1",
                                "2",
                                "3",
                                "4",
                                "5"
                            ],
                            "enumTitles": [
                                "1 star",
                                "2 stars",
                                "3 stars",
                                "4 stars",
                                "5 stars"
                            ]
                        }
                    },
                    "maxPrice": {
                        "title": "Maximum price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only keep hotels whose lowest room price is at or below this amount (in the site currency, USD). 0 = no limit.",
                        "default": 0
                    },
                    "includeHotelDetails": {
                        "title": "Include full hotel details",
                        "type": "boolean",
                        "description": "Fetch each hotel's detail page for the full record: description, complete amenities list, address & nearby transit, all policies, comment-tag breakdown, AI review summary and sub-ratings. One extra page fetch per hotel.",
                        "default": true
                    },
                    "includeReviews": {
                        "title": "Include guest reviews",
                        "type": "boolean",
                        "description": "Output the most-relevant guest reviews for each hotel as separate review records — rating, sub-ratings, original text plus an English translation, room, travel type, dates, photos and the hotel's response. Requires hotel details.",
                        "default": true
                    },
                    "maxReviewsPerHotel": {
                        "title": "Max reviews per hotel",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum guest reviews to output for each hotel.",
                        "default": 10
                    },
                    "deduplicateHotels": {
                        "title": "Deduplicate hotels",
                        "type": "boolean",
                        "description": "Skip a hotel if it was already emitted in this run (e.g. when a hotel appears in two searches).",
                        "default": true
                    },
                    "monitorMode": {
                        "title": "Monitor mode (only new hotels)",
                        "type": "boolean",
                        "description": "Remember hotels returned in previous runs (in a named key-value store) and output only hotels that are NEW since the last run. Pair with Apify Schedules to watch a destination for newly listed properties. This does not conflict with the scheduler — the schedule triggers the run; monitor mode dedupes a run's results against earlier runs.",
                        "default": false
                    },
                    "monitorStoreName": {
                        "title": "Monitor store name",
                        "type": "string",
                        "description": "Named key-value store used to remember seen hotels across runs. Use different names to track different destinations independently (lowercase letters, digits and hyphens).",
                        "default": "tripcom-monitor"
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "How many hotel pages to fetch in parallel.",
                        "default": 6
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxies to use. Apify Proxy (datacenter, US) works well for Trip.com; switch to residential if you hit rate limits at high volume.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyCountry": "US"
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
