Expedia Scraper [$2💰] | Reviews | Hotels.com
Pricing
from $1.60 / 1,000 results
Expedia Scraper [$2💰] | Reviews | Hotels.com
Extract Expedia & Hotels.com guest reviews, room rates, and hotel search results for reputation monitoring, competitive intelligence, and market research. No Expedia API key needed.
Pricing
from $1.60 / 1,000 results
Rating
0.0
(0)
Developer
Ahmed Jasarevic
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Expedia Scraper [Only $2💸] | Hotel Reviews | Price Monitoring | Hotels.com
Extract Expedia and Hotels.com hotel guest reviews, room rates, and search results for reputation monitoring, competitive intelligence, and hospitality market research — no API key required. Scrape Expedia hotel reviews with ratings, sentiment, management responses, and photos at scale via GraphQL.
Main Use Cases
- Hotel reputation monitoring — Track guest sentiment and rating trends for your own or competitor properties over time
- Competitive intelligence — Benchmark review scores, pricing, and amenity positioning against competing hotels
- Hotel price monitoring — Schedule nightly rate and availability tracking across room types and date ranges
- Market research — Analyze traveler types, languages, stay durations, and what guests praise or complain about
- Sentiment analysis datasets — Build structured review corpora to train or feed ML/NLP models
- Travel industry research — Study booking patterns, review volume, and pricing across whole destinations or regions
Extract Hotel Reviews Without Official API Access
Expedia and Hotels.com do not offer a public API for guest reviews, room rates, or search listings. The Expedia Rapid API is partner-gated and built for booking flows, not data access. This actor fills that gap by talking directly to the same GraphQL API the Expedia Group websites use — no browser automation, no API key, no payment for scraping infrastructure.
This actor only accesses publicly available pages — it does not bypass login walls, solve CAPTCHAs, or access private inventory.
How It Works
The actor calls Expedia Group's internal GraphQL API — the same data later their web and mobile apps use — to extract structured JSON. It automatically handles:
- TLS fingerprint impersonation and session cookie management to mitigate Akamai bot protections
- Automatic rotation of persisted GraphQL query hashes when Expedia redeploys their frontend
- 429-aware throttling — honors the server's Retry-After header and rotates sessions automatically
- Configurable parallelism for high-concurrency bulk extraction across many properties
- Residential proxy support with Apify's built-in proxy pool
Build Business Databases Without Manual Collection
Use the actor's three core modes to build structured travel datasets programmatically:
- Review scraping — Pass Expedia or Hotels.com hotel URLs (or bare property IDs), get structured review data with ratings, text, traveler types, stay dates, photos, and management responses
- Hotel search — Search by city or region with check-in/out dates; return hotel listings with pricing, star/guest ratings, amenities, coordinates, and filter options
- Room rates — Fetch room types, nightly rates, rate plans, meal plans, cancellation policies, and availability for specific date windows
- Things To Do — Scrape reviews for Expedia activities, tours, and attractions
- Hotel info only — Set
skipReviewsto emit one summary row per property (plus room rates) with no review rows — ideal for overnight rate-monitoring runs
Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
startUrls | array | No* | — | Expedia/Hotels.com hotel URLs, bare property IDs, activity URLs, or deeplinks |
searchLocations | array | No* | — | City/region search configs with optional per-location check-in/out dates |
checkIn | string | No | — | Default check-in date for search locations (YYYY-MM-DD) |
checkOut | string | No | — | Default check-out date for search locations (YYYY-MM-DD) |
searchSort | string | No | RECOMMENDED | RECOMMENDED, PRICE_LOW_TO_HIGH, PRICE_HIGH_TO_LOW, GUEST_RATING, STAR_RATING_HIGH_TO_LOW |
searchAmenities | array | No | [] | Filter by pool, gym, hot_tub, spa, parking, wifi, etc. |
minStars | integer | No | 0 | Minimum star rating (1-5, 0=any) |
minRating | number | No | 0 | Minimum guest rating out of 10 |
maxResults | integer | No | 50 | Max hotel results per search location |
maxItems | integer | No | 1000 | Max review rows per URL (not a run total) |
reviewsFrom | string | No | — | Only emit reviews on/after this date (YYYY-MM-DD) |
sortBy | string | No | newest | newest, highest, lowest, mostHelpful |
includeReviewPhotos | boolean | No | true | Strip reviewPhotos[] when false (for compact CSV exports) |
includeOwnerResponses | boolean | No | true | Strip hotelResponse (management replies) when false |
includeRoomRates | boolean | No | false | Fetch room types, pricing, and availability via GraphQL |
includeHotelInfo | boolean | No | false | Fetch hotel name/rating via property-info GraphQL op (flaky, off by default) |
includePropertyDetails | boolean | No | false | Fetch descriptive block, address, coordinates, amenities, photo gallery |
includeCategoryRatings | boolean | No | false | Fetch 5-category ratings (requires includePropertyDetails) |
includeRatingDistribution | boolean | No | false | Fetch verified rating distribution (requires includePropertyDetails) |
includePropertyImages | boolean | No | true | Property photo gallery (with details mode) |
maxPropertyImages | integer | No | 200 | Max gallery photos per property |
skipReviews | boolean | No | false | Emit one hotel-summary row instead of reviews (for rate/price runs) |
roomsCheckIn | string | No | today | Check-in for room availability queries |
roomsCheckOut | string | No | tomorrow | Check-out for room availability queries |
roomsAdults | integer | No | 2 | Adult count for room availability queries |
roomsRegion | string | No | — | ISO country code for quoted-for country (US, DE, SG, etc.) |
roomsLanguage | string | No | — | en_US-style locale override for room queries |
requestDelayMs | integer | No | 2500 | Pause between GraphQL review pages (lower to 1000-1500 on dedicated residential IPs) |
maxConcurrency | integer | No | 2 | Parallel properties scraped at once (keep 1-2 on shared proxies) |
maxRequestRetries | integer | No | 20 | Retry budget per property |
proxyConfiguration | object | No | Residential | Residential proxies strongly recommended — datacenter IPs are rate-limited by Expedia Group |
debug | boolean | No | false | Store fallback HTML in KV store for troubleshooting |
*Either startUrls or searchLocations is required.
Output
The actor emits flat, structured JSON rows tagged by rowType. Fields vary by mode:
Review row (rowType: "review")
provider, rowType, inputUrl, url, hotelId, hotelName, reviewId, reviewTitle, reviewText, reviewRating, reviewDate, reviewLanguage, authorName, tripType, traveledWith, stayDuration, sentiments (liked/disliked), reviewPhotos, hotelResponse (management reply), hotelOverallRating, hotelTotalReviews, and optional enrichment fields: hotelCategoryRatings, ratingDistribution, propertyName, starRating, propertyType, propertyAddress, propertyCoordinates, propertyDescription, propertyAmenities, propertyHighlights, propertyImages, scrapedAt.
Search result row (rowType: "searchResult")
hotelId, name, starRating, guestRating, reviewCount, nightlyPrice, totalPrice, currency, freeCancellation, propertyUrl, city, neighborhood, latitude, longitude, amenities, imageUrl, locationSearched, checkIn, checkOut.
Room rate row (rowType: "roomRate")
roomId, roomType, ratePlan, pricePerNight, totalPrice, currency, cancellationPolicy, freeCancellation, details, mealPlans, cancellationOptions, quotedFor, amenities, beds, maxOccupancy.
Activity review row (rowType: "activityReview")
provider, activityId, activityName, reviewId, reviewText, reviewRating, reviewLanguage, authorName, submissionDate, locale, currency, overallRating, totalReviews, activityHighlights, activityFeatures, activityPrice, activityUrl.
Hotel info row (rowType: "hotel", with skipReviews: true)
Single summary row per property with hotelId, hotelName, url, hotelOverallRating, hotelTotalReviews, plus all enabled enrichment fields.
Example Input
Scrape hotel reviews by URL
{"startUrls": [{ "url": "https://www.expedia.co.uk/London-Hotels.h196459.Hotel-Information" },{ "url": "https://el.hotels.com/ho434012/hotel-anastassiou-kastoria-ellada/" },"600217"],"maxItems": 500,"sortBy": "newest","reviewsFrom": "2024-01-01"}
Search hotels by city + track rates
{"searchLocations": [{ "location": "Miami, Florida", "checkIn": "2026-10-01", "checkOut": "2026-10-05" },{ "location": "Barcelona, Spain", "checkIn": "2026-10-01", "checkOut": "2026-10-05" }],"searchSort": "PRICE_LOW_TO_HIGH","maxResults": 30,"minStars": 3,"excludeVacationRentals": true}
Example Output
{"provider": "expedia","rowType": "review","hotelId": "196459","hotelName": "The Grand Hotel London","reviewId": "abc123","reviewTitle": "Excellent stay","reviewText": "The hotel was clean and the staff were friendly...","reviewRating": 9.0,"reviewDate": "2025-06-15","authorName": "John D.","tripType": "Solo travel","traveledWith": "Family","stayDuration": "3 nights","sentiments": { "liked": ["clean room", "great breakfast"], "disliked": ["noisy street"] },"reviewPhotos": ["https://example.com/photo1.jpg"],"hotelResponse": { "responseText": "Thank you!", "respondedOn": "2025-06-16", "responderName": "Manager" },"hotelOverallRating": 8.5,"hotelTotalReviews": 1234,"scrapedAt": "2025-07-01T12:00:00Z"}
Integrations & Automation
This actor runs on the Apify platform, giving you:
- REST API — trigger runs programmatically from any language
- Webhooks — get notified when runs complete
- Zapier / Make — connect runs to your existing automation stack
- Google Sheets, BigQuery, Snowflake — push results to your data stack
- Scheduling — run on a daily, weekly, or hourly cadence
Recommended schedule for recurring use: For reputation/review monitoring, run weekly to catch new reviews and rating shifts. For price/rate intelligence or parity tracking, run daily — hotel rates change frequently. Recurring runs build your time-series dataset and become more valuable over time.
Related Actors
- Expedia.com & Hotels.com Reviews [$2.5] — companion actor covering all three Expedia Group brands
- Expedia Hotel Reviews Scraper — cross-brand (7 brands) review extraction with AI-ready markdown
- Tripadvisor Reviews — guest reviews from TripAdvisor
- Google Maps Reviews Scraper — reviews from Google Maps listings
- Trustpilot Reviews — business reviews from Trustpilot
FAQ
Why use this actor instead of the official Expedia API?
Expedia does not offer a public reviews or data API. The Expedia Rapid API (EPS Rapid) is partner-gated — you must apply, be approved, and sign a contract — and it's built for booking flows, not for reading guest reviews or shopping competitor rates. Reviews are explicitly outside its scope. This actor provides self-serve access to the same data the Expedia website serves, without the application process.
What are alternatives to this actor / to scraping Expedia reviews?
If you need reviews from other platforms, consider actors for TripAdvisor reviews, Google Maps reviews, Booking.com reviews, or Trustpilot reviews. For Expedia specifically, the closest Apify alternatives are the other Expedia Group scrapers (see Related Actors above). Off-Apify, third-party data APIs (StayAPI, Outscraper) offer Expedia review endpoints at monthly subscription cost.
How is this different from scraping Expedia's HTML pages?
This actor uses Expedia's GraphQL API directly instead of parsing HTML. That means: structured JSON output, no CSS selector maintenance, access to fields not always rendered on the page, and stability across frontend redesigns. It also handles anti-bot protections and hash rotation automatically.
Does Expedia's bot protection block this?
The actor impersonates a real browser's TLS fingerprint and manages session cookies, which mitigates Expedia's Akamai bot protection. It also rotates residential proxy IPs when rate-limited. However, residential proxies are strongly recommended — datacenter IPs are rate-limited by Expedia Group.
Can I scrape reviews for my competitor's hotels?
Yes. Any publicly listed Expedia or Hotels.com property can be scraped — there's no ownership restriction. This is useful for competitive benchmarking and market research.
Can I filter reviews by date to build incremental datasets?
Yes. Set reviewsFrom (e.g., "2025-01-01") to only emit reviews on/after that date. The actor stops paginating once it reaches older reviews, saving compute time on incremental runs.
Can this scrape Things To Do activities and tours?
Yes. Pass any Expedia /things-to-do/...a{id}.activity-details URL in startUrls and the actor scrapes its reviews, pricing, highlights, and features.
Does this extract hotel room rates and pricing?
Yes. Set includeRoomRates: true to fetch room types, rate plans, nightly and total prices, cancellation policies, meal plans, and availability for the specified dates. Combine with skipReviews: true for fast price-only runs.
Is this available via the Apify API or MCP server?
Yes. Run it through the Apify REST API or via the Apify MCP server, so AI assistants (Claude, GPT, LangChain) can pull Expedia reviews on demand.
SEO Keywords
expedia scraper, expedia reviews scraper, hotels.com scraper, hotels.com reviews, scrape expedia reviews, expedia hotel reviews, hotel review scraping, expedia data extraction, hotels.com data, hotel price monitoring, hotel rate tracking, hotel competitive intelligence, hotel reputation management, hotel sentiment analysis, hospitality market research, guest review data, expedia graphql, expedia api alternative, hotels.com api alternative, scrape hotel reviews, travel data scraping, hotel review dataset, price parity monitoring, expedia uk, expedia de, expedia au
For AI Agents & LLM Apps
What it returns: Structured JSON rows of Expedia/Hotels.com hotel guest reviews (ratings, text, sentiments, traveler metadata, photos, management responses), hotel search results (pricing, amenities, coordinates), and room rate data (types, rates, availability, cancellation policies).
Minimal working input:
{"startUrls": [{ "url": "https://www.expedia.com/London-Hotels.h196459.Hotel-Information" }],"maxItems": 100}
Variant inputs:
- Hotel search mode:
{"searchLocations": ["Miami, Florida"],"checkIn": "2026-10-01","checkOut": "2026-10-05","maxResults": 20}
- Price-only / hotel-info mode:
{"startUrls": [{ "url": "https://www.expedia.com/Hotel.h600217.Hotel-Information" }],"skipReviews": true,"includeRoomRates": true}
Output fields: provider, rowType, inputUrl, url, hotelId, hotelName, reviewId, reviewTitle, reviewText, reviewRating, reviewDate, reviewLanguage, authorName, tripType, traveledWith, stayDuration, sentiments, reviewPhotos, hotelResponse, hotelOverallRating, hotelTotalReviews, plus optional hotelCategoryRatings, ratingDistribution, propertyName, starRating, propertyAddress, propertyCoordinates, propertyDescription, propertyAmenities, propertyHighlights, propertyImages, scrapedAt. Search/room-rate/activity modes return their own field sets (see Output section above).
Behaviors an agent should know:
maxItemsis per-URL (not a run total): N URLs ×maxItems= max row count. Set it deliberately to control cost.startUrlsandsearchLocationsare mutually complementary — you can use either or both; at least one is required.skipReviews: trueskips review rows entirely and emits one summary row per property — use it for rate/price intelligence runs.- Enrichment flags (
includePropertyDetails,includeCategoryRatings,includeRatingDistribution) add extra GraphQL calls per property and set off a chain — leave off unless the fields are needed. maxConcurrencyis per-IP rate-limited by Expedia's GraphQL endpoint. Keep at 1-2 unless you have dedicated residential proxy IPs.- Residential proxies are strongly recommended (
"apifyProxyGroups": ["RESIDENTIAL"]).
Billing model: Pay-per-event. Charged on actor start (per GB memory) + per result in the default dataset.
Legal & Compliance Disclaimer
This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Expedia Group, Expedia, or Hotels.com. It accesses only publicly available pages rendered by Expedia Group's own websites — it does not bypass login walls, solve CAPTCHAs, or access private inventory or membership data. Users are responsible for ensuring their use complies with Expedia Group's Terms of Service and applicable data-protection laws, including GDPR and CCPA where EU or California personal data is involved. Review data may include personally identifiable information (reviewer names); do not use it for unsolicited outreach in violation of applicable law (e.g., CAN-SPAM, GDPR).