Google Hotels Scraper - Live Room Prices by Date
Pricing
from $3.35 / 1,000 hotel results
Google Hotels Scraper - Live Room Prices by Date
Scrape Google Hotels prices for your own dates and party. Type a search like "hotels in Lisbon" and each row has the hotel name, nightly price, stay total, rating, review count, class and photo. Up to 10 searches a run, about 20 hotels each. $3.50 per 1,000 hotels.
Pricing
from $3.35 / 1,000 hotel results
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Get Google Hotels prices for your own dates, one row per hotel: type a destination search like
hotels in Lisbon, add your check-in and check-out, and each row comes back with the nightly price,
the stay total, the guest rating, review count, hotel class, a photo and the Google listing link.
Google does not sell rooms. Hotels and booking sites feed in their rates for one specific stay, which is why a price on that page belongs to a set of dates rather than to the hotel. So the dates do real work here.
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 list every hotel in a city.
| Input | Up to 10 destination searches, with check-in and check-out dates and who is staying |
| Output | One row per hotel: nightly price, stay total, currency, rating, review count, class, type, photo and Google link |
| Ceiling | 10 searches per run, one page of results each, about 20 hotels |
| Account needed | None, and no Google API key |
| Price | $3.50 per 1,000 hotels, flat on every plan. The free plan's $5 a month covers about 1,400 |
๐ What Google Hotels Scraper does
You search the way you would in Google itself: hotels in Lisbon,
family hotels near Disneyland ParisDates matter more than anything else here. Leave checkIn and checkOut empty and Google
prices a stay of its own choosing, 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 place, which stay and which guests it priced. If that is not what you asked for, the search is refused with a note and nothing is charged.
propertyToken is the field to key on. It is Google's stable id for the property, so tracking
one hotel's price across runs survives a name being reformatted.
๐ What data you get from each Google Hotels listing
| What you get | Field |
|---|---|
| The hotel, and Google's id and page for it | name, propertyToken, detailsUrl |
| Nightly price and the whole stay | price, priceText, totalPrice, totalPriceText, currency |
| Guest rating and how many reviews it rests on | rating, reviewsCount |
| Star class and kind of place | hotelClass, hotelType |
| The booking site behind the rate, when Google names it | vendor |
| A photo | thumbnail |
| The stay it was priced for | checkInDate, checkOutDate |
| Your search, and the place Google says it searched | searchQuery, resolvedLocation, destinationCheck |
| When it was read | scrapedAt |
โถ๏ธ How to scrape Google Hotels prices
- Open Google Hotels Scraper and click Try for free.
- Put your destinations into Hotel searches, replacing the example. Ten at most.
- Fill in Check-in date and Check-out date. Prices mean little without them.
- Add Children's ages if kids are coming, pick a Currency if you want one, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
Run it with no searches and you get one labelled sample row so you can see the shape. That row is not charged.
๐ฐ How much does it cost to scrape Google Hotels prices?
$3.50 per 1,000 hotels, which is $0.0035 a row. The same rate on every Apify plan, no volume tiers. On the free plan, the $5 Apify gives you each month covers about 1,400 hotels.
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 or priced a different stay, and places your minRating
leaves out.
๐ฅ 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}
| Field | Default | What it is |
|---|---|---|
searchQueries | empty, the form opens with hotels in Barcelona | Destination searches in plain words. Only the first 10 are used. |
checkIn | empty | YYYY-MM-DD, today or later. Optional, but set it. |
checkOut | empty | YYYY-MM-DD, after check-in and at most 30 nights later. Optional, but set it. |
adults | 2 | 1 to 12. Prices are for the whole party. |
childAges | empty | One age per child, 0 to 17, like [8, 3]. Up to 6. Children change the price and which hotels have room. |
country | ca | Two-letter Google edition code. In our tests it did not change the prices. Use currency to choose the currency. |
language | en | Interface language, like en, fr or de. |
currency | empty | A 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. |
minRating | empty | Keep 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. Works with language set to en. |
maxItemsPerQuery | 50 | Caps the rows kept per search, up to 100. It trims the page, it does not deepen it. |
fallbackToProxy | true | Leave it on. |
proxyConfiguration | on | Leave it alone. Servers of your own, if you add them, are used exactly as given. |
๐ค What you get back
A real row from a run on 1 October 2026: hotels in Lisbon for 12 to 14 November, two adults,
minRating 4. The photo link is cut short.
{"ok": true,"propertyToken": "ChgI782c2Z2f8OMdGgwvZy8xMWR5anhtYjcQAQ","searchQuery": "hotels in Lisbon","name": "Avenida Palace","vendor": null,"price": 279,"priceText": "US$279","currency": "USD","totalPrice": 585,"totalPriceText": "US$585","rating": 4.8,"reviewsCount": 1072,"hotelClass": 5,"hotelType": "hotel","thumbnail": "https://lh3.googleusercontent.com/grass-cs/ACvplmOAmg17Zla3xIHeeqhUsn_ljjJ...","detailsUrl": "https://www.google.com/travel/hotels/entity/ChgI782c2Z2f8OMdGgwvZy8xMWR5anhtYjcQAQ","checkInDate": "2026-11-12","checkOutDate": "2026-11-14","scrapedAt": "2026-10-01T03:19:55.453Z","resolvedLocation": "Lisbon","destinationCheck": "ok"}
| Field | How to read it |
|---|---|
price, totalPrice | The nightly rate on the card, and the whole stay with taxes and fees. In the row above, two nights at US$279 come to US$585. Use totalPrice for the cost of a stay. |
priceText, totalPriceText | Google's own strings, currency symbol included. |
propertyToken | Google's stable property id. Key on this, not the name. |
resolvedLocation | The destination Google says it searched. Ask for hotels near the Eiffel Tower and it reads Paris, which is right, and it is also how you catch a search that drifted. |
destinationCheck | ok when that matches what you asked for, unverified when the page carried no heading to check against. |
checkInDate, checkOutDate | Your dates, on every row. A row only goes out once Google's page confirmed it priced those dates. |
vendor | The booking site behind the rate. Often null, because Google does not always name it on the results page. |
rating, reviewsCount | Google's own figures. They will not match a booking site's numbers. |
๐งพ Reading the output
| Row | How to spot it | Charged |
|---|---|---|
| A hotel | ok: true | yes |
| The sample row | _sample: true | no |
| A diagnostic | ok: false and an errorCode | no |
| Code | What it means |
|---|---|
DESTINATION_NOT_FOUND | Google 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_APPLIED | Google 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_INPUT | A 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_RESULTS | Google returned a page with no properties on it, or none rated at your minRating. |
BLOCKED | That search could not be read this time. Run it again. |
RATE_LIMITED | Google asked for a slower pace. Wait a little and try again. |
SERVER_ERROR | Google answered with an error of its own. |
NETWORK | Google could not be reached. 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 default table view hides that field, along with price, totalPrice, searchQuery
and the dates, so read the dataset as JSON or export it.
๐ก 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.
A trip priced end to end, in three runs:
- Run this with your dates and
minRatingat4, and keep the hotels whosetotalPricefits. - Put the
nameof each one you kept, with the city, into Google Maps Reviews Scraper and read what guests said lately. - Price the flights in
Skyscanner Flights Scraper with a route
whose
dateis yourcheckInDateandreturnDateyourcheckOutDate.
๐ง What it does not do
- One page of results per search. Measured at roughly twenty hotels.
maxItemsPerQuerytrims 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.
minRatingtrims the page, it does not dig deeper. At 4.5 expect about a third of the page. A place whose row has noratingis 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.
vendoris 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.
๐งญ Which travel scraper do you need?
| If you want | Use |
|---|---|
| Hotel prices from Google for your own dates | This one |
| Booking.com properties with prices, review scores and free cancellation | Booking.com Hotels Scraper |
| Airbnb listings with prices and ratings | Airbnb Listings Scraper |
| Hotels as places on Google Maps, with address, category and coordinates | Google Maps Scraper |
| Every Google review for one hotel | Google Maps Reviews Scraper |
| Guest reviews from Booking.com | Booking.com Reviews Scraper |
| Traveller reviews of hotels, restaurants and attractions | Tripadvisor Reviews Scraper |
| Flight fares for the same dates | Skyscanner Flights Scraper |
โ Questions people ask
Do I need a Google account or an API key to scrape Google Hotels?
No. There is 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's price 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 search.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has ready-made
code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/google-hotels-scraper. Either way the
run happens on your Apify account at the same price.
Is scraping Google Hotels legal?
These are public listings and public prices. Apify's write-up on the legality of web scraping 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.