Home › Guides › Google Hotels Scraper
Google Hotels data: nightly prices, booking-site offers and hotel contacts for any destination
Google Hotels compares the price of a stay across the booking sites it lists — Booking.com, Expedia, Hotels.com, Agoda, the hotel's own site and others. The Google Hotels Scraper returns that comparison as one row per property: the nightly price, each booking site's offer with totals, room rates with free-cancellation terms, star class, guest rating and review count, third-party ratings such as Tripadvisor, and the hotel's address, phone, website and Google Place ID. No Google account, no API key, no browser.
Who it's for
- Hotel revenue managers checking rate parity: the hotel's own-site price next to the OTA prices Google lists, per date, with the total including taxes where the booking site shows it.
- Teams tracking competitor prices on a schedule, for a destination or a shortlist of hotels, with a relative check-in date.
- Travel and OTA product teams that need hotel lists with lead price, rating, class and location for a destination.
- B2B vendors selling to hotels — PMS, booking-engine and revenue-management companies — building property lists with phone, address, website and Google Place ID.
What you get
| Group | Fields |
|---|---|
| Property | Name, property type (hotel, hostel, resort hotel, vacation rental…), star class, description, highlights, amenities (vacation rentals), thumbnail |
| Price | Nightly lead price (before taxes), price text with and without taxes, deal label ("16% less than usual"), cheapest offer |
| Booking sites | Per site: provider, whether it is the hotel's official site, nightly price with and without taxes, total price with and without taxes, booking link with your dates; number of offers |
| Rooms | Provider, room, features, free cancellation (yes / unknown), cancellation term ("Free cancellation until Nov 10"), prices |
| Reviews | Rating, review count, reviews per star, review topics with mentions, third-party ratings (Tripadvisor, Trip.com…) with their review counts |
| Contact & location | Address, phone, website, Google Place ID, Maps feature ID, latitude, longitude, country code, neighborhood, check-in and check-out times |
| Search | Check-in, check-out, nights, adults, currency, rank in this search, the place Google searched, Google Hotels URL, property token, scrape time |
Booking sites, rooms, address, phone, Place ID and third-party ratings come from each hotel's price comparison, read when includeOffers is on (the default).
A real row from a platform run on 2026-09-27 — hotels in Paris, 12–14 November 2026, 2 adults, EUR (trimmed):
{
"name": "MOB HOUSE",
"propertyType": "hotel",
"hotelClass": 4,
"rating": 4.3,
"reviewsCount": 1130,
"pricePerNight": 67.31,
"cheapestOffer": { "provider": "Traveluro", "pricePerNight": 67.31, "totalPriceWithTaxes": 179.3, "isOfficialSite": false },
"address": "70 Rue des Rosiers, 93400 Saint-Ouen-sur-Seine, France",
"phone": "+33 1 55 28 80 80",
"website": "https://www.mobhouse.com/",
"googlePlaceId": "ChIJIfquhEVv5kcRwVvMuyVzegQ",
"offersCount": 26,
"offers": [
{ "provider": "MOB HOUSE", "isOfficialSite": true, "pricePerNight": 110.38, "pricePerNightWithTaxes": 119.85, "totalPrice": 220.75, "totalPriceWithTaxes": 239.7 },
{ "provider": "Traveluro", "isOfficialSite": false, "pricePerNight": 67.31, "pricePerNightWithTaxes": 89.65, "totalPrice": 134.62, "totalPriceWithTaxes": 179.3 }
],
"roomRates": [
{ "provider": "Expedia.com", "room": "1 double bed", "freeCancellation": true, "cancellation": "Free cancellation until Nov 9", "pricePerNight": 108, "pricePerNightWithTaxes": 135 }
],
"externalRatings": [{ "source": "Tripadvisor", "rating": 3.6, "scale": 5, "reviewsCount": 66 }],
"checkIn": "2026-11-12",
"checkOut": "2026-11-14",
"nights": 2,
"currency": "EUR"
}
In this row the hotel's own site asks 110.38 per night while the cheapest listed booking site asks 67.31 — the kind of gap a rate-parity check is looking for, with both sides of it in one record.
Input: destinations, hotels and stay dates
| Input | What it does |
|---|---|
queries | Destinations as you would type them into Google Hotels (hotels in Paris, Istanbul, resorts in Bali), hotel names (Ritz Paris), Google Hotels links or property tokens |
checkIn | YYYY-MM-DD, or days from today such as +30 (a scheduled run always prices the stay 30 days ahead); default +14 |
nights / checkOut | Length of stay (1–30), or an explicit check-out date; default 1 night |
adults · currency | Guests per room (default 2) · currency of every price (30 currencies, default USD) |
maxHotelsPerQuery | Up to 200 properties per destination; Google pages 20 at a time (default 20) |
includeOffers | Booking-site offers, rooms, address, phone, Place ID and third-party ratings — one extra request per hotel (on by default) |
propertyType | All, hotels only (no vacation rentals), or vacation rentals |
minRating · minHotelClass · maxPricePerNight | Filters applied to the results Google returns; a filtered search reads up to 20 result pages to find enough matches |
language · country | Language of descriptions and labels; the searcher's market (the booking sites shown follow it) |
Price comparison for Paris, 2 nights, 30 days ahead:
{ "queries": ["hotels in Paris"], "checkIn": "+30", "nights": 2, "currency": "EUR", "maxHotelsPerQuery": 10 }
A local market with its own currency and language:
{ "queries": ["Istanbul"], "checkIn": "+30", "currency": "TRY", "language": "tr", "country": "tr", "maxHotelsPerQuery": 20 }
Each hotel once per run. A property is delivered and charged once per run, whichever query finds it first — the same hotel given by name and by token, or returned by two searches, is one row. Destinations Google cannot find deliver no hotels: the run leaves one free row whose error starts with unresolved: and says why, instead of quietly returning hotels near the server's own location.
Measured data quality
Measured on three platform runs (Paris 40 properties, Istanbul 20, Paris 10):
- Uniqueness: no property appeared twice in a run (40 of 40, 20 of 20 and 10 of 10 unique property tokens).
- Price arithmetic: every offer's total equals its nightly price × nights to the cent (1,225 of 1,225 offers; 743 exactly, the rest within a cent of rounding). The cheapest offer was the lowest offer in 70 of 70 rows.
- Paris, 40 properties: booking-site offers for 40 of 40, three or more sites for 35, about 19 sites on average. Address for all 36 hotels, hostels and extended-stay hotels (the 4 vacation rentals have no address and no phone). Phone 35, website 38. The hotel's own site was among the offers for 29. Room rates with a free-cancellation term for 28.
- Istanbul, 20 properties: booking-site offers for 20 of 20, three or more sites for 14. Address and phone 16 of 20 (the 4 without are vacation rentals). Star class for 14 of the 15 hotels. Room rates with a free-cancellation term for 11.
Honest limits
- The lead price is Google's, before taxes. In the latest measured runs it equalled the cheapest offer in most rows (median ratio 1.00), was at most 15.2% above it and at most 5.2% below it; one row in an earlier test run was 27% below every listed booking site. Use
cheapestOfferfor the lowest booking-site price. - Totals with taxes are not always shown. Some booking sites show no total including taxes: it was empty for 82 of 752 offers in one Paris run.
- Vacation rentals carry less. In the measured runs they had no address and no phone, and Google shows no star class for them; it shows none for some hotels either (5 of 33 hotels in one Paris run).
- Hotel amenities are not named. Google gives amenity names for vacation rentals only; for hotels the field is
nullrather than guessed. Room features (Wi-Fi, breakfast, parking) are in the room rates. - Search order is not fixed. Google reorders results between requests, so treat the rank as the rank in this run, not a stable position.
- Prices change often. They come from Google's partners; keep the scrape time with the data. Up to 200 properties per destination and 30 nights per stay.
Speed
On the Apify platform, 10 Paris hotels with booking sites took 7 seconds, 40 took 25 seconds and 20 Istanbul properties took 11 seconds. One list request returns up to 20 properties; the booking-site comparison is one more request per hotel. None of the measured runs was rate-limited or needed the residential proxy; if Google does rate-limit a run, the actor switches to Apify residential proxy by itself.
Pricing
Pay per result: each delivered property is one hotel event, with the booking-site offers included. Status rows are free — a search with no results, a destination Google could not find, a hotel already delivered by an earlier query. Apify also charges its standard actor-start event once per run. Current prices are on the actor's Pricing tab on Apify.
Price a destination now: type hotels in Paris, pick the dates and currency, and get every listed booking site's offer per hotel — exportable to JSON, CSV or Excel.
Related
Demand for a destination moves with the seasons; the Google Trends scraper guide shows how to pull 5-year weekly interest for a search term. If you sell to hotels, the website on each row is the key for company enrichment — see the firmographics & competitive intelligence guide. All Google datasets are in the Google data section.
Frequently asked questions
Is pricePerNight the cheapest price?
It is Google's lead price for the stay, before taxes. In the latest measured runs it equalled the cheapest offer in most rows (median ratio 1.00), was at most 15.2% above it and at most 5.2% below it; one row in an earlier test run was 27% below every listed booking site. The cheapestOffer field gives the lowest booking-site price among the offers.
Can I search by hotel name?
Yes. When Google matches the name to one hotel, such as Ritz Paris, the scraper returns that hotel with its price comparison, the same as for its property token. Google's offer list can differ between two requests.
Why do some properties have no star class?
Google shows no class for vacation rentals and for some hotels (5 of 33 hotels in one measured Paris run).
What happens with a typo in the destination?
No hotels are delivered for it. The run leaves one free row whose error starts with unresolved: and explains why, so nothing is charged. On delivered rows, resolvedLocation shows the place Google searched.
Is free cancellation always detected?
Room terms are read from Google's labels, checked in 13 languages including English, Turkish, German, French and Spanish. In another language the term stays in the room features and freeCancellation is null. When a rate states no cancellation term, freeCancellation is null, never false.
Google Hotels Scraper — pay per hotel, booking-site offers included, no Google account.
Get hotel prices on Apify →