Trip.com Scraper - Hotels, Trains & Attractions avatar

Trip.com Scraper - Hotels, Trains & Attractions

Pricing

from $2.20 / 1,000 results

Go to Apify Store
Trip.com Scraper - Hotels, Trains & Attractions

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

kane liu

Maintained by Community

Actor stats

1

Bookmarked

28

Total users

11

Monthly active users

2 days ago

Last modified

Security

Limited permissions

Share

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 enter destination or regionId.
  • Trains: choose service: "trains" and enter origin and destination.
  • Attractions: choose service: "attractions" and enter a destination. Rows may represent places or bookable offers, identified by listingType.
  • Optional details: enrichDetails is off by default. It adds available hotel contact details or attraction offers to the existing row. Attraction offers are nested in offers, 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

FieldDescriptionExample
serviceSelected travel servicehotels
listingIdListing identifier when available1234567
listingTypeKind of listinghotels
nameListing or offer nameExample Riverside Hotel
urlListing or route linkhttps://www.trip.com/hotels/detail/?hotelId=1234567
priceNumeric price when shown89
priceDisplayPrice text from the listingUS$89
priceKindMeaning of the pricenightly
currencyCurrency reported for the rowUSD
ratingSource rating, when present8.6
reviewCountReview count, omitted when unknown2140
domainRegional Trip.com hostwww.trip.com
scrapedAtCollection timestamp2026-10-24T02:00:00Z

Hotel rows: listingType: "hotels"

FieldDescriptionExample
phonesPublic hotel numbers, when available[{"value":"+1 555 0100"}]
emailsPublic hotel email addresses[{"value":"name@example.com"}]
addressStructured hotel address{"locality":"Bangkok"}
geoCoordinates, when available{"lat":13.75,"lng":100.5}
orgHotel organization identity{"name":"Example Riverside Hotel"}

Train rows: listingType: "trains"

FieldDescriptionExample
carrierTrain operatorExample Rail
departStationDeparture stationTokyo
arriveStationArrival stationKyoto
departTimePublished departure time09:00
arriveTimePublished arrival time11:15
durationPublished journey duration2h 15m

Attraction rows: listingType: "attractions"

FieldDescriptionExample
imageListing image URLhttps://example.com/attraction.jpg
sourceStatusStatus shown by Trip.com, not a booking guaranteeOpen
offersUp to eight offers when detail enrichment succeeds[]
offerCountNumber of detail offers found before the eight-offer limit3

Attraction offer rows: listingType: "attractions_offer"

These can appear directly among attraction search results. They count as rows like other listings.

FieldDescriptionExample
listingTypeDistinguishes an offer from a placeattractions_offer
nameTour, ticket or other offer nameExample city tour
priceKindPrice categoryticket

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

  1. Open Trip.com Scraper in Apify Console.
  2. Fill destination, for example Bangkok, and choose service.
  3. Set maxResults to 3 for a small first run.
  4. Click Start and wait for completion.
  5. 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

FieldWhat to enterDefault
destinationCity or region nameEmpty; example uses Bangkok
regionIdNumeric Trip.com city ID, mainly for hotelsEmpty
servicehotels, trains or attractionshotels
maxResultsMaximum rows for this input, from 1 to 50070; form prefill 3
checkinHotel arrival date, YYYY-MM-DDToday plus 21 days
checkoutHotel departure date, YYYY-MM-DDTwo nights after check-in
adultsAdult travelers, 1–102
childrenChildren, 0–100
roomsHotel rooms, 1–101
originDeparture city for a train routeEmpty
departureDateOptional train date; not a guaranteed fare-date filterEmpty
domainRegional Trip.com hostwww.trip.com
currencyCurrency code, such as GBPUSD
localeLanguage setting, such as en_GBen_US
sortHotel sorting preferenceRECOMMENDED
includeSponsoredKeep sponsored listings when identifiedfalse
enrichDetailsAdd available hotel contacts or attraction offersfalse
proxyCountrySearch country override; normally leave emptyFrom domain
returnDateReserved; leave empty for supported servicesEmpty
tripTypeReserved; keep the default for supported servicesoneway

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
}
  • maxItems and limit are aliases for maxResults. city maps to destination, cityId to regionId, and checkIn / checkOut to 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_REPORT record in the default key-value store records filled, corrected and ignored fields, warnings and validation errors. exampleRun identifies 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_SUMMARY for failures, or RUN_SUMMARY for 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 planStart eventPrice per rowPrice 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.

  • maxResults limits 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 (maxTotalChargeUsd in 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-sync and run-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 after SUCCEEDED, 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 ApifyClient
client = 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

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.

More travel, hotel and flight scrapers from the same publisher:

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.