Google Hotels is one of the richest travel datasets on the public web. For any property it shows a live price, a ladder of booking sources (Booking.com, Agoda, Expedia, the hotel's own site, and a dozen more), per-room rates, star class, guest ratings, and reviews. If you run a hotel, resell rooms, build a travel app, or feed a pricing model, that is exactly the data you want. Getting it out cleanly is the hard part.
This guide shows both ways: a runnable Python recipe, and a no-code shortcut with the Google Hotels Scraper that skips the hard parts entirely.
What you can pull
- Live prices for a stay, with the full OTA rate ladder per hotel (every booking source and its price plus a deep booking link).
- Per-room rates where the source shares them, so you see the room-level breakdown, not just a single "from" price.
- Hotel facts: name, star class, guest rating, review count, property type, coordinates, and a stable Google entity token.
- Guest reviews with exact publish dates and owner responses, in a separate dataset.
- A price window: track prices across a range of dates for the same set of hotels.
Why scraping Google Hotels directly is hard
Google Hotels does not render its prices in simple HTML you can select with CSS. The data comes from Google's internal travel endpoints, which expect a specific TLS fingerprint and reject plain HTTP clients, and the price ladder is spread across several nested response containers that change shape by property and by date. On top of that, the values are keyed on internal Google entity tokens, not on anything you would guess from a URL. You can solve all of this, but it is real engineering, and it breaks whenever Google reshapes a response.
That is the whole reason a maintained actor exists: it absorbs the endpoint work and hands you a flat table.
DIY vs actor vs official API
| Write it yourself | Google Hotels Scraper (actor) | Official Google API | |
|---|---|---|---|
| Setup | TLS impersonation, proxies, response parsing | Paste a destination and dates | Partner onboarding required |
| Prices and OTA ladder | You reverse-engineer it | Included, structured | Not available for open scraping |
| Reviews with dates | Separate endpoint to solve | Included, exact dates and owner replies | Not available |
| Maintenance | You own every breakage | Maintained for you | Contractual |
| Access | Free but you build it | Free tier, then pay per result | Gated to hotel owners and OTAs |
There is no public Google API that lets you pull arbitrary hotel prices and reviews. The Hotel APIs Google does publish are gated to hotel owners and booking partners for their own inventory. For open collection, scraping is the route, and the choice is really "build and maintain it" versus "call an actor".
The no-code way (about a minute)
- Create a free Apify account and open the actor page.
- Click Try for free. The input is pre-filled with an example search.
- Set your destination and dates, or paste exact hotels, then click Start.
- Download the results from the Output tab as JSON, CSV, or Excel.
You can search a destination the way you would type it on Google Hotels (hotels in New York City, Paris 5 star hotels, resorts in Bali), or add exact hotels one per line: a hotel name, a Google Hotels URL, a Google Maps link, or an entity token.
Run it from Python
The actor runs on Apify, so you drive it with the Apify client. Install it with pip install apify-client, grab your token from Apify Settings, then:
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"searchQueries": ["hotels in New York City"],
"checkInDate": "2026-08-15",
"checkOutDate": "2026-08-16",
"includePrices": True,
"includeReviews": True,
"maxReviews": 20,
"maxResults": 10,
"currency": "USD",
}
run = client.actor("factden/google-hotels-scraper").call(run_input=run_input)
# Hotels dataset: one row per hotel, with the price ladder nested on the row
for hotel in client.dataset(run["defaultDatasetId"]).iterate_items():
print(hotel["name"], hotel["leadPrice"], hotel["currency"], hotel["vendorCount"], "sources")
Reviews land in a separate named dataset, so you can process prices and reviews independently.
What a hotel row looks like
Trimmed from a real run (The Marmara Park Avenue, New York):
{
"name": "The Marmara Park Avenue",
"starClass": 5,
"rating": 4.2,
"reviewCount": 1070,
"currency": "USD",
"leadPrice": 252,
"leadPriceTotal": 252,
"vendorCount": 13,
"offers": [
{
"source": "Booking.com",
"checkInDate": "2026-11-15",
"checkOutDate": "2026-11-16",
"roomName": "Deluxe Queen (DLXQ)",
"perNight": 287,
"total": 287,
"currency": "USD",
"official": false,
"bookingLink": "https://www.google.com/aclk?..."
}
]
}
The key fields on each hotel row:
| Field | What it is |
|---|---|
name, starClass, propertyType
|
Hotel identity and class |
rating, reviewCount
|
Aggregate guest score and how many reviews |
leadPrice, leadPriceTotal
|
Cheapest per-night and total for the stay |
vendorCount |
How many booking sources sell this hotel |
offers[] |
The full priced table: one row per source, date, and room, each with a booking link |
vendors[] |
Booking directory (source plus link, no prices) |
markdownContent |
A self-contained summary block, ready to drop into an LLM or RAG pipeline |
Reviews carry publishedAt (the exact date, not "2 months ago"), reviewText, rating, and ownerResponse.
Try it on a real dataset first
If you want to see the shape before running anything, there is a free sample Google Hotels dataset you can open in the browser, and the input, snippets, and field reference are on GitHub.
FAQ
Do I need a Google API key?
No. There is no key and no Google login. You only need an Apify token to run the actor.
Can I get prices for many dates at once?
Yes. Set a price-window end date and each date's prices are added to the offers table for the same set of hotels, which is how you track rate movements over time.
Does it return per-room rates or just a "from" price?
Per-room rates when the booking source shares them with Google. Sources that only hand Google a single lead price show one row; the per-room breakdown for those lives only on the OTA's own site.
How are reviews dated?
With the exact publish date decoded to ISO-8601, plus the hotel's owner response when there is one. Most relayed feeds only give you a relative string like "3 weeks ago".
Is it legal?
It collects publicly visible data. As with any scraping, use the output responsibly and follow the applicable terms and laws for your use case.
What does it cost?
There is a free tier to try it, then you pay per result. Discovery is cheap, prices are an opt-in per hotel per date, and reviews are billed per review.
Related
Working hotel data across sites? The same team maintains an Expedia hotel reviews scraper, a Hotels.com reviews scraper, and a Trip.com and Ctrip reviews scraper, so you can line up reviews across Google, Expedia, Hotels.com, and Trip.com in the same format.
Full write-up with more examples: how to scrape Google Hotels.
Top comments (0)