Google Hotels API: hotel prices by city, hotel name or URL for your dates. One row per hotel: nightly rate, stay total, taxes, deals, availability, rating. Optional OTA rates (Booking.com, Expedia, Agoda, official site): rate parity, price comparison, price tracking. Free: address, phone, amenities.
2026-10-16 — Keyword Planner and locale documentation
Validated search terminology against Google Ads Keyword Planner and Store shelves. Added localized usage guidance and bounded examples; retained existing English phrases. Clarified locale limitations where measured. No runtime, output fields, defaults, or pricing changed.
1.9 — listing and input form reworded, 2026-09-21
No behaviour, output or price changed; the same inputs return the same rows.
The input form is reordered: what to price, the stay, how many hotels and which rows (includeOffers, offerLevel, includeDetails), the price calendar, then filters. hotels (Google Hotels URLs), maxOffersPerHotel, minPrice and specialOffers moved lower; nothing was renamed or removed.
Every input now says what to pass, with an example, its default and what it costs.includeOffers states up front that it is on by default and adds about 18 rows per hotel; country says it is the searcher's market, not the destination; maxHotels says filters apply before the cap; hotels explains how to price the same set every day.
Measured row counts replace the old guesses: every booking site's rate is 18 rows per hotel on average (4 to 36, 174 hotels); room level about 65 (up to about 150). The old text said 5–15.
The pricing text lists what is never charged, that there is no start fee, and that a run stops at the maximum cost you set.
README: a section mapping common requests to the exact input.
1.9 — 2026-09-21
Fixed: a search could come back empty for no reason. About 1 run in 85, Google answered a perfectly good search ("hotels in Lisbon") with a well-formed but empty result — 702 bytes instead of ~200 KB — and the run ended green with no rows. An empty first page is now asked again from another IP, twice at most; a search that really has no results (a filter nothing passes) still comes back empty.
Fixed: maxHotels above about 180 came back short. The pager stopped after ten pages of twenty, and consecutive pages share a hotel or two, so maxHotels: 200 delivered about 185 in a large city. The page budget now follows maxHotels; checked live: London, 200 of 200. A place with fewer hotels still simply runs out.
Corrected the taxes note: from a US IP Google displays the price before taxes with mandatory fees included (total_base + fees), not the bare base — measured on 57 of 57 hotels. The fields themselves were right and are unchanged.
New on offer rows: the free-cancellation deadline as data — free_cancel_until_date (ISO date) and free_cancel_until_time, next to the display text. Google gives the deadline without a year and in the page's language; the date is derived only where the wording cannot be misread (nine languages, checked live: every derived date fell between today and check-in) and is left empty otherwise.
sortBy: lowest_price — documented what it sorts on: Google uses the price basis of the country the request comes from (total_base from a US IP, total_with_taxes elsewhere), so the list is exactly sorted on one of those two fields even when the displayed nightly price is not.
Found by a new smoke suite of 42 awkward inputs (stay lengths, occupancy, 9 markets and scripts, every filter and sort, names, URLs, details, inputs that must be refused) that now runs against every release before it reaches you.
1.8 — 2026-09-20
Six new ready-made runs, each run for real before its page was published and billed exactly what the page says: Singapore in SGD, Hong Kong in HKD and Traditional Chinese, Shanghai in CNY and Simplified Chinese, free-cancellation and rating filters, rate parity for hotels by name, and hotel data with address, phone, rating breakdown and amenities. No change to the actor's behaviour.
1.7 — 2026-09-20
New on every hotel row from a place search: what the stay costs with and without taxes — total_base, taxes, fees and total_with_taxes, Google's own breakdown, where total_base + taxes + fees = total_with_taxes (checked on 120 hotels in six markets). This matters because what Google displays (nightly, total) follows the country of the proxy IP: pre-tax from a US IP, all-in from most others. total_with_taxes is the same either way.
New: deal_percent — the number in the deal note (19 for "19% less than usual"), read in any language.
New with includeDetails: amenities and amenities_unavailable — what the property page lists, by name, with notes (Wi-Fi (free), Parking (extra charge)). Google sends these as bare ids; the names were matched to Google's own About tab across 76 hotels and then checked on 22 hotels in cities not used for the matching: 796 amenities named, none wrongly. An id without a verified name is left out.
Existing fields are unchanged; these are additional columns.
1.6 — 2026-09-20
New: hotel details (includeDetails) — address, phone, Google Maps place ID, long description, the 5-to-1-star rating breakdown, review topics with positive and negative mention counts, ratings on Tripadvisor and other sites, and photos, from Google's own property page. One small extra call per hotel, asked once per run however many stays are priced, at no extra charge: a hotel row costs the same with or without details.
Hotels given by URL (hotels) come back complete with star class, rating and coordinates when details are on.
Off by default: a run that does not set it has the same rows, columns and cost as before. A new "Hotel details" table view shows the fields in the Console.
1.5 — 2026-09-20
Hotel names in Chinese, Japanese, Korean and Thai now resolve.hotelNames compared names as Latin words only, so 香港半島酒店 or パーク ハイアット 東京 were refused even though Google had found the hotel (6 of 6 tested). Names in scripts written without spaces are now compared by character pairs, and a property Google names in another script (台北君悅酒店 → Grand Hyatt Taipei) is accepted when Google resolved exactly one property. Latin names are matched exactly as before.
Verified in 13 language/market/currency combinations (Singapore, Hong Kong, mainland China, Taiwan, Japan, Korea, Indonesia, Thailand, Malaysia, Vietnam): 20 of 20 hotels priced in each; the README lists the settings and the booking sites Google shows per market.
1.4 — 2026-09-20
New: Google Hotels' own filters and sort for place searches — sortBy (lowest price, highest rating, most reviewed), freeCancellation, minPrice/maxPrice, minRating (3.5+/4.0+/4.5+), hotelClass, amenities (19 of them) and specialOffers. Google applies them before anything is fetched, so only matching hotels are returned and billed, and they hold across every page of results.
All of them are optional and off by default: a run that sets none sends Google exactly the request it always sent.
Fixed: multi-page searches could skip hotels. Google's page tokens belong to the result set of the IP that issued them; the actor spread the pages of one search over its proxy sessions, so page 2 could start somewhere else (measured on a price-sorted search: every hotel between $108 and $131 was skipped). All pages of one search now come from one session; different searches and stays still run in parallel across sessions.
1.3 — 2026-09-20
Fixed: truncated rate ladders. About one proxy IP in eight gets a cut-down answer from Google on every call: 6–7 booking sites instead of 20–26, with Booking.com and Agoda missing, so even the lowest rate was wrong for that hotel (measured: $360 instead of $175). Roughly 7% of hotels in a run were affected, clustered on whichever session drew such an IP. The actor now recognises these answers, retires that IP for the rest of the run and asks again (at most twice), keeping the most complete answer. Measured after the fix: 0 short answers in 48 fetches. The run summary reports how many answers were rescued (rpc.weak).
You may see more offer rows for the hotels that used to come back short — those are the rates that were missing. Nothing else changed: inputs, fields, defaults and prices are the same.
1.2 — 2026-09-20
New: hotels by name (hotelNames). Give property names ("Hyatt Regency Lisbon") or Google Maps place links instead of Google Hotels URLs. Each name is looked up once per run, a name nothing matches is free and reported in its status row, and only a property whose name matches yours is billed. Rows found by name carry star class, rating, review count, coordinates and website — which rows from a bare URL cannot.
Nothing else changed: every existing input, output field, default and price is the same, and runs that do not use hotelNames behave exactly as before.
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.