Trip.com Scraper - Hotels, Trains & Attractions
Pricing
from $2.20 / 1,000 results
Trip.com Scraper - Hotels, Trains & Attractions
Extract Trip.com hotels, train offers and attractions across regional sites, including the UK, Japan and Singapore. Get prices, ratings and listing links. Pay per delivered row plus a start fee.
Pricing
from $2.20 / 1,000 results
Rating
0.0
(0)
Developer
kane liu
Maintained by CommunityActor stats
1
Bookmarked
28
Total users
11
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Trip.com Scraper
Extract hotels, train offers and attractions from Trip.com regional sites as structured rows you can export.
- Listing names, prices, ratings and Trip.com links.
- Hotel searches by destination or city ID, with dates and party size.
- Train routes and attraction listings, with optional hotel and attraction details.
- Regional domains, currencies and language settings.
- Free-plan pricing of $3.00 per 1,000 rows, plus a small start fee.
What does Trip.com Scraper do?
Trip.com Scraper collects public travel listings from trip.com. Use the rows for price comparisons, destination research or scheduled checks. Each run searches one destination or region for one selected service; it does not accept a list of destinations.
- Hotels: choose
service: "hotels"and enterdestinationorregionId. - Trains: choose
service: "trains"and enteroriginanddestination. - Attractions: choose
service: "attractions"and enter a destination. Rows may represent places or bookable offers, identified bylistingType. - Optional details:
enrichDetailsis off by default. It adds available hotel contact details or attraction offers to the existing row. Attraction offers are nested inoffers, not delivered as additional rows by this option.
Flights, cars and packages are unavailable. Selecting them fails input validation.
What data can you extract from Trip.com?
Fields shared by listing rows
| Field | Description | Example |
|---|---|---|
service | Selected travel service | hotels |
listingId | Listing identifier when available | 1234567 |
listingType | Kind of listing | hotels |
name | Listing or offer name | Example Riverside Hotel |
url | Listing or route link | https://www.trip.com/hotels/detail/?hotelId=1234567 |
price | Numeric price when shown | 89 |
priceDisplay | Price text from the listing | US$89 |
priceKind | Meaning of the price | nightly |
currency | Currency reported for the row | USD |
rating | Source rating, when present | 8.6 |
reviewCount | Review count, omitted when unknown | 2140 |
domain | Regional Trip.com host | www.trip.com |
scrapedAt | Collection timestamp | 2026-10-24T02:00:00Z |
Hotel rows: listingType: "hotels"
| Field | Description | Example |
|---|---|---|
phones | Public hotel numbers, when available | [{"value":"+1 555 0100"}] |
emails | Public hotel email addresses | [{"value":"name@example.com"}] |
address | Structured hotel address | {"locality":"Bangkok"} |
geo | Coordinates, when available | {"lat":13.75,"lng":100.5} |
org | Hotel organization identity | {"name":"Example Riverside Hotel"} |
Train rows: listingType: "trains"
| Field | Description | Example |
|---|---|---|
carrier | Train operator | Example Rail |
departStation | Departure station | Tokyo |
arriveStation | Arrival station | Kyoto |
departTime | Published departure time | 09:00 |
arriveTime | Published arrival time | 11:15 |
duration | Published journey duration | 2h 15m |
Attraction rows: listingType: "attractions"
| Field | Description | Example |
|---|---|---|
image | Listing image URL | https://example.com/attraction.jpg |
sourceStatus | Status shown by Trip.com, not a booking guarantee | Open |
offers | Up to eight offers when detail enrichment succeeds | [] |
offerCount | Number of detail offers found before the eight-offer limit | 3 |
Attraction offer rows: listingType: "attractions_offer"
These can appear directly among attraction search results. They count as rows like other listings.
| Field | Description | Example |
|---|---|---|
listingType | Distinguishes an offer from a place | attractions_offer |
name | Tour, ticket or other offer name | Example city tour |
priceKind | Price category | ticket |
Fields vary by service and source availability. Contact details are not guaranteed. Ratings retain the source scale; do not assume every service uses the same scale.
How to scrape Trip.com
- Open Trip.com Scraper in Apify Console.
- Fill
destination, for exampleBangkok, and chooseservice. - Set
maxResultsto3for a small first run. - Click Start and wait for completion.
- Open the dataset and download your rows or read them through the API.
An empty JSON input starts the form's Bangkok hotel example, capped at 3 rows. It is a normal billed run, not a free preview. Filling destination or regionId selects the destination search automatically; service still chooses hotels, trains or attractions and defaults to hotels.
Hotels
Enter a city name or a numeric Trip.com regionId; Bangkok is 359. If both are supplied, keep them consistent. Without stay dates, the Actor selects check-in 21 days from today and a two-night stay. Explicit checkin and checkout use YYYY-MM-DD; past check-in dates are rejected.
Trains
Provide both origin and destination, such as Tokyo to Kyoto. Results depend on Trip.com publishing that route. departureDate is accepted, but it does not reliably filter the published route offers to that date. Confirm dates and fares on Trip.com before booking.
Attractions
Enter a destination such as Singapore. The results can mix attractions and offers such as tours, tickets or travel products. Enable enrichDetails if you also need available offers attached to attraction rows.
What to fill in
| Field | What to enter | Default |
|---|---|---|
destination | City or region name | Empty; example uses Bangkok |
regionId | Numeric Trip.com city ID, mainly for hotels | Empty |
service | hotels, trains or attractions | hotels |
maxResults | Maximum rows for this input, from 1 to 500 | 70; form prefill 3 |
checkin | Hotel arrival date, YYYY-MM-DD | Today plus 21 days |
checkout | Hotel departure date, YYYY-MM-DD | Two nights after check-in |
adults | Adult travelers, 1–10 | 2 |
children | Children, 0–10 | 0 |
rooms | Hotel rooms, 1–10 | 1 |
origin | Departure city for a train route | Empty |
departureDate | Optional train date; not a guaranteed fare-date filter | Empty |
domain | Regional Trip.com host | www.trip.com |
currency | Currency code, such as GBP | USD |
locale | Language setting, such as en_GB | en_US |
sort | Hotel sorting preference | RECOMMENDED |
includeSponsored | Keep sponsored listings when identified | false |
enrichDetails | Add available hotel contacts or attraction offers | false |
proxyCountry | Search country override; normally leave empty | From domain |
returnDate | Reserved; leave empty for supported services | Empty |
tripType | Reserved; keep the default for supported services | oneway |
Hotel example
{"service": "hotels","destination": "Bangkok","regionId": "359","maxResults": 3}
Train example
{"service": "trains","origin": "Tokyo","destination": "Kyoto","maxResults": 3}
Attraction example
{"service": "attractions","destination": "Singapore","enrichDetails": true,"maxResults": 3}
maxItemsandlimitare aliases formaxResults.citymaps todestination,cityIdtoregionId, andcheckIn/checkOutto the stay-date fields.- Close field-name misspellings can be corrected. Other unknown fields are ignored with a note, not rejected.
- Fatal validation errors stop before rows are charged and begin with
INVALID_INPUT:. A date error names the field and correction; an unavailable service error lists supported services. Some malformed optional values are ignored or normalized instead of failing. - The
INPUT_REPORTrecord in the default key-value store records filled, corrected and ignored fields, warnings and validation errors.exampleRunidentifies an example run. - Empty stay dates move forward with the current date. This is not an automatic search across multiple stay windows.
Output example
Illustrative hotel row, not a current price quote:
{"source": "trip.com","service": "hotels","listingType": "hotels","listingId": "1234567","name": "Example Riverside Hotel","domain": "www.trip.com","destination": "Bangkok","url": "https://www.trip.com/hotels/detail/?cityId=359&hotelId=1234567","price": 89,"priceDisplay": "US$89","priceKind": "nightly","currency": "USD","rating": 8.6,"reviewCount": 2140,"sponsored": false,"scrapedAt": "2026-10-24T02:00:00Z"}
Export the dataset as JSON, CSV, Excel, XML, RSS or an HTML table. JSON preserves nested contact and offer fields.
Why use this Trip.com scraper?
- Pay per delivered row. Row charges apply to rows written to the dataset, not unsuccessful searches. The start fee still applies.
- Keep partial results. Available partial rows can be delivered when collection stops or reaches its time limit. Rows already in the dataset remain there; a manual abort does not guarantee delivery of rows not yet written.
- Understand failures. Check the status message and
ERROR_SUMMARYfor failures, orRUN_SUMMARYfor completed searches, empty results and capacity limits. - Keep missing data missing. Unavailable prices and contacts remain empty, null or absent rather than being invented.
- Compare markets. Set the domain, currency and locale explicitly for repeatable comparisons.
- No proxy setup. You do not need to set up proxies.
How much does it cost to scrape Trip.com?
The Actor uses pay-per-event pricing. Platform usage is included in these prices.
| Apify plan | Start event | Price per row | Price per 1,000 rows |
|---|---|---|---|
| Free | $0.005 | $0.003 | $3.00 |
| Starter | $0.005 | $0.003 | $3.00 |
| Scale | $0.005 | $0.0026 | $2.60 |
| Business | $0.005 | $0.0022 | $2.20 |
| Platinum | $0.005 | $0.0020 | $2.00 |
| Diamond | $0.005 | $0.0016 | $1.60 |
The start event is memory-scaled: one event per GB, with a minimum of one event. At the default 512 MB, the start charge is $0.005.
maxResultslimits rows for the one destination or region in this run. The default is 70 and the maximum is 500. All delivered listing types share the limit.- Free Apify plan users are limited to 200 rows per run and 10 runs of this Actor.
- The whole run stops at your Maximum cost per run setting (
maxTotalChargeUsdin the API); set it in run options, not the input JSON.
Example: one Bangkok search delivering 3 rows at 512 MB on the Free plan costs $0.005 + 3 × $0.003 = $0.014. Fewer delivered rows mean fewer row charges. A zero-row run can still incur the start charge.
What happens when the run timeout is too short
If the Actor expects collection to outlast the remaining run time and automatic resumption is accepted, it pauses instead of failing immediately. Its status message is "Queued on the collection backend; this run will resume automatically when results are ready (about Ns)." The run temporarily shows as ABORTED.
When results are ready, the same run resumes automatically, writes to the same dataset and can finish as SUCCEEDED. Already delivered rows are skipped so they are not delivered or charged twice. When continuing a partially delivered run, the delivery message is "Resumed: delivering N rows." No manual restart is needed for this pause.
- Automatic pauses are limited to at most 3 per run. Keep the default timeout of 3600 seconds to reduce interruptions.
- Not every abort is an automatic pause. Read the status message before deciding whether to retry.
- Synchronous API endpoints (
run-syncandrun-sync-get-dataset-items) wait at most 300 seconds and may return an empty dataset while the run is paused. Start longer searches asynchronously, then read the dataset afterSUCCEEDED, or use a succeeded-event webhook.
Use with AI agents and the API
Apify MCP server
Add the Actor to a remote MCP client such as Claude, ChatGPT, Cursor or VS Code:
https://mcp.apify.com?tools=lentic_clockss/trip-com-scraper
Sign in with Apify through OAuth, or send Authorization: Bearer <YOUR_APIFY_TOKEN>. The tool starts a run and returns run and dataset IDs; read rows with get-dataset-items.
Clients without remote MCP support can use npx @apify/actors-mcp-server --tools lentic_clockss/trip-com-scraper with APIFY_TOKEN set.
Example prompt: "Find 3 Bangkok hotels with Trip.com Scraper. Return names, prices, ratings and listing links."
Apify API
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("lentic_clockss/trip-com-scraper").call(run_input={"destination": "Bangkok", "maxResults": 3})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('lentic_clockss/trip-com-scraper').call({destination: 'Bangkok', maxResults: 3});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
For asynchronous HTTP calls, use POST https://api.apify.com/v2/acts/lentic_clockss~trip-com-scraper/runs with input JSON and an Authorization: Bearer token header. Read results with GET https://api.apify.com/v2/datasets/<datasetId>/items?format=json after completion.
Integrations
Use the Actor's Integrations tab for Google Sheets, Make, Zapier, n8n, Slack, Airtable or your own webhook. Use Apify Schedules for regular runs.
FAQ
Is it legal to scrape Trip.com?
This unofficial Actor collects public data and is not affiliated with Trip.com. You are responsible for complying with the site's terms and applicable data-protection law. Processing personal data requires a lawful basis; public availability does not remove that responsibility.
Why did my run end as ABORTED?
A temporary automatic pause can show as ABORTED; the queued status message explains it. A manually aborted run is different. Check the message and the timeout section before starting another run.
How many results can I get?
Request 1–500 rows for one search. The default is 70, while the form example uses 3. Free-plan and spending limits may reduce delivery, and the source may contain fewer matching rows.
Why are some fields empty?
Trip.com does not show every price, rating or contact field for every listing. Detail enrichment is optional and may not return additional data. A missing reviewCount is omitted, not replaced with zero.
Which regional domains can I use?
Configured hosts include www.trip.com, us.trip.com, uk.trip.com, ph.trip.com, sg.trip.com, jp.trip.com, kr.trip.com, hk.trip.com, tw.trip.com, my.trip.com, th.trip.com, id.trip.com, in.trip.com, au.trip.com, de.trip.com, fr.trip.com, es.trip.com, it.trip.com, nl.trip.com, ca.trip.com, mx.trip.com, br.trip.com and ae.trip.com. Coverage varies by service. Set currency and locale yourself; choosing a domain does not replace their input defaults.
Does this scrape the mainland Ctrip site?
No. The documented targets are Trip.com regional hosts, not ctrip.com.
Do I need a Trip.com login or official API key?
No Trip.com login or official Trip.com API key is required. You need an Apify account to run the Actor and an Apify token for API access.
Can I collect flights, car rentals or packages?
No. Those services are unavailable and fail validation. Use hotels, trains or attractions instead.
Limitations
- One service and one destination per run; use separate runs for multiple destinations or regional comparisons.
- Train results require a published route, and requested departure dates do not guarantee date-specific fares.
- Attractions may include travel products rather than only physical places.
- Detail enrichment can take longer and may leave contact or offer fields empty.
- Prices and availability can change; displayed listings are not confirmed bookings or final checkout totals.
- No guaranteed row count, complete market coverage or delivery of unwritten rows after a manual abort.
Related scrapers
More travel, hotel and flight scrapers from the same publisher:
- Traveloka Scraper
- Expedia Scraper
- Skyscanner Scraper
- Agoda Scraper — Hotels, Flights, Packages & More
- Despegar Scraper
- TripAdvisor Scraper — Hotels, Restaurants & More
- Airbnb Listings Scraper
- Booking.com Hotels Scraper
Browse all of our scrapers at apify.com/lentic_clockss.
Support
Report problems or request a field through the Issues tab of this Actor's page. Include the run ID and the input you used.