Google Hotels Scraper avatar

Google Hotels Scraper

Pricing

$1.00 / 1,000 results

Go to Apify Store
Google Hotels Scraper

Google Hotels Scraper

Find public hotel listings by destination and stay dates, with nightly and total prices, ratings, amenities, photos, nearby places, and property links.

Pricing

$1.00 / 1,000 results

Rating

0.0

(0)

Developer

MLG Data

MLG Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Scrape Google Hotels listings for cities, neighborhoods, and landmarks with stay dates, nightly prices, total stay prices, guest ratings, amenities, photos, and nearby places. Export Google Hotels data to CSV, JSON, or a spreadsheet for accommodation research, rate tracking, and destination comparisons; this actor provides a structured alternative to manually reviewing Hotel Search pages.

What data can you extract from Google Hotels?

Each dataset item describes one property found for one input location and stay. The search is public and does not require a guest account. A field can be empty when the listing does not show it.

FieldDescriptionExample
hotelIdPublic property identifier used for deduplication0x47e66e67ab78db57:0x4012cab02f7b7804
hotelNameName displayed on the listingGlint Paris
hotelUrlLink to the property's Hotel Search detail pagehttps://www.google.com/travel/hotels/entity/...
locationInput place that produced the resultParis
searchUrlSearch page used to retrieve the resulthttps://www.google.com/travel/search?...
propertyTypeProperty category when identified in the listinghotel
hotelDescriptionShort description shown by the search pageModern rooms & suites...
gpsLatitudeProperty latitude48.8886187
gpsLongitudeProperty longitude2.3498362
hotelClassDisplayed classification, if present4-star tourist hotel
starRatingNumeric hotel classification, if present4
overallRatingPublic guest rating out of five4.5
reviewCountCount of public guest reviews3184
checkInTimeDisplayed arrival time3:00 PM
checkOutTimeDisplayed departure time11:00 AM
pricePerNightNumeric nightly price in currency66.27
pricePerNightDisplayRounded nightly price as displayed$66
totalRateNumeric full-stay amount when shown157.65
totalRateDisplayRounded full-stay price as displayed$158
currencyCurrency actually returned with the listingUSD
amenityCodesCodes for amenities marked as present[29, 2, 18]
imagesPublic property photo URLs, up to ten["https://lh3.googleusercontent.com/..."]
ratingsBreakdownReview distribution by star level[{"stars": 5, "percent": 71, "count": 2228}]
reviewsBreakdownMention counts and sentiment by topic[{"name": "Service", "sentiment": 0.76}]
nearbyPlacesNamed places and displayed travel times[{"name": "Château Rouge", "transportations": [...]}]
detailTokenPublic property route tokenChcIhPDt-4LWsolAGgsvZy8xdjZsNnQ2bRAB
bookingSourcesReserved for date-matched vendor quotes; empty in this version[]
checkInDateArrival date actually applied to the result2026-11-12
checkOutDateDeparture date actually applied to the result2026-11-14
scrapedAtUTC collection timestamp2026-09-27T07:51:56+00:00

The numeric and display price fields serve different purposes. The numeric amount can contain cents even when the page rounds the visible label to a whole unit. The total covers the selected stay when the page provides a total, while the nightly figure is a per-night amount. Use currency from each record when combining prices; a requested currency can be ignored by the search page.

The review distributions describe aggregated public ratings, not individual guest comments. Each ratingsBreakdown entry gives stars, percentage, and count. Each reviewsBreakdown entry gives a topic name, a sentiment value, the number of mentions, and positive and negative mention counts. The topic counts do not have to sum to the property's full review count.

How to scrape Google Hotels

  1. Enter one or more locations, such as a city or neighborhood.
  2. Set check-in and check-out dates in YYYY-MM-DD format. The departure date must be later than the arrival date.
  3. Choose a maximum number of results per location and, if useful, a total limit across all locations.
  4. Run the actor. It verifies that each listing's applied stay dates match your request before saving prices.
  5. Open the dataset to inspect property rows or download CSV, JSON, or spreadsheet output.

A location is a search phrase, not a geographic boundary. A search for a city can include nearby suburbs or airport properties if they appear in the public results. Use a more specific neighborhood or landmark when you need a narrower area. The location column keeps the original search term so rows from several searches remain distinguishable after export.

For recurring price checks, use the same locations, dates, language, and region each time. Compare records by hotelId, then by checkInDate, checkOutDate, and currency. Hotel prices change frequently, and some properties do not show an available rate for every stay.

Input

ParameterTypeDefaultDescription
locationsstring arrayRequiredPlaces to search; each entry produces a separate search.
checkInDatestringRequiredRequested arrival date in YYYY-MM-DD format.
checkOutDatestringRequiredRequested departure date in YYYY-MM-DD format.
adultsinteger2Currently fixed at two adults because the public page did not apply other guest counts reliably.
currencystringUSDRequested currency code. Check the returned currency field before comparing prices.
languageCodestringenInterface language for the search.
countryCodestringusRegional context for the search results.
maxResultsinteger20Maximum unique hotels to store for each location, up to 1,000 requested. Availability of new results is controlled by the site.
maxItemsinteger0Overall dataset cap; zero means no overall cap.
proxyConfigurationobjectEnabledConnection settings for retrieving the public pages.

Example for two cities:

{
"locations": ["Paris", "Tokyo"],
"checkInDate": "2026-11-12",
"checkOutDate": "2026-11-14",
"adults": 2,
"currency": "USD",
"languageCode": "en",
"countryCode": "us",
"maxResults": 20,
"maxItems": 40
}

The date range is an essential part of the search. A search page can silently fall back to its own default dates; this actor checks the dates in the structured listing data and discards the location when they do not match. A successful result therefore reports the dates used for its price rather than simply repeating the input.

maxResults applies independently to each location. For two locations at 20, the intended maximum is 40 rows. maxItems stops the entire run sooner if set below that sum. The limit is a ceiling, not a promise that a particular destination has that many public results.

Output example

The following values come from a 2026-09-27 run for a two-night Paris stay. Long image URLs and array contents are shortened here; the dataset contains the full values.

{
"hotelId": "0x47e66e67ab78db57:0x4012cab02f7b7804",
"hotelName": "Glint Paris",
"hotelUrl": "https://www.google.com/travel/hotels/entity/ChcIhPDt-4LWsolAGgsvZy8xdjZsNnQ2bRAB?q=hotels+in+Paris+November+12+to+14+2026",
"location": "Paris",
"propertyType": "hotel",
"gpsLatitude": 48.8886187,
"gpsLongitude": 2.3498362,
"overallRating": 4.5,
"reviewCount": 3184,
"pricePerNight": 66.27,
"pricePerNightDisplay": "$66",
"totalRate": 157.65,
"totalRateDisplay": "$158",
"currency": "USD",
"amenityCodes": [165, 29, 2, 18, 4, 27, 7, 11, 25],
"ratingsBreakdown": [
{"stars": 5, "percent": 71, "count": 2228}
],
"reviewsBreakdown": [
{"name": "Service", "sentiment": 0.7564954, "totalMentioned": 252, "positive": 232, "negative": 17}
],
"nearbyPlaces": [
{"name": "Château Rouge", "transportations": [{"type": 2, "duration": "3 min"}]}
],
"bookingSources": [],
"checkInDate": "2026-11-12",
"checkOutDate": "2026-11-14",
"scrapedAt": "2026-09-27T07:51:56.122755+00:00"
}

This is a listing snapshot, not a reservation or a guarantee that a room can still be booked at that rate. Visit the property link to verify the current offer and any conditions before making a decision. A total can be absent when the listing does not provide one.

Use cases

  • Destination research: Collect hotel names, locations, ratings, and classes for several candidate cities, then compare the available mix of properties.
  • Rate monitoring: Schedule the same stay search repeatedly and compare nightly and total rates for matching hotelId values over time.
  • Market mapping: Use coordinates and nearbyPlaces to see where listed hotels cluster relative to stations, landmarks, or airports.
  • Quality screening: Filter exported rows by rating, review count, and the distribution of star reviews before manual evaluation.
  • Accommodation catalogs: Build a structured shortlist with descriptions, property links, image URLs, amenities, and stay-specific pricing.
  • Travel planning: Compare the total displayed stay cost across locations, keeping dates and currency consistent so comparisons are meaningful.

How much does it cost to scrape Google Hotels?

The configured result price is $1 per 1,000 stored hotels, or $0.001 per hotel. Platform usage is included in that result price. A run that stores 40 hotels costs approximately $0.04; 100 stored hotels cost approximately $0.10; 5,000 stored hotels across many runs cost approximately $5.00. Your actual bill follows the number of rows stored, subject to your account's run settings and budget limit.

A location may require more than one public search pass to reach its requested limit. Those passes do not create duplicate result charges: the actor deduplicates by the public property identifier and pushes each property at most once per location. A property found in two separately requested locations appears once for each location because each row retains its search context.

For a small recurring monitor, start with a few locations and a modest maxResults. Increase the limit only when the destination returns enough new properties. Repeating very broad searches may cost time without producing many additional unique rows.

Tips for best results

Use recognizable place names. A city such as Paris or a distinct neighborhood is easier for the search page to interpret than an ambiguous abbreviation. If several places share a name, include a region or country in the location text. Use separate location entries when you want each area's output labeled independently.

Choose dates within the site's available booking horizon. The actor rejects an invalid date order, and it checks the dates in every retrieved listing. If the site substitutes a default stay, that location is skipped and the run log identifies the issue. This protects price comparisons from mixing different travel dates.

Keep currency consistent across repeated runs, then inspect the output currency. In observed searches, the page returned USD even when a different code was requested. The numeric price fields always represent the currency in the row, not an exchange conversion performed by this actor. Convert currencies separately only after confirming the source amounts.

Expect some nulls. A hotel may have a rating but no published class, a nightly price but no total, or an image with no description. Avoid treating a blank price as zero. The output contains keys consistently, making it straightforward to filter on available fields.

The actor retrieves datacenter pages first and changes connection route if a block occurs. For frequent monitoring, leave pauses between repeated runs and keep result limits proportionate to the question you are answering. Very large requested limits can stop early if public search passes cease to reveal new properties.

Limits

The public listing response normally exposes roughly one screen of properties at a time. The actor makes additional public search passes for larger maxResults values and deduplicates overlaps. Those passes are not a guaranteed numbered pagination feed, so a requested 1,000 results can finish well below 1,000. The observed golden run retrieved 40 rows from two cities with a 20-row limit for each.

The current public page applied stay dates when they were included in the search text. Direct checkin, checkout, and htichips URL parameters did not apply the requested stay in observed probes. The actor verifies applied dates from the listing data rather than trusting the URL. Searches with unusual date phrases or dates beyond the site's supported window may yield no stored rows.

Guest count is limited to two adults. The page did not apply a three-adult request in the observed search. Alternate currency requests can also be ignored by the page; currency in each result reports the returned currency. Vendor-specific booking quotes are not included, so bookingSources is an empty array. Opening a property detail page without its original stay state showed default dates, which would make those quotes unsafe to attach to the requested stay.

There is no guarantee that every property shows a price, a hotel class, a description, or the same set of review topics. Rates, taxes, fees, and availability can change after collection. Results reflect the site's public search at the time of the run.

Use with agents

The input and output fields are designed for structured requests. Example requests:

  • “Find up to 20 hotels each in Paris and Tokyo for November 12–14, 2026. Return the hotel name, total rate, currency, rating, review count, and property URL.”
  • “Compare two runs for the same stay by hotel ID. Show properties whose total rate changed, and keep rows with different currencies separate.”

When a request needs a strict price ceiling or a star threshold, filter the dataset after collection. This version does not claim to apply those filters inside the search page. Check checkInDate and checkOutDate alongside the price whenever you combine outputs from multiple runs.

FAQ

Is this data public?

The actor reads publicly accessible hotel search listings. Use the data in line with the site's terms and applicable privacy and data-protection rules. Do not use any public information for personal-data misuse. The output contains aggregate review statistics, not individual reviewer profiles.

Do I need to configure a proxy?

The default connection setting is ready for ordinary runs. The actor starts with a datacenter route and can escalate after blocks. If a location fails, review the run log and try a smaller, focused search before increasing volume.

How fast is a run?

A small search depends on the site's response time and the number of public search passes needed to reach the result limit. The observed two-city golden run completed with 40 rows. Larger requests take longer and may stop before the requested ceiling when new unique properties are exhausted.

Can I schedule repeated price checks?

Yes. Use the same dates, locations, language, and region each time. Keep the returned currency with every snapshot, and join rows by hotelId. Save the scrapedAt value to distinguish collection times.

Can I export to a spreadsheet?

Yes. Download the dataset as CSV or a spreadsheet file, or use the dataset endpoint in an existing workflow. Arrays such as amenities and nearby places are best handled as structured JSON if you need their internal values.

Why is a field empty?

The listing may omit it, or the field may not apply to that property. For example, a property can have a guest rating without a formal hotel class. bookingSources remains empty because this version does not attach vendor quotes whose dates cannot be verified.

Why did I receive fewer hotels than maxResults?

The site may expose fewer unique listings for that query and stay. Additional passes can overlap heavily, and the actor stops after repeated passes without new properties. Try a broader location or several nearby areas if you need more coverage.

Integrations

Use the dataset endpoint, webhooks, schedules, and exported files to move hotel rows into reporting, alerting, or spreadsheet workflows. The stable hotelId, location label, applied stay dates, actual currency, and collection time make repeat runs easier to compare. Keep the raw record when you need image lists, review distributions, or nearby-place travel times.

Support

Open an issue on the Issues tab; we reply within 24h and add fields on request.