# Apify Hotel Price Monitoring

> 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.

- Skill: `johnisanerd/apify-hotel-price-monitoring` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add johnisanerd/apify-hotel-price-monitoring`
- Raw SKILL.md: https://api.skillmd.com/api/skills/johnisanerd/apify-hotel-price-monitoring/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- License: MIT
- Author: johnisanerd (https://skillmd.com/u/johnisanerd)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/johnisanerd/apify-hotel-price-monitoring

---


# 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

- Apify account (sign up at https://apify.com?fpr=9n7kx3&fp_sid=skillrepo).
- Authentication via `apify login`, or an `APIFY_TOKEN` environment variable (Apify Console, Settings, Integrations).

## The Actor

- Store page: https://apify.com/johnvc/google-hotels-search-scraper?fpr=9n7kx3&fp_sid=skillrepo
- Actor ID: `johnvc/google-hotels-search-scraper`
- Pricing: pay per page of results processed plus a small per-run setup fee (see `references/gotchas.md`).

## Run it with the Apify CLI

One monitoring poll, one page, fixed stay dates:

```bash
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:

```bash
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

1. 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.
2. 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.
3. 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.
4. 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.
5. 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

- Google Flights Data Scraper: https://apify.com/johnvc/Google-Flights-Data-Scraper-Flight-and-Price-Search?fpr=9n7kx3&fp_sid=skillrepo
- Google Travel Explore API: https://apify.com/johnvc/google-travel-explore-api?fpr=9n7kx3&fp_sid=skillrepo
- Google Local API: https://apify.com/johnvc/google-local-api?fpr=9n7kx3&fp_sid=skillrepo

