Expedia.com & Hotel.com [$2.5π°] Reviews/Ratings/Sentiment A.
Pricing
from $2.50 / 1,000 results
Expedia.com & Hotel.com [$2.5π°] Reviews/Ratings/Sentiment A.
[Only $2.5π°] Expedia + Hotels.com + Things-To-Do activities at $2.50/1k β only scraper covering all 3 brands. Deeplink auto-resolution, date filter, 10+ regional TLDs, bare property IDs. 25+ fields: sentiment, traveled-with, manager responses, category ratings. JSON or CSV. Pure HTTP.
Pricing
from $2.50 / 1,000 results
Rating
5.0
(7)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
4
Bookmarked
114
Total users
52
Monthly active users
7.8 hours
Issues response
7 hours ago
Last modified
Categories
Share
Expedia Reviews Scraper β Hotels + Activities + Hotels.com, one actor

Scrape every review from Expedia hotels, Expedia Things-To-Do activities (tours, attractions, day trips), and Hotels.com β all in one run, with deeplink resolution, date filtering, and 10+ regional TLDs supported. The only Apify scraper that covers all 3 brands plus activities under a single PPE actor. $2.50 per 1,000 reviews.
Why use this scraper
- π¨ 3 brands in one actor β Expedia hotels, Expedia activities (Things-To-Do), and Hotels.com share the same code path and same input array. No need to run separate scrapers per brand.
- π’ Activities / Things-To-Do support β tours, museum tickets, day trips, transfers, bus tours, classes β anything bookable on Expedia's activities section. Rows are tagged
provider: "expedia-activity"for easy filtering. No other Apify Expedia scraper does activities. - π Deeplink auto-resolution β paste
https://expe.app.link/KjB1EuacRSborhttps://expe.onelink.me/...and the scraper follows the redirect chain to the real hotel page. Useful for ingesting URLs from mobile-app sharing, marketing campaigns, and social media. - π
Date filtering with smart pagination β pass
reviewsFrom: "2025-01-01"and the scraper stops paginating when it reaches older reviews. You only pay for the reviews you want. Perfect for monitoring-mode delta runs. - π 10+ regional TLDs β
.com,.co.uk,.com.br,.de,.fr,.com.sg,.com.au,.es,.it,.nl,.jpβ all resolve via the same scraper. - π Bare property IDs accepted β paste
600217orh600217instead of full URLs. Auto-expanded tohttps://www.expedia.com/Hotel.h{id}.Hotel-Information. - π·οΈ Sentiment + traveled-with + management response on hotel rows β liked/disliked highlights, "Traveled with family / partner / business", and hotel manager replies when present.
Overview
Expedia Group operates several review surfaces: hotels (under expedia.com, expedia.co.uk, expedia.de, β¦), Things-To-Do activities (/things-to-do/{slug}.a{id}.activity-details), and the Hotels.com sister brand. Every Apify Expedia scraper before this one targets just one of these. This actor unifies all three plus four input shortcuts (long URL, short URL, bare ID, deeplink) so a buyer can ingest URLs from any source β CRM exports, mobile-app shares, Excel pastes β without preprocessing.
Every dataset row represents one review. Rows are tagged provider: "expedia" | "expedia-activity" | "hotels" so downstream consumers can split them apart. Hotel rows additionally carry the hotel-level aggregate (overall rating, total reviews, full 5-category breakdown β Cleanliness, Staff & service, Amenities, Property conditions & facilities, Location β Expedia's AI-generated guest-sentiment summary when available, the property's full photo gallery β typically 100-300 image URLs per hotel, and a rich descriptive block β name, star class, address, coordinates, description, categorized amenities, and highlights) when includeCategoryRatings: true.
Supported inputs
| Input type | Example URL | Provider tag | Output |
|---|---|---|---|
| Expedia hotel (long slug) | https://www.expedia.co.uk/Kastoria-Hotels-Hotel-Anastassiou.h6136437.Hotel-Information | expedia | One row per review + hotel aggregate |
| Expedia hotel (short path) | https://www.expedia.com/h17369936.Hotel-Information | expedia | Same |
| Expedia hotel (minimal slug) | https://www.expedia.com/Hotel.h600217.Hotel-Information | expedia | Same |
| Bare property ID | 600217 or h600217 | expedia | Auto-expanded to Hotel.h{id}.Hotel-Information |
| Expedia activity (Things-To-Do) | https://www.expedia.com.sg/things-to-do/singapore-hop-on-hop-off-bus-tour.a203344.activity-details | expedia-activity | One row per review + activity metadata block (price, highlights, features) |
| Hotels.com hotel | https://el.hotels.com/ho434012/hotel-anastassiou-kastoria-ellada/ | hotels | One row per review + hotel aggregate |
Expedia deeplink (expe.app.link) | https://expe.app.link/KjB1EuacRSb | expedia | Auto-resolved to hotel page, then scraped |
Expedia deeplink (expe.onelink.me) | https://expe.onelink.me/hnLd/5dfidl8b | expedia | Same |
| Any mix of the above | array of all 8 types | mixed | Scraper partitions and dispatches each correctly |
| Regional Expedia TLDs | .co.uk, .com.br, .de, .fr, .com.sg, .com.au, .es, .it, .nl, .jp, β¦ | expedia | All work β same code path |
| π Google Maps URL or Place ID | https://www.google.com/maps/place/Hotel+Anastassiou+Kastoria/@40.5,21.2/... or ChIJX_BcZ7C_TBQRyQXrJlw0fJg | google-maps-pending | Recognised. Parses the hotel name from the URL slug, emits a row with the parsed name + a pre-built Expedia hotel-search URL the buyer can use to find the canonical Expedia listing. Full auto-resolution coming in v1.1 β until then, click the search URL, find the matching Expedia hotel, re-run with that URL. |
β οΈ Not supported: Expedia destination/region landing pages (
.../Place.d{id}.Place-To-Visit) have no reviews of their own β they only list nearby hotels and tours. If you pass one, the actor emits a single explanatory row with a hint about the URL types it does support and skips the network fetch entirely. You don't get charged for dead URLs.
Use cases
| Audience | Use case |
|---|---|
| Hotel reputation managers | Daily monitoring of new reviews across owned properties; alert on negative trends |
| Hospitality consultants | Benchmark a hotel against direct competitors in the same city; surface category-rating gaps |
| Tour & activity operators | Track Things-To-Do listings (your own + competitors) for review-rate, rating-band, recurring complaints |
| Market analysts | Geographic + price-tier sentiment analysis across Expedia + Hotels.com inventory |
| Aggregator builders | Power downstream review-aggregation SaaS with comprehensive multi-brand data |
| PE / hospitality due diligence | Sentiment + rating-trend snapshot of a target property before acquisition |
| Academic / consumer-research | Auto-translation patterns, multi-language review trends, traveler-companion demographics |
How it works
- Classify each
startUrls[]entry β hotel / activity / Hotels.com / bare ID / deeplink. Reject non-Expedia-Group hosts. Destination pages emit a single explanatory row. - Resolve deeplinks β for
expe.app.link/expe.onelink.me, follow redirects to the canonical hotel/activity URL before fetching reviews. - For hotel URLs: GraphQL request to Expedia's
ProductReviewsListfor the per-review stream, plus (whenincludeCategoryRatings: true) parallel calls toProductReviewDetailsfor the rating summary,ProductReviewProgressBarfor the full 5-category breakdown,ReviewsSummarisationfor Expedia's AI-generated guest-sentiment bullets, andPageLayoutfor the property photo gallery + descriptive content (name, address, coordinates, star class, description, categorized amenities, highlights β one response feeds bothpropertyImagesand theproperty*fields), and β when opted in βProductLocationfor the nearby/transit/restaurants block (includeLocation)PropertyContentSectionGroupsfor policies & important info (includePolicies), andPropertyOffersRoomsAndRatesfor room inventory + live rates over a chosen date window (includeRooms). Paginate through review pages, merging the aggregate block into every emitted row. - For activity URLs: GraphQL request to Expedia's
ActivityReviewsQuery+ parallelOverviewQueryfor activity metadata (price, highlights, features). Paginate through review pages. - For Hotels.com URLs: Use Hotels.com's own review API (similar GraphQL surface to Expedia).
- Date filter (when
reviewsFromis set): stop paginating as soon as a review older than the cutoff appears. Reviews are sorted newest-first by Expedia. - Emit one flat row per review to the Apify dataset. JSON or CSV export.
Input configuration
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
startUrls | string[] | yes | β | Any mix of hotel URLs (long / short / minimal), activity URLs, Hotels.com URLs, bare IDs, deeplinks |
maxItems | integer | no | 1000 | Hard cap on total review rows. Each row = one paid result event. |
reviewsFrom | string (YYYY-MM-DD) | no | β | Only emit reviews on/after this date. Triggers smart-pagination stop. Leave empty for all reviews. |
includeCategoryRatings | boolean | no | true | Include hotel/activity-level aggregate: overall rating, total reviews, full 5-category breakdown (Cleanliness, Staff & service, Amenities, Property conditions & facilities, Location), AI-generated guest-sentiment summary (reviewSummaryAI), and the property's full photo gallery (propertyImages β typically 100-300 URLs per hotel). Disable if you only need per-review fields β saves one additional-cost event per URL. |
includePropertyImages | boolean | no | true | When true, every gallery image URL is returned in propertyImages and billed per image at $0.0001 each (~$0.02 for a typical 200-image hotel). Set false to skip image extraction and pay nothing for images. Has no effect unless includeCategoryRatings: true. |
includePropertyDetails | boolean | no | true | When true, each row carries rich hotel-level descriptive fields: propertyName, starRating, propertyType, propertyAddress, propertyCoordinates, propertyDescription, propertyLanguages, propertyAmenities (categorized), propertyHighlights. Extracted from the same page-layout response as the photo gallery β no extra per-item charge. Set false to omit them. Has no effect unless includeCategoryRatings: true. |
includeLocation | boolean | no | false | Opt-in. When true, each row carries propertyLocation β nearby landmarks, transit/airports, and restaurants, each with walk/drive times. Fires a separate request per hotel, billed one additional-cost ($0.001) per hotel. Leave off if you don't need location data. |
includePolicies | boolean | no | false | Opt-in. When true, each row carries propertyPolicies β check-in/out times & fees, minimum age, pets, children & extra beds, deposits, payment types, and "you need to know" notes, grouped by section. Fires a separate request per hotel, billed one additional-cost ($0.001) per hotel. |
includeRooms | boolean | no | false | Opt-in. When true, each row carries propertyRooms β room types, bed config, occupancy, inclusions, nightly & total rate, and cancellation terms. Prices are a snapshot for the search window below (stamped as quotedFor). Fires a separate (heavy) request per hotel, billed one additional-cost ($0.001) per hotel. |
roomsCheckIn | string (YYYY-MM-DD) | no | ~30 days out | Check-in date for the room-rate quote. Only used with includeRooms. |
roomsCheckOut | string (YYYY-MM-DD) | no | night after check-in | Check-out date for the room-rate quote. Only used with includeRooms. |
roomsAdults | integer | no | 2 | Adults for the room-rate quote. Only used with includeRooms. |
reviewSort | enum | no | newest | Sort order for the review list. newest and relevant are fully wired via Expedia's GraphQL. highest, lowest, mostHelpful are accepted but currently fall back to newest (see FAQ β v1.1 roadmap below). |
includeReviewPhotos | boolean | no | true | Set false to strip reviewPhotos[] from every emitted row. Useful for CSV exports or compact JSON. |
includeOwnerResponses | boolean | no | true | Set false to strip hotelResponse from every emitted row. Use when you only want guest-side review text. |
maxConcurrency | integer | no | 10 | Parallel fetches. Sweet spot 8-15 via Apify Residential. |
minConcurrency | integer | no | 1 | Floor β auto-scales up. |
maxRequestRetries | integer | no | 100 | Per-URL retry budget on transient failures. |
proxy | object | no | Apify Residential | Auto-prefilled β leave alone unless you need a specific country. |
Example input β mixed run, all 6 input types
{"startUrls": ["https://www.expedia.co.uk/Kastoria-Hotels-Hotel-Anastassiou.h6136437.Hotel-Information","https://www.expedia.com/h17369936.Hotel-Information","https://www.expedia.com.br/Rio-De-Janeiro-Hotels-Premier-Copacabana-Hotel.h53296.Hotel-Information","https://www.expedia.com.sg/things-to-do/singapore-hop-on-hop-off-bus-tour-by-open-top-bus.a203344.activity-details","https://el.hotels.com/ho434012/hotel-anastassiou-kastoria-ellada/","https://expe.app.link/KjB1EuacRSb","600217"],"reviewsFrom": "2025-01-01","includeCategoryRatings": true,"maxItems": 1000,"maxConcurrency": 10,"proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
This yields up to 1,000 review rows since 2025-01-01 across 7 input URLs spanning 3 brands and 5 regional TLDs.
Output schema
Two row shapes β distinguishable by the provider field.
provider: "expedia" or "hotels" (hotel review row)
{"provider": "expedia", // or "hotels" for Hotels.com"url": "https://www.expedia.co.uk/Kastoria-Hotels-Hotel-Anastassiou.h6136437.Hotel-Information","hotelId": "6136437","hotelName": "Hotel Anastassiou","locale": "en_GB",// ββ Per-review fields βββββββββββββββββββββββββββββββββββββββ"reviewId": "6136437|2026-04-12|10|...","reviewText": "The hotel was wonderful and the staff very welcoming...","reviewTitle": "Amazing stay","reviewRating": 10, // 0-10 scale"reviewRatingLabel": "Exceptional", // "Exceptional" / "Wonderful" / "Very good" / "Good" / "Okay" / "Poor""reviewDate": "2026-04-12","stayMonth": "Mar 2026","stayDuration": "Stayed 3 nights in Mar 2026","verified": true,"authorName": "Maria",// ββ Trip metadata βββββββββββββββββββββββββββββββββββββββββββ"tripType": "leisure","traveledWith": "partner", // "family" / "partner" / "business" / "solo" / "friends"// ββ Sentiment highlights ββββββββββββββββββββββββββββββββββββ"sentiments": {"liked": ["Cleanliness", "Staff & service", "Property condition"],"disliked": ["Room amenities"]},// ββ Photos ββββββββββββββββββββββββββββββββββββββββββββββββββ"reviewPhotos": ["https://...jpg", "https://...jpg"],// ββ Management response (when present) ββββββββββββββββββββββ"hotelResponse": {"responseText": "Thank you for staying with us...","respondedOn": "2026-04-15","responderName": "Hotel Manager"},// ββ Hotel aggregate (when includeCategoryRatings: true) βββββ"hotelOverallRating": 8.2,"hotelRatingLabel": "Very good","hotelTotalReviews": 1247,"hotelCategoryRatings": [ // up to 5 categories{ "label": "Cleanliness", "percent": 88 },{ "label": "Staff & service", "percent": 84 },{ "label": "Amenities", "percent": 84 },{ "label": "Property conditions & facilities", "percent": 82 },{ "label": "Location", "percent": 88 }],// ββ Expedia AI guest-sentiment summary (when available) βββββ// Bulleted topics auto-generated by Expedia from many reviews. Each// bullet aggregates several individual reviews β `mentions` tells you// how many. `null` when the property has too few reviews for Expedia// to summarise (typically small / low-volume listings)."reviewSummaryAI": [{"category": "What guests liked","text": "Breakfast was consistently delicious, with hot food served hot and cold items kept cool.","mentions": 7},{"category": "What guests liked","text": "The spa experience was exceptional with beautifully designed rooms and large whirlpool tubs.","mentions": 3}],"reviewSummaryAIDisclaimer": "From real guest reviews summarized by AI.",// ββ Full property photo gallery (when available) ββββββββββββ// Every image Expedia shows in the hotel's gallery, ordered as// Expedia returns them, deduplicated. Typically 100-300 images// per property. URLs are the canonical CDN paths β append your// own `?impolicy=resizecrop&rw={width}&ra=fit` query string if// you want a specific size, or use as-is for the original."propertyImages": ["https://images.trvl-media.com/lodging/10000000/9730000/9721900/9721825/w5977h3997x10y0-0092ce90.jpg","https://images.trvl-media.com/lodging/10000000/9730000/9721900/9721825/92e976cb.jpg","https://images.trvl-media.com/lodging/10000000/9730000/9721900/9721825/8d2cbffe.jpg"// β¦ 217 more],// ββ Property description & amenities (when includePropertyDetails: true) ββ"propertyName": "The Anniversary Inn Logan","starRating": 2.5, // star class, NOT the guest score"propertyType": "BedAndBreakfast", // schema.org type"propertyAddress": {"street": "169 East Center Street","city": "Logan","region": "UT","postalCode": "84321","country": "USA"},"propertyCoordinates": { "latitude": 41.731704, "longitude": -111.830614 },"propertyDescription": "The Anniversary Inn Logan provides free continental breakfast and more.\nRoom features\nAll guestrooms are individually furnishedβ¦","propertyLanguages": ["English"],"propertyAmenities": [ // categorized{ "category": "Parking", "items": ["Free self parking on site"] },{ "category": "Breakfast", "items": ["Continental breakfast included", "Served daily"] },{ "category": "Spa", "items": ["In-room massages"] },{ "category": "Accessibility", "items": ["No elevator", "Wheelchair accessible (may have limitations)"] }// β¦ more categories (Pets, Conveniences, Guest services, Business services, More)],"propertyHighlights": [{ "title": "Highly rated by solo travelers", "description": "This property received multiple high ratings from solo travelers." },{ "title": "Top rated breakfast", "description": "Experience delightful mornings with the top rated breakfast." }],// ββ Location intelligence (only when includeLocation: true) ββ"propertyLocation": {"whatsNearby": [{ "name": "Logan Utah Temple", "distance": "7 min walk" },{ "name": "Utah State University", "distance": "18 min walk" }],"gettingAround": [{ "name": "Pleasant View Station", "distance": "56 min drive" }],"restaurants": [{ "name": "Center Street Grill", "distance": "3 min walk" },{ "name": "Le Nonne", "distance": "5 min walk" }]},// ββ Policies & important info (only when includePolicies: true) ββ"propertyPolicies": [{ "section": "Check-in", "items": ["Check-in start time: 5:00 PM; Check-in end time: midnight", "Minimum check-in age: 21", "Early check-in fee: USD 35.00"] },{ "section": "Check-out", "items": ["Check-out before noon", "Late check-out fee: USD 35.00"] },{ "section": "Pets", "items": ["Pets not allowed"] },{ "section": "Fees", "items": ["Deposit: USD 50.00 per stay"] }// β¦ more sections (Children & extra beds, Payment types, You need to know, β¦)],// ββ Room inventory + rates (only when includeRooms: true) ββ// Prices are a point-in-time snapshot for the `quotedFor` window."propertyRooms": {"quotedFor": { "checkIn": "2026-06-28", "checkOut": "2026-06-29", "adults": 2 },"rooms": [{"name": "Room (Lake Powell)","details": ["Breakfast included", "Parking included", "Sleeps 2", "1 Queen Bed"],"nightlyRate": "$204","totalRate": "$232","currency": "USD","cancellation": "Fully refundable before Sun, Jun 21"}// β¦ one entry per room type]},"scrapedAt": "2026-05-16T10:24:31Z"}
provider: "expedia-activity" (activity review row)
{"provider": "expedia-activity","activityId": "203344","activityUrl": "https://www.expedia.com.sg/things-to-do/singapore-hop-on-hop-off-bus-tour.a203344.activity-details","locale": "en_SG","siteid": "1","currency": "SGD",// ββ Activity aggregate (always included for activities) βββββ"activityName": "Singapore Hop-On Hop-Off Bus Tour by Open-Top Bus","activitySubHeading": "By Big Bus Tours","activityPrice": "S$65","activityOverallRating": "8.4/10","activityRatingLabel": "Very good","activityTotalReviews": 216,"activityHighlights": ["Explore Singapore by open-top bus", "Frequent service every 25-40 min", ...],"activityFeatures": ["Free cancellation", "Printed voucher", "Instant confirmation", ...],// ββ Per-review fields βββββββββββββββββββββββββββββββββββββββ"reviewId": "203344|2026-03-14|...","reviewText": "No plug in to keep phone charged. I was afraid I'd lose my access...","reviewRating": 3, // 0-10 scale"reviewRatingLabel": "Poor","reviewDate": "2026-03-14","activityDate": "Mar 2026", // when the user did the activity"userLocation": "Australia","authorName": "A verified traveller","reviewedOn": "Reviewed on 14 Mar, 2026"}
Hotel rows and activity rows have different field sets β that's intentional. Activities don't have
traveledWith/stayDuration/hotelResponse; hotels don't haveactivityHighlights/activityFeatures. Filter byproviderif you only want one shape.
Pricing
Pay-per-event β no monthly subscription.
| Event | When it fires | Rate |
|---|---|---|
Actor Start | Once per run | $0.008 |
result | Per review row emitted | $0.0025 |
additional-cost (monitoring mode / category ratings) | Per hotel/activity when includeCategoryRatings: true | $0.001 |
property-image | Per gallery image URL when includePropertyImages: true (typically 100-300 per hotel) | $0.0001 |
additional-cost (location) | Per hotel when includeLocation: true β the propertyLocation block | $0.001 |
additional-cost (policies) | Per hotel when includePolicies: true β the propertyPolicies block | $0.001 |
additional-cost (rooms) | Per hotel when includeRooms: true β the propertyRooms block | $0.001 |
Cost examples:
| Run | Charges |
|---|---|
| 1 hotel, 50 reviews, with category ratings (no images) | $0.008 + 50 Γ $0.0025 + 1 Γ $0.001 = $0.134 |
| 1 hotel, 50 reviews, with category ratings + 220 gallery images | $0.134 + 220 Γ $0.0001 = $0.156 |
| 10 hotels Γ 100 reviews avg, with category ratings (no images) | $0.008 + 1000 Γ $0.0025 + 10 Γ $0.001 = $2.52 |
| 10 hotels Γ 100 reviews avg, with category ratings + ~200 images per hotel | $2.52 + 10 Γ 200 Γ $0.0001 = $2.72 |
| 1 activity, 200 reviews, with metadata | $0.008 + 200 Γ $0.0025 + 1 Γ $0.001 = $0.509 |
| Date-filtered (5 hotels, reviewsFrom: last 7 days) β say 30 new reviews total | $0.008 + 30 Γ $0.0025 + 5 Γ $0.001 = $0.088 |
What makes this richer than competing actors
We surveyed all Expedia + Hotels.com review scrapers on Apify Store. Direct comparison:
| Capability | Competitor actors | This actor |
|---|---|---|
| Expedia hotel reviews | β most | β |
| Expedia Things-To-Do activities | β none | β unique β tours, attractions, day trips |
| Hotels.com reviews via the same scraper | β usually separate actor | β same input array, same row shape |
Multi-region TLDs (.co.uk, .de, .com.br, β¦) | partial | β 10+ TLDs validated |
Expedia deeplink resolution (expe.app.link, expe.onelink.me) | β | β |
Bare property ID input (e.g. 600217) | β | β auto-expanded |
| Date filtering with smart pagination stop | β usually fetches everything | β stops early, saves cost |
| Sentiment (liked / disliked) extraction | partial | β structured array |
| Traveled-with normalization | β | β
family / partner / business / solo / friends |
| Management response capture | partial | β text + date + responder name |
| Hotel category ratings (cleanliness / staff / amenities / property conditions / location) | β usually missing or partial (3 of 5) | β
full 5-category breakdown when includeCategoryRatings: true |
| Expedia AI guest-sentiment summary (bulleted topics + mention counts) | β not extracted by other scrapers | β included when Expedia has generated one for the property |
| Full property photo gallery URLs (100-300 per hotel) | β not extracted by other scrapers | β
every gallery image URL, deduplicated, when includeCategoryRatings: true |
| Property description + categorized amenities + address/coords/star-class/highlights | β reviews-only | β
full descriptive block per hotel, no per-item charge, when includePropertyDetails: true |
| Location intelligence (nearby landmarks / transit / restaurants + walk-drive times) | β not extracted | β
structured propertyLocation block, opt-in via includeLocation: true |
| Policies & important info (check-in/out times & fees, min age, pets, deposits) | β not extracted | β
structured propertyPolicies block, opt-in via includePolicies: true |
| Room inventory + live rates (room types, occupancy, nightly/total price, cancellation) | β not extracted | β
structured propertyRooms block with configurable date window, opt-in via includeRooms: true |
| Activity highlights + features (for Things-To-Do) | β | β full arrays |
| Destination-page graceful handling (no dead-URL charges) | β usually 0-row failures | β single explanatory row, no fetch |
FAQ
Can I scrape Expedia hotels AND Hotels.com in the same run?
Yes. Paste both in startUrls. Each row carries a provider field (expedia / hotels) so you can split them apart in your downstream pipeline.
What's a "Things-To-Do" activity, and how is it different from a hotel?
Activities are tours, attractions, day trips, classes, transfers β anything bookable in Expedia's "Things to do" section. URL pattern: /things-to-do/{slug}.a{id}.activity-details. The output row has a different shape (no traveledWith, stayDuration, or hotelResponse; adds activityHighlights, activityFeatures, userLocation, activityDate). Rows are tagged provider: "expedia-activity".
Can I paste a deeplink URL like expe.app.link/KjB1EuacRSb?
Yes. The scraper follows the redirect chain to the canonical hotel/activity URL before fetching reviews. Useful when ingesting URLs from mobile-app shares, marketing campaigns, or social media.
How does date filtering work with pagination?
Pass reviewsFrom: "YYYY-MM-DD". Expedia returns reviews newest-first, so the scraper paginates until it hits a review older than your cutoff, then stops. You only pay for reviews that match. Perfect for daily-delta monitoring workflows.
Why do I get an "explanatory row" instead of reviews on a destination URL?
URLs like .../Place.d12345.Place-To-Visit are destination/region landing pages β they don't have reviews of their own, just lists of nearby hotels and tours. Rather than silently failing or charging you for a dead fetch, the scraper emits a single row with a clear hint about the URL types that ARE supported. No network charge.
Can I just paste hotel IDs without full URLs?
Yes. 600217 and h600217 both auto-expand to https://www.expedia.com/Hotel.h600217.Hotel-Information. Saves time when importing IDs from a CRM or spreadsheet.
Does this work on regional Expedia domains?
Yes β .com, .co.uk, .com.br, .de, .fr, .com.sg, .com.au, .es, .it, .nl, .jp, and others. Same scraper, same row shape. The hotel's locale field on each row tells you which region the data came from.
What if includeCategoryRatings: false?
You'll save one additional-cost event per URL ($0.001 each), but you'll lose all hotel-level fields: hotelOverallRating, hotelTotalReviews, hotelCategoryRatings, reviewSummaryAI, reviewSummaryAIDisclaimer, propertyImages, and the descriptive block (propertyName, starRating, propertyType, propertyAddress, propertyCoordinates, propertyDescription, propertyLanguages, propertyAmenities, propertyHighlights). Set this to false if you only need per-review data and have those aggregates elsewhere.
π What is propertyRooms (includeRooms)?
Opt-in (includeRooms: true, default off). Adds a propertyRooms object with the hotel's room inventory and live rates for a search window: { quotedFor: { checkIn, checkOut, adults }, rooms: [ { name, details[], nightlyRate, totalRate, currency, cancellation } ] }. Each room's details lists bed config / occupancy / inclusions (e.g. "Sleeps 2", "1 Queen Bed", "Breakfast included"). Prices are a point-in-time snapshot β they depend on the search dates, which is why the window is stamped into quotedFor. Control it with roomsCheckIn / roomsCheckOut (YYYY-MM-DD) and roomsAdults; leave them empty to default to ~30 days out, 1 night, 2 adults. Fires a separate (~309KB) request per hotel and is billed one additional-cost event ($0.001) per hotel. (If a hotel is sold out for the chosen dates, propertyRooms is null β pick different dates.)
π What is propertyPolicies (includePolicies)?
Opt-in (includePolicies: true, default off). Adds a propertyPolicies array to every hotel row β the property's policies & important info grouped by section: Check-in (start/end times, early-check-in fee, minimum age), Check-out (time, late fee), Pets, Children & extra beds, Fees / deposits, accepted payment types, and the "You need to know" notes (ID requirements, incidental holds, safety features). Each section is { section, items[] }. Fires a separate request per hotel and is billed one additional-cost event ($0.001) per hotel.
π What is propertyLocation (includeLocation)?
When you opt in with includeLocation: true, every hotel row gains a structured propertyLocation object with three lists β whatsNearby (landmarks/attractions), gettingAround (transit stations & airports), and restaurants β each entry a { name, distance } pair where distance is a human-readable walk/drive time (e.g. { "name": "Utah State University", "distance": "18 min walk" }). It's opt-in (default off) because it fires a separate request per hotel and is billed one additional-cost event ($0.001) per hotel. Like all hotel-level fields, the same block is repeated on every review row for that hotel.
π What property descriptive data do I get (includePropertyDetails)?
When includePropertyDetails: true (default), every hotel row carries: propertyName (canonical name), starRating (the property's star class, e.g. 2.5 β distinct from the guest review score), propertyType (e.g. "Hotel", "BedAndBreakfast", "Resort"), propertyAddress (street/city/region/postalCode/country), propertyCoordinates (lat/lng), propertyDescription (the "About this property" narrative), propertyLanguages (languages spoken), propertyAmenities (categorized β Parking, Breakfast, Spa, Accessibility, β¦), and propertyHighlights (the marketing highlight cards). All of this is extracted from the same page-layout response as the photo gallery, so it adds no extra charge beyond the additional-cost event that includeCategoryRatings already triggers. Set includePropertyDetails: false to omit these fields.
π What is propertyImages and how big does it get?
Every URL in the hotel's photo gallery on Expedia (e.g. main exterior shots, all room photos, lobby, restaurant, pool, etc.) β typically 100-300 image URLs per property. The URLs are returned as the canonical CDN paths (images.trvl-media.com/lodging/...jpg) with the ?impolicy=... resize query stripped, so you can append your own size parameter (?impolicy=resizecrop&rw=1200&ra=fit for 1200px-wide, etc.) or use the original. Images are deduplicated and ordered as Expedia returns them. Returns null when extraction fails (rare β usually a transient GraphQL error). Requires includeCategoryRatings: true AND includePropertyImages: true (both default true).
π How is propertyImages billed?
Each URL is its own billable event: property-image at $0.0001 per image. A typical 200-image hotel adds ~$0.02 to your run cost; a 500-image resort adds ~$0.05. If you don't want to pay for gallery images, set includePropertyImages: false in your input β the PageLayout fetch is skipped entirely and you pay $0 for images.
π What is reviewSummaryAI and where does it come from?
Expedia generates an AI-written bulleted summary of guest sentiment for each hotel that has enough review volume β surfaced in their iOS app's "See all reviews" screen. Each bullet aggregates several individual reviews into a topic (e.g. "Breakfast was consistently delicious, with hot food served hot and cold items kept cool.") and carries a mentions count showing how many guest reviews fed into it. The category heading ("What guests liked" etc.) is preserved alongside the text. Returns null when Expedia hasn't generated one β usually low-volume / niche properties. The accompanying reviewSummaryAIDisclaimer field carries Expedia's own attribution string ("From real guest reviews summarized by AI.") so downstream consumers can credit the source correctly. Only fetched when includeCategoryRatings: true.
π Can I paste a Google Maps URL or Place ID?
Yes β paste it directly into startUrls. The actor recognises Maps URLs (/maps/place/Hotel+Name/..., maps.app.goo.gl/...) and bare Place IDs (ChIJX_BcZ7C_TBQRyQXrJlw0fJg). It parses the hotel name from the URL slug and emits a row tagged provider: "google-maps-pending" containing the parsed name, a pre-built Expedia hotel-search URL, and a hint with the next step. Full auto-resolution (Maps URL β Expedia canonical hotel URL β reviews fetched in same run) is queued for v1.1. The blockers are (a) capturing Expedia's hotel-search GraphQL persisted-query from a live browser session, (b) building a match-quality scorer for ambiguous results. Until then, the explanatory row gives you a deterministic shortcut to find the right Expedia URL manually.
π What does reviewSort do, and why don't all 5 options work yet?
reviewSort controls the order of reviews fetched. Five values accepted:
newest(default) β fully wired, applies Expedia'sMOST_RECENT_SORT_URN. Required forreviewsFromdate-filter mode (the smart-stop pagination relies on newest-first ordering).relevantβ fully wired, omits thesortByparameter so Expedia returns its default "most relevant" order.highest/lowest/mostHelpfulβ accepted as input but currently fall back tonewestwith a clear log message. Expedia's GraphQL uses opaqueurn:expediagroup:taxonomies:core:#{uuid}sort values per option. We have theMOST_RECENTURN; the other 3 need to be captured from a live Expedia browser session, which is queued for v1.1.
π What do includeReviewPhotos and includeOwnerResponses do?
Toggles that strip the matching fields from emitted rows (reviewPhotos[] and hotelResponse). Useful for CSV exports (flatter row shape), or when you want compact rows. Note: these are post-fetch filters β they don't reduce proxy bandwidth cost. GraphQL-level skipping (slimming the request body) is queued for v1.1.
Support
- Bugs / feature requests β open an issue on this actor
- Custom exports / tailored field selection β email muhamed.didovic@gmail.com
- API access (no Apify fee, raw usage) β same address for direct API setup
Additional services
- Custom scraping work for sites not in the catalog
- Bulk historical dataset purchase (skip the scraping step entirely)
- Webhook delivery to your S3 / GCS / DB pipeline
- Daily / hourly scheduled monitoring with email or Telegram alerts
Contact: muhamed.didovic@gmail.com
Explore more scrapers
Other travel + reviews actors in the memo23 portfolio:
- Trustpilot Reviews β flagship reviews scraper (264 u30d, 4.9β )
- Glassdoor Reviews β employer reviews
- Indeed Reviews β employer + interview reviews
- Clutch β B2B services reviews
- TripAdvisor β competing travel reviews
- Booking.com β see profile for related travel scrapers
β οΈ Disclaimer
This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Expedia Group, Inc., Expedia.com, Hotels.com, or any related entity. All trademarks mentioned are the property of their respective owners.
The scraper accesses only publicly visible review content rendered by Expedia.com, Hotels.com, and their regional TLD variants. No login bypass, no API-key forgery, no CAPTCHA solving, no private/authenticated endpoints. The actor honours robots.txt and rate-limits via concurrency cap (default 10) to avoid burdening Expedia Group's infrastructure.
Users are responsible for:
- Complying with Expedia.com's and Hotels.com's Terms of Service in your target jurisdiction
- Following GDPR (EU/UK), CCPA (US), PIPL (China), LGPD (Brazil), and any other applicable data-protection law when storing, processing, or republishing review + guest-name data
- Not contacting reviewers listed in scraped data for unsolicited commercial outreach
- Not republishing scraped reviews in a way that competes commercially with Expedia or Hotels.com
- Respecting reviewer privacy β many reviewers use first-name-only handles, do not attempt to de-anonymize
We do not store scraped data β the Actor returns rows directly to your Apify dataset for your authorized use.
SEO Keywords
expedia scraper, expedia reviews scraper, expedia.com scraper, scrape expedia, expedia api, hotels.com scraper, hotels.com reviews, expedia things-to-do scraper, expedia activities scraper, hotel reviews api, tour reviews scraper, attraction reviews scraper, travel reviews data, hospitality reviews api, hotel reputation monitoring, sentiment analysis hotels, expedia deeplink resolver, expedia.co.uk scraper, expedia.de scraper, expedia.com.br scraper, multi-region expedia, expedia JSON export, expedia CSV export, travel data mining, hotel category ratings scraper, expedia AI review summary, AI generated hotel sentiment summary, guest sentiment AI bullets, expedia 5-category breakdown, cleanliness staff amenities property conditions location ratings, expedia property images scraper, expedia hotel photo gallery, expedia gallery URLs, hotel image scraping, scrape hotel photos expedia, expedia hotel amenities scraper, expedia property description scraper, hotel amenities data, scrape hotel address coordinates, hotel metadata scraper, expedia star rating scraper, expedia nearby places scraper, hotel location intelligence, points of interest near hotel, hotel walk drive times, expedia what's nearby data, expedia hotel policies scraper, check-in check-out times scraper, hotel pet policy data, hotel deposit fees scraper, expedia important information, expedia room rates scraper, hotel price scraper, room inventory scraper, expedia nightly rate tracking, hotel rate intelligence, room type occupancy scraper, expedia cancellation policy scraper