Google Hotels API & Scraper — Prices, Ratings, Reviews avatar

Google Hotels API & Scraper — Prices, Ratings, Reviews

Pricing

from $0.01 / 1,000 dataset items

Go to Apify Store
Google Hotels API & Scraper — Prices, Ratings, Reviews

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

Daniel Posztos

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 days ago

Last modified

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

FieldWhat it doesDefault
locationsPlaces to search, e.g. ["Budapest"], ["Times Square, New York"]—
checkInDate / checkOutDateYYYY-MM-DD, max 30 nights14 days from today, 1 night
adults1-10 guests2
currencyISO code: USD, EUR, GBP, HUF...USD
maxResultsPerLocation1-100050
onlyAvailableSkip properties without a price for your dates (not charged)false
languagee.g. en-US, de, huen-US
countryCodeCountry the search comes from (gl), e.g. us, deus
proxyConfigurationProxy 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 / nightlyValue is the lowest price per night Google shows. total / totalValue is for the whole stay, including taxes and fees where Google includes them.
  • available: false, price: null means Google shows the property but has no price for your dates (sold out, or no booking partner). Set onlyAvailable: true to skip these.
  • cheapestProvider and dealBadge (e.g. GREAT PRICE) are filled only when Google shows them on the results page. That's mostly for vacation rentals.
  • position is the rank within the location's results, after duplicates are removed.
  • Results mix hotels and vacation rentals, the same as on Google Hotels. hotelClass is null for rentals.
  • A location that fails or finds nothing appears as one row with hasData: false and an error. 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 ApifyClient
client = 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 onlyAvailable and 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.