Expedia Hotel Details Scraper avatar

Expedia Hotel Details Scraper

Pricing

from $0.84 / 1,000 hotel-scrapeds

Go to Apify Store
Expedia Hotel Details Scraper

Expedia Hotel Details Scraper

Scrape the full property record from Expedia and Hotels.com. Just add property IDs or hotel links and get name, address, coordinates, star class, guest score, amenities, check-in and check-out times, policies, fees and the property's own answered questions. $1.20 per 1,000 hotels.

Pricing

from $0.84 / 1,000 hotel-scrapeds

Rating

0.0

(0)

Developer

BonCross API

BonCross API

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

7 days ago

Last modified

Categories

Share

What is Expedia Hotel Details Scraper?

A hotel's page on Expedia holds a lot that never reaches a search result: the exact coordinates, the fees you pay at the desk, check-in times, the pet policy, the property's own answers to common questions. Expedia Hotel Details Scraper gets you all of it as one record per hotel, from Expedia or Hotels.com. Paste property IDs or hotel links. No dates are needed, because a property record doesn't change with the stay.

What you can count on:

  • Coordinates to six decimal places, with the full address, city, postcode and country. They're the property's own published position, good enough to map.
  • The charges a headline price hides. Destination fees, city tax, parking and resort charges are returned as the property wrote them, next to the optional extras.
  • Times as clock times. Check-in from, check-in until and check-out are returned as 15:00, 00:00 and 11:00, with the site's wording kept beside them.
  • Both scores. The official star class and the guest score out of 10, with the review count and the score by category. Measured on four properties, all five fields were present on all four.
  • About 250 hotels a minute. 150 properties took 35 seconds.

It costs $1.20 per 1,000 hotels on the Free plan and $0.84 on Business, with proxy usage and platform usage included.

BonCross Verified means we tested this actor against the live site before release and kept the record:

  • 23 of 23 live checks on its inputs and filters passed on 7 October 2026
  • 24 hotels run the same day across Expedia and Hotels.com, in two Expedia markets: 24 records, none empty

Typical jobs: geocoding a hotel list you already have, building a map layer for a city, showing guests the fees they'll pay on arrival, checking that your own property's policies, times and amenities are listed as you intended, and enriching a search or rates dataset with address and amenities. The answered questions about pets, parking and check-in are ready-made material for a chatbot.

What data is in the record?

🏨 Hotel name and property IDSite (Expedia or Hotels.com)
📍 Latitude and longitude📮 Full address and postcode
City, province and countryMarket the record came from
⭐ Star classGuest score, its wording and review count
Score by categoryWhat guests loved
✨ Popular amenitiesAmenities by category, in full
🕒 Check-in and check-out timesMinimum check-in age
Special check-in instructions💵 Fees payable at the property
Optional extrasWhat you need to know
🐾 Pet policyChildren and extra beds
💳 Card brands acceptedFull policy sections
❓ Answered questionsNeighbourhood write-up
♿ Accessibility detailImportant information
🖼 Photos, with captions where the site gives one🔗 Link to the hotel page

How to scrape Expedia hotel details

It's a form. You paste hotels in and download a table.

  1. Create a free Apify account.
  2. Open Expedia Hotel Details Scraper.
  3. Add property IDs or paste hotel page links into Hotels. For a long list, use Start URLs, which loads links from a file, a Google Sheet or a remote list.
  4. Choose Expedia or Hotels.com. A pasted link already names its own site.
  5. Click Start, and download the records as Excel, CSV, JSON, XML or HTML when the run finishes. Eight hotels take 6 to 9 seconds.

⬇️ Input

Paste property IDs or hotel page links, in any mix. The link https://www.expedia.com/Santorini-Hotels-Ira-Hotel-Spa.h6116875.Hotel-Information and the bare number 6116875 mean the same hotel. You can get IDs for a whole destination from Expedia Hotel Search Scraper.

Each property is one row, and there's a single limit: "Maximum rows for the whole run" stops the run once that many properties have been returned. 0 means no limit.

Three hotels on three continents

{
"hotels": [
"12570",
"https://www.expedia.com/Santorini-Hotels-Ira-Hotel-Spa.h6116875.Hotel-Information",
"375613"
]
}

A compact record: no photos, no long lists

{
"hotels": ["12570", "1723187"],
"includePhotos": false,
"includeAmenityGroups": false,
"includePolicies": false,
"includeFaqs": false
}

The same hotels read from Hotels.com

{
"hotels": ["12570", "3388", "22902"],
"site": "hotels"
}

Read from another country's site

{
"hotels": ["12570", "6116875"],
"market": "uk",
"maxItems": 500
}

The four include switches are all on by default. They control the long blocks: the full policy sections, the answered questions, the photo gallery (most of a row's size, around 90 images on a typical hotel) and the full amenity list. Turn them off for a compact record of name, address, coordinates, stars, guest score, amenities and times. The summarised policy columns (check-in and check-out, fees, pets, children and the rest) stay either way.

Market picks which country's site to read. Expedia runs 40 of them, and a record is read from one per run. Leave it on Auto and the first pasted link's own site sets the market, while a list of bare property IDs uses the US site. The property IDs are the same in each market, and each row says which one it came from.

What changes with the market is the link in each row, the order of the address lines and any note that country's site adds for its own law. The French site, for one, adds a French tax-code disclosure to "You need to know". The property's own text is the same wherever you read it. Nothing here is priced, which means the market doesn't affect any money. For rates, use Expedia Room Rates Scraper.

Label language is English by default. The market's own language translates the site's labels (amenity names and groups, section headings) and leaves the property's own text as written. The summarised policy columns are filled either way.

For developers

  • The switches are includePolicies, includeFaqs, includePhotos and includeAmenityGroups. maxItems is the only row limit.
  • startUrls takes the same links as hotels, and the two are combined.
  • site applies to bare property IDs only. A pasted link overrides it, and a list mixing Expedia and Hotels.com links is read correctly.
  • For a schedule, give dedupStoreName a name and set onlyNew. Each run then returns only properties no earlier run returned.
  • maxConcurrency (default 4, up to 8) is how many hotels are fetched at once. delayMs (default 0) pauses after each request, per parallel lane, and values above 2000 are treated as 2000. The defaults suit almost any run.
  • If the platform moves or restarts a run part-way, it carries on where it stopped. Properties already in the dataset aren't fetched, delivered or billed again. Restarting a 150-property run part-way gave the same 150 rows as an uninterrupted run.

⬆️ Output

One row per property. This is the Hilton Chicago, read on 7 October 2026. The long lists and texts are shortened here, and the real record has 202 photos.

{
"id": 12570,
"brand": "expedia",
"market": "us",
"hotelId": 12570,
"name": "Hilton Chicago",
"lat": 41.872505,
"lng": -87.62482,
"address": "720 S Michigan Ave, Chicago, IL, 60605",
"city": "Chicago",
"province": "IL",
"countryCode": "USA",
"postcode": "60605",
"stars": 4,
"rating": 8.6,
"ratingScale": 10,
"ratingText": "Excellent",
"reviewCount": 3380,
"categoryRatings": [
{ "name": "Cleanliness", "score": 8.8 },
{ "name": "Amenities", "score": 8.6 },
{ "name": "Service", "score": 8.8 }
],
"vipMessage": null,
"isVipAccess": false,
"neighbourhoodTitle": "About the neighborhood",
"neighbourhood": "Located in Downtown Chicago, a neighborhood in Chicago, Hilton Chicago is near the airport and near a metro station...",
"amenities": ["Pool", "Hot Tub", "Pet friendly", "Free WiFi", "Restaurant", "Air conditioning"],
"amenityGroups": [
{ "group": "Property amenities",
"categories": [
{ "category": "Parking and transportation",
"items": ["Covered self parking on site (USD 72 per night)", "Covered valet parking on site (USD 88 per day)", "Wheelchair-accessible parking and van parking available"] }
] }
],
"photos": ["https://images.trvl-media.com/lodging/1000000/20000/12600/12570/fabe31cf.jpg?impolicy=resizecrop&rw=1200&ra=fit"],
"photoCaptions": [null],
"checkInFrom": "15:00",
"checkInUntil": "00:00",
"checkOutUntil": "11:00",
"checkInText": "Check-in start time: 3:00 PM; Check-in end time: midnight Early check-in subject to availability...",
"checkOutText": "Check-out before 11 AM Contactless check-out available Late check-out subject to availability...",
"minCheckInAge": 18,
"specialCheckInInstructions": "Front desk staff will greet guests on arrival at the property...",
"petPolicy": "Pets allowed for an extra charge of USD 100 per accommodation, per stay Service animals are welcome, and are exempt from fees Up to 75 lbs per pet",
"childrenPolicy": "Children are welcome Children up to the age of 18 years can stay for free if using existing beds when occupying the parent or guardian's room...",
"fees": "You'll be asked to pay the following charges at the property. Fees may include applicable taxes: • Destination fee: USD 29.35 per accommodation, per night We have included all charges provided to us by the property.",
"optionalExtras": "• Fee for full breakfast: approximately USD 35 for adults and USD 17 for children • Fee for in-room wireless internet: USD 12.95 per day (rates may vary)...",
"youNeedToKnow": "Extra-person charges may apply and vary depending on property policy Government-issued photo identification and a credit card may be required at check-in for incidental charges...",
"weShouldMention": "The property has connecting/adjoining rooms, which are subject to availability...",
"paymentCards": ["American Express", "Diners Club", "Discover", "JCB International", "Mastercard", "Visa"],
"policies": [
{ "section": "Policies", "heading": "Check-in",
"lines": ["Check-in start time: 3:00 PM; Check-in end time: midnight", "Early check-in subject to availability"] }
],
"importantInfo": [
{ "section": "Important information", "heading": "Fees",
"lines": ["You'll be asked to pay the following charges at the property. Fees may include applicable taxes:", "• Destination fee: USD 29.35 per accommodation, per night", "We have included all charges provided to us by the property."] }
],
"highlights": [
{ "text": "Relax in the indoor pool", "detail": "A rare find in this area - enjoy a swim, whatever the weather." }
],
"accessibility": [
{ "section": "Accessibility", "heading": "Common areas",
"lines": ["Wheelchair accessible (may have limitations)", "Assistive listening devices", "Braille/raised signage"] }
],
"faqs": [
{ "question": "Is Hilton Chicago pet-friendly?",
"answer": "Yes, this property allows pets with a maximum weight of up to 75 lbs per pet. There's a fee of USD 100 per accommodation, per stay. Service animals are exempt from fees." }
],
"url": "https://www.expedia.com/en/h12570.Hotel-Information",
"scrapedAt": "2026-10-07T20:25:51.363Z"
}

A few notes on the columns:

  • policies and importantInfo hold the same content as the summarised fields, section by section, each with its heading and its lines. Nothing the site publishes is lost to the summarising.
  • stars is the property's official class (1 to 5, half stars included). rating is the guest score out of ratingScale (10), ratingText the site's word for it and reviewCount the number of verified reviews the site states. categoryRatings has the per-category scores shown beside it.
  • amenities is the short set the site highlights first. amenityGroups is the complete list, grouped the way the site groups it. It ran to around 36 to 108 entries per hotel on the properties measured.
  • paymentCards is null when the property publishes none. photos and photoCaptions line up index by index, with null where a photo has no caption.
  • vipMessage is only filled for a VIP Access property. It's null wherever isVipAccess is false.
  • minCheckInAge is null where the property states no minimum age.
  • hotelId joins these rows to the search, room rates and reviews actors listed at the end.
  • A hotel the site never answered is written as a row with an error, and is never charged.

Expedia or Hotels.com: which should you read?

The two sites share property IDs and publish the same hotel, and you can read either with the same input and get the same columns. They don't fill them equally.

Hotels.com is available on the United States market only, where it answered 6 of 6 properties in testing. It publishes a shorter policy record. You get its fees, optional extras, pet, children and house policies (fees, optionalExtras, petPolicy, childrenPolicy, youNeedToKnow, and the full text in policies). The check-in and check-out times, special check-in instructions, accepted cards, neighbourhood text, weShouldMention and importantInfo were empty on all six Hotels.com properties measured. If you need those, read the same property ID on Expedia.

Hotels.com Japan isn't supported. Each hotel asked for there returns a row with an error that says so, at no charge. Use the Expedia site for Japan (expedia.co.jp). And if Hotels.com doesn't answer for a property on a given run, that property returns an uncharged error row saying so. Run it again later.

How fast is it?

One request per property returns the whole record, and several properties are fetched at the same time. Measured on Apify on 2 October 2026, on Tokyo properties:

RunRowsRun time
2 properties23 to 5 s
8 properties86 to 9 s
40 properties4011 s
150 properties15035 s

That works out at about a quarter of a second per property on a larger run, or roughly 250 a minute. 500 properties take about two minutes, and around 15,000 fit in the default one-hour run limit.

On that day's sample, name, address, coordinates, check-in and check-out times, amenities and answered questions were present on five of five properties.

How much does it cost?

EventFree planStarterScaleBusiness
actor-start, once per run$0.002$0.002$0.002$0.002
hotel-scraped, per property returned$0.0012$0.00108$0.00096$0.00084

Enterprise plans pay the Business price.

$1.20 per 1,000 hotels on the Free plan, $0.84 on Business. Nothing is added to that: proxy usage and platform usage are included, and you don't set up a proxy.

  • 100 properties: $0.002 + 100 × $0.0012 = $0.122 ($0.086 on Business).
  • 1,000 properties: $0.002 + 1,000 × $0.0012 = $1.202 ($0.842 on Business).

Apify's Free plan includes $5 of credits a month. That's about 40 runs of 100 hotels, or roughly 4,000 property records, without paying.

A hotel the site never answered costs nothing.

FAQ

Where do I get the property IDs?

From the hotel's page link, which you can paste as it is: the ID is the number after the h. For a whole city, Expedia Hotel Search Scraper returns an ID for each hotel it lists.

Why is there no description of the hotel?

The property's "About this property" text isn't returned. It was empty on every property measured. The neighbourhood write-up, the highlights and the answered questions are the descriptive text you do get.

Can I get the fees as numbers?

Not directly. Fees and policies are prose, as the property wrote them. You get them as text, cleaned of markup, but not parsed into amounts. In the Hilton Chicago record above the destination fee reads "USD 29.35 per accommodation, per night".

How do I make the rows smaller?

Turn off "Include photos" first, because the gallery is most of a row. Then "Include the full amenity list", "Include policies and fees" and "Include answered questions".

Does the record include room types or prices?

Neither. A property record takes no dates, and prices need them. Rooms and rates come from Expedia Room Rates Scraper, and search prices from Expedia Hotel Search Scraper.

Why does a time read "midnight" in the text?

checkInText and checkOutText are as published, and a property can write "midnight" or "noon". The parsed columns (checkInFrom, checkInUntil, checkOutUntil) give you the clock time.

Can I read one hotel from two markets in one run?

One market per run. Each country's site is its own listing, and the property IDs match across them. Run the hotel once per market you want.

What are the limits?

  • There's no marketing description, and fees and policies are text, not parsed amounts.
  • Hotels.com is read on the United States market only and publishes a shorter policy record, as described above.
  • Room-level detail isn't here. Expedia Room Rates Scraper returns rooms and rates.
  • One market per run.
  • vipMessage, minCheckInAge and paymentCards are null where the property doesn't publish them.

Do I need proxies or an account?

You need neither. There's no login to give it, and proxy usage is part of the price.

The actor reads only pages Expedia and Hotels.com serve to a logged-out visitor. It takes no account access and collects no private data. Scraping public data is generally lawful in the UK, EU and US. You're responsible for how you use what you collect, including under GDPR where it identifies a person, and for the site's own terms.

From your own tools

To keep adding hotels to a table, schedule the run in Apify with a memory store named and "Only new properties" on. Each run then returns only the hotels you don't have yet. Results can go on to Google Sheets, Airbyte, Make or Zapier, or to your own endpoint through a webhook.

curl -X POST "https://api.apify.com/v2/acts/boncross~expedia-hotel-details/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"hotels":["12570"]}'

For an AI agent, add the Apify MCP server (mcp.apify.com) to your client and call boncross/expedia-hotel-details. It can then answer questions about a hotel's location, times, fees and policies from the record.

More from BonCross

Your feedback

Is a field empty that the hotel's page clearly shows, or do you need something the record doesn't have? Raise it on the Issues tab in Apify Console. BonCross reads every issue and replies there.