DEV Community

SteadyScrape
SteadyScrape

Posted on

Track Google Hotels OTA Prices and Rate Parity From Python for $0.006 a Check

Revenue managers and hotel owners keep asking the same three questions: what does each OTA charge for my dates, is anyone undercutting my direct rate, and what changed since yesterday? Most Google Hotels scrapers give you a one-off snapshot. Here's how to get the full rate grid from code, pay per hotel and date checked, and schedule change-only alerts.

What you get

Disclosure: we (SteadyScrape) built the tool below and get paid when it's used.

Hotel Rate Monitor: Google Hotels OTA Prices & Parity (steady-scrape/hotel-rate-monitor) is an Apify Actor that reads Google Hotels via a licensed data API (no headless browser, no proxy rotation). For each hotel and check-in date it returns:

  • Every booking site's nightly price (Booking.com, Expedia, Agoda, Hotels.com, Trip.com, Vio.com, the hotel's own site, and more)
  • Which site is cheapest, the official/direct price when Google shows one, and a parityStatus (undercut, official_cheapest, no_official_rate, …)
  • An observedAt timestamp (ISO 8601 UTC) on every price
  • Optional change rows when you schedule it with a Monitor ID

You only pay for hotels that were found and stays that were bookable. Misses, sold-outs and failed checks are free.

What a real run returns

We ran the Actor's prefilled example: three Tamarindo hotels, Costa Rica market, check-ins +14d and +30d (2026-11-20 and 2026-12-06 on the day we ran it), 1 night, 2 adults, USD.

  • 6 rate rows in about 27 seconds.
  • Cost at the Free-plan list price: $0.01 run start + 6 × $0.006 = $0.046 (name matches were already cached, so $0 for lookups; plus the $0.00005 Apify start fee).

A few of the rows:

Hotel Check-in Lowest Source Official Parity
The Beach Bungalows Tamarindo 2026-11-20 $133 Bluepillow.com $147 undercut 9.52%
The Beach Bungalows Tamarindo 2026-12-06 $133 Bluepillow.com $147 undercut 9.52%
Ten North Tamarindo Beach Hotel 2026-11-20 $115 Booking.com — no_official_rate
Ten North Tamarindo Beach Hotel 2026-12-06 $123 Agoda — no_official_rate
Tamarindo Diria 2026-11-20 $391 Qantas Hotels — no_official_rate
Tamarindo Diria 2026-12-06 $354 Qantas Hotels — no_official_rate

Each row also carries a rates array with every booking site Google showed for that stay (pricePerNight, isOfficialSite, isAd, bookingUrl, observedAt). Export the dataset to CSV or Sheets, or set output format to one row per booking site.

Example: check a 3-hotel comp set

from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("steady-scrape/hotel-rate-monitor").call(run_input={
    "hotels": [
        "The Beach Bungalows Tamarindo",
        "Ten North Tamarindo Beach Hotel",
        "Tamarindo Diria",
    ],
    "location": "Costa Rica",
    "checkInDates": ["+14d", "+30d"],
    "nights": 1,
    "adults": 2,
    "currency": "USD",
})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    if row.get("recordType") == "rate":
        print(row["hotelName"], row["checkIn"], row["lowestPrice"],
              row["lowestSource"], row.get("parityStatus"), row.get("undercutByPct"))
Enter fullscreen mode Exit fullscreen mode

Relative dates like +14d move forward on every scheduled run, so a daily task keeps checking "two weeks out" without editing the input. Names are matched to Google Hotels once and remembered for 90 days; paste a Google Hotels /entity/ URL or hotel id to skip the lookup.

Daily change alerts

Add a monitorId (any name) and schedule the task. The first run saves a baseline; later runs add change rows (price_up, price_down, new_lowest_source, parity_break, sold_out, …). Set onlyChanges to true and wire a webhook, Slack or email to the dataset.

run = client.actor("steady-scrape/hotel-rate-monitor").call(run_input={
    "hotels": ["Tamarindo Diria", "Ten North Tamarindo Beach Hotel"],
    "location": "Costa Rica",
    "checkInDates": ["+7d", "+14d", "+30d"],
    "monitorId": "tamarindo-compset",
    "onlyChanges": True,
})
Enter fullscreen mode Exit fullscreen mode

Cost (list prices on the Apify Free plan)

  • $0.006 per hotel + stay checked (all OTAs in one event); Starter $0.0054, Scale $0.0048, Business+ $0.0045
  • $0.01 run start when the run returns data
  • $0.002 per newly matched hotel name (remembered 90 days)
  • $0.002 per change row; $0.001 per search listing without rates
  • Live speed checks are $0.012; price calendars start at $0.01 standard ($0.009 / $0.008 / $0.0075 on paid plans)

A 10-hotel comp set × 3 check-ins, daily for 30 days, is about $6/month on Free (about $4.67 on Business), including run starts and a handful of change rows.

Limits worth knowing

  • Prices depend on Market (searcher's country), currency, guests and time — set Market to where your guests book from
  • Google shows one price per site (not room types or rate plans)
  • Free Apify plan: standard speed only, max 50 hotel/date checks and 50 new name lookups per run
  • Public prices only; no personal guest data

Built by SteadyScrape (steady-scrape). More tools: https://apify.com/steady-scrape

Top comments (0)