Google Hotels Scraper
Pricing
from $4.00 / 1,000 hotel results
Google Hotels Scraper
Scrape Google Hotels for any city or hotel: prices per night and total for your dates, guests and currency, deals, ratings, review topics, amenities, location scores and photos. Add every booking site's rate, typical price range, cheaper dates and highlights. Export to CSV, Excel or JSON.
Pricing
from $4.00 / 1,000 hotel results
Rating
0.0
(0)
Developer
CHEN-SHU-CHEN
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
What is Google Hotels Scraper?
Google Hotels shows prices from every booking site side by side, but only one city, one set of dates and one screen at a time. Comparing a few cities, tracking prices for a trip, or building a list of hotels with their ratings means copying numbers by hand.
Type a city or a search ("hotels in tokyo", "beach resorts in Bali") or paste a Google Hotels URL, pick your dates, guests and currency, and get one row per hotel: price per night and for the whole stay, with taxes split out, deal badges ("38% less than usual"), star class, Google rating and review count, the 1–5 star split, what reviewers talk about, location scores, check-in and check-out times, nearby sights and airports with travel times, amenities, website, coordinates and photos.
Turn on hotel details and each row also gets every booking site's price with its link, which one is the official site, member rates, free-cancellation deadlines, taxes, the typical price range and where today's price sits in it, cheaper dates nearby, Google's highlights with the reviews behind them, Tripadvisor and other sites' ratings, the full amenity list, address, phone and similar hotels nearby.
Because it runs on Apify, you can schedule a daily price check, call it through the API, connect it to Make, Zapier or Google Sheets, and export the table as CSV, Excel or JSON.
How to scrape Google Hotels
- Open the Input tab and type one search per line into Locations, searches or Google Hotels URLs:
Tokyo,hotels in Shinjuku, a search URL copied from google.com/travel, or a hotel's own page (https://www.google.com/travel/hotels/entity/...). - Set Check-in and Check-out. Leave them empty for a two-night stay 30 days from today. For scheduled runs, relative dates such as
+30 dayskeep working every day. - Set Adults, Children's ages and Currency.
- Choose Hotels per search (20 is about one Google page).
- Optional: turn on Add hotel details, set filters (guest rating, stars, price, sort).
- Click Start. A page of 20 hotels takes about 3 seconds; details add about one second per hotel.
What data does Google Hotels Scraper return?
| Field | Notes |
|---|---|
status, error, notes | ok, not_found, blocked, parse_error, invalid_input, not_processed; notes says when a price is missing or Google answered in another currency |
query, input, inputIndex, position, page | Which input the row answers, and its rank in Google's order |
name, entityToken, mapsCid, featureId, placeId | Ids for joining with Google Maps data; placeId with details or for hotel URLs |
googleHotelsUrl, googleMapsUrl, website | The Google Hotels link opens at your dates and currency |
latitude, longitude, address, phone, countryCode, neighborhood | Address and phone come with details, or for hotel URLs |
hotelClass, hotelClassText, propertyType, propertyTypes | Official stars; hotel, hostel, ryokan, vacation rental... |
rating, reviewCount, ratingDistribution | Google rating, and the percent and count of each star |
reviewTopics | What reviews mention: name, mentions, positive, negative, sentiment |
locationScores | overall, thingsToDo, restaurants, transit, airportAccess, 0–5 |
checkInTime, checkOutTime, nearbyPlaces | Nearby sights, transit, airports and restaurants with walking, taxi or transit times |
currency, pricePerNight, priceTotal, priceBeforeTaxesTotal, taxesTotal, otherFeesTotal | Google's lowest price for your stay; the display strings too (pricePerNightDisplay) |
pricedCheckIn, pricedCheckOut, checkIn, checkOut, nights, adults, childrenAges, requestedCurrency | What Google priced, next to what you asked for |
deal | {"text": "38% less than usual", "label": "GREAT DEAL", "percentBelowUsual": 38} |
ecoCertified, sponsored, amenities, amenityCodes, essentialInfo | essentialInfo is "Sleeps 4", "2 bedrooms" for vacation rentals |
description, photos, thumbnail | Photo URLs with size, and the booking site's original where Google has it |
With hotel details (includeDetails)
| Field | Notes |
|---|---|
rates | Every booking site: price per night and total, isOfficialSite, memberRateBadges ("Member rate, save 5%") and the price before it, freeCancellation and freeCancellationUntil, taxesPerNight where Google shows it, and the booking link |
featuredOffers | Featured sites with their rooms: room name, bed and breakfast details, price |
typicalPrice | {"low": 178, "high": 312, "current": 234, "positionInRange": 0.45, "level": "typical"} |
priceCalendar, cheaperDates | The same stay length starting each day a week either side, and the up to five cheapest of those that beat your dates, with the saving |
thingsToKnow, reviewHighlights | Google's highlights; each review highlight carries the reviews it is based on (author, rating, text, date) |
reviewSummary, reviewSnippets, otherSiteRatings | Tripadvisor, Trip.com and others: rating, review count, link and latest review |
amenitiesDetailed | Every amenity by group (Internet, Pools, Food & drink...), with free/extra charge, what the hotel lacks ("No pools"), and sustainability practices |
longDescription, placeId, address, phone | |
similarHotels, popularHotelsNearby, vacationRentalsNearby, sponsoredSimilarHotels | Name, id, rating, price and distance of each |
detailsStatus, detailsError | ok, or why the details could not be read (that hotel's details are then not charged) |
Unknown is null, never 0. A hotel with no price for your dates has pricePerNight: null and a note.
How much does it cost to scrape Google Hotels?
You pay per hotel row, not per page or per minute.
| Event | When | Price | Per 1,000 hotels |
|---|---|---|---|
hotel-result | Each hotel row with status: ok | $0.004 | $4 |
hotel-details | On top, for each row whose details were read (detailsStatus: ok) | $0.003 | $3 |
So 1,000 hotels cost $4, or $7 with details. Rows that are not_found, blocked, parse_error, invalid_input or not_processed are free, and so are hotels skipped by the minimum price.
Is it free to try?
Apify's free plan includes $5 of usage a month: about 1,250 hotels, or 700 with details.
How do I keep a run from costing more than I expect?
Set a maximum charge for the run. Each hotel row is written and charged in one step, and only if the remaining budget covers it, so you are never charged for a row you did not get. A hotel's details are read only when the budget covers the hotel and its details together, and are charged once, after their row is in the dataset. When the budget runs out, the run stops and every input it did not reach gets a not_processed row. If charging fails, the run stops the same way rather than keep working unbilled.
What happens if Apify restarts a run?
Progress is saved before and after each row. After a restart, a row that was already written is neither written nor charged again, and a row that was not written yet is read again and charged once. Searches already finished are skipped. The run also stops about 90 seconds before its timeout, so the remaining inputs still get their not_processed rows.
Input example
{"queries": ["hotels in tokyo", "https://www.google.com/travel/hotels/entity/ChUIuILA_uqFna0LGgkvbS8wMzV3X3AQAQ"],"checkInDate": "2026-11-17","checkOutDate": "2026-11-19","adults": 2,"childrenAges": [6],"currency": "EUR","maxHotelsPerQuery": 40,"minRating": "4.0","includeDetails": true}
Output example
One row from a run on 2026-10-18, trimmed:
{"status": "ok","query": "hotels in paris","position": 1,"name": "Hilton Garden Inn Paris La Villette","hotelClass": 4,"rating": 4.4,"reviewCount": 519,"locationScores": {"overall": 3.3, "thingsToDo": 3.6, "restaurants": 3.2, "transit": 4.4, "airportAccess": 4.4},"currency": "GBP","pricePerNight": 192.87,"priceTotal": 578.61,"priceBeforeTaxesTotal": 487.06,"taxesTotal": 91.55,"deal": {"text": "17% less than usual", "label": "DEAL", "percentBelowUsual": 17},"ecoCertified": true,"amenities": ["Paid breakfast", "Free Wi-Fi", "Air conditioning", "Pet-friendly", "Fitness center"],"typicalPrice": {"low": 184.0, "high": 279.0, "current": 193.0, "positionInRange": 0.256, "level": "typical"},"cheaperDates": [{"checkIn": "2026-12-11", "checkOut": "2026-12-14", "pricePerNight": 178.5, "savingsPerNight": 14.37}],"rates": [{"site": "Booking.com", "isOfficialSite": false, "pricePerNight": 192.87, "taxesPerNight": 30.52}]}
FAQ
Are the prices for my dates and currency?
Yes. Dates, guests and currency go into the request itself, the same way Google's own page sends them, and each row says which dates Google priced (pricedCheckIn, pricedCheckOut) and in which currency. If Google ever answers for other dates or in another currency, the row says so in notes.
Why are some taxes per booking site null?
Google shows a site's tax only for the featured offers at the top of the price list. The other sites' prices already include taxes, but Google does not split them. The stay's overall split is always in priceBeforeTaxesTotal and taxesTotal.
Why does a minimum price take longer?
Google's price filter only takes a maximum. A minimum is applied after reading, so cheaper hotels are read, skipped and not charged, and more pages may be needed to fill Hotels per search.
What can it not return?
- Individual Google reviews. The highlights carry the reviews Google picked to support them; a full review list is a different tool.
- Prices hidden behind sign-in. Member prices that only appear when logged in to a booking site are not visible to Google either.
- Amenity labels in other languages. Labels are English whatever
languageis set; hotel names, descriptions and reviews followlanguage. - Rating of a hotel looked up by URL in other languages. For hotel URLs the overall rating is read from the page's English markup, so set
languagetoento get it.
Does it work from Europe?
Google shows a cookie notice to visitors from the EU. The Actor accepts it up front, and a request that still lands on the notice is retried on another IP. The default Apify datacenter proxy reads Google Hotels without it.
What happens when Google changes its pages?
Google Hotels sends its data as unlabelled arrays. The Actor finds each object by the type key Google gives it and checks every field's shape, so a changed layout gives parse_error rows instead of numbers in the wrong column. Amenity labels were mapped from codes on 2026-10-18; a code that is new since then is still in amenityCodes, with no label.
Something broke or a number looks wrong
Open an issue on the Issues tab with the input and the run link.