Expedia & Hotels.com Scraper - Hotels, Prices & Reviews
Pricing
from $2.30 / 1,000 hotels
Expedia & Hotels.com Scraper - Hotels, Prices & Reviews
Scrape Expedia and Hotels.com: hotel search results with nightly price, stay total, guest score, star class, amenities, address and coordinates, plus guest reviews with score, text, trip type and hotel reply. 30 Expedia sites, Expedia filters, monitor. $2.30 per 1,000 hotels, $2 per 1,000 reviews.
Pricing
from $2.30 / 1,000 hotels
Rating
0.0
(0)
Developer
Top Api
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 hours ago
Last modified
Categories
Share
What does Expedia & Hotels.com Scraper do?
Expedia & Hotels.com Scraper extracts hotels and guest reviews from Expedia and Hotels.com. Type a destination and get one row per hotel with the nightly price, stay total, guest score, star class, amenities, address and map position for your dates; give it hotels and get one row per guest review with the score, text, trip type and the hotel's reply. Built for revenue managers, travel analysts, OTA and meta-search teams, and AI builders who need Expedia data in bulk.
Expedia scraper - Hotels.com scraper - Expedia hotels API - Expedia reviews scraper
- Hotel search rows: name, link, position, star class, guest score and label, review count, nightly price, stay total, was-price, deal badge, member price, VIP Access, free cancellation, pay later, rooms left, neighborhood, amenities, photos, full address and coordinates.
- Guest reviews: score out of 10 and its label, text, title, review date, stay month and nights, traveled-with, liked / disliked topics, guest photos, hotel response with its date, review language (as Expedia marks it), plus the hotel's score, review count and category scores on every row.
- Every review Expedia serves: all 5,759 reviews of one London hotel in a test, 50 per request; 150 reviews of one hotel took 4-5 seconds (two test runs).
- Expedia's own filters: dates, rooms, adults, children, sort order, price range, stars, guest rating, property type, amenities, meal plan, refundable, pay later, member / VIP deals, neighborhood, property name; for reviews: sort, traveler type and keyword.
- 30 Expedia sites: expedia.com, Hotels.com, expedia.co.uk, .de, .fr, .ca, .com.au, .co.jp and more, each priced in its own currency.
- Hotel details (add-on): amenities by category, policies, important info, category scores, rating histogram, AI review summary, highlights, nearby places, the photo gallery, and every room with its rates for your stay.
- Rate-position report (add-on): where your hotel ranks and prices against its market.
- Monitor mode: only hotels and reviews you have not received yet, plus hotels whose stay price changed. A rate-position report, if on, is a fresh market snapshot on every run (charged each time).
- No login, cookies or Expedia API key. Export to JSON, CSV, Excel, XML; schedules, webhooks, Make, Zapier, n8n, Google Sheets, the Apify API and MCP.
What data can you get from Expedia?
π¨ Hotel name, id (hotelId) and link | β Star class (starRating) | π― Guest score + label (guestRating) |
| π£οΈ Review count | π² Price per night (pricePerNight) | π§Ύ Stay total, was-price, taxes included |
| π·οΈ Deal badge, member price, VIP Access | β Free cancellation, pay later, rooms left | π Address, postal code, latitude / longitude |
| ποΈ Neighborhood and search position | ποΈ Amenities | πΌοΈ Photos |
| π¬ Review text, title and score 1-10 | π Review date, stay month, nights | π§³ Traveled with (partner, family, solo, group, business) |
| π Liked / π disliked topics | π’ Hotel response and its date | π Review language (Expedia's mark) |
| π Category scores + rating histogram | π€ Expedia's AI review summary | ποΈ Rooms and rates for your dates |
On a 100-hotel Lisbon run every row had the name, link, star class, guest score, review count, nightly price, stay total, neighborhood, amenities, photos, address and coordinates; 62% had a was-price, 51% a deal badge and 23% free cancellation. On a 500-hotel London run 99.2% had a price. On 1,000 reviews every row had the score, date, stay month and nights; 71% had review text, 58% a traveled-with and 86% a hotel response.
How to scrape Expedia with Expedia & Hotels.com Scraper
- Create a free Apify account - $5 of monthly credit, no card needed.
- Open Expedia & Hotels.com Scraper and click Try for free.
- Type destinations into Destinations (for hotel rows) or paste hotel links, ids or names (for their reviews).
- Set your dates, guests and filters, and Max hotels per destination / Max reviews per hotel.
- Click Start. Rows stream into the dataset as each page is read.
- Open the Storage tab and Export as JSON, CSV or Excel - or let a schedule run it for you.
β¬οΈ Input
| Parameter | Type | Description |
|---|---|---|
| π What to scrape | ||
mode | Select | auto (default): destinations give hotel rows, hotels give their reviews. hotels, reviews, hotelsAndReviews force one or both. |
locations | List | Destinations as you would type them on Expedia: "Lisbon", "Times Square, New York", an airport ("Heathrow Airport" or its code "JFK"). For a name several places share, add the state or country ("Dublin, Ireland", "Dublin, Ohio"); without it the place with its own major airport is used (Dublin -> Dublin, Ireland), and RUN_SUMMARY notes list the others with their region ids. |
startUrls | List | Expedia / Hotels.com hotel links (any regional site, also Travelocity, Orbitz, Wotif, CheapTickets, ebookers), Hotel-Search links, expe.app.link share links or bare Expedia ids such as 179 (Hotels.com links need the hotel name in them). |
hotelNames | List | Hotel names with their city: "Four Seasons Hotel Ritz Lisbon". |
regionIds | List | Expedia region ids (regionId= of a search link). |
googleMapsInputs | List | Google Maps links of hotels; matched by name and position. |
site | Select | Which Expedia site prices the stay. Default expedia.com (USD). |
| π― Search filters (applied by Expedia) | ||
checkIn / checkOut | Text | "2026-12-20" or relative ("30 days"). Default: 30 days out, 2 nights. |
adults, rooms, childrenAges | Numbers | Guests per room. Default 2 adults, 1 room. |
sortBy | Select | Recommended, price low/high, distance, guest rating, property class. |
minPrice / maxPrice | Integer | Nightly price range in the site's currency. |
starRatings, minGuestRating, propertyTypes, stayType, amenities, mealPlans, deals | Select | Expedia's own filter values. |
freeCancellation, payLater, showAvailableOnly | Boolean | Expedia's refundable / pay-later / availability switches. |
propertyName, neighborhoodId, customFilters | Text / JSON | Name search, one neighborhood, and more Expedia filters by their id: accessibility, travelerType, bedroomFilter, hotel_brand, neighborhood, room_views_group, room_amenities_group, beach_access_group, nearby_activities_group, amenities_facilities_group, or Expedia's ids for the filters above (star, guestRating, amenities, lodging, categorySearch, mealPlan, paymentType, rewards, availableFilter); any other id is ignored with a note in RUN_SUMMARY. |
| βοΈ Refine results | ||
minReviews, onlyWithPrice | Drop hotels with few reviews or no price. | |
reviewsFrom / reviewsTo, minRating / maxRating, onlyWithText, reviewLanguages | Review date window ("2026-01-01", or how far back: "30 days" = the last 30 days), score band, text-only, languages (matched on language; score-only reviews have none, so a language filter drops them). | |
| π¬ Reviews | ||
maxReviewsPerHotel | Integer | Default 50; 0 = every review Expedia serves. |
reviewSort, travelerType, reviewKeyword | Expedia's review order, traveler-type filter and review search. | |
maxHotelsPerSearch | Integer | In reviews mode, how many top hotels of each destination are read. Default 10. |
includeReviewPhotos, includeOwnerResponses, includeReviewMarkdown, stripPersonalData | Boolean | Photos and responses on by default; markdown copy for LLM pipelines. stripPersonalData (on by default) empties authorName, reviewerName and hotelResponseAuthor, and takes the greeting name, the reviewer's name and the staff name in the sign-off out of hotelResponse; a name staff write elsewhere in a reply can remain (turn off includeOwnerResponses to leave replies out). |
| β Extra data | ||
includeDetails | Boolean | Hotel details on each hotel row, charged as hotel-details at $0.00095 per hotel. includeRooms and maxPropertyImages shape it. |
ratePositionReport, ratePositionSubject | Boolean / Text | One report row per destination (up to 5 per run), charged as rate-position-report at $0.14. |
| π Monitoring | ||
monitorMode, monitorPriceChanges, monitorStoreName | Only hotel and review rows not delivered by earlier runs; price changes re-delivered. Hotels are remembered per search (destination, dates, guests, filters, sort) and, for hotels you list, per list and stay (dates and guests). Reviews are remembered per hotel, shared by every search and list that uses the same store, so give each schedule its own monitorStoreName. The rate-position report is rebuilt and charged on every run. | |
| π¦ Output | ||
maxResults | Integer | Hotels per destination. Default 100; 0 = all Expedia serves (about 500). Hotels you list (links, ids, names) are not capped: each gets its row. |
compact | Boolean | Core fields only, for AI agents and MCP. |
Input JSON
{"locations": ["Lisbon"],"checkIn": "2026-12-20","checkOut": "2026-12-22","adults": 2,"starRatings": ["4", "5"],"maxResults": 100}
Reviews of specific hotels:
{"startUrls": ["https://www.expedia.com/London-Hotels-Strand-Palace-Hotel.h179.Hotel-Information"],"maxReviewsPerHotel": 500,"reviewSort": "newest"}
Put hotels in the hotel fields, places in Destinations
A destination gives up to Max hotels per destination hotel rows; a hotel link, id or name gives that hotel's reviews (or its own row in hotels mode, every hotel you list). Do: "locations": ["Lisbon"] Β· Don't: paste a city into startUrls expecting reviews of every hotel - use mode: "reviews" with maxHotelsPerSearch for that.
For a city name several places share (Dublin, Vienna, Portland), write the state or country: "Dublin, Ireland", "Portland, Maine". Without it the actor takes, every run, the place with its own major airport (Dublin -> Dublin, Ireland; Athens -> Athens, Greece), then the one with the lowest Expedia region id, and names the other places with their region ids in RUN_SUMMARY notes. A destination whose matched name does not contain your text gets a note too.
Prices follow the site you pick
Each Expedia site prices in its own currency: expedia.co.uk gives GBP, expedia.de EUR. Setting currency on the default site switches to the matching site (EUR uses expedia.ie).
β¬οΈ Output
Every hotel, review and report becomes one dataset item, told apart by type. Here is the table view of a run for Lisbon:
A hotel row as JSON (trimmed):
{"type": "hotel","hotelId": "7369640","name": "MeliΓ‘ Lisboa Aeroporto","url": "https://www.expedia.com/Lisbon-District-Hotels-Melia-Lisboa-Aeroporto.h7369640.Hotel-Information?chkin=2026-11-07&chkout=2026-11-09&rm1=a2","position": 1,"starRating": 4,"guestRating": 9.4,"guestRatingLabel": "Exceptional","reviewCount": 3097,"pricePerNight": 204,"totalPrice": 451,"currency": "USD","taxesIncluded": true,"neighborhood": "Olivais","amenities": ["Spa", "Hot tub on site", "Bar and lounge"],"latitude": 38.770382,"longitude": -9.125218,"address": "Aeroporto Internacional de Lisboa, Rua C, Lisbon, 1700-008, PRT","checkIn": "2026-11-07","checkOut": "2026-11-09"}
A review row (trimmed):
{"type": "review","hotelId": "179","hotelName": "Strand Palace Hotel","reviewId": "6ac3a2e59a328577543026e2","reviewRating": 4,"reviewRatingLabel": "Poor","reviewDate": "2026-10-05T00:00:00.000Z","stayDate": "2026-10-01T00:00:00.000Z","stayDuration": 2,"traveledWith": "Traveled with partner","reviewText": "Poor Maintenance, Bad Management, Great Location. We arrived around 1 a.m. ...","hotelResponse": "Dear Guest, Thank you for sharing your feedback ...","hotelResponseDate": "2026-10-06T00:00:00.000Z","language": "en","hotelOverallRating": 9,"hotelTotalReviews": 5759}
Fields
| Field | Type | What it is | Fill on test run |
|---|---|---|---|
hotelId, name, url, position | string / number | Expedia property id (same on Hotels.com), name, link with your dates, rank in the results | 100% |
starRating | number | Property class | 100% (100 hotels), 99.8% (500) |
guestRating, guestRatingLabel, reviewCount | number / string | Guest score out of 10, its label, review count | 100% |
pricePerNight, totalPrice, priceText | number / string | Nightly price and stay total in currency | 100% (100), 99.2% (500) |
strikeOutPrice, dealBadge | number / string | Was-price and deal badge | 62%, 51% |
memberPrice, vipAccess, freeCancellation, payLater, roomsLeft | boolean / number | Expedia's flags on the card | when Expedia shows them |
neighborhood, amenities, image, images | string / array | Card location label, three top amenities, photos | 100% |
latitude, longitude, address, street, city, postalCode, countryCode | number / string | Where the property is | 100% |
reviewRating, reviewRatingLabel, reviewDate, stayDate, stayDuration | number / string | Review score, label, dates, nights | 100% (1,000 reviews) |
reviewText, reviewTitle | string | What the guest wrote | 71%, rare titles |
traveledWith, liked, disliked | string / array | Traveler type and topics | 58%, 80%, 4% |
hotelResponse, hotelResponseDate | string | The property's reply; with stripPersonalData (default) without the greeting name, the reviewer's name or the staff name in the sign-off | 86% (one hotel), 59% (10 hotels) |
language, photos | string / array | Language: the one Expedia marks on a review written in another language than the site's (de, fr, ja...), otherwise en, the site's language (a few untranslated non-English reviews read en too); empty on score-only reviews. Guest photos | 71%, 3-8% |
hotelOverallRating, hotelTotalReviews, hotelCategoryRatings | number / array | The hotel's score, review count, category scores on every review | 100% |
How can I use Expedia hotel data?
- πΉ Revenue managers - track your hotel's nightly rate and rank against the market every day with monitor mode and the rate-position report.
- π§ OTA and meta-search teams - compare Expedia prices, deals and refundable rates with other channels for the same dates.
- πΊοΈ Travel analysts - map supply, star mix and price bands by neighborhood with coordinates on every row.
- β Reputation teams - collect every review and the hotel's responses; filter by traveler type, score band or keyword.
- π€ AI and research teams - feed review text, liked/disliked topics and markdown copies into an LLM or a RAG index.
- π Investors and consultants - benchmark a property's guest score, category scores and pricing before a deal.
How much does it cost to scrape Expedia?
Expedia & Hotels.com Scraper is pay-per-result with no start fee:
| What | Price |
|---|---|
Hotel row (hotel) | $2.30 per 1,000 ($0.0023 each) |
Review row (review) | $2.00 per 1,000 ($0.002 each) |
Hotel details add-on (hotel-details) | $0.95 per 1,000 hotels |
Rate-position report (rate-position-report) | $0.14 per report |
| Run | Cost |
|---|---|
| 25 hotels | $0.06 |
| 100 hotels | $0.23 |
| 500 hotels (all of London) | $1.15 |
| 100 hotels with details | $0.33 |
| 1,000 reviews | $2.00 |
| 10 hotels x 100 reviews | $2.00 |
There is nothing else to pay: Apify platform usage is included in these prices. You are charged only for rows written to the dataset. On the default 256 MB a 100-hotel run took 6-9 seconds and 150 reviews of one hotel 4-5 seconds (two runs each).
Integrations, API, scheduling & MCP
- Schedules: run Expedia & Hotels.com Scraper daily from the Schedules tab; turn on
monitorModeto get only new hotels, price changes and new reviews of the hotels you follow. - Webhooks: fire a URL when a run finishes - push rows to your database, Slack or a sheet.
- No-code: Make, Zapier, n8n, Google Sheets, Airtable, Slack via Apify integrations.
- API: call it from Node.js or Python with
apify-client- code on the API tab and the Apify API reference. - MCP / AI agents: connect Claude, Cursor or any MCP client through the MCP tab and ask for Expedia hotels or reviews in plain language.
More hotel and review scrapers
Limits & empty runs
- Hotels per destination: Expedia serves about 500 hotels for one search (London 500, Lisbon 488). Split a city into neighborhoods or price bands to go deeper.
- Reviews: every review Expedia lists for the property; the score, date and stay month are on every row, text on about 70% (Expedia accepts score-only reviews).
- Not available: the property's long description (Expedia's API returns none for it; the details block carries the area description, highlights and amenities instead).
- Empty dataset: the destination or hotel was not matched (RUN_SUMMARY lists each input and why), every hotel was filtered out, or monitor mode found nothing new. Nothing is charged.
- Proxy: Expedia answers residential connections only; keep the default RESIDENTIAL proxy.
FAQ
How many hotels can Expedia & Hotels.com Scraper collect in one run?
About 500 per destination (all Expedia serves for one search), across as many destinations as you list. Hotels are read 100 per request; a 100-hotel destination took 6-9 seconds in two test runs.
How many reviews can Expedia & Hotels.com Scraper read per hotel?
All of them: set maxReviewsPerHotel to 0. A test read all 5,759 reviews of the Strand Palace Hotel, 50 per request.
Can I run Expedia & Hotels.com Scraper on a schedule to track prices?
Yes. Save your input as a task, open Schedules, pick the cadence and turn on monitorMode: each run delivers only hotels you have not received for that search (or, for hotels you list, that list and stay), hotels whose stay price changed (changeType: "priceChanged" with previousTotalPrice), and reviews not yet delivered for that hotel. Review memory is per hotel and shared by every run that uses the same monitor store, so give each schedule its own Monitor store name (monitorStoreName). In hotelsAndReviews mode the new reviews come from the top Max hotels per destination hotels of each search plus any hotel delivered in that run, whether or not their hotel row came back. A rate-position report, if on, is rebuilt and charged on every run (a fresh market snapshot).
Does Expedia & Hotels.com Scraper work with Hotels.com and regional Expedia sites?
Yes. Pick the site in Expedia site (30 sites). In Hotel or search links paste Hotels.com links with the hotel name in them (hotels.com/ho114409/strand-palace-hotel-london-united-kingdom/) or Expedia hotel ids; a bare Hotels.com ho-number is a different numbering and is not accepted. Reviews are the same pool on every Expedia Group site.
Can I integrate Expedia & Hotels.com Scraper with other apps?
Yes - Make, Zapier, n8n, Google Sheets, Slack and more via Apify integrations, or webhooks when a run finishes.
Can I use Expedia & Hotels.com Scraper with the Apify API?
Yes. Use apify-client for Node.js or Python; the API tab has ready-to-paste code.
Can I use Expedia & Hotels.com Scraper through an MCP server?
Yes. Open the MCP tab, connect your MCP client and ask for hotels or reviews in plain language. Turn on compact for shorter rows.
Do I need an Expedia account, cookies or an API key?
No. Expedia & Hotels.com Scraper reads what Expedia shows any visitor; you pass destinations, hotel links, ids or names.
What is in the hotel details add-on of Expedia & Hotels.com Scraper?
Amenities by category, policies (check-in/out, pets, children), important info and fees, category scores, the 5-band rating histogram, Expedia's AI review summary, highlights, nearby places with walk/drive times, the photo gallery, and every room with its rates (meal plan, nightly and total price, payment options) for your dates.
Why did my Expedia & Hotels.com Scraper run return no results?
Most often the destination or hotel name was not matched (see notFound in RUN_SUMMARY, with candidates for names), filters removed every hotel or review (RUN_SUMMARY filtered and notes say which), or monitor mode had already delivered everything. A check-in date in the past does not empty a run: it is moved to tomorrow (see the run log). Nothing is charged for an empty run.
Is it legal to scrape Expedia?
Expedia & Hotels.com Scraper reads only publicly visible hotel listings and reviews; it does not log in. Review rows can contain first names, which data-protection laws such as the GDPR regulate, so by default (stripPersonalData) the reviewer and responder name fields are empty, and the greeting name, the reviewer's name and the staff name in the sign-off are taken out of hotel replies. A name staff write elsewhere in a reply can remain; turn off includeOwnerResponses to leave replies out. This actor is not affiliated with, endorsed or sponsored by Expedia Group, Expedia.com or Hotels.com; trademarks belong to their owners.
Your feedback
We keep improving Expedia & Hotels.com Scraper. Found a bug or missing a field? Open an issue on the Issues tab.

