Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Google Hotels Scraper icon

Google Hotels Scraper

Scrape Google Hotels by destination and dates: name, nightly price, stay total, rating, reviews, link. $3.50 per 1,000.

213 runs on Apify $0.0035 per hotel result ($3.5 / 1,000)
Run this in the cloudRun on Apify →

Travel, Hotels & Events

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust searchQueries, checkIn, checkOut (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.0035 per hotel result = $3.5 per 1,000

You are charged forWhenPrice
Hotel resultOne successfully extracted Google Hotels listing.$0.0035

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-07-28, and they are what you are actually charged.

Inputs

FieldWhat it doesType
searchQueriesDestination searches such as 'hotels in Toronto' or 'family hotels near Disneyland Paris'. One row is returned per hotel and each row includes the query that produced it.array
checkInOptional check-in date in YYYY-MM-DD format, today or later. Leave both dates empty and Google prices a stay of its own choosing.string
checkOutOptional check-out date in YYYY-MM-DD format. Must be after check-in when both dates are supplied, and no more than 30 nights later: Google shows no prices for longer stays.string
adultsNumber of adults for the hotel search. Prices are for the whole party.integer
childAgesOne age per child, from 0 to 17: [8, 3] is an eight-year-old and a three-year-old. Up to 6 children. Children change the price and which hotels have room. Leave it empty if only adults are staying.array
languageGoogle interface language, for example en, fr, or de.string
countryTwo-letter Google country edition code, such as ca, us, gb, or fr.string
currencyOptional three-letter currency code such as EUR, USD or CAD. Google Hotels offers 72 currencies, and a code it does not offer is refused before the search runs. Leave it empty and Google picks one.string
minRatingOptional. Keep only places rated at least this, out of 5, such as 4 or 4.5. Places below it, and places with no rating, are left out of each search and not charged, so a high minimum returns fewer rows, sometimes none. Works with English result pages (language en). Leave it empty to keep every place.number
maxItemsPerQueryMaximum number of unique hotel rows returned for each search query.integer
fallbackToProxyIf a search is blocked, rate limited or comes back with no properties, try it again through Apify Proxy. Turn this off to never retry that way.boolean

What you get

A structured dataset — each result includes fields like:

namepriceTextratingreviewsCountcurrencydetailsUrl

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Related tools in Travel, Hotels & Events

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

Luma Events Scraper iconTravel, Hotels & Events

Luma Events Scraper

Scrape lu.ma events by city, calendar or event link. Get name, date with timezone, venue, host, ticket price and guest count. $2.125 per 1,000.

Ready to run — no setup

Booking.com Reviews Scraper iconReviews & Reputation Data

Booking.com Reviews Scraper

Scrape Booking.com guest reviews. Get the score, title, liked and disliked text, reviewer name, country and stay dates. $1.50 per 1,000 reviews.

Ready to run — no setup

Tripadvisor Reviews Scraper iconReviews & Reputation Data

Tripadvisor Reviews Scraper

Scrape Tripadvisor reviews for hotels, restaurants and attractions. Get rating, full text, reviewer, hometown, trip type and owner reply. $0.25/1,000.

1 use cases

Airbnb Listings Scraper iconTravel, Hotels & Events

Airbnb Listings Scraper

Scrape Airbnb listings by location, dates and guests. Get listing ID, name, room type, price, rating, reviews and host. No account, no API key.

Ready to run — no setup

Google Maps Scraper iconMaps & Local Lead Generation

Google Maps Scraper

Scrape Google Maps places and reviews. Business name, category, address, rating, GPS coordinates and place ID. $0.27 per 1,000 rows.

28 use cases

Google News Scraper iconNews & Finance Data

Google News Scraper

Track Google News by keyword or topic. Get real publisher URLs, source, date and snippet. $3.00 per 1,000 articles.

22 use cases

See all Travel, Hotels & Events →

Google Hotels Scraper: live prices for your own dates, by destination search

Google does not sell hotel rooms. Hotels and booking sites feed their rates in for one specific itinerary, which is why a price on that page belongs to a set of dates rather than to the hotel. So you give it plain searches like hotels in Barcelona, plus your check-in and check-out, and each row comes back priced for your stay.

The size of it, before you plan around it: a search returns one page of Google's results, which has measured at roughly twenty hotels. It is not a way to enumerate every hotel in a city.

InputUp to 10 destination searches, with check-in and check-out dates
OutputOne row per hotel
Ceiling10 searches per run, one page of results each
Account neededNone, and no Google API key
Price$3.50 per 1,000 hotels, flat on every plan

🏨 What Google Hotels Scraper does

You search the way you would in Google itself: hotels in Lisbon, family hotels near Disneyland Paris. Each row carries the hotel name, the nightly price, the stay total, the currency, the star rating, the review count, the hotel class and type, a photo and a link to the Google listing.

Dates matter more than anything else here. Leave checkIn and checkOut empty and Google prices its own default stay, so what you get back is not comparable to anything. Set them and the prices belong to your itinerary.

Every page is checked before you pay for it. Google's page says which stay and which guests it priced. If that is not what you asked for, the search is refused and nothing is charged.

propertyToken is the field to key on. It is Google's stable identifier for the property, so tracking one hotel's price across runs survives a name being reformatted.

resolvedLocation is worth a glance. It is the destination Google says it searched. Ask for hotels near the Eiffel Tower and it reads Paris, which is right, but it is also how you catch a search that drifted.

📥 What you give it

{
  "searchQueries": ["hotels in Lisbon", "family hotels near Disneyland Paris"],
  "checkIn": "2027-05-14",
  "checkOut": "2027-05-16",
  "adults": 2,
  "childAges": [8],
  "country": "fr",
  "currency": "EUR",
  "maxItemsPerQuery": 50
}
FieldDefaultWhat it is
searchQueriesbox starts at hotels in BarcelonaDestination searches in plain words. Only the first 10 are used.
checkInemptyYYYY-MM-DD, today or later. Optional, but set it.
checkOutemptyYYYY-MM-DD, after check-in and at most 30 nights later. Optional, but set it.
adults21 to 12. Prices are for the whole party.
childAgesemptyOne age per child, 0 to 17, like [8, 3]. Up to 6. Children change the price and which hotels have room.
countrycaTwo-letter Google edition code. In our tests it did not change the hotels' prices. Use currency to choose the currency.
languageenInterface language, like en, fr or de.
currencyemptyA three-letter code like EUR or USD. Google Hotels offers 72, and a code it does not offer is refused before anything runs. Empty lets Google pick, and every row states what it used.
minRatingemptyKeep only places rated at least this, out of 5, like 4 or 4.5. Places below it, and places with no rating, are left out and not charged, so a high minimum returns fewer rows. Works with language set to en.
maxItemsPerQuery50Caps the rows kept per search, up to 100. It trims the page, it does not deepen it.
fallbackToProxyonLeave it on. It is what a refused first attempt falls back to.
proxyConfigurationleave it aloneOptional. Your own servers are used exactly as given.

Run it with no searches and you get one labelled sample row so you can see the shape. That row is not charged.

📤 What you get back

A real row from a recent run, with the long photo link cut short. This search was run without dates, which is why the date fields are empty:

{
  "ok": true,
  "propertyToken": "ChkIg4Lbvvq9iJiRARoML2cvMXl3MF93NmNuEAE",
  "searchQuery": "hotels in Barcelona",
  "name": "Hotel SB Diagonal Zero Barcelona",
  "vendor": null,
  "price": 102,
  "priceText": "US$102",
  "currency": "USD",
  "totalPrice": 134,
  "totalPriceText": "US$134",
  "rating": 4,
  "reviewsCount": 4278,
  "hotelClass": 4,
  "hotelType": "hotel",
  "thumbnail": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWleqi5-453ypJoJnBsORhQZAg84...",
  "detailsUrl": "https://www.google.com/travel/hotels/entity/ChkIg4Lbvvq9iJiRARoML2cvMXl3MF93NmNuEAE",
  "checkInDate": null,
  "checkOutDate": null,
  "scrapedAt": "2026-09-14T05:43:29.643Z",
  "resolvedLocation": "Barcelona",
  "destinationCheck": "ok"
}
FieldWhat it is
price, totalPriceThe nightly rate on the card, and the whole stay with taxes and fees. That is why the total runs a little over the nightly rate times the nights. Use totalPrice for the cost of a stay.
priceText, totalPriceTextGoogle's own strings, currency symbol included.
propertyTokenGoogle's stable property id. Key on this, not the name.
resolvedLocationThe destination Google says it searched.
destinationCheckok when that matches what you asked for, unverified when the page carried no heading to check against.
checkInDate, checkOutDateYour dates, echoed onto every row, so a dataset built from several runs stays readable. A row only goes out once Google's page confirmed it priced those dates.
vendorThe booking site behind the rate. Often null, because Google does not always name it on the results page.
rating, reviewsCountGoogle's own figures. They will not match a booking site's numbers.

🧾 Reading the output

RowHow to spot itCharged
A hotelok: trueyes
The sample row_sample: trueno
A diagnosticok: false and an errorCodeno
CodeWhat it means
DESTINATION_NOT_FOUNDGoogle searched somewhere other than the place you asked for, so nothing was delivered. Usually a spelling slip or a name that needs narrowing: Springfield Illinois rather than Springfield.
STAY_NOT_APPLIEDGoogle priced a different stay or party than the one you asked for, so nothing was delivered. A check-in date in the past does this.
BAD_INPUTA setting Google can't use: a child's age outside 0 to 17, more than 6 children, a currency it does not offer, or a stay over 30 nights. Also a minRating outside 1 to 5, or one set with a language other than English. Nothing was searched.
NO_RESULTSGoogle returned a page with no properties on it, or none of them rated at your minRating.
BLOCKEDGoogle would not serve that search. Re-run it.
RATE_LIMITEDGoogle answered with a rate limit. Wait and try again.
SERVER_ERRORGoogle answered with an error of its own.
NETWORKGoogle was unreachable. A malformed date also lands here rather than saying the date is wrong.

Check destinationCheck before you trust a batch. When Google's page carries no heading there is nothing to compare against, so those rows come through as unverified and are delivered and charged. The Overview table hides that field, along with price, totalPrice, searchQuery and the dates, so read the dataset as JSON or export it.

▶️ How to run it

1. Open Google Hotels Scraper and click Try for free. 2. Put your destinations into Hotel searches, replacing the example. Ten at most. 3. Fill in Check-in date and Check-out date. Prices are meaningless without them. 4. Add Children's ages if kids are coming, pick a Currency if you want one, then click Start. 5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.

💰 How much does it cost?

$3.50 per 1,000 hotels, which is $0.0035 a row. The same rate on every Apify plan, no volume tiers.

The same hotel matching two of your searches is delivered and charged once.

Not charged: the sample row, every diagnostic row, a search that comes back empty, a search where Google could not place your destination, and places your minRating leaves out.

💡 What people use it for

  • Watching a handful of hotels' nightly rates for one set of dates, keyed on propertyToken.
  • Pricing a family trip: two adults and the kids' ages, for the dates the school holidays allow.
  • Pulling rating, review count and class for a shortlist without opening twenty tabs.
  • Building a weekly price series for a city break, by running the same searches on the same dates.

🚧 What it does not do

  • One page of results per search. Measured at roughly twenty hotels. maxItemsPerQuery trims

that page, it cannot go deeper, so a broad city search will not return every hotel in the city.

  • Only the first 10 searches are used. Extras past that are dropped without a message.
  • minRating trims the page, it does not dig deeper. Places below it are taken out of the one page

each search returns, so at 4.5 expect about a third of that page. A place whose row has no rating is left out as well, and some holiday rentals come back that way.

  • Big parties and far-off dates get fewer prices. Google only shows a price where it has a room:

in our tests, two adults with six children got a price at 2 of 20 hotels, and a stay a year out at 3 of 20. Rows without a price are still delivered and charged.

  • Prices move, constantly. A rate read this morning may be gone this afternoon. Anything

price-tracking needs repeat runs.

  • vendor is often empty, because Google does not always name the booking site on the results

page.

  • No dates means no comparable prices. Google prices its own default stay, and that default is

not stable between runs.

  • Ratings are Google's, not a hotel's or a booking site's, so they will not line up with either.

🧭 Which Google scraper do you need?

If you wantUse
Hotel prices for your own datesThis one
Hotels as businesses, with address, phone and coordinatesGoogle Maps Scraper
Every review for one propertyGoogle Maps Reviews Scraper
The web results page for a keywordGoogle Search Results Scraper
Travel coverage in the pressGoogle News Scraper

❓ Questions people ask

Do I need a Google account or an API key? No. Nothing to sign in to.

Why is the total more than the nightly price times the nights? The total is the whole stay with taxes and fees, and the nightly price leaves them out. In our tests it ran up to a quarter higher.

Why did a search return nothing? Most likely Google could not place the destination, so the run returned a DESTINATION_NOT_FOUND note instead of hotels from somewhere else. Narrow the name and try again.

Can I track one hotel over time? Yes. Save propertyToken and run the same dates on a schedule.

Can I get more than one page of hotels per search? No. Split the city into several searches instead, like a district or a landmark per query.

Is scraping Google Hotels legal? These are public listings and public prices. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the search, the dates and the run ID. The errorCode on the diagnostic row usually names the problem on its own.