Google Hotels Scraper | Prices, Offers and Ratings avatar

Google Hotels Scraper | Prices, Offers and Ratings

Pricing

from $2.55 / 1,000 hotels

Go to Apify Store
Google Hotels Scraper | Prices, Offers and Ratings

Google Hotels Scraper | Prices, Offers and Ratings

Google Hotels scraper that turns any destination into a hotel price table: rates for your dates, star class, guest ratings, taxes and fees, plus the offers of Booking.com, Expedia, Agoda and the hotel's own site with booking links. Address, phone, coordinates, amenities, photos. No account needed.

Pricing

from $2.55 / 1,000 hotels

Rating

0.0

(0)

Developer

SilentFlow

SilentFlow

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Google Hotels Scraper

Turn Google Hotels into a table: every hotel of a destination, priced for your dates, with the rate of every booking site Google compares on the same row. 20 hotels with their offers in about ten seconds, a whole city in a few minutes.

How it works

How it works

  1. You type destinations, hotel names or hotel links, and your dates. hotels in Paris, resorts in Bali, Ritz Paris, or the link of a hotel page on Google Hotels. Pick the check-in and check-out, the number of adults and the currency. Leave the dates empty to price one night starting tomorrow.
  2. One row comes back per hotel. 34 fields: name, star class, guest rating and review histogram, price per night and total with taxes and fees, the offers of Booking.com, Expedia, Agoda, Trip.com, the hotel's own site and every other seller Google lists, each with its per-night price, total and booking link, plus address, phone, coordinates, amenities, photos and description. Ready for a spreadsheet, a warehouse, a rate parity dashboard or an AI pipeline.

✨ Why teams choose this over other Google Hotels scrapers

Checking hotel rates city by city in a browser? Copying prices into a sheet the night before a pricing meeting? Running a scraper that returns 20 hotels and stops, or prices for dates you did not ask for?

  • 💵 Prices for your stay, not for a random night. Check-in, check-out, party size and currency are part of the request, so every price per night, every total and every offer is the one Google shows a traveler with your dates. The taxes and fees are broken out on the row.
  • 🏷️ The whole offers ladder on every hotel. Up to 24 sellers per hotel on our Paris test: the hotel's own site flagged as official, Booking.com, Expedia, Hotels.com, Agoda, Trip.com, Vio.com, Priceline, Super.com and the others, each with its per-night rate, its total and its booking link. Rate parity in one column instead of one tab per site.
  • 📄 Hundreds of hotels per destination. The walk follows Google's own pagination, 20 hotels per page, page after page, until your cap. Duplicates across pages are removed on the hotel's stable id.
  • ⭐ Ratings you can compare. Guest rating, review count and the 1 to 5 star histogram as numbers, the star class as an integer, never "4.5/5 (1,2K)" strings.
  • 🗺️ Where it is and how to reach it. Street address, phone, latitude and longitude, country code, check-in and check-out times, the hotel's website and its Google Maps link.
  • 🌐 Any market, any currency. 24 currencies and 14 languages: price Tokyo in yen with Japanese descriptions, London in pounds, Dubai in dirhams.
  • 🔓 No account, no API key. Click Start on the prefilled form and the first 50 hotels of Paris arrive with their offers in about half a minute.

🎯 What you can do with Google Hotels data

TeamWhat they build
Revenue managementA nightly rate shop of the 30 competitors of each property, with the rate of every OTA next to the hotel's own, to spot parity breaks before guests do
OTAs and metasearchA price index of a destination for a given stay, refreshed every morning, to check their own placement and undercut where it matters
Travel agencies and TMCsA quote of every hotel of a city for the client's exact dates, party size and currency, exported to a proposal in minutes
Market analystsThe average price per night by star class and neighborhood across 500 hotels of a city, for a report or an investor deck
Hotel groupsThe guest rating and review histogram of every property of a brand and its competitors, tracked week by week
Data and AI teamsA structured hotel dataset with prices, coordinates, amenities and descriptions to feed a travel assistant or a recommendation model
Growth and SEODestination pages with live prices from, ratings and hotel counts, regenerated from the dataset on a schedule

📥 Input parameters

Type a destination like hotels in Paris, pick your dates and hit Start. Each hotel becomes one row of the dataset, priced for your stay.

FieldTypeDefaultWhat it does
searchQueriesarray["hotels in Paris"]What to search, one per line: a destination (hotels in Paris, resorts in Bali, hotels near Times Square), a hotel name (Ritz Paris) or the link of a hotel page (https://www.google.com/travel/hotels/entity/...). A destination returns hotels in Google's order, 20 per page; a hotel name or link returns that hotel alone.
checkInDatestringemptyFirst night of the stay, YYYY-MM-DD. Empty with an empty check-out: one night starting tomorrow, computed when the run starts.
checkOutDatestringemptyDeparture day, YYYY-MM-DD, after the check-in. Empty: one night. Stays of up to 30 nights are priced.
maxItemsinteger50How many hotels to save in all, across every search.

👥 Guests and prices

FieldTypeDefaultWhat it does
adultsinteger2Adults in the room, 1 to 8. Prices change with the party size.
currencystringUSDCurrency of every price in the output, as Google converts it. 24 codes available: USD, EUR, GBP, CHF, CAD, AUD, JPY, CNY, INR, AED, BRL, MXN and more.
languagestringenLanguage of the descriptions and of the hotel pages Google returns: en, fr, de, es, it, pt, nl, ja, ko, zh-CN, ar, ru, tr, pl. Amenity names are always in English.

📄 Output

FieldTypeDefaultWhat it does
includeDetailsbooleantrueOn: every row also carries the street address, the phone, the price breakdown of the stay (base, taxes and fees, total) and the offers of every booking site with their links. One extra read per hotel, about ten seconds per page of 20. Off: the search columns only, for the fastest list.

⚙️ Advanced

FieldTypeDefaultWhat it does
debugModebooleanfalseAdds detailed lines to the run log. Only useful when you report a problem.

📊 Output data

One row per hotel. A resort of "resorts in Bali", three adults, 20 to 23 December, prices in AUD, with the details on:

{
"id": "ChoI3LHO6tXtkviSARoNL2cvMTFieGY2ZmRiahAB",
"url": "https://www.google.com/travel/hotels/entity/ChoI3LHO6tXtkviSARoNL2cvMTFieGY2ZmRiahAB",
"name": "Sumberkima Hill Retreat",
"hotelClass": 4,
"propertyType": "resort hotel",
"description": "Refined rooms & posh villas with infinity pools in an elegant resort offering sea & mountain views.\nOn a remote hilltop overlooking the Bali Sea, this elegant resort is 21 km from mountainous Barat National Park and 27 km from the Gilimanuk ferry port.\nAccommodations range from refined rooms with verandahs, suspended lounge beds and a shared outdoor infinity pool, to posh 5-bedroom villas that sleep up to 11, and feature private terraces and pools, kitchens, indoor/outdoor bathrooms, and flat-screen TVs. All have sea and/or mountain views, Wi-Fi access, safes and mosquito nets.\nThere's an open-air restaurant offering Asian and western cuisines, plus scenic views. Yoga, spa services and bike rentals are also available.",
"amenities": ["Spa", "Pool", "Wi-Fi", "Parking", "Restaurant", "Airport shuttle", "Fitness center"],
"checkInTime": "3:00 PM",
"checkOutTime": "12:00 PM",
"pricePerNight": 149.96,
"totalPrice": 449.87,
"basePrice": 408.96,
"taxesAndFees": 40.91,
"currency": "AUD",
"rating": 4.7,
"reviewsCount": 1544,
"ratingHistogram": { "1": 33, "2": 36, "3": 42, "4": 144, "5": 1289 },
"offers": [
{
"provider": "Booking.com",
"pricePerNight": 150,
"totalPrice": 450,
"currency": "AUD",
"url": "https://www.google.com/travel/lodging/clk?pc=AA80OszyrJffUy4CV0Qi...&ap=1",
"isOfficial": false
}
],
"offersCount": 1,
"address": "Sumberkima, Gerokgak, Buleleng Regency, Bali 81155, Indonesia",
"phone": "+62 812-8212-9211",
"latitude": -8.1513898,
"longitude": 114.60883679999998,
"countryCode": "ID",
"checkInDate": "2026-12-20",
"checkOutDate": "2026-12-23",
"nights": 3,
"adults": 3,
"imageUrl": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWl58c-dLCokHgTL9vVG5XK3YbrqhmEDU1bAi_JmCIPAqkTZ...=s150-w92-h150-n-k-no",
"images": [
"https://lh3.googleusercontent.com/gps-cs-s/AHRPTWl58c-dLCokHgTL9vVG5XK3YbrqhmEDU1bAi_JmCIPAqkTZ...=s287-w287-h192-n-k-no-v1",
"https://lh3.googleusercontent.com/gps-cs-s/AHRPTWkBdU3ZhP4yf2CEGOZjglqK8ckCbG8T_iAraM-kZlGy26hC...=s287-w287-h192-n-k-no-v1"
],
"website": "https://sumberkimahill.com/",
"mapsUrl": "https://www.google.com/maps?cid=10588045657037314268",
"searchQuery": "resorts in Bali",
"scrapedAt": "2026-09-20T15:58:39Z"
}

The same shape with the details off, from a French search (hôtels à Lyon, language: fr, one adult, two nights in EUR). The search page already carries the price breakdown and the address for many hotels; the offers ladder needs the details:

{
"id": "ChkI-PHLhdCU3o0dGg0vZy8xMXRiZmhreHNkEAE",
"url": "https://www.google.com/travel/hotels/entity/ChkI-PHLhdCU3o0dGg0vZy8xMXRiZmhreHNkEAE",
"name": "The People Lyon",
"hotelClass": null,
"propertyType": "hostel",
"description": "Dortoirs modernes et chambres privées dans une auberge de jeunesse décontractée proposant un restaurant et une cuisine commune.",
"amenities": [],
"checkInTime": "15:00",
"checkOutTime": "11:00",
"pricePerNight": 23.08,
"totalPrice": 46.17,
"basePrice": 44.51,
"taxesAndFees": 1.66,
"currency": "EUR",
"rating": 4.3,
"reviewsCount": 1175,
"ratingHistogram": { "1": 102, "2": 43, "3": 71, "4": 168, "5": 791 },
"offers": [],
"offersCount": 0,
"address": "10 Mnt des Carmélites",
"phone": "04 28 01 86 00",
"latitude": 45.7717096,
"longitude": 4.8273408,
"countryCode": "FR",
"checkInDate": "2026-11-06",
"checkOutDate": "2026-11-08",
"nights": 2,
"adults": 1,
"imageUrl": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWn7z2Erg-gYovaG20ZowU0VZTlnV9DNOTrXBG-4b1WVr8Df...=s150-w92-h150-n-k-no",
"images": ["https://lh3.googleusercontent.com/gps-cs-s/AHRPTWn7z2Erg-gYovaG20ZowU0VZTlnV9DNOTrXBG-4b1WVr8Df...=s287-w287-h192-n-k-no-v1"],
"website": "https://www.thepeoplehostel.com/fr/destinations/lyon/",
"mapsUrl": "https://www.google.com/maps?cid=2097402701547763960",
"searchQuery": "hôtels à Lyon",
"scrapedAt": "2026-09-20T16:00:27Z"
}

🗂️ Data fields

34 fields per hotel, plus 6 per offer. A value Google does not show is null (or an empty list), never an empty string or a zero.

Identity

FieldTypeDescription
idstringGoogle's stable token of the hotel. Paste it, or the url, back into searchQueries to read that hotel again
urlstringPermanent link of the hotel page on Google Hotels
namestringHotel name as Google displays it

Content

FieldTypeDescription
hotelClassintegerStar class, 1 to 5; null for hostels and unclassified properties
propertyTypestringGoogle's category: hotel, hostel, resort hotel, bed and breakfast, motel...
descriptionstringGoogle's summary, with the full paragraphs when the details are on. In the language you picked
amenitiesarrayThe amenities Google highlights, in English: Wi-Fi, Air conditioning, Pool, Spa, Parking, Breakfast, Restaurant, Fitness center, Pet-friendly, Beach access, Beach front, Hot tub, Airport shuttle. Empty when the hotel highlights none of them
checkInTime, checkOutTimestringAs displayed, in the format of the language picked (3:00 PM, 15:00)

Measures

FieldTypeDescription
pricePerNightnumberLowest price per night Google shows for your stay, taxes included where Google includes them
totalPricenumberTotal of the stay, taxes and fees included
basePrice, taxesAndFeesnumberThe breakdown of totalPrice
currencystringISO 4217 code of every price on the row, the one you asked for
ratingnumberGuest rating, 0 to 5
reviewsCountintegerNumber of reviews behind the rating
ratingHistogramobjectReviews per star, {"1": n, ..., "5": n}
offersarrayOne entry per seller Google compares for your stay: provider, pricePerNight, totalPrice, currency, url (the booking link through Google, which opens the seller's page for these dates), isOfficial (true for the hotel's own site)
offersCountintegerLength of offers

Place and time

FieldTypeDescription
addressstringStreet address as Google displays it
phonestringPhone number as displayed
latitude, longitudenumberCoordinates of the property
countryCodestringISO 3166-1 alpha-2
checkInDate, checkOutDatestringThe stay every price refers to, YYYY-MM-DD
nights, adultsintegerLength of the stay and party size the prices are for

Media and links

FieldTypeDescription
imageUrlstringThumbnail of the hotel. Google image links stay valid for months
imagesarrayThe first photos of the hotel, larger variants
websitestringThe hotel's own website when Google shows one
mapsUrlstringLink to the property on Google Maps

Meta

FieldTypeDescription
searchQuerystringThe entry of searchQueries that produced the row
scrapedAtstringTime of the read, RFC 3339 UTC

🚀 Examples

Get the hotels of Paris with their offers for next weekend

{
"searchQueries": ["hotels in Paris"],
"checkInDate": "2026-10-10",
"checkOutDate": "2026-10-12",
"maxItems": 50
}

Price a whole city in euros for a family of four

{
"searchQueries": ["hotels in Barcelona"],
"checkInDate": "2026-12-27",
"checkOutDate": "2026-12-30",
"adults": 4,
"currency": "EUR",
"maxItems": 300
}

Run a rate parity check on the hotels you track

Paste hotel links or exact names. Each one comes back as a row with the rate of every seller next to the hotel's own (isOfficial: true).

{
"searchQueries": [
"https://www.google.com/travel/hotels/entity/ChUImcGKtLfWgL9OGgkvbS8wNTZuODEQAQ",
"Hotel Saint Paul Rive Gauche Paris",
"The Plaza New York"
],
"checkInDate": "2026-11-06",
"checkOutDate": "2026-11-08",
"currency": "USD"
}

List Tokyo hotels in Japanese, priced in yen, without the offers

The fastest list: 20 hotels every couple of seconds, with rating, class, lead price and coordinates.

{
"searchQueries": ["東京 ホテル"],
"language": "ja",
"currency": "JPY",
"includeDetails": false,
"maxItems": 200
}

Compare resorts around a landmark for a long stay

{
"searchQueries": ["resorts near Nusa Dua Bali", "resorts in Seminyak"],
"checkInDate": "2027-01-10",
"checkOutDate": "2027-01-24",
"adults": 2,
"currency": "AUD",
"maxItems": 80
}

Get tonight's prices for a last-minute deal page

No dates: one night starting tomorrow, computed at run time. Schedule the run daily and the dates move with it.

{
"searchQueries": ["hotels in Miami Beach"],
"maxItems": 100
}

🤖 Copy to your AI assistant

Paste this block into Claude, ChatGPT or Cursor to give it full context about this scraper:

You have access to the Google Hotels Scraper on Apify: silentflow/google-hotels-scraper
Input schema:
- searchQueries (array of strings, prefill ["hotels in Paris"]): destinations, hotel names, or Google Hotels hotel links (https://www.google.com/travel/hotels/entity/...)
- checkInDate (string YYYY-MM-DD, optional): first night; empty with an empty checkOutDate = one night starting tomorrow
- checkOutDate (string YYYY-MM-DD, optional): departure day, after checkInDate; up to 30 nights
- maxItems (integer, default 50): hotels to save in all
- adults (integer, default 2, 1 to 8)
- currency (string, default "USD"): USD, EUR, GBP, CHF, CAD, AUD, NZD, JPY, CNY, HKD, SGD, INR, AED, BRL, MXN, SEK, NOK, DKK, PLN, CZK, TRY, ZAR, THB, KRW
- language (string, default "en"): en, fr, de, es, it, pt, nl, ja, ko, zh-CN, ar, ru, tr, pl
- includeDetails (boolean, default true): add address, phone, price breakdown and the offers of every booking site
- debugMode (boolean, default false)
Output per hotel (34 fields):
- id, url, name (string)
- hotelClass (integer or null), propertyType (string), description (string), amenities (string[]), checkInTime, checkOutTime (string)
- pricePerNight, totalPrice, basePrice, taxesAndFees (number), currency (string), rating (number), reviewsCount (integer), ratingHistogram ({"1".."5": integer})
- offers (array of {provider, pricePerNight, totalPrice, currency, url, isOfficial}), offersCount (integer)
- address, phone (string), latitude, longitude (number), countryCode (string), checkInDate, checkOutDate (string), nights, adults (integer)
- imageUrl (string), images (string[]), website, mapsUrl (string)
- searchQuery, scrapedAt (string, RFC 3339)
Pay per result. No account or API key needed. Use apify-client for Python or JavaScript.

💻 Integrations

Build a nightly rate shop of your competitors (Python)

from apify_client import ApifyClient
import pandas as pd
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("silentflow/google-hotels-scraper").call(run_input={
"searchQueries": [
"Hotel Saint Paul Rive Gauche Paris",
"Hôtel Le Six Paris",
"Hotel Le Littré Paris",
],
"checkInDate": "2026-11-06",
"checkOutDate": "2026-11-08",
"currency": "EUR",
})
rows = []
for hotel in client.dataset(run["defaultDatasetId"]).iterate_items():
own = next((o for o in hotel["offers"] if o["isOfficial"]), None)
for offer in hotel["offers"]:
rows.append({
"hotel": hotel["name"],
"seller": offer["provider"],
"per_night": offer["pricePerNight"],
"vs_official": (offer["pricePerNight"] or 0) - (own["pricePerNight"] if own else 0),
})
report = pd.DataFrame(rows).sort_values(["hotel", "per_night"])
undercuts = report[report["vs_official"] < 0]
print(undercuts) # sellers cheaper than the hotel's own site

Feed a destination price index into a dashboard (JavaScript)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('silentflow/google-hotels-scraper').call({
searchQueries: ['hotels in Lisbon'],
checkInDate: '2026-11-20',
checkOutDate: '2026-11-22',
currency: 'EUR',
maxItems: 200,
includeDetails: false,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const byClass = {};
for (const h of items) {
if (!h.pricePerNight || !h.hotelClass) continue;
(byClass[h.hotelClass] ??= []).push(h.pricePerNight);
}
for (const [stars, prices] of Object.entries(byClass)) {
const median = prices.sort((a, b) => a - b)[Math.floor(prices.length / 2)];
console.log(`${stars} stars: median ${median} EUR per night over ${prices.length} hotels`);
}

Export a city to CSV for a spreadsheet (Apify CLI)

apify call silentflow/google-hotels-scraper --input '{"searchQueries": ["hotels in Rome"], "checkInDate": "2026-10-03", "checkOutDate": "2026-10-05", "currency": "EUR", "maxItems": 100}'
# then download the dataset of the run as CSV
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv&token=YOUR_TOKEN" -o rome-hotels.csv

📈 Performance

Measured on 20 September 2026, without any option beyond the ones shown.

RunRowsDuration
hotels in Paris, details on (default form)50 hotels, 49 with offers1 min 25 s
resorts in Bali, 3 adults, 3 nights in AUD, details on30 hotels55 s
A hotel link, a hotel name and hôtels à Lyon in French, details off14 hotels5 s

A search page returns 20 hotels in about two seconds. The details add about eight seconds per page of 20, so 50 hotels with their offers take about half a minute. A destination yields several hundred hotels before Google stops paging; there is no fixed limit per run beyond maxItems.

💾 Data export

The dataset is available from the run page in JSON, CSV, Excel, XML, HTML and RSS, or through the API:

https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv&token=YOUR_TOKEN

Nested fields (offers, ratingHistogram, images) are flattened as offers/0/provider columns in CSV and Excel.

💡 Tips for best results

  1. Name the city in the query. hotels in Lyon reads as a destination. A bare Lyon can be read as a hotel name and return one property.
  2. Set the dates you will actually sell. Prices and offers change with the stay and the party size; a run without dates prices tomorrow night, which is a last-minute price.
  3. Use the offers for parity, the lead price for ranking. pricePerNight is the lowest rate Google found; offers holds every seller, with the hotel's own site flagged.
  4. Turn the details off for a quick market scan. Class, rating, reviews and lead price are on the search page; 200 hotels take under a minute.
  5. Paste url values back in to track the same hotels every day. A hotel link returns exactly that hotel, whatever Google ranks around it.

❓ FAQ

What does the scraper extract exactly? The hotels Google Hotels lists for a destination, a hotel name or a hotel link, priced for the stay you set: name, star class, rating and review histogram, price per night, total with taxes and fees, the offers of every booking site Google compares, address, phone, coordinates, amenities, photos, description and links.

Do I need a Google account or an API key? No. Everything comes from the public Google Hotels pages. No login, no API key, nothing to paste from your browser.

Are the prices the ones a traveler would see? Yes, for the dates, party size and currency of the run. The lead price is the lowest rate Google shows on the hotel card; each offer is the rate of one seller for that stay. Prices move during the day, so re-run before you act on them.

How many hotels can one search return? Google pages 20 hotels at a time and keeps paging for several hundred hotels on a large destination. Set maxItems to what you need; a search stops earlier when Google has nothing new.

Why does a hotel have no offers, or only one? Google lists the sellers that have availability for the stay. A sold-out night, a small party or a distant date can leave one seller or none. The row is still delivered with everything else.

Can I search in another language or currency? Yes: language sets the descriptions and the hotel pages, currency converts every price. Amenity names are always in English.

Can I scrape several destinations in one run? Yes. Each entry of searchQueries is searched in turn, in the same stay; maxItems caps the total. A hotel found by two searches is delivered once.

Which fields can be missing? hotelClass is null for hostels and unclassified properties. address, phone, the price breakdown and offers need the details on for most hotels. amenities is empty when Google highlights none of the ones it names. Nothing is ever an empty string.

Are the links permanent? url and mapsUrl are permanent. Offer links open the seller's page for the run's dates and stay valid for days. Image links stay valid for months.

How fresh is the data? Live: every run reads Google Hotels at that moment, nothing is cached. Schedule the run to track prices over time.

Does it handle children? Prices are computed for the adults you set, in one room. Add children's ages later if you need them; tell us in a feature request.

This Actor extracts publicly available data from Google Hotels. It does not bypass any login, paywall or CAPTCHA. Users are responsible for complying with Google's terms of service and applicable data protection laws (GDPR, CCPA and PIPL where relevant). The output describes businesses, not private individuals; hotel phone numbers and addresses are the public contact details of those businesses. Prices are informational and change often; verify them before a booking or a regulated use.

📬 Support

Need something this scraper doesn't do yet? We ship features fast.

  • Feature requests go straight to our backlog
  • Enterprise needs? We do custom integrations and high-volume plans
  • Pricing questions? Check the Monetization tab on the actor page

Response time: usually under 24 hours.

Check out our other scrapers: silentflow on Apify