Export public Expedia hotel reviews from property IDs or hotel URLs into a structured dataset for hospitality research, reputation analysis and review archives. Each row contains a review's available rating, guest text, author attribution, submission date, photos and management responses. Some reviews contain only a rating.
Quick start
Enter one or more Expedia property IDs or hotel URLs, set a small review limit and start the Actor. Open the dataset to inspect results, then export CSV, Excel or JSON.
{
"propertyIds": ["905202"],
"maxReviewsPerHotel": 20,
"sortBy": "NEWEST_TO_OLDEST",
"includeRatingsOnly": true
}
At least one propertyIds or startUrls entry is needed. Reviews and fields depend on what Expedia returns. Access restrictions can prevent extraction. No Expedia login or cookies are required.
Prefer a video guide? This short Apify walkthrough shows you how to set up and run an Actor. It uses a different Actor, but the setup steps are the same.
https://youtu.be/1OW8gOqlZbY?t=25
What you get
One row per saved public review, with its hotel and review identifiers, available rating, text, author attribution and submission date. Optional photos and management responses can be included when Expedia supplies them. Ratings-only rows can lack written text, and reserved stay-related fields remain null.
Who is it for?
- Hotel reputation teams: review recurring guest feedback and available management responses.
- Travel analysts: compare ratings and comments across selected properties.
- Data teams: build review archives using review IDs and collection timestamps.
How you can use the data
- Review a small property-feedback sample. Use property
905202with an explicit per-hotel cap. KeephotelId,reviewId,rating,textandscrapedAttogether before analyzing recurring themes in your own reporting. - Read guest feedback alongside available replies. Inspect
managementResponseswith the source review text and property link. Missing replies are empty collections, and ratings-only rows do not supply guest comments to summarize. - Compare selected hotels downstream. Export a bounded sample for each known property and retain the same requested sort and filter settings. Review available ratings and text without treating the sample as a complete history or guaranteeing Expedia's returned order.
- Build a dated review archive in your own system. Preserve review identifiers and collection timestamps when joining later exports.
submissionDateis localized source text rather than a normalized ISO date, and reserved stay or verified-stay fields cannot establish guest verification.
Input settings
Both target lists are combined when supplied together. Detailed behavior and limitations are in each field's input-form help.
| Setting | API key | Purpose |
|---|---|---|
| Expedia property IDs | propertyIds |
Numeric hotel IDs. |
| Expedia hotel URLs | startUrls |
Hotel-Information or Hotel-Reviews URLs containing .h<ID>. |
| Maximum reviews per hotel | maxReviewsPerHotel |
Per-property limit. Form default 20. Set explicitly for bounded API calls. |
| Sort reviews | sortBy |
Request newest, relevance, highest or lowest rating order. |
| Include ratings-only reviews | includeRatingsOnly |
Include entries without written text. Default true. |
| Review text search | search |
Optional Expedia text filter. |
| Reviews per request | pageSize |
Request size, from 1 to 50. |
| Traveler type | travelerType |
Optional Expedia filter value. |
| Expedia locale | locale |
Localized labels and dates. Default en_US. |
| Runtime budget | maxRuntimeSecs |
Shared time budget in seconds. |
Example inputs
Use the Quick start input as a small first run. Adjust the fields described above for your own data.
Output data
Illustrative shape only, not an extracted guest review. Missing scalar fields are generally null, missing collections are empty arrays, and an unavailable submission date is an empty string.
{
"hotelId": "905202",
"propertyUrl": "https://www.expedia.com/h905202.Hotel-Information",
"reviewId": "illustrative-review-id",
"rating": 8,
"ratingLabel": "8/10",
"superlative": null,
"title": null,
"text": null,
"locale": "en_US",
"author": "Anonymous",
"submissionDate": "",
"stayDate": null,
"stayDetails": null,
"travelerType": null,
"travelers": [],
"brandType": "EXPEDIA",
"verifiedStay": null,
"themes": [],
"photos": [],
"managementResponses": [],
"propertyReviewSource": null,
"reviewRegion": null,
"sourceUrl": "https://www.expedia.com/h905202.Hotel-Information",
"scrapedAt": "2026-10-24T12:00:00.000Z",
"pageIndex": 0,
"position": 1
}
More output fields
| Fields | Meaning |
|---|---|
hotelId, propertyUrl, reviewId |
Property identity, page and review identifier. |
rating, ratingLabel, superlative |
Available numeric score and Expedia labels. |
title, text, locale |
Public review content. Title/text can be null. |
author, submissionDate |
Author attribution (Anonymous when unavailable) and localized submitted date, not a normalized ISO date. |
travelers, brandType |
Available traveler labels and source brand. |
themes, photos, managementResponses |
Available theme, media and reply collections. Empty arrays when absent. |
stayDate, stayDetails, travelerType, verifiedStay |
Reserved fields currently returned as null. Not populated by this export. |
propertyReviewSource, reviewRegion |
Reserved source/region metadata currently returned as null. |
sourceUrl, scrapedAt |
Input provenance and collection timestamp. |
pageIndex, position |
Zero-based page index and one-based source position, not a guarantee of complete coverage. |
Download your results
Open your run's dataset, choose Export and select JSON, CSV or Excel. JSON keeps nested fields together. CSV and Excel are useful when you want to review the records in a spreadsheet.
See Apify's download and export guide for the available formats and field options.
Tips for best results
- Set a small per-property cap explicitly. Keep the shared runtime budget in mind when supplying several hotels.
- Check text availability before summarizing feedback. Ratings-only reviews can have null title or text fields.
- Keep source dates and capture times separate. Use the collection timestamp for your own exports and inspect localized submission dates before date analysis.
- Read the summary before calling an export complete. Check
SUMMARY.saved,targets,failuresandpartialfor missing or interrupted work. - Retain property and review identifiers in comparisons. Match separate exports in your own system rather than expecting a built-in historical archive.
Limits and caveats
Review filters and requested sort order depend on Expedia's response. Reviews can be edited, removed or unavailable, with no complete historical archive or guaranteed requested order. Optional text, photos and replies can be absent, and some entries contain only a rating.
A completed empty extraction can return an empty dataset. A run with property failures and no saved reviews fails. Saved output from completed pages or properties remains available in mixed runs. Inspect the SUMMARY key-value record before treating the run as complete.
Submission dates are localized source strings, not normalized ISO dates. Reserved stay date, stay details, traveler type, verified-stay and source/region fields remain null as documented in Output data.
The Actor reads public review information without Expedia login or cookies and does not retrieve private account data. Access restrictions can prevent extraction. This independent tool is not affiliated with Expedia.
Automation and integrations
Save your settings for next time
Once you have an input that works for you, save it as an Apify task. This keeps your settings together so you can use them again without filling in the form from scratch.
Run on a schedule
Need fresh results regularly? You can schedule the Actor or a saved task to run at a time that suits you.
Each scheduled run collects the data again. If you want to compare results or highlight changes, add that step in your own workflow.
Send results to your other tools
Use n8n, Make or Zapier to connect this scraper to the rest of your workflow. For example, you could pass its results to an AI assistant or add records to a spreadsheet. Follow the Apify integration guides for your chosen tool.
For a custom connection, an Apify webhook can notify your app when a run finishes or fails. Your app can then fetch the results or handle the failure.
API usage
Want to collect this data from your own app or automation? The examples below send input to the scraper and show how to collect its results.
The Node.js and Python examples wait for the run to finish before reading its results. The cURL example starts the run and returns its details. Wait for that run to finish, then use its defaultDatasetId to fetch the results.
For setup instructions, see Apify's JavaScript client guide, Python client guide and Actor runs API reference.
cURL
curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~expedia-reviews-scraper/runs' \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H 'Content-Type: application/json' \
--data @- <<'JSON'
{
"propertyIds": [
"905202"
],
"maxReviewsPerHotel": 20,
"sortBy": "NEWEST_TO_OLDEST",
"includeRatingsOnly": true
}
JSON
Node.js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/expedia-reviews-scraper').call({
"propertyIds": [
"905202"
],
"maxReviewsPerHotel": 20,
"sortBy": "NEWEST_TO_OLDEST",
"includeRatingsOnly": true
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
Python
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/expedia-reviews-scraper').call(run_input={'propertyIds': ['905202'], 'maxReviewsPerHotel': 20, 'sortBy': 'NEWEST_TO_OLDEST', 'includeRatingsOnly': True})
print(client.dataset(run['defaultDatasetId']).list_items().items)
MCP and AI agents notes
Example request: “Export up to 20 newest reviews for Expedia property 905202 using propertyIds and maxReviewsPerHotel, then summarize the available review text.” Retrieve the dataset, check SUMMARY, and account for nullable fields before analysis. This uses Apify's server, not a separate Expedia-specific MCP service.
MCP and AI agents
You can ask your AI assistant to collect data with Expedia Reviews Scraper and help you work with the results. The scraper returns the data, and your assistant can then summarize it, compare records or prepare notes.
Connect your assistant through the Apify MCP server. MCP gives your assistant a way to find this scraper, run it and read the results. Follow the official setup and sign-in guide for your app.
Easier setup with an Apify plugin
If you use a supported coding assistant, the official Apify plugin can set up the connection for you. It connects your assistant to Apify and includes instructions for common tasks. Follow the guide for your particular app.
Use Apify AI in Console
Prefer to keep everything in Apify? Open Apify AI in Console and ask it to find Fetch Cat's Expedia Reviews Scraper. You can describe the data you want and ask questions about the results.
Apify AI is currently in beta. It asks for confirmation before starting an Actor, and normal run charges apply.
Choose your assistant
- Claude and Claude Code (Anthropic): Apify setup guide.
- ChatGPT and Codex (OpenAI): Apify setup guides.
- Grok Bot (xAI): Apify plugin guide.
- Gemini CLI (Google): MCP server setup guide. Use the server URL below with the HTTP configuration supported by Gemini CLI.
Connect just this scraper
To keep your setup focused on this scraper, add this server configuration to a compatible MCP client:
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=fetch_cat/expedia-reviews-scraper"
}
}
}
Sign in to Apify when your client asks. If your client uses a Bearer token instead, follow its setup guide and keep the token in its secure configuration. Configuration formats vary by app, so use the linked guide if your client needs a different format.
Use Apify's general server
Already connected to the general Apify MCP server at https://mcp.apify.com? You can use it to find this scraper without adding another server. Ask your assistant to use Expedia Reviews Scraper by Fetch Cat, or give it the identifier fetch_cat/expedia-reviews-scraper.
Your assistant can check the available settings and retrieve the results from the returned run. If the run is still working, it should follow that run rather than start it again. Both connection options use Apify's hosted service.
Example requests
- “Use Fetch Cat’s Expedia Reviews Scraper to collect up to 5 reviews for property 905202, requesting newest-first order. Show available ratings, guest text and source links, while keeping ratings-only entries distinct.”
- “Collect at most 5 reviews per hotel for the 2 Expedia hotel URLs I provide. Include available management responses and review identifiers so I can review feedback themes in my own report.”
- “Retrieve up to 5 reviews from my supplied Expedia property ID. Keep collection times and localized submission dates separate, and explain partial or failed-property outcomes before I add the records to my archive.”
Normal Apify charges apply. Check the live Pricing tab before asking your assistant to run a larger batch.
Pay with x402
If your AI agent has a funded wallet, it can pay for Apify usage through x402. This experimental option lets an agent use Apify without a conventional account.
Apify AGI provides a prepaid API token with a spending cap after payment. Your agent can use that token to run this scraper through the Apify API or an authenticated MCP connection.
Some MCP setups also support paying for each request directly. That is a different payment option, so check the official guide for its availability.
Follow the official guide for wallet setup, supported payment options and current terms. Apify handles the payments. Keep wallet keys and payment tokens in your agent's secure configuration.
Other ways for agents to pay
Apify also supports MPP for prepaid access through AGI and Skyfire for eligible Actors. If your agent already uses one of these, see the agentic payment guide to choose the right setup.
Support and feedback
For custom additions or integrations, email hello@fetchcat.dev.
Found an error or have a feature request? Open an issue with the run URL, a non-sensitive input example and what you expected.
Need help sharing it? See Apify’s guide to sharing a run when reporting an issue. Sharing a run can give the developer access to its input, logs and results, so use a run that contains no sensitive data. Please leave out API tokens, passwords, cookies, private documents and personal data. Use a public sample URL or a redacted example instead.
Tried this scraper? We'd love to hear how it worked for you. Leave a review to help others choose the right tool and help us improve it. Your feedback means a lot to us.
Made with care for curious people, AI agents and the possibilities in data. ♥