Expedia logoHotels.com logo

Property & travel · Coming soon

Expedia & Hotels.com Scraper: Hotel Prices and Reviews

Enter a place and dates, or exact hotels. You get one row per hotel with the price the site shows for those dates. It can also save guest reviews and watch price changes.

Built and tested. Prices will be shown after release.

Coming soon to the Apify StoreFollow us on Apify

What you get, for example

typehotel
hotelId7369640
nameMeliá Lisboa Aeroporto

How it will work: 3 steps

  1. Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
  2. Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example: search in What to do. Each start is one run.
  3. Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.

What it does

This Actor reads public hotel lists and hotel pages on Expedia and Hotels.com. It returns hotels with prices for your dates, ratings, addresses, coordinates and guest reviews.

  • search finds hotels in a place.
  • hotels reads exact hotels by ID or link.
  • reviews collects guest reviews for exact hotels.
  • monitor saves only hotels that are new or whose price changed since the last run.

Good for

  • Compare hotel prices in a city for chosen dates.
  • Compare one hotel's price across many dates.
  • Export guest reviews of your own hotel or of competitors.
  • Get a signal when a hotel price changes.

Who uses it

Travel analysts

Compare hotel prices in a city for chosen dates.

Hotel revenue teams

Check your own hotel and rivals across many dates.

Developers

Get hotel data as JSON or CSV for your own tools.

Price

Prices will be shown after release.

Questions

Do I need an account or a login?

No. The tool reads public pages only. You need an Apify account.

Are Expedia and Hotels.com prices the same?

Not always. Run both and compare price by hotelId.

Which prices do I get?

The prices a visitor who is not signed in sees. Member and app prices are not included.

Can I get more than 500 hotels in a city?

Not in one place search. Split the city into areas in destinations, or use filters such as stars.

What happens if a place or hotel does not exist?

A hotel ID that does not exist gives a free not_found row and status NOT_FOUND. For a place name, the site usually picks its nearest match, so check matchedPlace.

How fresh are the prices?

Each row has fetchedAt. The price is what the site showed at that time. The Actor does not promise that the price stays the same or that you can book it.

Details

Step by step on Apify
  1. Open the Input tab. Keep Expedia in Website (box 1), or choose Hotels.com.
  2. Keep Lisbon in Destination (box 2), or type your place.
  3. Open How much to collect (box 3) if you want to change the limit or the dates.
  4. Click Start.
  5. Open the Output tab and check the Hotels view (box 5).
Use cases
TaskInputYou getKey fieldsNext step
Compare hotel prices in a citydestination, checkIn, checkOutHotel rowname, price, rating, urlCSV export, spreadsheet
Compare prices across dateshotelIds, staysOne hotel row per date pairhotelId, checkIn, checkOut, priceAPI, your own database
Read guest reviewsmode = reviews, hotelIdsReview rowrating, text, dateCSV export, text analysis
Watch price changesmode = monitor, destinationChanged hotel rowchange, previousPrice, priceSchedule, Slack or Notion summary
See where a hotel stands in its marketmarketSummary, subjectHotelMarket summary rowmedianPricePerNight, subjectPricePercentileReport, spreadsheet
Tips for better results
  • The sites show about 500 hotels per place and dates. Split a city into areas for more.
  • Use monitor mode to save only new hotels or hotels with a changed price.
  • Run both sites and compare price by hotelId. Do not assume they match.
Limits and good to know
  • The sites show about 500 hotels per place and set of dates. Use smaller areas or several places to get more
  • maxReviews is at most 2000 per hotel. stays is at most 30 pairs. destinations and regionIds are at most 50 each
  • Prices are what the site shows to a visitor who is not signed in, in the United States. Member and app prices are not included. Taxes are as displayed
  • The Actor does not convert currency. It supports USD, GBP, EUR, CAD and AUD
  • It does not return hotel descriptions, spoken languages, amenities by category, the guest's name on a review, contact details, flights, cars or Vrbo listings. It does not book
  • Sites can change. If a hotel has no price for your dates, price is null and the hotel is still saved

For developers

Sample result

One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.

one result · JSON
{
  "type": "hotel",
  "hotelId": "7369640",
  "name": "Meliá Lisboa Aeroporto",
  "stars": 4,
  "rating": 9.2,
  "ratingLabel": "Wonderful",
  "reviewsCount": 3098,
  "price": 191,
  "pricePerNight": 171,
  "strikeoutPrice": null,
  "priceText": "$191 · $171 nightly · $191 total · Total with taxes and fees",
  "priceIncludesTaxes": true,
  "currency": "USD",
  "address": "Aeroporto Internacional de Lisboa, Rua C, Lisbon, 1700-008",
  "city": "Lisbon",
  "region": null,
  "postalCode": "1700-008",
  "countryCode": "PRT",
  "lat": 38.770382,
  "lng": -9.125218,
  "amenities": ["Pool", "Spa", "Free WiFi"],
  "url": "https://www.expedia.com/Lisbon-District-Hotels-Melia-Lisboa-Aeroporto.h7369640.Hotel-Information?chkin=2026-12-05&chkout=2026-12-06",
  "image": "https://images.trvl-media.com/lodging/8000000/7370000/7369700/7369640/b05af088.jpg?impolicy=resizecrop&ra=fit&rw=455&rh=455",
  "neighborhood": "Olivais",
  "badges": [],
  "site": "expedia",
  "host": "www.expedia.com",
  "destination": "Lisbon",
  "matchedPlace": "Lisbon, Lisbon District, Portugal",
  "regionId": "2080",
  "checkIn": "2026-12-05",
  "checkOut": "2026-12-06",
  "adults": 2,
  "rooms": 1,
  "source": "Expedia",
  "fetchedAt": "2026-11-05T05:25:37.426Z"
}
Data fields (40)
FieldTypeMeaning
typestringhotel, review, market_summary or not_found. Use this column to tell rows apart.
hotelIdstringThe hotel number on Expedia and Hotels.com.
namestringHotel name as published.
starsnumberStar rating; null when the site shows none.
ratingnumberGuest rating out of 10 on a hotel row, or the guest's score on a review row; null when none is shown.
ratingLabelstringThe word for the rating, such as Wonderful.
reviewsCountintegerNumber of guest reviews; null when not shown, 0 only when the site shows 0.
pricenumberTotal for the stay as the site displays it; null when no total is shown. No conversion.
pricePerNightnumberPrice per night when the site displays it.
strikeoutPricenumberOld crossed-out price when the site shows one.
priceTextstringThe price lines exactly as displayed.
priceIncludesTaxesbooleantrue when a price line mentions taxes; null when the site does not say.
currencystringCurrency actually shown by the site for this price.
addressstringStreet address.
citystringCity.
regionstringState or province.
postalCodestringPostal code.
countryCodestringCountry code.
latnumberLatitude; null when the site has no coordinates.
lngnumberLongitude; null when the site has no coordinates.
amenitiesarray/stringMain amenities as listed. Empty when none are listed.
urlstringPublic hotel page, with the dates when known.
imagestringMain image link.
neighborhoodstringArea shown on the search card.
badgesarray/stringLabels shown on the search card, such as VIP Access.
changestringMonitor mode: new, priceUp, priceDown, priceAppeared or priceGone.
previousPricenumberMonitor mode: the price from the previous run.
sitestringexpedia or hotels.
hoststringRegional site that was read.
destinationstringPlace as you typed it.
matchedPlacestringPlace the site really searched for this row. Empty when the row came from a hotel ID or the site did not report a place.
regionIdstringRegion number you gave, or the number the site reports for the searched place.
checkInstringCheck-in date of this price.
checkOutstringCheck-out date of this price.
adultsintegerAdults per room used for the price.
roomsintegerRooms used for the price.
roomOffersarray/stringPaid option: rooms with their rate plans.
policiesarray/stringPaid option: hotel policies.
imagesarray/stringPaid option: image links.
ratingBreakdownobject/stringPaid option: counts per score and scores per category.
Input settings (25)

The main fields of the input form. With the API you send them as JSON.

SettingName in the APITypeExample value
What to domodestring"search"
Websitesitestring"expedia"
Destinationdestinationstring"Lisbon"
More destinationsdestinationsarray
Region IDsregionIdsarray
Hotel IDshotelIdsarray
LinksstartUrlsarray
Check-in datecheckInstring"30 days"
Check-out datecheckOutstring"31 days"
More datesstaysarray
Adultsadultsinteger2
Children's ageschildrenAgesarray
Roomsroomsinteger1
Currencycurrencystring"USD"
Hotels per place and datesmaxItemsinteger10
Reviews per hotelmaxReviewsinteger
Sort hotels bysortBystring"recommended"
Star ratingstarsarray
Amenitiesamenitiesarray
Property typespropertyTypesarray
Hotel name containshotelNamestring
Free cancellation onlyfreeCancellationbooleanfalse
Breakfast included onlybreakfastIncludedbooleanfalse
Reserve now, pay later onlypayLaterbooleanfalse
Minimum price per nightminPricenumber

Start on Apify

Make a free Apify account: you get $5 of free usage every month. Missing a tool? Suggest it. We read every idea, but we do not promise to build it.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure