Hotel Price Monitoring: Rate Snapshots From Google Hotels
Turn Google Hotels into a hotel price monitor. Each poll takes a destination and stay dates and returns every listed property with numeric nightly and total rates. Snapshot the run, diff it against the last one on property_token, and you have rate-drop alerts, competitor rate watching, or a price history for one market.
When to use this skill
- The user wants hotel price monitoring for a destination, a set of stay dates, or specific properties.
- They want to watch competitor hotel rates (a hotelier checking the market around their property).
- They want alerts when a rate drops below a threshold before a trip or an event.
- They ask "do hotel prices go down closer to the date": monitor the same stay across days and answer with data.
Not for: one-off exports of a single search (use the scrape-hotel-prices skill), booking or reservations (the Actor is read-only), or flight fare tracking (use the Google Flights Data Scraper).
What each snapshot returns (one object per results page)
Each dataset item is a page of results with search_metadata (total_results, properties_count, pages_processed, pagination_limit_reached) and a properties array. Per property: name, type, rate_per_night and total_rate (display lowest plus numeric extracted_lowest and before-tax variants), overall_rating, reviews count, amenities, gps_coordinates, check_in_time, check_out_time, and property_token, the stable key you diff on. When present: hotel_class, location_rating, deal plus deal_description, a per-vendor prices array with cancellation flags, and a reviews_breakdown by topic. Sponsored listings arrive separately in ads.
Prerequisites
The Actor
Run it with the Apify CLI
One monitoring poll, one page, fixed stay dates:
apify actors call "johnvc/google-hotels-search-scraper" -i '{"search_type":"search","q":"hotels near Moscone Center San Francisco","check_in_date":"2026-10-05","check_out_date":"2026-10-08","currency":"USD","max_pages":1}' \
--json \
--user-agent apify-awesome-skills/apify-hotel-price-monitoring \
2>/dev/null
Read a finished run's snapshot later, for example from a scheduled run:
apify datasets get-items <DATASET_ID> --format json --user-agent apify-awesome-skills/apify-hotel-price-monitoring 2>/dev/null
Every call carries the three flags this repo expects: --json (or --format json), --user-agent apify-awesome-skills/apify-hotel-price-monitoring, and 2>/dev/null.
Run it from Claude or another AI agent (MCP)
The Actor is MCP-ready. Add the hosted server URL:
https://mcp.apify.com/?tools=actors,docs,johnvc/google-hotels-search-scraper
Then ask, for example: "Check hotel prices near the Louvre for November 12 to 14 and tell me which of yesterday's hotels got cheaper." MCP setup docs: https://docs.apify.com/platform/integrations/mcp
Workflow
- Fix the monitor definition. One Actor input per monitor:
q (destination or market), check_in_date and check_out_date, party size, and an explicit currency. Keep every field identical across polls; only then are two snapshots comparable.
- Bound each poll.
max_pages: 1 covers about 20 properties and is enough for most competitor sets. Narrow the market with server-side filters (hotel_class, guest_rating, max_price) instead of adding pages.
- Poll on a schedule. Wrap the same input in an Apify Schedule or a cron job. Daily is the usual cadence; hourly only for short event windows.
- Store and diff. Flatten each page object's
properties into rows keyed on property_token, keep extracted_lowest from rate_per_night and total_rate plus the run timestamp, then compare with the previous snapshot: new lows, threshold crossings, and week-over-week drift.
- Alert and report. Send drops past the user's threshold, and chart a property's rate across snapshot dates to answer "when should I book".
Inputs
q (string): destination, market, or landmark query
check_in_date / check_out_date (YYYY-MM-DD): the monitored stay, required with a query
adults, children, children_ages: party, keep constant across polls
currency (ISO 4217): set it explicitly so snapshots compare cleanly
hotel_class, guest_rating, stars, min_price, max_price: narrow to the competitor set
gl, hl: country and language codes
max_pages (default 1): pages per poll, the cost bound per snapshot
Cost
Billing is pay per event: a per-run setup fee plus a per-page fee, about $0.04 for a one-page poll at the time of writing. A daily one-page monitor is roughly $1.20 a month; three markets daily is under $4 a month. Estimate with the live prices in references/gotchas.md before scheduling.
Honest limits
- This is a polled monitor, not a push feed: freshness equals your poll interval.
- Rates apply to the exact stay dates and party in the input; a monitor with rolling dates (always 30 days out) needs the dates recomputed before each poll.
- Listing sets shift between polls: hotels enter and leave page one, so a missing
property_token does not always mean sold out.
- The Actor returns current prices only. Price history exists only in the snapshots you keep.
- Read-only data: it cannot hold, book, or confirm any rate.
Troubleshooting
- A tracked property vanished from the snapshot: it may have dropped off the fetched pages; raise
max_pages by one or query the hotel name directly.
- Rates jump wildly between polls: confirm
currency, party fields, and dates are identical across polls before trusting the diff.
- Empty
properties: dates in the past or check_out_date not after check_in_date are the usual cause in long-running monitors.
pagination_limit_reached true: expected on one-page polls; only raise max_pages if your competitor set is bigger than one page.
See references/gotchas.md for cost guardrails and error recovery, and references/actor-index.md for the Actor routing table.
Related travel-data Actors
1---2name: apify-hotel-price-monitoring3description: Run hotel price monitoring on Google Hotels with the Apify Google Hotels Search Scraper Actor (johnvc/google-hotels-search-scraper). Poll the same destination and stay dates on a schedule, snapshot rate_per_night and total_rate per property with numeric extracted values, then diff snapshots keyed on property_token to alert on drops, watch competitor hotel rates, or chart how prices move as the stay date approaches. Use when the user wants hotel price monitoring, wants to track or watch hotel prices over time, monitor competitor hotel rates for a property or market, build a rate drop alert pipeline, or asks whether hotel prices go down closer to the date. Pay-per-page billing plus a small per-run setup fee, MCP-ready for Claude and other AI agents.4license: MIT5---67# Hotel Price Monitoring: Rate Snapshots From Google Hotels89Turn Google Hotels into a hotel price monitor. Each poll takes a destination and stay dates and returns every listed property with numeric nightly and total rates. Snapshot the run, diff it against the last one on `property_token`, and you have rate-drop alerts, competitor rate watching, or a price history for one market.1011## When to use this skill1213- The user wants hotel price monitoring for a destination, a set of stay dates, or specific properties.14- They want to watch competitor hotel rates (a hotelier checking the market around their property).15- They want alerts when a rate drops below a threshold before a trip or an event.16- They ask "do hotel prices go down closer to the date": monitor the same stay across days and answer with data.1718Not for: one-off exports of a single search (use the scrape-hotel-prices skill), booking or reservations (the Actor is read-only), or flight fare tracking (use the Google Flights Data Scraper).1920## What each snapshot returns (one object per results page)2122Each dataset item is a page of results with `search_metadata` (`total_results`, `properties_count`, `pages_processed`, `pagination_limit_reached`) and a `properties` array. Per property: `name`, `type`, `rate_per_night` and `total_rate` (display `lowest` plus numeric `extracted_lowest` and before-tax variants), `overall_rating`, `reviews` count, `amenities`, `gps_coordinates`, `check_in_time`, `check_out_time`, and `property_token`, the stable key you diff on. When present: `hotel_class`, `location_rating`, `deal` plus `deal_description`, a per-vendor `prices` array with cancellation flags, and a `reviews_breakdown` by topic. Sponsored listings arrive separately in `ads`.2324## Prerequisites2526- Apify account (sign up at https://apify.com?fpr=9n7kx3&fp_sid=skillrepo).27- Authentication via `apify login`, or an `APIFY_TOKEN` environment variable (Apify Console, Settings, Integrations).2829## The Actor3031- Store page: https://apify.com/johnvc/google-hotels-search-scraper?fpr=9n7kx3&fp_sid=skillrepo32- Actor ID: `johnvc/google-hotels-search-scraper`33- Pricing: pay per page of results processed plus a small per-run setup fee (see `references/gotchas.md`).3435## Run it with the Apify CLI3637One monitoring poll, one page, fixed stay dates:3839```bash40apify actors call "johnvc/google-hotels-search-scraper" -i '{"search_type":"search","q":"hotels near Moscone Center San Francisco","check_in_date":"2026-10-05","check_out_date":"2026-10-08","currency":"USD","max_pages":1}' \41 --json \42 --user-agent apify-awesome-skills/apify-hotel-price-monitoring \43 2>/dev/null44```4546Read a finished run's snapshot later, for example from a scheduled run:4748```bash49apify datasets get-items <DATASET_ID> --format json --user-agent apify-awesome-skills/apify-hotel-price-monitoring 2>/dev/null50```5152Every call carries the three flags this repo expects: `--json` (or `--format json`), `--user-agent apify-awesome-skills/apify-hotel-price-monitoring`, and `2>/dev/null`.5354## Run it from Claude or another AI agent (MCP)5556The Actor is MCP-ready. Add the hosted server URL:5758`https://mcp.apify.com/?tools=actors,docs,johnvc/google-hotels-search-scraper`5960Then ask, for example: "Check hotel prices near the Louvre for November 12 to 14 and tell me which of yesterday's hotels got cheaper." MCP setup docs: https://docs.apify.com/platform/integrations/mcp6162## Workflow63641. Fix the monitor definition. One Actor input per monitor: `q` (destination or market), `check_in_date` and `check_out_date`, party size, and an explicit `currency`. Keep every field identical across polls; only then are two snapshots comparable.652. Bound each poll. `max_pages: 1` covers about 20 properties and is enough for most competitor sets. Narrow the market with server-side filters (`hotel_class`, `guest_rating`, `max_price`) instead of adding pages.663. Poll on a schedule. Wrap the same input in an Apify Schedule or a cron job. Daily is the usual cadence; hourly only for short event windows.674. Store and diff. Flatten each page object's `properties` into rows keyed on `property_token`, keep `extracted_lowest` from `rate_per_night` and `total_rate` plus the run timestamp, then compare with the previous snapshot: new lows, threshold crossings, and week-over-week drift.685. Alert and report. Send drops past the user's threshold, and chart a property's rate across snapshot dates to answer "when should I book".6970## Inputs7172- `q` (string): destination, market, or landmark query73- `check_in_date` / `check_out_date` (YYYY-MM-DD): the monitored stay, required with a query74- `adults`, `children`, `children_ages`: party, keep constant across polls75- `currency` (ISO 4217): set it explicitly so snapshots compare cleanly76- `hotel_class`, `guest_rating`, `stars`, `min_price`, `max_price`: narrow to the competitor set77- `gl`, `hl`: country and language codes78- `max_pages` (default 1): pages per poll, the cost bound per snapshot7980## Cost8182Billing is pay per event: a per-run setup fee plus a per-page fee, about $0.04 for a one-page poll at the time of writing. A daily one-page monitor is roughly $1.20 a month; three markets daily is under $4 a month. Estimate with the live prices in `references/gotchas.md` before scheduling.8384## Honest limits8586- This is a polled monitor, not a push feed: freshness equals your poll interval.87- Rates apply to the exact stay dates and party in the input; a monitor with rolling dates (always 30 days out) needs the dates recomputed before each poll.88- Listing sets shift between polls: hotels enter and leave page one, so a missing `property_token` does not always mean sold out.89- The Actor returns current prices only. Price history exists only in the snapshots you keep.90- Read-only data: it cannot hold, book, or confirm any rate.9192## Troubleshooting9394- A tracked property vanished from the snapshot: it may have dropped off the fetched pages; raise `max_pages` by one or query the hotel name directly.95- Rates jump wildly between polls: confirm `currency`, party fields, and dates are identical across polls before trusting the diff.96- Empty `properties`: dates in the past or `check_out_date` not after `check_in_date` are the usual cause in long-running monitors.97- `pagination_limit_reached` true: expected on one-page polls; only raise `max_pages` if your competitor set is bigger than one page.9899See `references/gotchas.md` for cost guardrails and error recovery, and `references/actor-index.md` for the Actor routing table.100101## Related travel-data Actors102103- Google Flights Data Scraper: https://apify.com/johnvc/Google-Flights-Data-Scraper-Flight-and-Price-Search?fpr=9n7kx3&fp_sid=skillrepo104- Google Travel Explore API: https://apify.com/johnvc/google-travel-explore-api?fpr=9n7kx3&fp_sid=skillrepo105- Google Local API: https://apify.com/johnvc/google-local-api?fpr=9n7kx3&fp_sid=skillrepo