Google Hotels Search Scraper - Prices by Booking Site
Pricing
from $4.25 / 1,000 hotel delivereds
Google Hotels Search Scraper - Prices by Booking Site
Hotel prices from Google Hotels for any destination and dates: nightly and total price on every booking site (Booking.com, Expedia, Hotels.com, Agoda, official site) with links, rating, reviews, star class, amenities, coordinates. Any currency and country. HTTP only.
Pricing
from $4.25 / 1,000 hotel delivereds
Rating
0.0
(0)
Developer
Scrapewise Data
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
21 hours ago
Last modified
Categories
Share
Google Hotels Scraper: Prices by Booking Site
Google Hotels Scraper returns hotel prices for any destination and stay dates, with the nightly and total price on every booking site Google lists (Booking.com, Expedia, Hotels.com, Agoda, the hotel's official website and others), plus rating, reviews, star class, amenities, address and coordinates. It is meant for revenue managers doing rate shopping, travel apps and agencies that need live prices with booking links, and analysts mapping a hotel market.
At a glance
| Apify plan | Per hotel | Per 1,000 hotels |
|---|---|---|
| Free | US$ 0.003 | US$ 3.00 |
| Bronze | US$ 0.00285 | US$ 2.85 |
| Silver | US$ 0.0027 | US$ 2.70 |
| Gold and above | US$ 0.00255 | US$ 2.55 |
- Booking-site prices are included and on by default, at the same price.
- You pay only for hotels delivered with a price. Sold-out hotels, names not found, destinations without results, blocked requests, hotels outside your filters and duplicates are free.
- No monthly fee and no start fee; proxy (including the residential fallback) is included. 20 hotels cost US$ 0.06.
Quick start
An empty input prices 20 hotels in New York, check-in 14 days from today, 1 night, 2 adults. With your own stay:
{"locations": ["Lisbon"],"checkInDate": "2026-11-05","checkOutDate": "2026-11-08","adults": 1,"currency": "EUR"}
Specific hotels, by name with the city or by Google Hotels link (google.com/travel/hotels/entity/...):
{ "hotels": ["The Savoy London", "Pestana Palace Lisboa"], "currency": "GBP", "countryCode": "gb" }
locations and hotels can be sent in the same run. One real row from a New York run (check-in 2026-10-15, 2 nights, 2 adults), lists and links shortened:
{"name": "Hilton Garden Inn New York/Staten Island","type": "hotel","hotelClass": "3-star hotel","stars": 3,"rating": 4.2,"reviewCount": 3211,"pricePerNight": 144,"totalPrice": 287,"currency": "USD","available": true,"lowestPriceSite": "Traveluro","bookingSitesCount": 28,"bookingPrices": [{ "site": "Traveluro", "pricePerNight": 144, "totalPrice": 287, "isOfficialSite": false, "url": "https://www.traveluro.com/hotels/..." },{ "site": "Hilton Garden Inn New York/Staten Island", "pricePerNight": 162, "totalPrice": 325, "isOfficialSite": true, "url": "https://..." },{ "site": "Booking.com", "pricePerNight": 162, "totalPrice": 325, "isOfficialSite": false, "url": "https://www.booking.com/..." }],"popularAmenities": ["Wi-Fi (free)", "Air conditioning", "Breakfast (extra charge)", "Parking"],"address": "1100 South Ave, Staten Island, NY 10314","latitude": 40.6148318,"longitude": -74.1766456,"checkInDate": "2026-10-15","checkOutDate": "2026-10-17","adults": 2,"searchQuery": "New York","position": 5,"errorCode": null}
What it fixes
- Prices for the wrong dates. Every booking-site price is checked against the stay you asked for. If Google prices a different stay, those offers are dropped and
detailsErrorstarts withDATES_NOT_APPLIED, so you never store a price for the wrong dates. - One price per hotel is not enough for parity checks.
bookingPriceslists every site with its own link andisOfficialSite, cheapest first. In a New York run hotels had offers from a median of 24 sites. - Hostels and apartments mixed into hotel lists.
typeseparates hotels, hostels, resorts and serviced apartments.
Switching from another Google Hotels actor? Your existing input works
| Field you already send | Here |
|---|---|
searchQuery, searchQueries, q, destination | Same as locations (a string or a list) |
hotelUrls | Same as hotels (names or Google Hotels entity links) |
country, gl / language, hl | Same as countryCode / languageCode |
check_in_date, check_out_date, min_price, max_price | Same as the camelCase fields |
minRating 7, 8, 9 | Read as 3.5+, 4.0+, 4.5+; a decimal from 0 to 5 is the rating itself |
minGuestRating, minStars | Accepted |
hotelClass | A number keeps that class and up; a list such as [4, 5] keeps exactly those |
maxItems | Caps the run; without maxResults it is also the limit per destination |
includeBookingSources, includePrices | Not needed: booking-site prices are on by default |
sortBy, amenities, freeCancellation, ecoCertified | Ignored with a log message; sort or filter the dataset yourself |
Not supported: children, multiple rooms, reviews text, photo galleries, and place ids or bare entity tokens in hotelUrls.
Use cases
Rate shopping and OTA parity. Put your hotel and your competitive set in hotels, set the dates you care about and schedule the run every morning. Filter bookingPrices on isOfficialSite to see who undercuts the official rate.
Price calendar. For hotels given by name or link, priceCalendarDays prices the same stay length for the next check-in dates, one row per date with every booking site and priceCalendarDay (1, 2, 3...). Each date is one charged row.
{ "hotels": ["The Plaza New York"], "checkInDate": "2026-11-10", "checkOutDate": "2026-11-12", "priceCalendarDays": 30, "currency": "USD" }
Daily price monitor. Save a Task with fixed dates, turn on compareWithPreviousRun and onlyChanged, and schedule it daily. Each run delivers, and charges, only hotels that are new for this search or whose nightly price moved, with previousPrice, priceChange, priceChangePct, isNew, isNewLowest, lowestSeenPrice and firstSeenAt. A day with no change returns one free row with errorCode: NO_PRICE_CHANGES. The history lives in the key-value store google-hotels-price-history in your account, one record per search; delete it to start over. Without fixed dates the default check-in moves every day and every run is a new search.
Market research. Map every property in a city with class, rating, review count, price level, amenities and coordinates.
Output fields
One row per hotel. Fill rates from a run of 300 London hotels; fields marked "details" need includeDetails (on by default).
| Field | Example | Filled |
|---|---|---|
name, type | "The Savoy", "hotel" | 100%, 87% |
hotelClass, stars | "4-star hotel", 4 | 81% |
rating, reviewCount, ratingDistribution | 4.2, 3211, {"5": 1828, ...} | 97%, 97%, 87% |
pricePerNight, totalPrice (+ ...Text) | 144, 287 | 100% |
currency, available | "USD", true | 100% |
lowestPriceSite, bookingSitesCount, bookingPrices (details) | "Traveluro", 28, [...] | 99% |
amenities, amenitiesByCategory, popularAmenities (details) | "Wi-Fi (free)" | 81 to 84% |
address, phone (details) | front desk number | 83 to 87% |
latitude, longitude, website | 40.61, -74.17 | 100%, 91% |
checkInTime, checkOutTime | "4:00 PM" | 90% |
description, descriptionLong (details) | short and full description | 78 to 80% |
imageUrl, placeId, propertyToken | main photo, Google ids | 87 to 100% |
googleHotelsUrl, googleMapsUrl | the hotel with your dates and currency | 87 to 100% |
searchQuery, position | what you sent, rank in the list | 100% |
checkInDate, checkOutDate, adults | the stay that was priced | 100% |
errorCode, error, detailsError | see below | on errors |
Each bookingPrices entry has site, pricePerNight, totalPrice (with text versions), isOfficialSite, url (the site's own link with your dates) and googleRedirectUrl. The dataset has two views: Hotels and prices and Price per booking site (one line per hotel and site).
Rows that are not charged
errorCode or flag | Meaning |
|---|---|
available: false | Google lists the hotel but shows no price for these dates and guests (often sold out or a minimum stay). |
HOTEL_NOT_FOUND | No Google Hotels property matches the name. Add the city or paste the Google Hotels link. |
NO_RESULTS | Google Hotels has no properties for this destination and dates. |
BLOCKED | Google refused the request on every retry. Run again. |
NO_PRICE_CHANGES | Price monitor: nothing changed for this search since the previous run. |
detailsError on a delivered row explains missing booking-site prices: DATES_NOT_APPLIED (Google priced another stay, offers dropped) or BLOCKED (the price page failed; the hotel keeps its list price and is charged).
Speed
Measured on Apify with 512 MB: 20 New York hotels in 23 s, 50 Tokyo hotels without details in 15 s, 300 London hotels with details in 411 s (about 1.4 s per hotel). Requests are plain HTTP through the Apify datacenter proxy; after two blocks a request moves to a residential IP at no extra price.
Use it from code and AI agents
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("scrapewise/google-hotels").call(run_input={"locations": ["Lisbon"], "currency": "EUR", "maxResults": 20})for hotel in client.dataset(run["defaultDatasetId"]).iterate_items():print(hotel["name"], hotel["pricePerNight"], hotel["rating"], hotel["lowestPriceSite"])
The same works from the HTTP API (run-sync-get-dataset-items), n8n, Make, Zapier and Google Sheets. For AI agents: https://mcp.apify.com/?actors=scrapewise/google-hotels.
Requests an agent can pass straight through:
- "Find 4 and 5 star hotels in Lisbon under 250 EUR a night rated 4.5 or more" ->
{"locations": ["Lisbon"], "currency": "EUR", "hotelClasses": ["4", "5"], "maxPrice": 250, "minRating": 4.5, "maxResults": 30} - "Which day in the next month is cheapest to book The Savoy London?" ->
{"hotels": ["The Savoy London"], "currency": "GBP", "countryCode": "gb", "priceCalendarDays": 30} - "Every day, tell me which Tokyo hotels changed price for cherry blossom week" ->
{"locations": ["Shibuya Tokyo"], "checkInDate": "2027-03-27", "checkOutDate": "2027-03-30", "currency": "JPY", "compareWithPreviousRun": true, "onlyChanged": true, "maxResults": 50}
FAQ
Why did my run fail with "checkInDate is in the past"?
Google only prices future stays. Use a date from today on, or leave checkInDate empty for 14 days from the run date. Saved tasks with fixed dates stop working once the date passes.
Do prices include taxes and fees?
They are the prices Google shows for the chosen countryCode, and Google's tax display rules vary by country. Compare prices collected with the same country, currency and number of adults.
Why is a price different from my browser?
Your browser uses your own country, currency, language and sometimes member rates. Set countryCode, currency, languageCode and adults to match.
Can I call it from the API, n8n, Make, Zapier or an AI agent? Yes, see "Use it from code and AI agents" above.
Is it legal to scrape Google Hotels? The Actor reads public pages without login and collects business information about hotels, not personal data. You are responsible for how you use the data.
Limitations
- One stay (dates and guests) per run, plus the optional price calendar for named hotels. Children and multiple rooms are not supported.
- Filters run on the list Google returns, so a narrow filter can read up to 60 pages per destination.
- About 1,000 hotels per destination at most, the depth of Google's own list.
- Amenity names and class labels follow
languageCode. - Something broke or a field is missing? Open an issue on the Issues tab.
Changelog
- 2026-10-19: examples for AI agents (Apify MCP server).
- 2026-10-04: price tracking between runs (
compareWithPreviousRun,onlyChanged) for daily monitors. - 2026-09-30: price calendar (
priceCalendarDays,priceCalendarStep), up to 90 check-in dates per hotel. - 2026-09-15: input field names from other Google Hotels scrapers work as they are.