Expedia Reviews Scraper avatar

Expedia Reviews Scraper

Pricing

from $0.42 / 1,000 review-scrapeds

Go to Apify Store
Expedia Reviews Scraper

Expedia Reviews Scraper

Scrape Expedia guest reviews for any hotel, including hotels given as Hotels.com links. Just add property IDs or hotel links and get the score out of 10, the guest's name, the full written review, trip type and any photos. Sort, filter and search within the text. $0.60 per 1,000 reviews.

Pricing

from $0.42 / 1,000 review-scrapeds

Rating

0.0

(0)

Developer

BonCross API

BonCross API

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

17 hours ago

Last modified

Categories

Share

What is Expedia Reviews Scraper?

Paste a hotel's link, from Expedia or from Hotels.com, and Expedia Reviews Scraper gets you its Expedia guest reviews: the score out of 10, the full written comment, who wrote it, when, what kind of trip it was, and the hotel's reply. You can take as many as the hotel has, at $0.60 per 1,000 reviews on the Free plan ($0.42 on Business) with proxy usage and platform usage included.

What makes it worth choosing:

  • Expedia does the narrowing, and you pay for what you keep. Search within the reviews for a word, keep one kind of traveller out of seven, keep only reviews with photos, or bound the score. You're charged per review returned.
  • Complaints first, if that's what you want. Sort lowest rated first with a maximum rating of 2 and you get just those. On a hotel with 3,141 reviews, that returned all 55 of them after reading 60.
  • The hotel's side of the conversation. Each review has the management reply, who wrote it and when.
  • The scoreboard with it. One extra row per hotel gives the overall score, the number of verified reviews and a score per category.
  • Fast enough for a whole portfolio. 15 hotels at 100 reviews each took 28 seconds, which is about 2,500 reviews a minute.

BonCross Verified means we tested this actor against the live site before release and kept the record:

  • 28 of 28 live checks on its inputs and filters passed on 7 October 2026
  • 12 hotels run the same day: 177 reviews, 12 overviews, none empty
  • Charges checked against the 177 reviews
  • A hotel with no reviews yet still gets its overview row

What can you do with the reviews?

  • Track sentiment for a property or a competitor set over time
  • Find each mention of a topic (breakfast, noise, air conditioning) with the search input
  • Pull the lowest-scored reviews first to triage complaints
  • Build a review corpus for classification or summarisation
  • Watch for new reviews daily and route them to Slack
  • Compare how one hotel is reviewed on different country sites

What review data do you get?

⭐ Score out of 10Score in words ("Excellent", "Good")
📝 Full review textReview title, where the guest gave one
👤 Guest name📅 Date the review was written
🧳 Trip type: who with, business or leisure🖼 Photos attached, and how many
💬 The hotel's replyWho replied, and when
🏨 Property ID and hotel nameMarket the review was read from
📊 Hotel overview: score, review count, category scoresGuest review summary (optional)
🔗 Link to the hotel pageReview ID and timestamp of the run

How to scrape Expedia reviews

No code is involved, and you don't need an Expedia account.

  1. Sign up for Apify, which is free, and open Expedia Reviews Scraper.
  2. Paste hotel page links or property IDs into Hotels. Expedia and Hotels.com links can be mixed.
  3. Say how many reviews you want per hotel (100 unless you change it), and pick a sort or filter if you need one.
  4. Press Start. A hotel's first 25 reviews arrive in about 3 seconds. Download them as Excel, CSV, JSON, XML or HTML.

How much does it cost?

EventFree planStarterScaleBusiness
actor-start, once per run$0.001$0.001$0.001$0.001
hotel-resolved, per hotel the site answered$0.0005$0.0005$0.0005$0.0005
review-scraped, per review returned$0.0006$0.00054$0.00048$0.00042
hotel-summary, per overview or summary row: one per hotel with Include the rating breakdown on (the default), and one more with Include the guest review summary on$0.002$0.0018$0.0016$0.0014

Enterprise plans pay the Business price.

$0.60 per 1,000 reviews on the Free plan, $0.42 on Business. There's nothing on top of the table: proxy usage and platform usage are included.

  • One hotel, 200 reviews, with its rating breakdown row: $0.001 + $0.0005 + $0.002 + 200 × $0.0006 = $0.1235 ($0.0869 on Business).
  • 50 hotels, 100 reviews each, with their rating breakdown rows: $0.001 + 50 × ($0.0005 + $0.002) + 5,000 × $0.0006 = $3.126 ($2.196 on Business).

Apify's Free plan includes $5 of credits a month. That's about 78 hotels at 100 reviews each, or roughly 7,800 reviews, before you pay anything.

The fixed fees are small on purpose, and a run of 20 reviews isn't dominated by them. The rating breakdown row is on by default and costs $0.002 per hotel on the Free plan ($0.0014 on Business). If you only want reviews, switch "Include the rating breakdown" off and you won't pay for it. And if the site never answers for a hotel, you pay nothing for it.

⬇️ Input

Give it hotels. A property ID, an Expedia link and a Hotels.com link for the same hotel all mean the same thing: 12570, or https://www.expedia.com/Santorini-Hotels-Ira-Hotel-Spa.h6116875.Hotel-Information, or https://www.hotels.com/ho3388/. Reviews aren't tied to a stay, and there are no dates to set.

You have two limits. "Maximum reviews per hotel" (default 100) applies to each hotel. "Maximum rows for the whole run" stops the run once that many rows exist in total, overview and summary rows included. 0 means no limit.

The newest reviews for two hotels

{
"hotels": ["12570", "https://www.hotels.com/ho3388/"],
"maxReviewsPerHotel": 100,
"sortBy": "NEWEST_TO_OLDEST"
}

Just the complaints, lowest first, with Expedia's own summary of the hotel

{
"hotels": ["https://www.hotels.com/ho3388/", "375613"],
"maxReviewsPerHotel": 50,
"sortBy": "LOWEST_TO_HIGHEST_RATED",
"maxRating": 6,
"includeSummary": true
}

What business travellers say about breakfast

{
"hotels": ["12570"],
"searchTerm": "breakfast",
"travellerType": "BUSINESS",
"maxReviewsPerHotel": 200,
"maxItems": 2000
}

A daily run that returns only reviews you haven't had

{
"hotels": ["12570", "375613"],
"sortBy": "NEWEST_TO_OLDEST",
"dedupStoreName": "my-hotels-reviews",
"onlyNew": true,
"includeOverview": false
}

Filters. "Minimum score" and "Maximum rating" bound the score out of 10 and work together: set both to read one band, or the maximum alone to pull the complaints. "Traveller type" keeps one kind of trip: business, couples, families, families with young children, groups, solo or with pets. "Reviews with photos only" keeps reviews a guest attached a photo to. "Search within reviews" matches the site's own review search, which is word-based and not a regular expression.

Sort is the site's recommended order by default. The others are newest first, highest rated first and lowest rated first.

The two extra rows. "Include the rating breakdown" (on by default) adds one row per hotel with its overall score and category scores. "Include the guest review summary" (off by default) adds one row per hotel with the site's themed summary of what guests liked. The site doesn't return that summary on every run, and when it doesn't, no row is added and nothing is charged for it.

Market picks which of Expedia's 40 country sites to read. Leave it on Auto and the first pasted link's own site sets it, while a list of bare property IDs uses the US site. Property IDs are the same in each market. What changes is the link in each row and the way the review date is written. The reviews themselves were the same set, in the same order, on the Japanese and French sites measured, each in the language its guest wrote it in.

Label language is English by default. The market's own language rewrites the site's wording on a review (the date as written, postedAtText). The review text is always as the guest wrote it.

For developers

  • maxReviewsPerHotel is the per-hotel limit and maxItems the run-wide one. Reviews arrive ten at a time.
  • travellerType takes BUSINESS, COUPLES, FAMILIES, FAMILIES_WITH_YOUNG_CHILDREN, GROUPS, SOLO or WITH_PETS. sortBy takes RECOMMENDED, NEWEST_TO_OLDEST, HIGHEST_TO_LOWEST_RATED or LOWEST_TO_HIGHEST_RATED. The other filters are minRating, maxRating, withPhotosOnly and searchTerm.
  • includeOverview and includeSummary each bill one hotel-summary per hotel when their row is written.
  • The rating and only-new filters are applied as reviews are read, and a hotel is read on until maxReviewsPerHotel reviews pass them. Once 200 of a hotel's reviews have been read, it stops if fewer than about 1 in 70 has passed. On a hotel with 3,141 reviews, keeping only those rated 2 or lower in the default order stopped after 210 read with 3 kept. Sort to match the filter and you get them all.
  • dedupStoreName names the store that remembers which reviews you've had, and onlyNew returns only reviews no earlier run returned. Pair it with NEWEST_TO_OLDEST.
  • startUrls takes the same links as hotels, pasted or loaded from a file, a Google Sheet or a remote list. The two are combined.
  • maxConcurrency (default 4, up to 8) is how many hotels are fetched at once. delayMs (default 0) pauses after each request, per parallel lane, and values above 2000 are treated as 2000.
  • If the platform moves or restarts a run part-way, it carries on where it stopped, and reviews already in the dataset aren't delivered or billed again. Restarting a 15-hotel run part-way gave the same 1,190 rows in the same order as an uninterrupted run.

⬆️ Output

One row per review. This one is from the Hilton Chicago, read on 7 October 2026:

{
"id": "6ac42d560503191a1ecd2839",
"brand": "expedia",
"market": "us",
"hotelId": 12570,
"rating": 10,
"ratingScale": 10,
"ratingText": "Excellent",
"hotelName": "Hilton Chicago",
"author": "Breonna",
"title": null,
"text": "Reserved this for my mother, father and sister and they absolutely loved the hotel.",
"postedAt": "2026-10-05",
"postedAtText": "Oct 5, 2026",
"tripType": "Traveled with family",
"tripTypes": ["Traveled with family"],
"photos": [],
"photoCount": 0,
"managementResponse": "Thank you for choosing us for your family's visit and for sharing such a kind review. We are delighted that your parents and sister thoroughly enjoyed their time with us, and we truly appreciate the trust you placed in our team. We look forward to welcoming your family back, and hopefully you as well, on a future trip to Chicago.\n\nSincerely,\nHilton Chicago Team",
"managementResponseBy": "Hilton Chicago",
"managementResponseAt": "2026-10-06",
"url": "https://www.expedia.com/en/h12570.Hotel-Information",
"scrapedAt": "2026-10-07T20:26:41.445Z"
}
  • rating is always out of 10 and ratingScale says so. You can average rows without checking which market they came from. ratingText is the site's wording for that score.
  • text is null when a guest left a score and no comment. That's common: 5 of the 10 newest Hilton Chicago reviews in this run were rating-only.
  • tripType is the line the site shows under a review about the trip, as written. tripTypes is the same line split into its parts.
  • postedAt is the review date as YYYY-MM-DD, read in any market's language, with the site's wording in postedAtText. It's the date the review was written. The site doesn't publish the date of the stay.
  • brand is always expedia, including for a hotel you gave as a Hotels.com link.
  • If the site never answers for a hotel, you get a row with an error for it and no charge.

The overview row. With "Include the rating breakdown" on, each hotel also gets one row marked isOverview. It isn't a review: it has no author, no text and no date. A hotel with no reviews yet returns this row alone.

{
"id": "12570-overview",
"brand": "expedia",
"market": "us",
"hotelId": 12570,
"isOverview": true,
"rating": 8.6,
"ratingScale": 10,
"ratingText": "Excellent",
"reviewCount": 3380,
"reviewCountText": "3,380 verified reviews",
"categories": [
{ "name": "Cleanliness", "score": 8.8 },
{ "name": "Amenities", "score": 8.6 },
{ "name": "Service", "score": 8.8 }
],
"url": "https://www.expedia.com/en/h12570.Hotel-Information",
"scrapedAt": "2026-10-07T20:26:41.441Z"
}

The summary row. With "Include the guest review summary" on, a hotel may also get one row marked isSummary. Each group has a heading and points, and each point has the number of reviews behind it. This one is the Lamaro Hotel Barcelona, shortened to two points:

{
"id": "3388-summary",
"brand": "expedia",
"market": "us",
"hotelId": 3388,
"isSummary": true,
"summaryHeader": "Guest review summary",
"summaryGroups": [
{ "heading": "What guests liked",
"points": [
{ "text": "The on-site restaurant offered delicious food, a great view, and friendly service.", "reviewCount": 143 },
{ "text": "The hotel is within walking distance to the beach and offers easy access to the Mediterranean Sea.", "reviewCount": 13 }
] }
],
"url": "https://www.expedia.com/en/h3388.Hotel-Information",
"scrapedAt": "2026-10-07T20:31:49.631Z"
}

Filter on isOverview and isSummary if you want reviews alone.

How many reviews can you get, and how fast?

As many as the hotel has. There's no cap beyond that and the limits you set. Several pages and hotels are fetched at the same time. Measured on Apify on 2 October 2026, on Tokyo hotels:

RunRowsRun time
1 hotel, 25 reviews253 s
4 hotels × 100 reviews, with the overview row40411 to 14 s
2 hotels × 300 reviews, with the overview row60213 s
15 hotels × 100 reviews, with the overview row1,19028 s

That's about 2,500 reviews a minute, and well over 100,000 fit in the default one-hour run limit. A run that has to switch to a fresh connection part-way takes a few seconds longer.

On the sample, each review row had a score and a guest name. Photos are uncommon, because most guests attach none.

Limitations

  • Reviews are read from Expedia only. A Hotels.com link returns the same property's Expedia reviews.
  • Reviews are those shown to an anonymous visitor, each in the language its guest wrote it in. They aren't translated.
  • The review summary row isn't always available. When the site doesn't return it, the hotel has no summary row.
  • The name of whoever replied for the hotel (managementResponseBy) is read in English only. In a market's own language it's empty, while the reply and its date are still returned.
  • One market per run. Property IDs match across markets, and you can read a hotel from whichever one you want.
  • A review title is rare. Expedia lets a guest add one and most don't: 1 in 20 on the property it was measured against. The field is always present and usually null.
  • Photos are uncommon, and photoCount is usually 0.

FAQ

They work, and you can mix them with Expedia links in one list. A hotel has the same property ID on both sites. The reviews are read from Expedia for each hotel, and brand on the row says so.

How do I get only the reviews posted since my last run?

Give "Memory store" a name, turn on "Only new reviews" and sort newest first. Schedule that daily and each run hands you the reviews that appeared since the one before.

How do I pull only the bad reviews without reading thousands?

Set "Maximum rating" and sort lowest rated first. Sorting to match the filter matters: in the default order the same filter on a 3,141-review hotel stopped after 210 reviews read with 3 kept, and lowest-first returned all 55.

Why is the text empty on some reviews?

The guest gave a score and wrote nothing. Expedia publishes those, and you get them with text: null.

Are scores comparable between markets?

All of them are out of 10, and ratingScale records that on each row.

Which language are the reviews in?

Whatever the reviewer wrote, as published. Nothing is translated. The same set of reviews was returned on the Japanese and French sites measured.

Do I need proxies or an account?

Neither one. There's no login, no cookie of yours is used, and proxy usage is part of the price.

The actor reads only pages Expedia and Hotels.com serve to a logged-out visitor, with no account access. Reviews include the name a guest chose to publish, which can be personal data: under GDPR and similar laws you're responsible for how you store and use it, and for the site's own terms. Collecting public reviews is generally lawful in the UK, EU and US.

Monitoring, your own code and AI agents

For review monitoring, an Apify Schedule plus "Only new reviews" does the work, and a webhook or the Slack integration can deliver each new review as it appears. Google Sheets, Make, Zapier and Airbyte connect the same way.

curl -X POST "https://api.apify.com/v2/acts/boncross~expedia-reviews/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"hotels":["12570"],"maxReviewsPerHotel":100}'

Through the Apify MCP server (mcp.apify.com) an agent can call boncross/expedia-reviews itself, pull a hotel's lowest-rated reviews and summarise what guests complain about.

More from BonCross

Your feedback

Missing a review you can see on the hotel's Expedia page, or a date that looks off? Report it on the Issues tab in Apify Console with the hotel's link. We read every report and answer there.