Expedia Hotel Scraper avatar

Expedia Hotel Scraper

Pricing

from $0.50 / 1,000 results

Go to Apify Store
Expedia Hotel Scraper

Expedia Hotel Scraper

Expedia hotel scraper for prices, ratings, photos, and room-by-room pricing breakdowns. Search by destination, hotel name, or URL - no API needed. Get per-room pricing, discounts, and amenities most Expedia scrapers miss, for any property worldwide.

Pricing

from $0.50 / 1,000 results

Rating

0.0

(0)

Developer

MrDoe

MrDoe

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

5 days ago

Last modified

Share

Extract hotel listings from Expedia.com, the world's largest online travel marketplace with millions of properties across 200+ countries. Get comprehensive data including prices, ratings, photos, and location details for any destination — delivered as clean, structured data ready for analysis, monitoring, or your own product.

Looking for guest reviews instead? See the companion Expedia Review Scraper.

Run it on the Apify platform for on-demand or scheduled runs, API access, and integrations with the tools you already use.

What does Expedia Hotel Scraper do?

This Actor collects hotel data from Expedia in three ways:

  • Search by destination. Type a city name, get back a list of hotels with a headline price, rating, and photos for your selected dates — one row per hotel, for comparing across a city.
  • Fetch by URL. Paste a specific Expedia hotel URL and get back every room type that hotel offers, each with its own price, strikeout discount, and facility list (bed configuration, size, view, WiFi, etc.) — one row per room, for a complete picture of a single property.
  • Find by hotel name. Don't have a URL? Type the hotel's name (e.g. "Hilton Garden Inn Dubai Mall Of The Emirates") and the Actor finds that exact property and returns its full room breakdown, same as fetch-by-URL. If the name doesn't match anything closely enough, nothing is scraped and the run tells you why instead of returning the wrong hotel; if it matches closely but not perfectly (a typo, a shortened name), it still scrapes the best match and flags that assumption on every output row.

Paste a search URL instead of a hotel URL and you get the destination-search behavior (one row per matching hotel) at that URL's filters.

Key features

FeatureDescription
Destination searchType any city; the Actor resolves it to the correct Expedia region
URL modeAccepts hotel URLs and Expedia search URLs
Deeplink supportExpedia share links (expe.onelink.me and similar) are auto-resolved to the canonical hotel URL
Date and guest filtersCheck-in/out dates, adults, rooms, children with ages
Price and rating filtersMin/max price, star ratings, sort order
Photos and pricingUp to 4 images per hotel, nightly price, strikeout discounts
Full room breakdownFetching a specific hotel returns every room type it sells, each with its own price and facilities
Find by hotel nameType a hotel's name instead of hunting for its URL; low-confidence matches are flagged, not silently guessed

What data can you extract?

Hotel cards (destination search or search URL)

  • Identity and location — property ID and URL, name, star rating, destination context
  • Pricing — headline nightly price (numeric and formatted), strikeout price when discounted, currency
  • Reviews (aggregate) — overall rating (0–10), rating label (Good, Excellent, etc.), total review count
  • Media and dates — gallery image URLs, check-in/check-out dates, adult count used for search

Room records (specific hotel URL)

  • Everything in a hotel card, repeated on every room row for context (name, rating, review count)
  • Room name — e.g. "Twin Room, 2 Twin Beds", "Suite, 1 Bedroom", "Family Suite, 2 Bedrooms"
  • Room price — nightly price and strikeout discount for that specific room type
  • Facilities — bed configuration, room size, view, WiFi, cancellation terms, and other amenities Expedia lists for that room

How to use Expedia Hotel Scraper

Search by destination

{
"mode": "search",
"destination": "Paris",
"adults": 2,
"currency": "USD",
"maxItems": 50
}

Filter by price and star rating

{
"mode": "search",
"destination": "Tokyo",
"checkIn": "2026-09-10",
"checkOut": "2026-09-13",
"adults": 2,
"starRatings": ["4", "5"],
"minPrice": 150,
"maxPrice": 400,
"sortBy": "REVIEW"
}

Get every room type for a specific hotel

{
"mode": "url",
"startUrls": [{ "url": "https://www.expedia.com/Example-City-Hotels-Sample-Hotel.h11111.Hotel-Information" }],
"checkIn": "2026-09-10",
"checkOut": "2026-09-13"
}

Returns one record per room type the hotel sells for those dates (Standard, Deluxe, Suite, etc.), each with its own price and facility list. Pass several hotel URLs in startUrls to do this for more than one property in a single run.

Find a hotel by name (no URL needed)

{
"mode": "hotelName",
"hotelName": "Hilton Garden Inn Dubai Mall Of The Emirates",
"destination": "Dubai",
"checkIn": "2026-09-10",
"checkOut": "2026-09-13"
}

Returns the same room-by-room breakdown as fetch-by-URL, but starting from just a name. destination is optional here — add it when the hotel name alone could match more than one property (e.g. a hotel chain with several locations). If nothing matches closely enough, the run finishes with zero records and a message explaining why, rather than returning an unrelated hotel; a close-but-imperfect match is still used, with the assumption noted in extra.hotelNameMatch on every returned row.

Share links generated by the Expedia mobile app's "Share" button, as well as marketing and social deeplinks, are accepted as-is. The Actor follows the redirect, identifies the hotel, and extracts it like any other URL.

{
"mode": "url",
"startUrls": [{ "url": "https://expe.onelink.me/hnLd/9o2lnq8o" }]
}

Supported deeplink hosts: expe.onelink.me (primary), expe.app.link, trip.expedia.com. Only Expedia hotel deeplinks are handled. Hotels.com and Vrbo short links are out of scope for this release.

Use a search URL

Paste an Expedia search URL with your filters already applied. The Actor returns matching records up to maxItems.

{
"mode": "url",
"startUrls": [
{ "url": "https://www.expedia.com/Hotel-Search?destination=Barcelona&d1=2026-07-01&d2=2026-07-05&adults=2" }
],
"maxItems": 200
}

Family travel with children

{
"mode": "search",
"destination": "Orlando",
"adults": 2,
"children": ["5", "10"],
"rooms": 1
}

Input parameters

ParameterTypeDefaultDescription
modestringsearchsearch, url, or hotelName
destinationstringParisCity name (search mode); optional narrowing hint (hotelName mode)
hotelNamestringHotel name to look up (hotelName mode)
startUrlsobject[]Expedia URLs (URL mode)
destinationIdstringOptional numeric region ID. Skips auto-resolution
checkInstringtomorrowYYYY-MM-DD or a relative offset like 1 day
checkOutstringday after tomorrowYYYY-MM-DD or a relative offset like 2 days
adultsinteger2Adult guests, 1 to 14
childrenstring[][]Ages of children, 0 to 17 (one entry per child)
roomsinteger1Rooms to book, 1 to 8
minPriceintegerMinimum nightly price
maxPriceintegerMaximum nightly price
starRatingsstring[][]One or more of 1, 2, 3, 4, 5
sortBystringRECOMMENDEDRECOMMENDED, PRICE_LOW_TO_HIGH, PRICE_HIGH_TO_LOW, DISTANCE, PROPERTY_CLASS, REVIEW
currencystringUSD3-letter ISO code
maxItemsinteger5Hard cap on total records
proxyConfigurationobjectApify ResidentialProxy configuration

Output example

Hotel card (destination search or search URL)

{
"mode": "search",
"placeName": "Example Hotel Paris",
"hotelId": "11111",
"hotelUrl": "https://www.expedia.com/Example-City-Hotels-Sample-Hotel.h11111.Hotel-Information",
"hotelOverallRating": 9.2,
"hotelRatingLabel": "Wonderful",
"hotelTotalReviews": 1843,
"provider": "expedia",
"scrapedAt": "2026-04-18T07:30:00.000Z",
"extra": {
"searchDestination": "Paris",
"starRating": 5,
"priceFrom": 420,
"priceFormatted": "$420 nightly",
"priceStrikeout": "$600",
"currency": "USD",
"images": [
"https://images.example.com/lodging/sample-1.jpg",
"https://images.example.com/lodging/sample-2.jpg"
],
"checkIn": "2026-07-01",
"checkOut": "2026-07-03",
"adults": 2
}
}

Room record (specific hotel URL)

{
"mode": "rooms",
"placeName": "Example Hotel Paris",
"hotelId": "11111",
"hotelUrl": "https://www.expedia.com/Example-City-Hotels-Sample-Hotel.h11111.Hotel-Information",
"hotelOverallRating": 9.2,
"hotelRatingLabel": "Wonderful",
"hotelTotalReviews": 1843,
"provider": "expedia",
"scrapedAt": "2026-04-18T07:30:00.000Z",
"extra": {
"roomName": "Deluxe Room, City View",
"facilities": ["City view", "355 sq ft", "Sleeps 3", "1 King Bed", "Free WiFi"],
"priceFrom": 420,
"priceFormatted": "$420 nightly",
"priceStrikeout": "$600",
"currency": "USD",
"checkIn": "2026-07-01",
"checkOut": "2026-07-03",
"adults": 2,
"starRating": 5,
"hotelCategoryRatings": {
"Cleanliness": 9.4,
"Service": 9.3
},
"hotelNameMatch": null
}
}

hotelNameMatch is only set (non-null) when the run used mode: "hotelName". It records what you typed, which hotel name it was matched to, a confidence score, and — when the match wasn't exact — a plain-language note explaining the assumption:

"hotelNameMatch": {
"query": "Hilton Garden Inn Dubai Mal",
"matchedName": "Hilton Garden Inn Dubai Mall Of The Emirates",
"score": 0.9,
"confident": false,
"note": "Hotel name \"Hilton Garden Inn Dubai Mal\" didn't match any hotel exactly (best match 90% confidence). Assumed you meant \"Hilton Garden Inn Dubai Mall Of The Emirates\" and scraped that hotel. If this is wrong, use a more exact name, add a destination to narrow the search, or use a direct hotel URL instead."
}

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel from the Apify Console or API.

Tips

  • Use maxItems to control run size. The Actor saves matching records until that limit is reached or there are no more results.
  • A specific hotel URL returns one row per room type, so a hotel with 7 room types uses up to 7 of your maxItems on its own — size maxItems accordingly when passing several startUrls.
  • destinationId speeds up search. Pass the numeric ID from any Expedia URL (the segment after .d) to skip name resolution.
  • Need reviews for a hotel? Use the companion Expedia Review Scraper — it accepts the same hotel URLs.
  • In hotelName mode, add destination whenever the hotel name alone could match a chain's multiple locations (e.g. "Hilton Downtown" exists in many cities) - it narrows the lookup instead of relying on the name alone.
  • Some fields (star rating) are only populated when Expedia itself publishes that data for a given property — they're left blank rather than guessed.

Pricing

This Actor is priced per result (per hotel card or per room record). There's no artificial ceiling on maxItems — raise it as high as you need for your use case. Runs use Apify's proxy network, which is included in your Apify plan's usage.

FAQ & support

Is this legal? This Actor extracts publicly available information from Expedia.com pages that anyone can view in a browser. You are responsible for using the collected data in compliance with applicable laws and Expedia's terms of service.

Some fields are empty for a hotel — why? Not every property on Expedia carries every field (e.g. an official star rating). The Actor never fabricates data — a missing field means Expedia itself doesn't expose it for that listing.

I typed a hotel name and got zero results — why? The name didn't match any hotel closely enough for the Actor to be confident it's the right one, so it scraped nothing rather than guessing. Check the run log for the exact warning, try a more complete/exact name, add destination to narrow the search, or switch to a direct hotel URL if you have one.

Found a bug or have a feature request? Open an issue on the Actor's Issues tab, or reach out for a custom data extraction solution tailored to your needs.