Expedia Reviews Scraper avatar

Expedia Reviews Scraper

Pricing

Pay per event

Go to Apify Store
Expedia Reviews Scraper

Expedia Reviews Scraper

Export public Expedia hotel reviews with ratings, guest comments, stay details, photos, helpful votes, and management replies. Filter by traveler type, keyword, rating, locale, or sort order.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Export public Expedia hotel reviews as clean JSON, CSV, Excel, XML, or RSS data.

Provide Expedia property URLs or numeric hotel IDs and receive one row per guest review.

The scraper captures the review text, rating, reviewer, stay context, traveler type, liked and disliked themes, photos, helpful votes, management reply, and hotel-level rating context.

It uses Expedia's structured review surface over HTTP, so it does not launch a heavy browser for every page.

What does Expedia Reviews Scraper do?

Expedia Reviews Scraper turns public hotel review pages into analysis-ready records.

Use it to:

  • 🏨 Export reviews from one hotel or a portfolio of Expedia properties.
  • ⭐ Track aggregate ratings and category scores alongside each review.
  • 💬 Collect full guest comments and property-management responses.
  • 🔎 Search reviews for topics such as breakfast, cleanliness, noise, or service.
  • 👥 Focus on couples, solo travelers, business travelers, families, groups, or pet travelers.
  • 📅 Sort recent reviews first for scheduled reputation monitoring.
  • 📊 Send structured rows to dashboards, sentiment models, spreadsheets, and databases.

The Actor reads public reviews only. It does not access reservations, traveler accounts, private inventory, or Expedia Partner Central.

Who is it for?

Hotel groups and operators

Monitor fresh feedback across multiple properties without copying reviews by hand.

Reputation-management agencies

Build recurring client reports from review text, ratings, and management-response coverage.

Hospitality analysts

Compare guest experience signals, category scores, and traveler segments across competitors.

Data and AI teams

Feed typed review records into sentiment analysis, topic classification, retrieval, or alerting workflows.

Travel product teams

Prototype review-search, hotel-comparison, and guest-experience features with exportable public data.

Why use this Expedia review extractor?

  • HTTP-based extraction avoids full browser rendering.
  • 🔁 Pagination supports historical exports as well as small monitoring runs.
  • 🧭 Two input routes accept full Expedia URLs and numeric property IDs.
  • 🛡️ Bounded retries rotate throttled residential sessions instead of silently returning empty data.
  • Fail-closed validation rejects non-Expedia URLs and malformed IDs.
  • 🧹 Deduplication uses Expedia review IDs.
  • 🎯 Server-side filters support keyword, traveler type, and Expedia sort order.
  • 📦 Flat fields work well in CSV, Google Sheets, BI tools, and databases.

What Expedia review data can I extract?

FieldDescription
propertyIdExpedia numeric property ID
propertyNameName derived from a standard Expedia URL slug
propertyUrlCanonical input or generated Expedia property URL
aggregateRatingHotel's aggregate guest score out of 10
totalReviewsExpedia aggregate review count
cleanlinessRatingCleanliness category score
staffServiceRatingStaff and service category score
amenitiesRatingAmenities category score
propertyConditionRatingProperty condition and facilities score
reviewIdExpedia review identifier
ratingNumeric review score out of 10
ratingLabelExpedia label such as Excellent or Good
titleReview title when present
textFull public review body
localeReview locale reported by Expedia
reviewDatePublic review date
helpfulVotesHelpful-vote count when exposed
likedExpedia's positive review themes
dislikedExpedia's negative review themes
reviewerNamePublic reviewer attribution
travelerTypePublic traveler segment when exposed
stayDetailsPublic stay context, such as month and nights
verifiedStayWhether Expedia marks the review verified
photoUrlsPublic review photo URLs
managementReplyTextProperty-management response
scrapedAtUTC extraction timestamp

How to scrape Expedia hotel reviews

  1. Open the Actor input page.
  2. Paste one or more Expedia hotel URLs in Expedia property URLs.
  3. Alternatively, add numeric IDs in Numeric Expedia property IDs.
  4. Set a small Maximum reviews value for your first run.
  5. Choose the review order and optional traveler, keyword, or rating filters.
  6. Click Start.
  7. Open the dataset to preview or export the review rows.
  8. Save the task and add a schedule if you need ongoing monitoring.

A working first input is prefilled, so you can test the main workflow without finding a property first.

Input parameters

Expedia property URLs

Use public URLs containing an h followed by the numeric property ID.

https://www.expedia.com/Bangkok-Hotels-Admiral-Suites.h911663.Hotel-Information

Non-Expedia URLs are rejected rather than treated as equivalent hotel pages.

Numeric Expedia property IDs

Pass IDs such as 911663 when another system already stores Expedia identifiers.

Maximum reviews

maxReviews is a global cap across all supplied properties.

The allowed range is 1 to 5,000.

Sort order

Choose most relevant, most recent, highest rated, or lowest rated.

Traveler type

Choose all travelers, couples, solo travelers, business travelers, families, families with small children, groups, or travelers with pets.

Keyword

Enter a public review search term such as breakfast or service.

Rating range

Use minRating and maxRating on Expedia's 10-point scale.

Unparseable ratings never pass an active rating boundary.

Locale

Use Expedia locale format such as en_US, en_GB, or de_DE.

Input example

{
"listingUrls": [
"https://www.expedia.com/Bangkok-Hotels-Admiral-Suites.h911663.Hotel-Information"
],
"maxReviews": 10,
"sort": "MOST_RECENT",
"travelerType": "all",
"keyword": "service",
"minRating": 6,
"maxRating": 10,
"locale": "en_US"
}

You can combine listingUrls and propertyIds; duplicate property IDs are processed once.

Output example

{
"propertyId": "911663",
"propertyName": "Admiral Suites",
"propertyType": "Hotel",
"propertyUrl": "https://www.expedia.com/Bangkok-Hotels-Admiral-Suites.h911663.Hotel-Information",
"aggregateRating": 8,
"totalReviews": 631,
"cleanlinessRating": 8.2,
"staffServiceRating": 8.4,
"reviewId": "69cdd48775e1c415f0bc8fec",
"rating": 10,
"ratingLabel": "Excellent",
"title": null,
"text": "Clean hotel staff friendly and welcoming",
"locale": "en_CA",
"reviewDate": "Apr 7, 2026",
"helpfulVotes": 0,
"liked": "Cleanliness, staff & service, amenities, property conditions & facilities",
"disliked": null,
"reviewerName": "eugenio",
"stayDetails": "Stayed 3 nights in Mar 2026",
"verifiedStay": true,
"photoUrls": [],
"managementReplyTitle": "Response from Rachaya P. on Apr 7, 2026",
"managementReplyText": "Dear Valued guest, thank you so much...",
"scrapedAt": "2026-07-20T00:00:00.000Z"
}

Empty optional values are returned as null; photos are always an array.

How much does it cost to scrape Expedia reviews?

The Actor uses pay-per-event pricing.

A run has a small start event and a per-review event, with lower review prices on higher Apify plans.

The current configuration starts at $0.002 per run and $0.0027146 per review on the Bronze tier before tier discounts.

For example, 100 saved reviews on Bronze are approximately $0.27346 at the configured event prices.

Residential proxy traffic and platform resources are handled by the Actor; you do not need a separate Expedia API subscription.

Check the pricing tab before a large run because Store pricing can change over time.

Scheduling a hotel review monitor

Create a saved task with MOST_RECENT sorting and a modest review limit.

Run it daily or weekly with an Apify schedule.

Use reviewId as the idempotency key in your destination system.

A downstream automation can ignore IDs it has already processed and alert only on new reviews.

For portfolio monitoring, place several Expedia URLs in one task or create one task per client/property.

Tips for reliable results

  • Start with 5–10 reviews while validating a property ID.
  • Keep the default residential proxy unless you have tested an alternative.
  • Prefer MOST_RECENT for monitoring and MOST_RELEVANT for discovery.
  • Use one keyword at a time because Expedia applies the search term to public review content.
  • Use rating boundaries for analysis, not to compensate for an invalid property.
  • Schedule conservative runs rather than repeatedly starting many concurrent tasks.
  • Preserve reviewId when loading results into a warehouse.
  • Numeric-ID input cannot always provide a friendly propertyName; supply the normal Expedia URL when the name is important.

Export formats

Every run writes to the default Apify dataset.

Export formats include:

  • JSON
  • JSONL
  • CSV
  • Excel
  • XML
  • RSS

The flat schema avoids nested objects in spreadsheets. Photo URLs remain an array in JSON and are serialized by tabular exports.

Integrations

Google Sheets reputation tracker

Use the Google Sheets integration to append review rows, then create pivots by property, date, rating, or keyword.

Slack or email alerts

Connect a scheduled task to Make, Zapier, or an Apify webhook. Trigger alerts for low ratings or missing management replies.

Sentiment and topic analysis

Send text, liked, and disliked to an NLP model. Group results by property and traveler segment.

Data warehouse pipeline

Load JSONL into BigQuery, Snowflake, Redshift, or PostgreSQL. Upsert on reviewId.

Hospitality dashboard

Combine aggregate scores with review-level trends in Looker Studio, Power BI, Tableau, or Metabase.

Use Expedia Reviews Scraper with the API

Replace APIFY_TOKEN with your Apify API token.

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/expedia-reviews-scraper').call({
propertyIds: ['911663'],
maxReviews: 10,
sort: 'MOST_RECENT',
travelerType: 'all',
locale: 'en_US'
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

from apify_client import ApifyClient
import os
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/expedia-reviews-scraper').call(run_input={
'propertyIds': ['911663'],
'maxReviews': 10,
'sort': 'MOST_RECENT',
'travelerType': 'all',
'locale': 'en_US',
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)

cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~expedia-reviews-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"propertyIds":["911663"],"maxReviews":10,"sort":"MOST_RECENT","travelerType":"all","locale":"en_US"}'

Poll the returned run ID, then read its default dataset.

Connect through Apify MCP

Use the Actor from Claude Code, Claude Desktop, Cursor, VS Code, or another MCP client.

Claude Code

$claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/expedia-reviews-scraper"

Claude Desktop, Cursor, or VS Code

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/expedia-reviews-scraper"
}
}
}

Example prompts:

  • “Export the 20 newest reviews for Expedia property 911663.”
  • “Find recent service-related reviews and summarize recurring complaints.”
  • “Compare rating themes across these three Expedia hotel URLs.”
  • “Save low-rated reviews and management replies as a CSV.”

Error handling

The Actor rejects malformed property IDs, unsupported hosts, invalid locales, and inverted rating ranges before scraping.

Expedia can throttle proxy exits. The Actor rotates bounded residential sessions and reuses a successful session for pagination.

If every session is blocked, the run fails with a clear error rather than succeeding with an empty dataset.

A valid property with no reviews matching strict filters also fails instead of presenting an empty extraction as success.

Troubleshooting

Why did my Expedia URL fail validation?

Confirm that the URL is an Expedia domain and contains a numeric h property segment, for example .h911663.Hotel-Information.

Short links and search-result URLs are not property pages. Open the hotel detail page and copy its final URL.

Why is propertyName empty?

ID-only input does not contain a human-readable name, and the review operation does not always return one. Use the standard Expedia hotel URL when you need a friendly name.

Why did a filtered run return no rows?

The traveler, keyword, and rating filters may have removed every public review. Test the property with travelerType: all, no keyword, and no rating boundaries.

Why can a run take longer than expected?

Expedia throttles some residential exits. The Actor may rotate sessions before finding one accepted by the public review endpoint.

This Actor extracts information displayed publicly without logging into an Expedia account.

Public availability does not remove your responsibilities.

You should:

  • follow applicable laws and regulations;
  • respect privacy and data-protection requirements;
  • avoid republishing personal data without a lawful purpose;
  • comply with contracts and website terms that apply to you;
  • use conservative schedules and output limits;
  • obtain legal advice for regulated or high-risk use cases.

The Actor is a data-extraction tool, not legal advice.

FAQ

Does this require an Expedia API key?

No. The Actor uses Expedia's public web review data and Apify proxy infrastructure.

Does it require an Expedia login?

No. V1 does not access traveler or partner accounts.

Can it scrape several hotels?

Yes. Add multiple URLs and/or IDs. maxReviews applies across the complete run.

Can it return every historical review?

It paginates until the output cap or Expedia's available pages end. Set a larger cap for backfills and estimate cost first.

Can I filter reviews by date?

V1 offers Expedia sort order, keyword, traveler type, and rating boundaries. Use MOST_RECENT and stop downstream when dates pass your cutoff.

Are ratings numbers or strings?

rating and aggregate category scores are numbers. ratingLabel preserves Expedia's descriptive text.

Are management responses included?

Yes, when Expedia publicly exposes a response for that review.

Does it scrape Hotels.com too?

No. V1 is Expedia-only. Hotels.com URLs fail scope validation.

Build broader travel intelligence workflows with other Automation Lab Actors:

Use source-specific IDs and deduplication rules when combining datasets from different travel platforms.

Support

If a valid Expedia property stops returning reviews, open an issue from the Actor page.

Include:

  • the Expedia property URL or ID;
  • the run URL;
  • the relevant filter settings;
  • whether the property visibly has public reviews.

Do not include booking references, account credentials, or private traveler information.