Google Hotels Scraper: Prices & OTA Offers avatar

Google Hotels Scraper: Prices & OTA Offers

Pricing

from $0.75 / 1,000 hotels

Go to Apify Store
Google Hotels Scraper: Prices & OTA Offers

Google Hotels Scraper: Prices & OTA Offers

Scrape Google Hotels by city or hotel: prices from every provider (Booking.com, Expedia, Agoda, official site), ratings, amenities, price calendar and alerts.

Pricing

from $0.75 / 1,000 hotels

Rating

0.0

(0)

Developer

Lighthouse Data

Lighthouse Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Get hotel prices from Google Hotels for any destination and dates, with every booking provider's price side by side (Booking.com, Expedia, Agoda, Hotels.com, Trip.com, the hotel's official site and 20–40 more). You also get ratings, star class, amenities and coordinates. Add a price calendar for the next 90 check-in dates, or schedule it to alert you when prices change. Export to JSON, CSV or Excel, or use the API.

What does Google Hotels Scraper do?

  • Searches Google Hotels by destination ("Prague", "Lisbon, Portugal", "hotels near Eiffel Tower") for your check-in date, nights, adults, children's ages and currency, in Google's ranking order, up to 500 hotels per destination.
  • Looks up specific hotels by name, Google Hotels URL or hotel ID. This suits a competitive set or a first-pass rate-parity screen.
  • Returns each provider's offer: nightly price, total for the stay, price including taxes and fees, free cancellation, and whether it is the hotel's own site.
  • Returns hotel details: rating, number of reviews and their star distribution, star class, property type, address, phone, website, coordinates, Google Maps link, amenities, check-in/out times and a photo.
  • Price calendar: the lowest price and cheapest provider for up to 90 consecutive check-in dates.
  • Price-change monitoring: remembers the last price per hotel, stay and provider, and reports what went up, went down, appeared or disappeared since the previous run.
  • 72 currencies, any Google language and country.

Why use it?

  • Built for reliability. It reads the same structured data the Google Hotels page loads, over plain HTTP. There is no headless browser to break and no HTML guessing. Blocks are retried on a fresh IP, with automatic fallback to residential proxies. In our tests, 1,368 of 1,368 requests succeeded.
  • Fails loudly, never silently. Google quietly swaps an unknown destination for "United States" and past dates for tomorrow. This Actor detects both and tells you, instead of handing you the wrong hotels or the wrong dates.
  • One flat price per hotel, however many offers it has. A hotel with 30 provider offers costs the same as one with 3.
  • Made for scheduled monitoring. The change-detection mode, the calendar and the stable hotel IDs are designed for daily runs.
  • Friendly to AI agents and MCP. Every input and output field is documented with types and examples.

Use cases

  • Hotel revenue management: a daily rate shop of your hotel and your competitive set across every OTA for the next 30–90 nights.
  • Rate-parity screening: spot booking sites that show a lower price than your official site on Google (isOfficialSite vs. everyone else), then verify the room type, cancellation terms and inclusions on the booking site.
  • Travel agencies and TMCs: watch quoted or booked stays and act when the price drops.
  • OTAs, metasearch and travel startups: price benchmarks and coverage by city, and seed data for new markets.
  • Analysts and researchers: city price indices, seasonality, and event-driven price spikes.
  • AI travel agents: "the cheapest 4-star hotel near the venue on these dates, and where to book it".

How to use it

  1. Click Try for free.
  2. Enter one or more Destinations (e.g. Prague), or Specific hotels by name or Google Hotels URL.
  3. Set the Check-in date (e.g. 2026-11-10, or +14 days for scheduled runs), Nights, Adults and Currency.
  4. Turn on Include every provider's price for the per-OTA price ladder.
  5. Click Start. Download the results as JSON, CSV or Excel, or read them through the API. Use the Offers by provider, Price calendar and Price changes tabs for one row per offer, date or change.

Input example (the prefilled input: 5 hotels in Prague with all offers, about $0.013):

{
"destinations": ["Prague"],
"checkIn": "2026-11-10",
"nights": 2,
"adults": 2,
"currency": "EUR",
"maxHotelsPerDestination": 5,
"includeOffers": true
}

Watch your competitive set every morning and receive only what changed:

{
"hotels": [
"Hotel NH Collection Prague Carlo IV",
"Hilton Prague Old Town",
"https://www.google.com/travel/hotels/entity/ChgI9pq7z4m4m4KvARoLL2cvMXYwbGpoNGIQAQ"
],
"checkIn": "+1 day",
"nights": 1,
"calendarDays": 30,
"currency": "EUR",
"monitorPrices": true,
"monitorStoreName": "prague-comp-set",
"minChangePercent": 2
}
  1. Save this as a task, then add a schedule (for example daily at 07:00) in Apify Console under Schedules.
  2. Each run checks the next 30 check-in dates for the three hotels, with every provider on the first date.
  3. The Price changes tab lists every move of 2% or more since the previous run: previous price, current price, delta and percent.
  4. Connect an integration (Slack, email, Google Sheets, Zapier, Make or a webhook) to get the changes pushed to you.

This costs about $0.23 per day (3 hotels × ($0.0025 + 30 × $0.0025)), or roughly $7 a month.

The relative check-in date (+1 day) moves forward with every run. Changes are compared for the same stay dates, so with a calendar each date is tracked day after day until it passes. Use a separate monitorStoreName for each independent watch list.

API

curl -X POST "https://api.apify.com/v2/acts/<username>~google-hotels/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"destinations":["Lisbon"],"checkIn":"+30 days","nights":2,"maxHotelsPerDestination":10,"includeOffers":true}'

Input

FieldTypeDescriptionExample
destinationsarray of stringsPlaces to search, as typed into Google Hotels. Unknown places fail with a clear message["Prague", "hotels near Eiffel Tower"]
hotelsarray of stringsHotel names (with the city), Google Hotels URLs or hotel IDs. Always include offers["Hilton Prague Old Town"]
checkInstringYYYY-MM-DD, or relative (+14 days, +2 weeks, tomorrow). Empty = 14 days from today. At most 365 days ahead"2026-11-10"
nightsinteger1–30 (default 1)2
adultsinteger1–12 (default 2)2
childrenAgesarray of integersOne age (0–17) per child, up to 6[5, 8]
maxHotelsPerDestinationinteger1–500 (default 20)20
includeOffersbooleanAdd every provider's price, address, phone and full amenities for destination results (default false)true
calendarDaysinteger0 = off; otherwise the number of consecutive check-in dates to price (up to 90)30
monitorPricesbooleanReport changes since the previous run (default false)true
monitorStoreNamestringKey-value store that keeps the last prices"prague-comp-set"
minChangePercentintegerIgnore smaller moves (default 0)2
onlyChangedHotelsbooleanWith monitoring, save only hotels with a changefalse
currencystringISO 4217 code, 72 supported (default USD)"EUR"
languagestringGoogle language (hl, default en)"de"
countrystringSearcher's country (gl, default us)"gb"
proxyConfigurationobjectDefault: Apify datacenter proxy{ "useApifyProxy": true }
residentialFallbackbooleanSwitch to residential proxy after repeated blocks (default true, no extra charge)true
maxConcurrencyintegerParallel requests, 1–20 (default 5)5

With an empty input, the Actor searches the example destination "Prague".

Output

Each hotel is one record. Offers, the calendar and changes are nested arrays; the dataset tabs Offers by provider, Price calendar and Price changes flatten them into one row each. A SUMMARY record in the key-value store lists per-destination counts, any inputs that failed and why, and the request statistics.

{
"hotelId": "ChcIrK78kOba8qxYGgsvZy8xdmZwMmJwdxAB",
"name": "Czech Inn, Prague",
"url": "https://www.google.com/travel/hotels/entity/ChcIrK78kOba8qxYGgsvZy8xdmZwMmJwdxAB/prices?hl=en&gl=us&curr=USD&ts=…",
"googleMapsUrl": "https://maps.google.com/?cid=11139706250922420949",
"propertyType": "hostel",
"hotelClass": null,
"rating": 4.4,
"reviewCount": 2354,
"ratingDistribution": { "1": 87, "2": 64, "3": 160, "4": 533, "5": 1510 },
"latitude": 50.0718358,
"longitude": 14.4464348,
"address": "Francouzská 240/76, 101 00 Praha 10-Vršovice, Czechia",
"phone": "+420 210 011 100",
"website": "http://www.czechinn.com/",
"description": "Stylish dorms & rooms in a comfortable hostel offering a shared kitchen & a cool basement bar.",
"amenities": ["Wi-Fi (free)", "Bar", "Breakfast (extra charge)", "Smoke-free property", "Front desk (24 hour)"],
"checkInTime": "15:00",
"checkOutTime": "12:00",
"thumbnailUrl": "https://lh3.googleusercontent.com/…",
"searchQuery": "Prague",
"resolvedLocation": "Prague",
"position": 2,
"checkIn": "2026-10-13",
"checkOut": "2026-10-15",
"nights": 2,
"adults": 2,
"childrenAges": [],
"currency": "USD",
"lowestPricePerNight": 20.43,
"lowestPricePerNightWithTaxes": 27.52,
"lowestTotalPrice": 40.85,
"lowestTotalPriceWithTaxes": 55.04,
"cheapestProvider": "Booking.com",
"offersCount": 4,
"offers": [
{
"provider": "Booking.com",
"isOfficialSite": false,
"pricePerNight": 20.43,
"pricePerNightWithTaxes": 27.52,
"totalPrice": 40.85,
"totalPriceWithTaxes": 55.04,
"freeCancellation": false,
"bookingUrl": "https://www.google.com/travel/lodging/clk?pc=…"
}
],
"priceCalendar": null,
"priceChanges": null,
"scrapedAt": "2026-09-29T22:04:38.912Z"
}

A price-change entry (monitoring mode):

{ "scope": "provider", "provider": "Booking.com", "checkIn": "2026-10-29", "checkOut": "2026-10-31", "status": "changed",
"previousPrice": 379.55, "currentPrice": 354.55, "priceDelta": -25, "priceDeltaPercent": -6.59, "previousScrapedAt": "2026-09-28T06:00:00.000Z" }

Field notes

  • All prices are numbers in currency. "Per night" is Google's nightly average before taxes. The totals are the nightly price × nights, which is how Google shows its totals; the …WithTaxes fields include taxes and fees when the provider reports them.
  • A missing value is null, never 0 or "". null prices mean Google shows no price (sold out, or dates too far ahead).
  • hotelId is stable. Pass it back in hotels for fast, exact lookups.
  • Hotels are saved as they finish, in parallel; sort by position for Google's ranking order.

Pricing

Pay per event: you pay only for results. Prices below are the FREE-tier prices; paid Apify plans get lower per-event prices (shown on the Pricing tab).

EventPriceWhen
Actor start$0.00005Once per run (per GB of memory)
Hotel$0.001Each hotel saved
Hotel offers$0.0015Each hotel with every provider's price (destination results with offers on; all direct hotel lookups)
Calendar date$0.0025Each hotel × check-in date in price-calendar mode

Examples

  • 100 hotels in a city, listing only: $0.10.
  • 100 hotels with every provider's offer: $0.25.
  • A daily rate shop of 5 hotels × 30 nights: 5 × ($0.0025 + 30 × $0.0025) = $0.39 per day.
  • The prefilled input (5 hotels with offers): about $0.013.

Higher Apify subscription plans get tiered discounts on these prices automatically. Set a maximum cost per run in the run options, and the Actor stops cleanly when it reaches it, keeping what it has already scraped. Proxy costs are included; you pay nothing extra for them.

FAQ

Is it legal to scrape Google Hotels? This Actor extracts only publicly available data: hotel listings, prices and aggregate ratings that anyone can see without logging in. It does not collect individual reviews or reviewers' names, and it solves no CAPTCHAs. Automated access may conflict with Google's Terms of Service, so use the data responsibly. Your results could in principle contain personal data (for example, a phone number of a private vacation rental host), which is protected by GDPR and other regulations. Do not process personal data unless you have a legitimate reason. If you are unsure, consult your lawyers.

Are the prices exact? They are the prices Google shows at the moment of the run, provided by the booking sites. Hotel prices change constantly and depend on the searcher's country (country), so treat them as indicative and confirm on the booking site.

Why do some hotels have no price? Google shows no price when a hotel is sold out for your dates, or when the dates are too far ahead (usually beyond about 11 months). The record is still saved, with null prices.

Why is hotelClass often null? Google shows an official star class for only some hotels. We never guess it.

What happens with a typo in the destination? Google silently falls back to a whole country. This Actor detects that and fails that destination with a message, while your other destinations still run.

Can I get more than 20 hotels? Yes, up to 500 per destination; the Actor pages through Google's results. Google itself lists only its most relevant hotels for very large cities.

Do you support vacation rentals? When Google lists them in hotel results, yes. They have propertyType: null and usually a single offer.

How do I use it from an AI agent? Call it through the Apify MCP server or API. Use hotels for exact lookups and destinations for discovery; hotelId values round-trip between runs.

Limitations

  • Prices come from Google's metasearch and can differ slightly from the booking site's final checkout price.
  • Each provider's price is the lowest one Google displays for that stay. Room type, cancellation terms and inclusions (such as breakfast) can differ between providers, so a lower price is not always a like-for-like rate. Room-level rates are not included.
  • Room-level rates (for example "Deluxe King, non-refundable") are not included in v1; offers are per provider.
  • Check-in must be within 365 days, stays 1–30 nights, at most 12 adults and 6 children.
  • Amenity labels are in English whatever the language.
  • The price calendar makes one request per date per hotel, so large calendars take longer (about 1 s per date per hotel, 3 in parallel).
  • Individual reviews are out of scope; only aggregate ratings are provided.

Changelog

See the ./CHANGELOG.md tab.

Support

Found a bug or need a field? Open an issue on the Issues tab. We reply within 48 hours. When Google changes its pages, our daily health check usually catches it before you do.