Expedia & Hotels.com Reviews Scraper - Guest Reviews & Ratings
Pricing
from $0.99 / 1,000 reviews
Expedia & Hotels.com Reviews Scraper - Guest Reviews & Ratings
Scrape guest reviews from Expedia, Hotels.com, Orbitz, Travelocity and Vrbo. Paste hotel links or IDs from any of them: review text, rating, stay length, liked and disliked themes, photos, verified status and the hotel's reply. One row per review.
Expedia & Hotels.com Reviews Scraper | Guest Reviews, Ratings & Replies
27 fields per review, from five sites at once: review text, score out of 10, what the guest liked and disliked, stay length, verified status, photos, and the hotel's own reply.

⚡ One link, five brands. A property's reviews are identical on Expedia, Hotels.com, Orbitz, Travelocity and Vrbo, so paste a link from whichever site you use. You never have to say which one it came from.
Reviews only. This actor returns no prices, room rates or availability — for those use the Expedia Hotels Scraper.
Copy to your AI assistant
Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.
clearpath/expedia-hotels-com-reviews-scraper on Apify. Scrapes guest reviews for a hotel from Expedia Group: Expedia, Hotels.com, Orbitz, Travelocity and Vrbo share one review corpus per property, so a link from any of them works and the rows are the same. Call: ApifyClient("TOKEN").actor("clearpath/expedia-hotels-com-reviews-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items for one row per review. A SECOND dataset holds one row per hotel (identity, location, overall score, reviews available vs collected): read run["output"]["hotels"], or open the "summary" dataset in Storage. Inputs: hotels (array, required - hotel page links or numeric hotel IDs, mixed freely; the ID is the number after ".h" in a link), maxReviews (integer, default 100, per hotel, 0 = every review the source serves). No date, rating or language filters: filter the rows yourself. Reviews only - this actor returns no prices, rates or availability. Full actor spec (input schema, dataset fields, README): GET https://api.apify.com/v2/acts/clearpath~expedia-hotels-com-reviews-scraper/builds/default (Bearer TOKEN) returns inputSchema, actorDefinition.storages.datasets, readme. Pricing: pay-per-event, $0.009 per run start plus $1.99 per 1,000 reviews. Get token: https://console.apify.com/account/integrations
Key Features
- Five brands, one actor: Expedia, Hotels.com, Orbitz, Travelocity and Vrbo links all resolve to the same property and the same reviews
- 27 fields per review: text, score out of 10, rating label, liked and disliked themes, author, stay length, verified status, helpful votes, photos and the hotel's reply
- The hotel's side of the story:
managementResponsecarries the reply text, who wrote it and when — present on 36 of 40 reviews in our test sample - Two inputs: hotel links or IDs, and how many reviews per hotel. Nothing else to configure
- Everything or a sample:
maxReviews: 0collects every review the source serves; a small number gives you a quick look first - Honest completion: every hotel gets a summary row saying how many reviews exist, how many were collected and whether the source ran out early
Pricing: Pay Per Event (PPE)
$1.99 per 1,000 reviews, no subscription.
| Event | Price |
|---|---|
| Review scraped | $0.00199 |
Example: 100 reviews costs about $0.20. A 1,000-review sweep of one hotel costs about $2.00.
Apify also charges $0.009 when a run starts, which covers the hotel lookup a run performs before any review is read.
Quick Start
One hotel, first 100 reviews
{"hotels": ["https://www.expedia.com/Paris-Hotels-Grand-Hotel-Leveque.h5951861.Hotel-Information"],"maxReviews": 100}
A Hotels.com, Orbitz, Travelocity or Vrbo link works the same way
Only the .h<id> part of a link is read, so paste whatever your browser gives you:
{"hotels": ["https://www.hotels.com/Hotel.h5951861.Hotel-Information"],"maxReviews": 100}
Several hotels, by ID
The ID is the number after .h in any hotel link. Mix IDs and links freely; duplicates are collapsed.
{"hotels": ["5951861", "9619719", "https://www.orbitz.com/Hotel.h868.Hotel-Information"],"maxReviews": 50}
Every review a hotel has
{"hotels": ["5951861"],"maxReviews": 0}
0 means everything the source will serve. On a 1,527-review property this returned 1,475 rows and reported the shortfall rather than pretending it was complete.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
hotels | array | — | Hotel page links or numeric hotel IDs, mixed freely. Required. |
maxReviews | integer | 100 | Reviews per hotel, not per run. 0 collects every review available. |
Output Data
Two datasets. Reviews go to the default dataset, one row per review. A second dataset named summary holds one row per hotel.
Review row (27 fields)
| Group | Fields |
|---|---|
| The review | id text title highlightedText date dateRaw |
| The score | rating ratingScore ratingScaleMax ratingLabel |
| Themes | liked disliked |
| The guest | author authorLocation traveledWith stayDuration verified verificationLabel |
| Signals | helpfulVotes photos originalLanguage language brandType |
| The hotel's reply | managementResponse (text, author, date, header) |
| Identity | hotelId hotelName hotelUrl |
Hotel row (summary dataset)
hotelId hotelName hotelUrl address city countryCode latitude longitude totalScore reviewsCount reviewsFetched reviewStatus status
reviewsCount is how many reviews the hotel has; reviewsFetched is how many this run delivered. reviewStatus tells you why they differ: limit_reached means your maxReviews stopped it, exhausted means the source ran out, partial means it stopped early and the row says so.
Complete Output Example
One real review, every field as returned:
{"id": "6a7fa1f71832b92a621e4d54","title": null,"text": "No place to put luggage .","highlightedText": null,"originalLanguage": null,"language": null,"brandType": null,"rating": "8/10 Good","ratingScore": 8,"ratingScaleMax": 10,"ratingLabel": "Good","author": "Saverio","authorLocation": null,"date": "Aug 14, 2026","dateRaw": "Aug 14, 2026","stayDuration": "Stayed 3 nights in Aug 2026","traveledWith": [],"verified": true,"verificationLabel": "Verified review","liked": ["Cleanliness","staff & service","amenities","property conditions & facilities"],"disliked": [],"managementResponse": {"text": "Thank you for your feedback. We understand that you found the luggage space limited. We do offer larger room categories with more space, which may be more suitable for guests travelling with larger luggage. We hope to welcome you again soon!","author": "Nicolas","respondedOn": "Sep 17, 2026","header": "Response from Nicolas on Sep 17, 2026"},"helpfulVotes": 0,"photos": [],"hotelId": "5951861","hotelName": "Grand Hotel Leveque","hotelUrl": "https://www.expedia.com/Hotel.h5951861.Hotel-Information"}
And the hotel it belongs to, from the summary dataset:
{"hotelId": "5951861","hotelName": "Grand Hotel Leveque","hotelUrl": "https://www.expedia.com/Hotel.h5951861.Hotel-Information","address": "29 rue Cler, Paris, Paris, 75007","city": "Paris","countryCode": "FRA","latitude": 48.857416,"longitude": 2.306071,"reviewsCount": 1002,"totalScore": 9.4,"reviewStatus": "limit_reached","reviewsFetched": 40}
What You Can Do With It
- Reputation tracking: watch what guests praise and complain about, hotel by hotel, over time
- Competitive sets: pull the same review depth for a block of hotels in one district and compare the
likedanddislikedthemes - Response auditing:
managementResponseshows which complaints a hotel answers and how fast - Training and sentiment data: review text with a numeric score and the guest's own theme labels already attached
FAQ
Does a Hotels.com link work? Yes. A property's reviews are identical on Expedia, Hotels.com, Orbitz, Travelocity and Vrbo — we measured it across all four domains and every Expedia Group site ID, and the response was the same every time. Paste whichever link you have.
Where do I find the hotel ID?
It is the number after .h in a hotel link. In .../Paris-Hotels-Grand-Hotel-Leveque.h5951861.Hotel-Information the ID is 5951861.
How many reviews can I get for one hotel?
Set maxReviews: 0 for everything the source serves. It does occasionally stop short of the published count — on a 1,527-review property it returned 1,475 — and the summary row reports that as partial instead of hiding it.
Does it include the hotel's reply?
Yes, in managementResponse, with the responder's name and date. Most reviewed hotels reply to a large share of reviews; 36 of the 40 reviews in our sample carried one.
Can I filter by date, rating or language?
Not in the input. Every review comes back with date, ratingScore and originalLanguage, so filter the rows after export.
Does it return prices or availability? No. This actor is reviews only. For rates, room types and availability use the Expedia Hotels Scraper.
What happens if a hotel ID is wrong?
The run continues. That hotel gets a summary row with status: "unresolved" and the other hotels still deliver their reviews.
Related Actors
| Actor | What it does |
|---|---|
| Expedia Hotels Scraper | Prices, rooms and live rates, property details, search by city |
| Booking.com Reviews Scraper | Guest reviews, scores and replies from Booking.com |
| Tripadvisor Reviews Scraper | Reviews for hotels, restaurants and attractions |
| Yelp Reviews Scraper | Business reviews in every language, with owner replies |
Support
- 📧 Email: max@mapa.slmail.me
- 📖 Found a bug?: Use the issues tab and describe your issue
- 🔧 Feature Requests: Contact via email or issues tab
Legal Compliance
This scraper extracts publicly available hotel review data. Users must comply with the source's terms of service and applicable data protection regulations for their intended use.