Google Hotels Scraper: Prices & OTA Offers
Pricing
from $0.75 / 1,000 hotels
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
2 days ago
Last modified
Categories
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 (
isOfficialSitevs. 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
- Click Try for free.
- Enter one or more Destinations (e.g.
Prague), or Specific hotels by name or Google Hotels URL. - Set the Check-in date (e.g.
2026-11-10, or+14 daysfor scheduled runs), Nights, Adults and Currency. - Turn on Include every provider's price for the per-OTA price ladder.
- 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}
Scheduled price monitoring (recommended for revenue managers)
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}
- Save this as a task, then add a schedule (for example daily at 07:00) in Apify Console under Schedules.
- Each run checks the next 30 check-in dates for the three hotels, with every provider on the first date.
- The Price changes tab lists every move of 2% or more since the previous run: previous price, current price, delta and percent.
- 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
| Field | Type | Description | Example |
|---|---|---|---|
destinations | array of strings | Places to search, as typed into Google Hotels. Unknown places fail with a clear message | ["Prague", "hotels near Eiffel Tower"] |
hotels | array of strings | Hotel names (with the city), Google Hotels URLs or hotel IDs. Always include offers | ["Hilton Prague Old Town"] |
checkIn | string | YYYY-MM-DD, or relative (+14 days, +2 weeks, tomorrow). Empty = 14 days from today. At most 365 days ahead | "2026-11-10" |
nights | integer | 1–30 (default 1) | 2 |
adults | integer | 1–12 (default 2) | 2 |
childrenAges | array of integers | One age (0–17) per child, up to 6 | [5, 8] |
maxHotelsPerDestination | integer | 1–500 (default 20) | 20 |
includeOffers | boolean | Add every provider's price, address, phone and full amenities for destination results (default false) | true |
calendarDays | integer | 0 = off; otherwise the number of consecutive check-in dates to price (up to 90) | 30 |
monitorPrices | boolean | Report changes since the previous run (default false) | true |
monitorStoreName | string | Key-value store that keeps the last prices | "prague-comp-set" |
minChangePercent | integer | Ignore smaller moves (default 0) | 2 |
onlyChangedHotels | boolean | With monitoring, save only hotels with a change | false |
currency | string | ISO 4217 code, 72 supported (default USD) | "EUR" |
language | string | Google language (hl, default en) | "de" |
country | string | Searcher's country (gl, default us) | "gb" |
proxyConfiguration | object | Default: Apify datacenter proxy | { "useApifyProxy": true } |
residentialFallback | boolean | Switch to residential proxy after repeated blocks (default true, no extra charge) | true |
maxConcurrency | integer | Parallel requests, 1–20 (default 5) | 5 |
With an empty input, the Actor searches the example destination "Prague".
Output
See real output: 20 records from a real run (JSON). This is the built-in example (empty input), run on 2026-10-06 with build 1.0.9.
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, a completeness object, 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,"lowestPrice": null,"lowestPriceAt": null,"isLowestPrice": null,"isComplete": true,"incompleteReason": 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, "changePercent": -6.6,"previousScrapedAt": "2026-09-28T06:00:00.000Z" }
In monitoring mode each record also carries its price history for the stay: lowestPrice (the lowest nightly price seen since tracking began in this monitor store, this run included), lowestPriceAt (when it was first seen) and isLowestPrice (true when today's price is at or below every earlier price; null on the first run or when there is no price today). Each price-calendar date has the same three fields. Outside monitoring mode they are null.
Completeness and rerunning failures
- Every record has
isComplete. It isfalsewhen part of what you asked for could not be read, with the reason inincompleteReason: for example the hotel page was blocked after all retries, so the hotel is saved from the search results only (no offers, address or phone), or some price-calendar dates could not be fetched. Incomplete records are free. SUMMARY.completenesscounts the run's hotels:{ "unit": "hotels", "requested": 20, "delivered": 18, "incomplete": 1, "failed": 1, "ratio": 0.9 }.requestedis the hotels the run attempted, plus one for each destination or hotel name that failed as a whole (unknown destination, no hotels on Google, blocked search);deliveredis complete hotels;ratioisdelivered / requested.- When anything failed or was incomplete, the key-value store also gets
FAILED_INPUT: your input with every setting kept and the target lists reduced to what failed. Hotels found through a destination are listed by hotel ID inhotels(so they are looked up directly, with offers); failed destinations and hotel names are kept as you typed them. Start a new run withFAILED_INPUTas the input to fetch just those. - The run's status message sums it up, e.g.
Saved 18 of 20 hotel(s); 1 incomplete (saved free of charge); 1 failed (blocked by Google or unavailable); rerun input saved as FAILED_INPUT.A run with some failures still succeeds.
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…WithTaxesfields include taxes and fees when the provider reports them. - A missing value is
null, never0or"".nullprices mean Google shows no price (sold out, or dates too far ahead). hotelIdis stable. Pass it back inhotelsfor fast, exact lookups.- Hotels are saved as they finish, in parallel; sort by
positionfor 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).
| Event | Price | When |
|---|---|---|
| Actor start | $0.00005 | Once per run (per GB of memory) |
| Hotel | $0.001 | Each hotel saved |
| Hotel offers | $0.0015 | Each hotel with every provider's price (destination results with offers on; all direct hotel lookups) |
| Calendar date | $0.0025 | Each hotel × check-in date in price-calendar mode |
What counts as complete. You pay only for complete hotel records, and an incomplete one (isComplete: false) is free: no hotel, offers or calendar events.
- A hotel is complete when everything requested for it was read: the search listing (listing-only runs), or the hotel page with its offers when offers or a calendar were requested, and every calendar date that was fetched.
- A real state is still complete and charged. That includes a hotel that is sold out or has no price for your dates (
nullprices), a hotel with no offers, and a calendar date for which Google shows no price. A date with no price is left out of the calendar and not charged. - A hotel is incomplete (free) when we could not read part of it. That happens when the hotel page was blocked or failed after all retries and the hotel was saved from the search results only, or when one or more calendar dates could not be fetched. Incomplete and failed hotels go into
FAILED_INPUTfor a rerun. - Hotels that fail completely, and destinations or hotel names Google does not recognise, produce no record and cost nothing.
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.
Ready-made tasks
One-click examples with the input already filled in. Open one, adjust it and run:
- Compare hotel prices across booking sites in Paris
- Hotel rate calendar for a competitor set
- London hotel prices from Google Hotels
- New York hotel price monitor
- Tokyo hotel prices in yen
Use it from an AI agent (MCP)
AI agents can run this Actor through Apify's MCP server. Add this server to Claude, Cursor, VS Code or any MCP client:
{"mcpServers": {"apify": { "url": "https://mcp.apify.com?tools=cylindrical_lighthouse/google-hotels" }}}
You sign in to Apify in the browser on first use, or you can send the header Authorization: Bearer <APIFY_TOKEN>. VS Code's mcp.json names the top-level key servers instead of mcpServers. With the Apify CLI you can also run apify mcp install cursor (other clients are supported). Then just ask, for example: "Find 2-night hotel prices in Paris for 2 adults and show the cheapest booking site".
Integrations
- Make, Zapier and n8n: use the Apify app or node, choose Run an Actor and pick
cylindrical_lighthouse/google-hotels, then send the dataset to Google Sheets, Airtable, Slack or a database. - Google Drive and webhooks: in the Actor's Integrations tab, upload each run's results to a Drive folder or call your own URL when a run finishes.
- Schedules: in Apify Console, go to Schedules, then Create new, and pick this Actor or one of its saved tasks to compare hotel rates automatically.
- API:
POST https://api.apify.com/v2/acts/cylindrical_lighthouse~google-hotels/run-sync-get-dataset-items?token=<APIFY_TOKEN>runs it and returns the results in one call.
Related Actors
From the same publisher:
- Google Trends Scraper
- Amazon Product Scraper & Price Tracker
- Coles & Woolworths Grocery Price Scraper
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.
Did this Actor save you time? A short review on the Store helps other people find it and tells us what to improve. If something didn't work, please open an issue first, so we can fix it for you.