Expedia Reviews Scraper, Fast Lightweight avatar

Expedia Reviews Scraper, Fast Lightweight

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Expedia Reviews Scraper, Fast Lightweight

Expedia Reviews Scraper, Fast Lightweight

Scrape hotel reviews from Expedia by URL or hotel ID. Extract ratings, review text, traveler type, guest experience score, owner replies, and more. Filter by keyword or traveler type. Fast and reliable β€” no Expedia API needed.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Vladimir Efimenco

Vladimir Efimenco

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

18 hours ago

Last modified

Share

Expedia Reviews Scraper | Fast, Lightweight

This Expedia Reviews Scraper pulls hotel reviews directly from Expedia's internal GraphQL API, no browser involved. Returns full review text, ratings, traveler type, guest experience score, and owner replies for any hotel listed on Expedia.

⚑ Why this Expedia Reviews Scraper

  • No browser session required. Most Expedia review scrapers launch a headless browser just to render the page before they can read anything. This one talks to the same GraphQL API that Expedia's own app uses, so there's nothing to render and nothing to wait on.
  • Full review content, not a snapshot. Each review comes with the title, full text, numeric rating, rating label, traveler type, publish date, and whether the stay was verified.
  • Hotel-level stats included. Guest rating, total number of ratings, and guest experience score are attached to every review from that listing.
  • Sort and filter built in. Sort by most recent, most relevant, or rating (high to low or low to high), filter by traveler type, and search by keyword, either through Expedia's own filter or checked locally against the review text.
  • Batch scraping. Feed in multiple hotel URLs or IDs and they run concurrently in the same job.
  • Proxies included. No need to bring your own, residential and datacenter proxies are already wired in.
  • Fast. Pure HTTP requests to Expedia's API, no page load, no rendering delay.

🎯 Who uses this Expedia Reviews Scraper

  • Hospitality market researchers tracking guest sentiment, rating trends, or traveler type breakdowns (business, couples, families, solo) across hotels or regions.
  • Competitor benchmarking teams comparing guest ratings and experience scores across properties in the same market.
  • Reputation management agencies monitoring new reviews and owner replies for a portfolio of hotel clients.
  • Sentiment analysis and NLP teams feeding review text into models, pre-filtered by keyword or rating.
  • Developers building travel or hospitality dashboards who need structured Expedia review data without maintaining their own scraper.

🧾 What you get, per review

  • Review content: title, text, rating (numeric and label), review date, locale
  • Traveler info: reviewer name, traveler type, verified stay flag
  • Owner reply: reply title and text, if the property responded
  • What guests liked and disliked, where Expedia surfaces it separately
  • Hotel-wide stats: guest rating, total ratings count, guest experience score
  • Keyword match: whether the search query matched this review

πŸ” How keyword search works

The search field works the same way as Expedia's own review search box.

  • searchIsLocalFilter unchecked (default): the keyword is sent to Expedia as a server-side filter. Only matching reviews come back, and each one is marked is_keyword_match: true.
  • searchIsLocalFilter checked: the keyword is not sent to Expedia. Every review is fetched regardless, and each one is checked locally against the title and text, with is_keyword_match showing the result.

Use the checked option when you want the complete review set but still need to flag which reviews mention your keyword.

πŸ”§ Input options

FieldDescription
listingUrlsOne or more Expedia hotel URLs, or plain numeric hotel IDs
maxResultsMax reviews to collect per listing. Leave empty to collect all available
sortBySort order: most recent, most relevant, rating high to low, rating low to high
travelerTypeFilter by traveler type: business, couples, families, families with young children, groups, solo, travelers with pets
searchKeyword to search for in reviews
searchIsLocalFilterIf checked, search tags reviews locally instead of filtering them via Expedia

πŸ“Š Data Fields

πŸ“ Review Details

FieldDescription
review_idUnique ID of the review
rating_number / rating_value / rating_textReviewer's overall rating, as a number, value, and text label
review_title / review_textReview title and body text
review_dateDate the review was published
review_localeLanguage the review was written in
what_liked / what_dislikedWhat the guest liked and disliked, if Expedia surfaces it
review_imagesImage URLs with caption text, if any

πŸ‘€ Reviewer

FieldDescription
reviewer_nameName of the reviewer
review_is_verifiedWhether the stay is marked verified
travel_typeBusiness, couples, family, friends, solo, etc.

🏒 Owner & Listing

FieldDescription
review_reply_title / review_reply_textProperty owner's reply, if any
listing_name / listing_typeName and type of the hotel
reviews_overall_statsGuest rating, total ratings, guest experience score

⭐ Matching

FieldDescription
query_keywordThe search keyword provided in actor input, if any
is_keyword_matchTrue if the query matched this review, either checked locally or because Expedia's own filter already applied it

πŸ“‹ Example output

[
{
"listing_name": "ibis Praha Mala Strana",
"listing_type": "Hotel",
"reviews_overall_stats": {
"guest_rating": 8.6,
"total_ratings": 789,
"guest_experience_score": 8.4
},
"review_id": "67ec19ad15d5c874a2ad47b5",
"rating_number": 10,
"rating_value": "10/10",
"rating_text": "Excellent",
"review_locale": null,
"review_title": "",
"review_text": "Good option for cheap accommodation if you are looking to avoid shared rooms. Ibis is always one of my go to's when i am specifically looking for a basic but comfortable and cheap private room.",
"what_liked": "Liked: cleanliness, staff & service, property conditions & facilities",
"what_disliked": null,
"review_date": "Apr 1, 2025",
"review_reply_title": null,
"review_reply_text": null,
"review_images": [],
"reviewer_name": "Roy",
"review_is_verified": true,
"travel_type": "Traveled with partner",
"query_keyword": null,
"is_keyword_match": false
},
{
"listing_name": "ibis Praha Mala Strana",
"listing_type": "Hotel",
"reviews_overall_stats": {
"guest_rating": 8.6,
"total_ratings": 789,
"guest_experience_score": 8.4
},
"review_id": "68a7af5a4b7654488031b2a2",
"rating_number": 8,
"rating_value": "8/10",
"rating_text": "Good",
"review_locale": "de_DE",
"review_title": "",
"review_text": "It’s in the centrum all shops available supermarket etc.",
"what_liked": "Liked: cleanliness, staff & service",
"what_disliked": null,
"review_date": "Aug 21, 2025",
"review_reply_title": "Response from ibis team on Aug 27, 2025",
"review_reply_text": "Dear Guest,\n\nThank you for your feedback. We appreciate your insights and strive to enhance our guests' experiences.\n\nWarm regards,\nibis Praha Mala Strana",
"review_images": [],
"reviewer_name": "Rosemary",
"review_is_verified": true,
"travel_type": "Traveled with family and young children",
"query_keyword": null,
"is_keyword_match": false
},
{
"listing_name": "ibis Praha Mala Strana",
"listing_type": "Hotel",
"reviews_overall_stats": {
"guest_rating": 8.6,
"total_ratings": 789,
"guest_experience_score": 8.4
},
"review_id": "68ae39df794d9610b2c357f0",
"rating_number": 10,
"rating_value": "10/10",
"rating_text": "Excellent",
"review_locale": null,
"review_title": "",
"review_text": "Just off a busy major street. Trams, buses, and shopping center (including an Albert supermarket) just a block away, as well as fast food options.\nThe room was clean, modern, and perfect for a short stay. Shower was excellent, bed was extra firm. A/C and a window that opens. Would definitely stay there again.",
"what_liked": "Liked: cleanliness, staff & service, property conditions & facilities",
"what_disliked": null,
"review_date": "Aug 26, 2025",
"review_reply_title": "Response from ibis team on Aug 27, 2025",
"review_reply_text": "Dear Guest,\n\nThank you for your feedback. We appreciate your insights and strive to enhance our guests' experiences.\n\nWarm regards,\nibis Praha Mala Strana",
"review_images": [
{
"url": "https://a.travel-assets.com/ugc/hotel-reviews/54ffeeeb-15db-4f8e-a99a-45b3e4e5fa36-1756249104053.jpg",
"image_text": "Unless you need a fridge or microwave, this room fill the needs."
}
],
"reviewer_name": "Daniel",
"review_is_verified": true,
"travel_type": "Solo traveler",
"query_keyword": null,
"is_keyword_match": false
}
]

πŸš€ Running the actor

Via Apify Console

Open the actor page, fill in the input form, and click Start.

Via Apify API: Python

import requests
APIFY_TOKEN = "your_apify_token"
ACTOR_ID = "mof1re~expedia-reviews-scraper"
run_input = {
"listingUrls": [
{"url": "https://www.expedia.com/Prague-Hotels-Hotel-Krystal.h10966026.Hotel-Information"}
],
"maxResults": 200,
"sortBy": "most_recent",
"travelerType": "",
"search": "",
"searchIsLocalFilter": False
}
response = requests.post(
f"https://api.apify.com/v2/acts/{ACTOR_ID}/run-sync-get-dataset-items",
params={"token": APIFY_TOKEN},
json=run_input,
)
reviews = response.json()
print(f"Fetched {len(reviews)} reviews")

Via Apify API: Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'your_apify_token' });
const input = {
listingUrls: [
{ url: 'https://www.expedia.com/Prague-Hotels-Hotel-Krystal.h10966026.Hotel-Information' }
],
maxResults: 200,
sortBy: 'most_recent',
travelerType: '',
search: '',
searchIsLocalFilter: false,
};
const run = await client.actor('mof1re/expedia-reviews-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Fetched ${items.length} reviews`);

Example input JSON

{
"listingUrls": [
{ "url": "https://www.expedia.com/Prague-Hotels-Hotel-Krystal.h10966026.Hotel-Information" },
{ "url": "190551" }
],
"maxResults": 200,
"sortBy": "rating_high",
"travelerType": "couples",
"search": "clean",
"searchIsLocalFilter": false
}

❓ FAQ

How is this different from other Expedia review scrapers? Most run a full browser to load the page before pulling reviews. This one calls Expedia's GraphQL API directly and supports sorting, traveler type filtering, and dual-mode keyword search together, in one input.

Does this scraper need an account or API key? No. It extracts publicly available review data.

Can I pass a hotel ID instead of a URL? Yes. Drop the numeric Expedia hotel ID straight into listingUrls and it works the same as a full URL.

Can I filter reviews by traveler type? Yes. Set travelerType to business, couples, families, families with young children, groups, solo, or travelers with pets.

Do I need my own proxies? No. Proxies are built into the actor.

Is this legal? Can I scrape publicly available reviews? This tool extracts publicly available review data. You're responsible for complying with the target site's terms of service and applicable data protection laws for your use case.

πŸ’³ Pricing

Pay-per-result. You're charged for reviews actually delivered, not for pages fetched or requests made.

⚠️ Notes

  • Free-tier accounts are capped at a small sample size per run, and to a single listing per run. Upgrade to a paid Apify plan for full volume and batch scraping.
  • Data reflects what's publicly listed on expedia.com at the time of the run; the source updates continuously.

πŸ”— See also

Need reviews from another platform? Check out: