Google Hotels API & Scraper — Prices, Ratings, Reviews
Pricing
from $0.01 / 1,000 dataset items
Google Hotels API & Scraper — Prices, Ratings, Reviews
Google Hotels prices for your dates, guests and currency, plus star class, rating breakdown, review topics, coordinates, nearby places and links. Up to 1000 properties per location, no browser, automatic retries.
Pricing
from $0.01 / 1,000 dataset items
Rating
0.0
(0)
Developer
Daniel Posztos
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 days ago
Last modified
Categories
Share
Google Hotels API & Scraper — Prices, Ratings & Reviews
SEO title: Google Hotels API — hotel prices, ratings & reviews SEO description: Google Hotels API, no Google API key needed: price per night and total stay for your dates, guests and currency, plus star class, ratings, review topics and links. Up to 1000 hotels per city.
A Google Hotels API you can call from Python, JavaScript, any HTTP client or an AI agent. Give it one or more places and your stay dates, and get every property Google Hotels lists, one row each:
- Price for your stay: per night and total, in the currency you choose, for your number of guests
- Quality signals: star class, guest rating, review count, the full 1-5 star breakdown, and what guests talk about (service, location, cleanliness, breakfast...)
- Where it is: coordinates, country, nearby landmarks, transit and airports with travel times
- Links: Google Maps, the property's Google Hotels page, its own website, photos
Up to 1000 properties per location, no browser.
Why this exists
Google Hotels compares prices from dozens of booking sites, but it has no API, and the existing scrapers fail a lot (the most-used one failed on ~47% of its runs over the last 30 days). This actor reads the same data the Google Hotels page is built from:
- Your dates, guests and currency actually apply. Google ignores the usual
checkin=/curr=URL parameters and quietly falls back to "tonight, in the currency of the server's IP". This actor encodes the stay the way the Google Hotels web app does, so you get the prices you asked for. - Deep pagination, no duplicates. It follows Google's own page tokens and drops properties that repeat across pages.
- Fast and resilient: the first attempt goes out directly, and when Google answers with an error, a consent wall or a captcha, the retry goes through a fresh proxy session.
Cloud test (Budapest, New York, Tokyo; 2 nights; EUR; 100 per city): 300 properties from 18 requests, no retries needed, under 2 minutes, all prices in EUR, no duplicates. Deep test: 1000 Budapest properties from 54 pages in 2.5 minutes.
Input
| Field | What it does | Default |
|---|---|---|
locations | Places to search, e.g. ["Budapest"], ["Times Square, New York"] | — |
checkInDate / checkOutDate | YYYY-MM-DD, max 30 nights | 14 days from today, 1 night |
adults | 1-10 guests | 2 |
currency | ISO code: USD, EUR, GBP, HUF... | USD |
maxResultsPerLocation | 1-1000 | 50 |
onlyAvailable | Skip properties without a price for your dates (not charged) | false |
language | e.g. en-US, de, hu | en-US |
countryCode | Country the search comes from (gl), e.g. us, de | us |
proxyConfiguration | Proxy used for retries (the first attempt goes out directly) | Apify Proxy |
Worked example — input
{"locations": ["Budapest"],"checkInDate": "2026-11-20","checkOutDate": "2026-11-22","currency": "USD","maxResultsPerLocation": 100}
Worked example — output (one row, real data, lists shortened)
{"name": "Eurostars Ambassador","location": "Budapest","available": true,"hotelClass": "4-star hotel","starRating": 4,"rating": 4.7,"reviewCount": 820,"ratingDistribution": {"5": 661, "4": 104, "3": 29, "2": 4, "1": 22},"price": {"nightly": "$139","nightlyValue": 138.88,"total": "$278","totalValue": 277.76,"currency": "USD","cheapestProvider": null,"dealBadge": null},"latitude": 47.5052944,"longitude": 19.0648532,"countryCode": "HU","checkInTime": "3:00 PM","checkOutTime": "12:00 PM","description": "Chic quarters in a polished hotel featuring a restaurant, a bar & a 24/7 gym, plus a sauna.","reviewTopics": [{"topic": "Service", "mentions": 118}, {"topic": "Breakfast", "mentions": 56}, "..."],"nearby": [{"name": "Oktogon", "travelTimes": ["3 min"]}, {"name": "Budapest Ferenc Liszt International Airport", "travelTimes": ["32 min", "47 min"]}, "..."],"website": "https://www.eurostarsambassador.com/...","thumbnail": "https://lh3.googleusercontent.com/...","images": ["https://lh3.googleusercontent.com/...", "..."],"googleMapsUrl": "https://www.google.com/maps?cid=...","googleHotelsUrl": "https://www.google.com/travel/hotels/entity/...","propertyToken": "...","placeId": "0x...:0x...","checkInDate": "2026-11-20","checkOutDate": "2026-11-22","nights": 2,"adults": 2,"position": 4,"hasData": true,"scrapedAt": "2026-10-12T14:45:53Z"}
Output notes
price.nightly/nightlyValueis the lowest price per night Google shows.total/totalValueis for the whole stay, including taxes and fees where Google includes them.available: false,price: nullmeans Google shows the property but has no price for your dates (sold out, or no booking partner). SetonlyAvailable: trueto skip these.cheapestProvideranddealBadge(e.g.GREAT PRICE) are filled only when Google shows them on the results page. That's mostly for vacation rentals.positionis the rank within the location's results, after duplicates are removed.- Results mix hotels and vacation rentals, the same as on Google Hotels.
hotelClassis null for rentals. - A location that fails or finds nothing appears as one row with
hasData: falseand anerror. That row is not charged.
Use it from code or an AI agent
curl -X POST "https://api.apify.com/v2/acts/westerly_breaker~google-hotels-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"locations": ["Lisbon"], "checkInDate": "2026-12-04", "checkOutDate": "2026-12-06", "currency": "EUR", "maxResultsPerLocation": 30, "onlyAvailable": true}'
From Python (pip install apify-client):
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("westerly_breaker/google-hotels-scraper").call(run_input={"locations": ["Lisbon"], "checkInDate": "2026-12-04", "checkOutDate": "2026-12-06", "currency": "EUR"})for hotel in client.dataset(run["defaultDatasetId"]).iterate_items():print(hotel["name"], hotel["price"] and hotel["price"]["total"], hotel["rating"])
Useful for rate-shopping and price monitoring (schedule a run per day and compare totalValue), market research on a city's supply (classes, ratings, review volume), travel apps and agents that need real prices for real dates.
Pricing (pay-per-event)
$0.002 per property delivered, platform usage included.
- 3 cities × 100 properties = 300 × $0.002 = $0.60
- Properties skipped by
onlyAvailableand locations that fail are not charged. - If you set a maximum cost per run, the actor stops cleanly at that limit. Every row you paid for is delivered, and you are never billed for a row you didn't get.
Error messages
Bad input stops the run before any request, naming the field and the fix, for example:
'checkInDate' 2026-10-01 is in the past. Use today (2026-10-12) or a later date.'currency' must be a 3-letter ISO code like 'USD', 'EUR' or 'HUF', got 'euro'.
Known limitations
- Per-site offers (Booking.com vs Expedia vs the hotel's own site) are not included. The results page only carries the lowest price. Per-provider prices would need one extra request per property; that is planned as an option.
- Prices change constantly and can differ by
countryCode, the same as on google.com. - Small places have fewer properties than your limit. The actor stops when Google has no further pages, and the log shows Google's own estimate of the total.
Data source
Public Google Hotels search results (google.com/travel), the same data the web page shows. No login, no API key.