Expedia Hotels Scraper
Pricing
from $4.00 / 1,000 hotel scrapeds
Expedia Hotels Scraper
Scrape Expedia.com hotel search results by destination and dates or a Hotel-Search URL, with name, nightly price, total, star class, guest rating, review count, location, image, deal badges and property URL. Filter by stars, guest rating and price.
Pricing
from $4.00 / 1,000 hotel scrapeds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
2
Monthly active users
11 days ago
Last modified
Categories
Share
What is Expedia Hotels Scraper?
Expedia Hotels Scraper extracts Expedia.com hotel search results for a destination and dates, or for a Hotel-Search URL you already built, and returns one dataset row per hotel. Each row has the hotel name, nightly price, total stay price, strikethrough price, star class, guest rating and label, review count, neighborhood, coordinates, lead image, free-cancellation flag, result position and property URL. Travel analysts, revenue managers, travel-tech builders and AI travel assistants use it to compare rates and quality across a city for specific dates, with filters for stars, guest rating, price and free cancellation.
Best fit for this Actor
- Designed for search-result pages. Use it when the question is "which hotels show up for this place and these dates, and at what price".
- Two ways to start. Give a
destinationwithcheckInandcheckOut, or paste full Expedia Hotel-Search URLs instartUrls. - Filters before billing.
minStarRating,minGuestRating,minPrice,maxPriceandfreeCancellationOnlydrop hotels before they are saved, and filtered hotels add no events. - Automatic paging. The Actor pages through results until it reaches
maxResults, and dedupes hotels by ID. - Cross-site price checks. When you want the same city priced on another site, then run Hotels.com Scraper with the same destination and dates and compare by hotel name.
- Guest feedback next. For reviews on the hotels you shortlisted, continue with Tripadvisor Reviews Scraper.
What people and AI agents ask this Actor to do
Find 4-star-plus hotels in Paris for next weekend under $300 a night. List the cheapest hotels in Tokyo for these dates. Which Barcelona hotels near the center offer free cancellation?
| Request | Input to send |
|---|---|
| A city for two nights | {"destination": "New York, New York", "checkIn": "2026-11-12", "checkOut": "2026-11-14"} |
| Quality and budget filters | {"destination": "Paris, France", "minStarRating": 4, "maxPrice": 300} |
| Budget-first ordering | {"destination": "Tokyo, Japan", "sortBy": "priceLowToHigh", "maxResults": 30} |
| Flexible bookings only | {"destination": "Barcelona, Spain", "freeCancellationOnly": true} |
| A search you built on Expedia | {"startUrls": ["https://www.expedia.com/Hotel-Search?destination=Tokyo&startDate=2026-11-12&endDate=2026-11-14"]} |
Workflow example: weekly rate monitoring for a hotel group
A revenue manager starts with the group's home city as destination, a fixed two-night window, minStarRating set to 4 and maxResults at 100. The dataset returns each competing hotel's pricePerNight, totalPrice, guestRating, reviewCount and position. The manager exports the rows to the pricing sheet, compares the group's own properties with the competitive set, and schedules the same input weekly so rate changes by hotelId show up between exports.
How to scrape Expedia hotels
- Type a Destination the way you would on Expedia, and set Check-in and Check-out dates (they default to a two-night stay two weeks out).
- Set guests, rooms, Max results and any filters.
- Click Start, then export the dataset or read it through the API.
Input
{"destination": "New York, New York","checkIn": "2026-11-12","checkOut": "2026-11-14","adults": 2,"rooms": 1,"maxResults": 50,"sortBy": "recommended","minStarRating": 3,"currency": "USD","proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
| Field | Type | What it controls |
|---|---|---|
destination | string | City, region, neighborhood or landmark, as typed on Expedia. |
checkIn, checkOut | string | Stay dates in YYYY-MM-DD. Default two nights starting 14 days from today. |
adults, rooms | integer | Guests (1 to 14) and rooms (1 to 8). Defaults 2 and 1. |
startUrls | array | Full Expedia Hotel-Search URLs, used instead of destination. |
maxResults | integer | Hotels to return across pages, 1 to 1000. Default 50. |
sortBy | string | recommended, priceLowToHigh, starRating, guestRating or distance. |
minStarRating | integer | Keep hotels at this star class or higher, 0 to 5. |
minGuestRating | integer | Keep hotels at this guest score or higher, on the 0 to 10 scale. |
minPrice, maxPrice | integer | Nightly price range in the selected currency. |
freeCancellationOnly | boolean | Keep hotels whose card advertises free cancellation or a fully refundable rate. |
currency | string | Currency label for output prices. Default USD. |
proxyConfiguration | object | Apify Proxy. Residential is preset and recommended for Expedia. |
Output
| Field | What it contains |
|---|---|
recordType, hotelId, position | Record type, Expedia property ID and rank across pages |
name, propertyUrl, image | Hotel name, Expedia property link and lead photo |
pricePerNight, totalPrice, strikethroughPrice | Lead nightly price, stay total and was-price when a deal shows |
priceLabel, currency | Price as displayed, and the currency label |
starRating, guestRating, guestRatingLabel, reviewCount | Star class, guest score, its word label and review count |
neighborhood, latitude, longitude | Area name and map coordinates when shown |
freeCancellation | true when the card advertises free cancellation or a refundable rate |
searchQuery, scrapedAt | The destination searched, and collection time |
Example record shape (illustrative values):
{"recordType": "hotel","hotelId": "1234567","name": "Example Midtown Hotel","propertyUrl": "https://www.expedia.com/New-York-Hotels-Example-Midtown-Hotel.h1234567.Hotel-Information","image": "https://images.trvl-media.com/lodging/2000000/1230000/1234500/1234567/example.jpg","starRating": 4,"guestRating": 8.6,"guestRatingLabel": "Excellent","reviewCount": 1842,"pricePerNight": 219,"strikethroughPrice": 259,"totalPrice": 492,"priceLabel": "$219","currency": "USD","neighborhood": "Midtown","latitude": 40.7549,"longitude": -73.984,"freeCancellation": true,"position": 3,"searchQuery": "New York, New York","scrapedAt": "2026-10-01T12:00:00.000Z"}
When a request returns no hotels, the dataset holds one free diagnostic row with hotelId set to diagnostic and a _warnings note, so scripts and agents can tell it apart from a hotel record at a glance.
Pricing
This Actor uses Pay per event plus Apify platform usage. Two events apply: Actor start once per run, and Hotel scraped once per hotel row returned. Hotels removed by your filters and the diagnostic row add no hotel events. For example, a city search with maxResults set to 50 creates up to 50 Hotel scraped events plus one Actor start event, plus the platform usage for the run, including residential proxy traffic. The live Pricing tab on this page shows the current event prices.
API example
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~expedia-hotels-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"destination": "Paris, France", "checkIn": "2026-11-12", "checkOut": "2026-11-14", "maxResults": 20, "minStarRating": 4}'
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("khadinakbar/expedia-hotels-scraper").call(run_input={"destination": "Barcelona, Spain","checkIn": "2026-11-12","checkOut": "2026-11-15","sortBy": "priceLowToHigh","maxResults": 25,})for hotel in client.dataset(run["defaultDatasetId"]).iterate_items():print(hotel.get("name"), hotel.get("pricePerNight"), hotel.get("guestRating"))
Use with AI agents through Apify MCP
Connect this Actor to Claude, ChatGPT, Cursor or any MCP client through Apify MCP, then ask:
Find up to 20 hotels in Lisbon, Portugal for November 12 to 14 with at least 4 stars and a guest rating of 8 or higher. Sort by nightly price and give me name, price per night, total, rating and the Expedia link.
Agent checklist:
- Set
destination, both dates andmaxResults; the cap sets the cost ceiling. - Add filters such as
minStarRating,minGuestRatingormaxPriceso only matching hotels are billed. - Read rows with
get-dataset-items, keep rows whererecordTypeishotelandhotelIdis a property ID, and citepropertyUrl. - Read
_warningson a diagnostic row and suggest a fresh run with Residential proxy.
Best results
| Starting situation | Helpful action | Expected outcome |
|---|---|---|
| Any Expedia run | Keep the preset Residential proxy | Steady access to result pages |
| Budget research | Use sortBy: "priceLowToHigh" with maxPrice | Lowest-priced hotels first |
| Quality shortlist | Set minStarRating and minGuestRating | Only hotels that meet both bars |
| A complex search with Expedia filters | Build it on Expedia and paste the URL in startUrls | Exactly the search you configured |
| Rate tracking | Schedule fixed dates and compare pricePerNight by hotelId | A price history per property |
| Flexible travel plans | Set freeCancellationOnly to true | Hotels advertising free cancellation |
Builder's note
I built this for rate comparison, so each row is one hotel with both the nightly and total price for the exact dates you asked about. I learned that filters matter most when they run before billing, which is why star, rating, price and cancellation filters drop hotels before anything is saved. My goal was a dataset that is easy to diff week over week, which is why every row carries its hotelId and position.
FAQ
Which Expedia site does it read?
Expedia.com search results, priced as Expedia.com shows them. currency labels the output.
Can I get a single hotel's reviews?
This Actor reads search result pages. For reviews, pass the hotel names to Tripadvisor Reviews Scraper.
Are hotels charged twice across pages?
No. Hotels are deduplicated by hotelId, so each property is one event.
What does a diagnostic row mean?
The request returned no hotels. It is free, and its _warnings note explains the next step.
Responsible use
This Actor collects publicly available hotel search data from Expedia.com. Use it in line with Expedia's terms of use and applicable laws, including data-protection rules such as the GDPR and CCPA, and respect intellectual-property rights in photos and descriptions. Expedia is a trademark of its owner, and this independent Actor is not affiliated with or endorsed by Expedia Group.