Rate parity check on Google Hotels by name or URL. One row per hotel and stay: every OTA and official site side by side (Booking.com, Expedia, Agoda), nightly rate, free cancellation, link; cheapest source, spread, direct booking rate, undercut by whom and how much. minSpreadPct: violations only.
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.0 — listing and input form reworded, 2026-10-11
No behaviour, output or price changed; the same inputs return the same rows.
The input form is reordered: hotelNames first (agents have names, not entity URLs), then hotels, the stay (checkIn, nights, sweepDays), minSpreadPct moved up next to the stay as the violations-only control, then guests, currency and market; proxy and pacing last. Nothing was renamed or removed.
Every input now says what to pass, with an example, its default and what it costs.sweepDays states the arithmetic (5 hotels × sweepDays 6 = 35 rows, $0.35); minSpreadPct says what 0 means, that filtered rows are never billed, and that it filters on the cheapest-to-dearest spread, not on the undercut — "only where an OTA undercuts direct" is a filter on undercut_by; hotelNames states the name guard (two shared words and 60 % of yours), that a city Google leaves out of the name counts against the match, and what to do on not_found; hotels explains how to check the same comp set every morning; country says it is the booker's market, not the hotel's; adults says Google prices one room and nothing above 6 adults.
Store description rewritten for agents: one row per hotel and stay, every OTA and the official site side by side with nightly rate, free cancellation and link, the spread, the direct booking rate and who undercuts it. seoDescription carries the synonyms and the German, Spanish and French nouns.
The pricing text states the per-1,000 price, that a row costs the same however many sources it holds (4 to 36, about 18), the rows-per-hotel arithmetic, what is never charged, that there is no start fee, and that a run stops at the maximum cost you set (maxTotalChargeUsd).
Dropped claim: the market (country) does not decide whether the displayed rate includes taxes — the parent module measured that the display basis follows the country of the proxy IP (pre-tax plus mandatory fees from a US IP, all-in from most others). country changes which booking sites are listed.
README: a section mapping common requests to the exact input, the row fields and the empty-result contract; the measured 2026-08-30 audit numbers (71 of 100 independent US hotels undercut); that Google does not list a hotel's official site on every run, so a missing direct rate should be confirmed on a second run; the sources-per-row range corrected to the measured 4 to 36.
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.0 — 2026-08-29
First public release.
One parity row per property and stay from Google Hotels: every booking source's lowest rate side by side (OTAs and the official site) with source ids, stay totals, free-cancellation flags and booking links.
Parity math in the row: cheapest and dearest source, spread in percent, median, the official-site rate, whether direct is the cheapest, which sources undercut it and by how much.
Properties by Google Hotels URL or entity token (exact, one offers call each) or by name (one place search; kept only when the listing's name matches most of the query's words, so a lookup never bills a stranger).
minSpreadPct delivers only properties whose spread reaches a threshold — the violations-only feed — and what it drops is never billed.
Relative dates ("30 days", "6 weeks", today) and sweepDays for a week of check-in dates per property in one run; occupancy with children's ages; any currency and market.
Billing: pay per delivered parity row only. Unpriced properties, unresolved names, duplicates, filtered rows and status rows are free; each property and stay is billed once per run.
status row per property and stay (ok, filtered, no_rates, not_found, duplicate, unpaid, error) and a SUMMARY record with the run's counts, so a failure is visible rather than a silent zero.
Same fetching module as the verified Google Hotels Prices Scraper, watched by a daily canary run.