# Changelog of Google Hotels Prices Scraper — Price Tracking & Rate Parity (`kestrel/google-hotels-prices`) Actor

- **URL**: https://apify.com/kestrel/google-hotels-prices/changelog.md
- **Full Actor documentation**: https://apify.com/kestrel/google-hotels-prices.md

## Changelog

### 2026-08-30

- Reliability: a run that cannot act on its input — a URL from the wrong site, a name nothing resolves to, an empty target list, a number outside the documented range — now ends cleanly with the reason on the run card instead of as a failed run. Nothing is charged in either case; a blocked or throttled source still fails loudly.
- Store listing: moved into the categories buyers actually browse (the old `Business` category has no Store page).

### 1.1 — 2026-08-26

Reliability and billing fixes.

- **Booking source is now reported for every hotel Google names one for.** The `source` field was matched against a fixed list of OTA names and missed most real sources (Expedia.com, Vio.com, Vrbo.com, ae.Bluepillow.com, freecancellations.com and many others), leaving the field empty. It is now read from its own field in Google's response, so any source is captured — and Google's currency list, which sits in the same block, can no longer be mistaken for one.
- **Property mode no longer delivers a row it could not bill.** When a run hit its spending limit, `hotels` inputs still pushed the hotel row while place searches correctly dropped it. Both paths now behave the same.
- **Bad input fails the run cleanly instead of crashing it.** Non-numeric values for `adults`, `childrenAges`, `maxHotels`, `maxOffersPerHotel`, `sessions` or `perIp` raised an unhandled error mid-run; out-of-range values were accepted silently. Every numeric input is now checked against the range this page documents, and `language`/`country` must be real codes.
- `maxHotels: 0` was silently treated as 20 and billed for 20 hotels. Values outside 1–200 are now rejected before anything is fetched.
- A negative `sweepDays` produced no stays and then crashed the run; it is now rejected.

### 1.0 — 2026-08-25

First public release.

- Hotel prices from Google Hotels for exact dates, occupancy (adults + children's ages), currency and market.
- `hotel` rows (lowest nightly rate, stay total, deal note, class, rating, coordinates, links) for place searches, paged up to 200 hotels.
- `offer` rows: every booking source's rate per hotel — `sources` (one row per source, lowest rate) or `rooms` (every room and rate) — with free-cancellation deadline, click link and partner deep link (official sites include the booking engine URL with the dates).
- Property mode: price exact hotels from Google Hotels URLs or entity tokens without a search.
- Relative dates (`"30 days"`, `"6 weeks"`, `today`) so schedules never go stale; `sweepDays` for rate calendars.
- Billing: pay per priced row only; sold-out hotels, empty searches and `status` rows are free; each hotel and stay is billed once per run even when searches overlap; `maxOffersPerHotel` caps offer rows.
- Dataset views in Console: Overview, Hotels, Offers by source, Run status.
- Reliability: rejects past check-ins instead of pricing tonight silently, reports failures as `status` rows, runs under limited permissions, and is watched by a daily canary run.
