Monitor Trip.com Hotel Availability and Rates Across Cities
Track Trip.com hotel availability and rate changes across 20+ cities with scheduled scraping. Detect sellouts, rate spikes, and inventory shifts automatically.

Thirdwatch's Ctrip / Trip.com Hotel Scraper powers automated hotel availability monitoring across 20+ cities — scheduled snapshots capture nightly rates, inventory presence, discount depth, and review scores at regular intervals. Built for travel operations teams, revenue managers, group booking coordinators, and growth teams at OTAs tracking competitor inventory. Pay-per-result pricing scales with your monitoring footprint.
Why monitor Trip.com hotel availability
Trip.com processes over 590 million room night bookings annually, making its availability data a meaningful signal for hotel demand across Asia-Pacific, Europe, and the Middle East. For operations teams, a hotel disappearing from Trip.com search results means it has sold out or been delisted — both are actionable events.
The operations job-to-be-done is clear. A corporate travel desk managing group bookings for a distributed team needs early warning when preferred hotels in event cities approach sellout. A revenue management team at a hotel chain wants to track competitor rate movements on Trip.com every 12 hours to adjust their own pricing. An OTA growth team benchmarking their inventory against Trip.com needs to know which properties Trip.com lists that they do not. A tour operator packaging multi-city itineraries needs availability confirmation across five cities before confirming a group reservation.
All reduce to the same pipeline: scheduled scraper runs across a city-date matrix, snapshot comparison to detect changes (new listings, delisted properties, rate movements), and alerting on thresholds. The scraper returns hotel_id, price, original_price, and hotel_name per record — enough to detect sellouts, rate spikes, and discount pattern changes between snapshots.
How does this compare to the alternatives?
Three approaches to hotel availability monitoring:
| Approach | Reliability | Setup time | Maintenance |
|---|---|---|---|
| DIY Python script with Playwright | Low — Trip.com's anti-bot defences break scripts within days, requiring constant patching | 3-5 weeks including retry logic and session handling | Weekly, sometimes daily |
| Enterprise travel data feed (OAG, ForwardKeys) | High — purpose-built data products | Weeks to months (contract negotiation + integration) | Vendor-managed but expensive |
| Thirdwatch Trip.com Scraper + Apify scheduler | High — handles anti-bot defences and returns stable JSON | Under 2 hours including alerting setup | Thirdwatch maintains extraction layer |
Enterprise travel data feeds provide broader coverage but cost tens of thousands per year and include data you may not need. For Trip.com-specific monitoring at a defined city scope, the Thirdwatch actor with Apify's built-in scheduler delivers the same signal at a fraction of the commitment.
How to monitor hotel availability across cities in 5 steps
Step 1: How do I configure the monitoring scope?
Define the cities, date windows, and check frequency. Most operations teams monitor 5-15 cities with rolling 30-60 day date windows:
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
MONITORING_CONFIG = {
"cities": [
{"city": "Tokyo", "cityId": 228},
{"city": "Singapore", "cityId": 73},
{"city": "Bangkok"},
{"city": "Dubai"},
{"city": "London"},
],
"date_windows": [
("2026-07-10", "2026-07-12"),
("2026-07-17", "2026-07-19"),
("2026-08-01", "2026-08-03"),
],
"guests": 2,
"rooms": 1,
"maxResults": 50,
}Step 2: How do I run a monitoring snapshot?
Execute one actor run per city-date combination and tag each record with a snapshot timestamp:
import datetime
def run_snapshot(config):
snapshot_ts = datetime.datetime.utcnow().isoformat()
all_records = []
for city_cfg in config["cities"]:
for check_in, check_out in config["date_windows"]:
run_input = {
"city": city_cfg["city"],
"checkIn": check_in,
"checkOut": check_out,
"guests": config["guests"],
"rooms": config["rooms"],
"maxResults": config["maxResults"],
}
if "cityId" in city_cfg:
run_input["cityId"] = city_cfg["cityId"]
run = client.actor("thirdwatch/ctrip-hotels-scraper").call(
run_input=run_input
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
for item in items:
item["snapshot_ts"] = snapshot_ts
all_records.append(item)
return all_recordsStep 3: How do I detect availability changes between snapshots?
Compare the current snapshot against the previous one. Hotels missing from the new snapshot have sold out; new hotels have become available; price changes above a threshold are flagged:
def compare_snapshots(previous, current, price_threshold=0.15):
prev_map = {h["hotel_id"]: h for h in previous if h.get("hotel_id")}
curr_map = {h["hotel_id"]: h for h in current if h.get("hotel_id")}
sold_out = []
new_listings = []
price_changes = []
for hid, hotel in prev_map.items():
if hid not in curr_map:
sold_out.append(hotel)
else:
old_price = hotel.get("price", 0)
new_price = curr_map[hid].get("price", 0)
if old_price and new_price:
pct_change = (new_price - old_price) / old_price
if abs(pct_change) > price_threshold:
price_changes.append({
"hotel_name": hotel["hotel_name"],
"city": hotel.get("city"),
"old_price": old_price,
"new_price": new_price,
"pct_change": round(pct_change * 100, 1),
})
for hid in curr_map:
if hid not in prev_map:
new_listings.append(curr_map[hid])
return {"sold_out": sold_out, "new_listings": new_listings, "price_changes": price_changes}Step 4: How do I set up alerts for critical changes?
Route change events to Slack, email, or your operations dashboard. Here is a Slack webhook example:
import requests
SLACK_WEBHOOK = os.environ.get("SLACK_WEBHOOK_URL", "")
def send_alerts(changes):
messages = []
for h in changes["sold_out"]:
messages.append(
f"SOLD OUT: {h['hotel_name']} in {h.get('city', 'unknown')} "
f"(was {h.get('currency', 'USD')} {h.get('price', '?')})"
)
for pc in changes["price_changes"]:
direction = "UP" if pc["pct_change"] > 0 else "DOWN"
messages.append(
f"RATE {direction}: {pc['hotel_name']} in {pc['city']} "
f"${pc['old_price']} -> ${pc['new_price']} ({pc['pct_change']:+.1f}%)"
)
if messages and SLACK_WEBHOOK:
text = "*Trip.com Availability Alert*\n" + "\n".join(messages)
requests.post(SLACK_WEBHOOK, json={"text": text})Step 5: How do I schedule this to run automatically?
Use Apify's scheduling feature to trigger the monitoring pipeline on a cron schedule. For most operations teams, every 12 hours captures meaningful rate movements:
# To schedule via the Apify API, create a schedule that triggers
# your monitoring actor or task at the desired interval.
# Example: cron "0 */12 * * *" runs every 12 hours.
# Alternatively, wrap the snapshot + comparison + alerting logic
# in a standalone Apify actor that calls the hotel scraper as a sub-task.
# See https://docs.apify.com/platform/schedules for setup details.For the monitoring script itself, store the previous snapshot in Apify's key-value store so each scheduled run can compare against the last one without external state management.
Sample output
Each snapshot record includes the fields needed for availability tracking — hotel identity, pricing, and quality signals:
[
{
"hotel_name": "Marina Bay Sands",
"hotel_id": 434076,
"url": "https://www.trip.com/hotels/detail/?hotelId=434076",
"price": 520,
"currency": "USD",
"original_price": 650,
"rating": 4.7,
"rating_label": "Excellent",
"reviews_count": 12400,
"stars": 5,
"address": "10 Bayfront Avenue",
"city": "Singapore",
"district": "Marina Bay",
"latitude": 1.2834,
"longitude": 103.8607,
"image_url": "https://ak-d.tripcdn.com/images/hotel/434076/exterior.jpg",
"amenities": ["Pool", "Spa", "Casino", "Restaurant", "Bar", "Free WiFi"],
"room_types": ["Deluxe Room", "Premier Room", "Club Room"],
"tags": ["Member Price", "Free Cancellation"],
"distance_from_center": "1.0 km from city center",
"checkin_date": "2026-07-10",
"checkout_date": "2026-07-12",
"search_city": "Singapore",
"source": "api"
},
{
"hotel_name": "YOTEL Singapore Orchard Road",
"hotel_id": 8924103,
"url": "https://www.trip.com/hotels/detail/?hotelId=8924103",
"price": 115,
"currency": "USD",
"original_price": null,
"rating": 4.3,
"rating_label": "Very Good",
"reviews_count": 2850,
"stars": 4,
"address": "366 Orchard Road",
"city": "Singapore",
"district": "Orchard",
"latitude": 1.3048,
"longitude": 103.8328,
"image_url": "https://ak-d.tripcdn.com/images/hotel/8924103/exterior.jpg",
"amenities": ["Pool", "Gym", "Restaurant", "Free WiFi"],
"room_types": ["Premium Queen", "First Class King"],
"tags": [],
"distance_from_center": "0.5 km from city center",
"checkin_date": "2026-07-10",
"checkout_date": "2026-07-12",
"search_city": "Singapore",
"source": "api"
}
]The hotel_id field is stable across snapshots, making it the join key for change detection. original_price versus price reveals whether a discount appeared or disappeared between snapshots.
Common pitfalls
Confusing delisted with sold out. A hotel missing from the current snapshot could be sold out for those dates, temporarily delisted by the property, or simply pushed below the maxResults cutoff by Trip.com's ranking algorithm. To distinguish true sellouts from ranking shifts, increase maxResults to 100 and confirm the hotel is genuinely absent, not just lower-ranked.
Ignoring date window drift. Monitoring "July 10-12 availability" only works if you run the snapshot before those dates. Once check-in passes, the search returns nothing. For rolling monitoring, programmatically advance your date windows each week so you always track 30-60 days ahead.
Alert fatigue from small rate changes. Trip.com hotel rates fluctuate 5-10% daily based on demand signals. Setting your price_threshold below 15% will generate noise. Start at 15-20% and tighten only after you understand your baseline volatility.
Timezone misalignment. Schedule snapshots in UTC and record timestamps in UTC. Trip.com serves rates based on the property's local pricing rules, and comparing snapshots taken at different times of day can introduce false positives — some properties adjust rates for same-day bookings.
The Thirdwatch actor handles Trip.com's session management and anti-bot defences so your monitoring pipeline focuses on comparison logic and alerting.
Related use cases
- Scrape Trip.com hotel prices for travel research — one-time or periodic price extraction for academic and consulting work.
- Build a hotel price comparison database with Ctrip — persistent database architecture for price aggregation.
- Track Trip.com hotel ratings for hospitality intel — monitor guest sentiment alongside availability.
- The complete guide to scraping travel and hospitality data
- Monitor BookMyShow ticket availability
- All Thirdwatch use-case guides
Frequently asked questions
How often should I monitor Trip.com hotel availability?
Every 12 hours is the practical sweet spot for most operations teams. Hotel rates on Trip.com shift based on demand signals, cancellations, and revenue management algorithms, but meaningful availability changes (sellouts, rate jumps above 15%) happen on a half-day cadence. Daily monitoring catches 90% of actionable changes; twice-daily catches rate spikes before they propagate to other OTAs.
Can I set up alerts for hotel sellouts or price spikes?
Yes. Store each snapshot with a timestamp, then compare the latest two snapshots per hotel_id. If a hotel_id present in the previous snapshot is missing from the current one, it likely sold out. If price increased more than 20% between snapshots, flag it as a rate spike. Pipe these events into Slack, email, or PagerDuty using Apify's webhook integrations.
Related
100 free credits, no credit card.
About 30 real searches. Add the MCP to Claude or Cursor in two minutes.