Google Hotels Search Scraper - Prices by Booking Site avatar

Google Hotels Search Scraper - Prices by Booking Site

Pricing

from $4.25 / 1,000 hotel delivereds

Go to Apify Store
Google Hotels Search Scraper - Prices by Booking Site

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

Scrapewise Data

Maintained by Community

Actor 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 planPer hotelPer 1,000 hotels
FreeUS$ 0.003US$ 3.00
BronzeUS$ 0.00285US$ 2.85
SilverUS$ 0.0027US$ 2.70
Gold and aboveUS$ 0.00255US$ 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 detailsError starts with DATES_NOT_APPLIED, so you never store a price for the wrong dates.
  • One price per hotel is not enough for parity checks. bookingPrices lists every site with its own link and isOfficialSite, cheapest first. In a New York run hotels had offers from a median of 24 sites.
  • Hostels and apartments mixed into hotel lists. type separates hotels, hostels, resorts and serviced apartments.

Switching from another Google Hotels actor? Your existing input works

Field you already sendHere
searchQuery, searchQueries, q, destinationSame as locations (a string or a list)
hotelUrlsSame as hotels (names or Google Hotels entity links)
country, gl / language, hlSame as countryCode / languageCode
check_in_date, check_out_date, min_price, max_priceSame as the camelCase fields
minRating 7, 8, 9Read as 3.5+, 4.0+, 4.5+; a decimal from 0 to 5 is the rating itself
minGuestRating, minStarsAccepted
hotelClassA number keeps that class and up; a list such as [4, 5] keeps exactly those
maxItemsCaps the run; without maxResults it is also the limit per destination
includeBookingSources, includePricesNot needed: booking-site prices are on by default
sortBy, amenities, freeCancellation, ecoCertifiedIgnored 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).

FieldExampleFilled
name, type"The Savoy", "hotel"100%, 87%
hotelClass, stars"4-star hotel", 481%
rating, reviewCount, ratingDistribution4.2, 3211, {"5": 1828, ...}97%, 97%, 87%
pricePerNight, totalPrice (+ ...Text)144, 287100%
currency, available"USD", true100%
lowestPriceSite, bookingSitesCount, bookingPrices (details)"Traveluro", 28, [...]99%
amenities, amenitiesByCategory, popularAmenities (details)"Wi-Fi (free)"81 to 84%
address, phone (details)front desk number83 to 87%
latitude, longitude, website40.61, -74.17100%, 91%
checkInTime, checkOutTime"4:00 PM"90%
description, descriptionLong (details)short and full description78 to 80%
imageUrl, placeId, propertyTokenmain photo, Google ids87 to 100%
googleHotelsUrl, googleMapsUrlthe hotel with your dates and currency87 to 100%
searchQuery, positionwhat you sent, rank in the list100%
checkInDate, checkOutDate, adultsthe stay that was priced100%
errorCode, error, detailsErrorsee belowon 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 flagMeaning
available: falseGoogle lists the hotel but shows no price for these dates and guests (often sold out or a minimum stay).
HOTEL_NOT_FOUNDNo Google Hotels property matches the name. Add the city or paste the Google Hotels link.
NO_RESULTSGoogle Hotels has no properties for this destination and dates.
BLOCKEDGoogle refused the request on every retry. Run again.
NO_PRICE_CHANGESPrice 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 ApifyClient
client = 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.