# Google Travel Hotel Rate Tracker - OTA Prices for Every Night (`tenfoldfleet/google-travel-hotel-rate-tracker`) Actor

Track Google Travel hotel prices for many stay dates: give hotel URLs or names and check-in dates, get every booking site's offer per date with nightly price, stay total, cheapest-offer flag and gap vs the hotel's own site for rate shopping and parity checks. $1 per 1,000 offers; errors are free.

- **URL**: https://apify.com/tenfoldfleet/google-travel-hotel-rate-tracker.md
- **Developed by:** [Tenfold Fleet](https://apify.com/tenfoldfleet) (community)
- **Categories:** Travel, Agents, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 offers

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Google Travel Hotel Rate Tracker do?

**Google Travel Hotel Rate Tracker** follows **one hotel, or a short list of hotels, across many stay dates** and returns **every booking site's price for each night**. Give it a hotel's Google Travel link (or its name) and a date range, and you get one row per offer: the **booking site** (Booking.com, Expedia, Agoda, Trip.com, the hotel's own website and many smaller OTAs), the **nightly price**, the **stay total**, a flag on the **cheapest offer of the date**, a flag on the **hotel's own website**, and how far each offer sits **above or below the hotel's own rate**.

It reads the public price list that Google Travel shows for a hotel, over plain HTTP with no browser, no login and no cookies. A two-week rate calendar for one hotel takes a few seconds. Use it in the Apify Console, on a schedule, or as a **Google Travel hotel prices API** from your code, Make, Zapier, n8n or an AI agent.

> Not affiliated with, endorsed by or sponsored by Google. Google Travel is a trademark of Google LLC. Hotel business data only: hotel names, addresses and public room prices.

**How it differs from a Google Hotels search scraper:** a search scraper takes a city and returns a list of hotels with one price each. This Actor takes hotels you already know and returns the **full offer list for every stay date**, which is what rate shopping, rate-parity checks and revenue reports need.

### Why use this hotel rate tracker?

- 📅 **Rate calendars**: price a hotel for every check-in date of the next 14, 30 or 180 days in one run, or for an exact list of dates (every Friday, a trade-fair week, New Year's Eve).
- ⚖️ **Rate parity checks**: `isOfficialSite`, `officialSiteNightlyPrice` and `diffVsOfficialPct` show at a glance which booking sites undercut the hotel's own website, and by how much.
- 🏨 **Competitor rate shopping**: put your hotel and 5-10 competitors in one run and compare the lowest rate per night (`isLowestForDate`, `priceRank`).
- 📈 **Price history**: schedule the same input daily and append the rows to a sheet or database to see how prices move as the stay date gets closer.
- 💸 **Pay only for real offers**: sold-out dates, unresolved names, dates Google won't price and blocked pages are returned as free rows with an `error` field.

### What data can it extract?

| Field | Example |
|---|---|
| `hotelName`, `entityId`, `hotelUrl` | `Hotel Adlon Kempinski Berlin`, `ChUI2f3tmL_9t_IZGgkvbS8wOG1mdzIQAQ`, Google Travel link |
| `checkIn`, `checkOut`, `nights`, `adults` | `2026-12-03`, `2026-12-04`, `1`, `2` |
| `provider` | `Booking.com`, `Expedia`, `Hotel Adlon Kempinski Berlin` (the hotel's own site) |
| `isOfficialSite` | `true` for the hotel's or chain's own website |
| `nightlyPrice`, `totalPrice`, `currency` | `350.89`, `350.89`, `USD` (total = the whole stay) |
| `isLowestForDate`, `priceRank` | `true`, `1` (1 = cheapest offer for that hotel and date) |
| `offerRank` | position in Google's own list (featured offers and the hotel's own site come first) |
| `officialSiteNightlyPrice`, `diffVsOfficialPct` | `403.08`, `-13` (13% below the hotel's own rate) |
| `offersForDate` | how many booking sites priced this date |
| `bookingLink` | Google's click-through link to the offer |
| `hotelStars`, `hotelRating`, `hotelReviewCount`, `hotelAddress` | `5`, `4.6`, `2383`, `Unter den Linden 77, 10117 Berlin, Germany` |
| `hotelInput`, `scrapedAt` | what you typed, and when the price was read |

### How to track hotel prices on Google Travel

1. Open the hotel on Google Travel (google.com/travel/hotels) and copy the address bar. It looks like `https://www.google.com/travel/hotels/entity/ChUI...`. (A hotel name also works, see Tips.)
2. Click **Try for free** (or **Start**) on this page and paste one or more hotels into **Hotels**.
3. Set the **first check-in date** and the **number of check-in dates**, or fill in **Exact check-in dates**.
4. Choose **nights per stay** and the **currency**.
5. Optional: set **Max offers per date** to keep only the cheapest few booking sites per date and cap the cost.
6. Click **Start**. Download the offers as **JSON, CSV, Excel or HTML**, or read them through the Apify API. To track prices over time, save the input as a task and add a daily schedule.

### How much does it cost?

This Actor uses pay-per-event pricing, the same on every Apify plan:

| Event | Price |
|---|---|
| Offer (one booking site's price for one hotel and one stay date) | **$1 per 1,000 offers** ($0.001 each) |
| Run start | $0.00005 per run |

A hotel shows about 15-30 offers per date. Examples: **one hotel for 14 dates** is about 280 offers, about **$0.28**. Ten hotels for 30 dates is about 6,000 offers, about $6. With **Max offers per date** set to 5, the same ten hotels for 30 dates cost at most $1.50. On the Apify free plan, the $5 monthly credit covers about 4,900 offers.

**Free of charge:** hotel names that can't be matched, duplicate hotels, sold-out dates, dates in the past or too far ahead, and pages Google blocks. Set a **maximum cost per run** and the Actor stops when it reaches it.

### Input

```json
{
    "hotels": [
        "https://www.google.com/travel/hotels/entity/ChUI2f3tmL_9t_IZGgkvbS8wOG1mdzIQAQ",
        "Park Hyatt Tokyo"
    ],
    "startDate": "2026-12-01",
    "days": 14,
    "nights": 1,
    "currency": "USD",
    "maxOffersPerDate": 0
}
```

Or price exact dates instead of a range:

```json
{
    "hotels": ["ChUI2f3tmL_9t_IZGgkvbS8wOG1mdzIQAQ"],
    "dates": ["2026-12-04", "2026-12-11", "2026-12-18", "2026-12-31"],
    "nights": 2,
    "currency": "EUR"
}
```

### Output

Each booking-site offer for each hotel and date is one row. You can download the dataset as **JSON, CSV, Excel, XML or HTML**.

```json
{
    "hotelName": "Hotel Adlon Kempinski Berlin",
    "entityId": "ChUI2f3tmL_9t_IZGgkvbS8wOG1mdzIQAQ",
    "hotelUrl": "https://www.google.com/travel/hotels/entity/ChUI2f3tmL_9t_IZGgkvbS8wOG1mdzIQAQ",
    "checkIn": "2026-12-03",
    "checkOut": "2026-12-04",
    "nights": 1,
    "adults": 2,
    "provider": "Traveluro",
    "isOfficialSite": false,
    "nightlyPrice": 350.89,
    "totalPrice": 350.89,
    "currency": "USD",
    "offerRank": 2,
    "priceRank": 1,
    "isLowestForDate": true,
    "officialSiteNightlyPrice": 403.08,
    "diffVsOfficialPct": -13,
    "offersForDate": 28,
    "bookingLink": "https://www.google.com/travel/lodging/clk?pc=...",
    "hotelStars": 5,
    "hotelRating": 4.6,
    "hotelReviewCount": 2383,
    "hotelAddress": "Unter den Linden 77, 10117 Berlin, Germany",
    "hotelInput": "Hotel Adlon Kempinski Berlin",
    "scrapedAt": "2026-10-23T11:40:58.007Z"
}
```

A date with no offers, a name that can't be matched or a blocked page adds one free row such as `{"hotel": "...", "checkIn": "2026-12-03", "error": "No booking-site offers for this stay (sold out, or a minimum stay longer than 1 night)."}`, so you can see what to retry.

### Tips

- **Hotel URLs are the reliable input.** A name is looked up on Google Travel and then checked against the hotel Google picked (word order and the city in the address are allowed for). If it looks like a different hotel, a city ("Paris", "Paris hotels") or a bare chain name ("Marriott"), you get a free error row with the hotel Google suggested, and nothing is charged. Paste the URL instead.
- **Any Google Travel hotel link works**, with or without a city in the path (`/travel/hotels/London/entity/...`). The same hotel given twice (as a URL and a name) is priced and charged once.
- **Booking sites depend on where the request comes from.** By default the Actor runs on Apify servers in the USA, so you see the offers a US traveller sees. To check another market, pick a proxy country under **Proxy**.
- **Prices are for 2 adults**, Google's default room occupancy.
- `totalPrice` is the price for the **whole stay** as Google shows it (for 1 night it equals the nightly price). Whether taxes and fees are included depends on the country Google prices for.
- **Booking links expire.** `bookingLink` is Google's click-through link for that search; open it soon after the run, or open `hotelUrl` later.
- **Minimum stays:** some hotels sell only 2-3 night stays on busy dates. A 1-night search then returns a free "no offers" row; try `nights: 2` or `3`.
- Google prices stays up to about 11 months ahead. A date in the past or beyond that window returns a free error row, never another date's prices.
- If Apify reports a **concurrent-run limit** when you start many runs at once, wait 60 seconds and start the run again.

### Use it with AI agents (MCP)

Give Claude, ChatGPT, Cursor or any MCP client this Actor as a tool through Apify's MCP server: add `https://mcp.apify.com?tools=tenfoldfleet/google-travel-hotel-rate-tracker` as a remote MCP server and sign in with your Apify account. The agent fills in the input, runs the Actor and reads the results itself; you pay the same per-event price as a normal run.

### FAQ

#### Do I need a Google account, an API key or cookies?

No. The Actor reads the public prices Google Travel shows to any visitor. It needs no login, no cookies and no API key.

#### How many booking sites does it return?

Everything Google lists for that hotel and date, usually 15-30 for a well-known city hotel and fewer for small or sold-out properties. A low count is real data (for example, most sites sold out), not an error.

#### Can I track several hotels in one run?

Yes. Add as many hotels as you like; every hotel is priced for every date. Duplicate dates are removed.

#### Can I choose the number of guests or rooms?

Not yet. Google's price list is read for 2 adults in one room. Use `nights` for the stay length.

#### How do I build a price history?

Save your input as a task and schedule it daily. Each run adds rows with `scrapedAt`, so you can chart how a date's price changes as it gets closer.

#### Is the cheapest price always the one to book?

`isLowestForDate` marks the lowest price in the list. Small OTAs sometimes win by a few cents; compare `priceRank` with `isOfficialSite` and the provider before you decide.

### Disclaimer

This Actor collects public hotel prices that Google Travel shows without a login. It does not collect personal data. Prices change often and can differ from what a booking site shows at checkout. Check the provider's terms before you republish their prices.

### More tools from Tenfold Fleet

| Actor | Output |
|---|---|
| [ALDI Australia Scraper - AU Products, Unit Prices & Catalogue](https://apify.com/tenfoldfleet/aldi-australia-scraper) | product |
| [Alibaba Image Search - Reverse Lookup of Suppliers by Photo](https://apify.com/tenfoldfleet/alibaba-image-search) | matched product |
| [AliExpress Keyword Scraper - Exact Sold Counts by Search Term](https://apify.com/tenfoldfleet/aliexpress-search-scraper) | product |
| [Amazon Product Scraper - Details, Prices & Search by ASIN](https://apify.com/tenfoldfleet/amazon-product-scraper) | product |
| [ATS Jobs Scraper - Greenhouse, Lever, Ashby & 5 More](https://apify.com/tenfoldfleet/ats-jobs-scraper) | job posting |
| [Backlinks Checker - Referring Domains, Anchors & Domain Rank](https://apify.com/tenfoldfleet/backlinks-checker) | backlink |
| [Bilibili Scraper - Videos, Comments, Danmaku & Search](https://apify.com/tenfoldfleet/bilibili-scraper) | video or comment |
| [Businesses Without Websites - Local Leads with Phone & Rating](https://apify.com/tenfoldfleet/businesses-without-websites) | lead |
| [Contact Details Scraper - One Lead Record per Company Website](https://apify.com/tenfoldfleet/company-contact-finder) | website with contacts |
| [Google Ads Transparency Center Scraper - Competitor Ads by Site](https://apify.com/tenfoldfleet/google-ads-transparency-scraper) | ad |
| [Google AI Overviews Checker - Citations & Domain Tracker](https://apify.com/tenfoldfleet/google-ai-overviews-checker) | keyword checked |
| [Google Jobs Scraper - Salary, Apply Links & Posting Dates](https://apify.com/tenfoldfleet/google-jobs-scraper) | job listing |
| [Google Keyword Planner Alternative - Ideas, Bids & Volume](https://apify.com/tenfoldfleet/google-keyword-planner) | keyword idea |
| [Google Maps Extractor - Business Leads, Phones & Websites](https://apify.com/tenfoldfleet/google-maps-extractor) | place |
| [Google News Scraper - Articles, Real URLs & Full Text](https://apify.com/tenfoldfleet/google-news-scraper) | article |
| [Google Trends Scraper - Interest, Regions & Related Queries](https://apify.com/tenfoldfleet/google-trends-scraper) | keyword |
| [Keyword Ideas & Related Keywords - Difficulty, Volume & CPC](https://apify.com/tenfoldfleet/keyword-ideas) | keyword idea |
| [Keyword Search Volume, CPC & Difficulty Checker (Bulk)](https://apify.com/tenfoldfleet/keyword-search-volume) | keyword with data |
| [Remote Job Board Scraper - Remote Jobs Aggregator, 7 Sites](https://apify.com/tenfoldfleet/remote-jobs-aggregator) | unique remote job |
| [SEEK Job Scraper - Australia, NZ, Jobstreet & JobsDB](https://apify.com/tenfoldfleet/seek-job-scraper) | job listing |
| [SEO Audit Tool - Technical On-Page SEO Checker & Score](https://apify.com/tenfoldfleet/seo-audit-tool) | page audit |
| [SEO Competitor Keywords - Domain Ranked Keywords & Keyword Gap](https://apify.com/tenfoldfleet/seo-competitor-keywords) | keyword |
| [Shopify Inventory Scraper - SKUs, Variants & In-Stock Status](https://apify.com/tenfoldfleet/shopify-products-scraper) | product |
| [Shopify App & Theme Detector - Store Analyzer & Contacts](https://apify.com/tenfoldfleet/shopify-store-analyzer) | shopify store |
| [Sitemap URL Extractor - All URLs from sitemap.xml & robots.txt](https://apify.com/tenfoldfleet/sitemap-url-extractor) | url |
| [Technology Detector - Wappalyzer & BuiltWith Alternative](https://apify.com/tenfoldfleet/tech-stack-detector) | website |
| [URL to Markdown - Web Page to LLM-Ready Text for AI Agents](https://apify.com/tenfoldfleet/url-to-markdown) | page |
| [Website Traffic Checker - Bulk Domain Traffic Estimate](https://apify.com/tenfoldfleet/website-traffic-checker) | domain with traffic data |
| [Woolworths Product Scraper - AU Shelf Prices, Specials & GTINs](https://apify.com/tenfoldfleet/woolworths-product-scraper) | product |
| [Workday Jobs Scraper - myworkdayjobs.com API with Salary](https://apify.com/tenfoldfleet/workday-jobs-scraper) | job posting |
| [YouTube Channel Email Scraper - Creator Contact Extractor](https://apify.com/tenfoldfleet/youtube-channel-email-scraper) | channel with email |
| [YouTube Livestream & Channel Scraper - Videos, Likes & Stats](https://apify.com/tenfoldfleet/youtube-channel-scraper) | video |
| [YouTube Comments Scraper - Replies, Likes & Sort by Newest](https://apify.com/tenfoldfleet/youtube-comments-scraper) | comment |
| [YouTube Shorts Analytics Scraper - Views, Likes & Hashtags](https://apify.com/tenfoldfleet/youtube-shorts-scraper) | short |
| [YouTube Captions Downloader - Transcript & Subtitles Scraper](https://apify.com/tenfoldfleet/youtube-transcript-scraper) | transcript |

# Actor input Schema

## `hotels` (type: `array`):

One or more hotels. Best: the hotel's Google Travel URL (open the hotel on google.com/travel, copy the address bar: https://www.google.com/travel/hotels/entity/...) or its bare entity id starting with 'Ch'. The same hotel given twice is priced once. A hotel name such as 'Park Hyatt Tokyo' also works; it is checked against the hotel Google picks, and a weak match (a city, a chain or an unknown name) returns a free error row instead of the wrong hotel's prices.

## `startDate` (type: `string`):

First check-in date as YYYY-MM-DD. Empty = tomorrow (UTC). Ignored when 'Exact check-in dates' is filled in.

## `days` (type: `integer`):

How many consecutive check-in dates to price, starting at the first check-in date (14 = two weeks of stays). Google prices stays up to about 11 months ahead.

## `dates` (type: `array`):

A list of check-in dates as YYYY-MM-DD, e.g. every Friday or the nights of an event. When filled in, it replaces 'First check-in date' and 'Number of check-in dates'.

## `nights` (type: `integer`):

Length of each stay. Check-out = check-in + this many nights. Prices are for 2 adults (Google's default occupancy).

## `currency` (type: `string`):

3-letter currency code for all prices, e.g. USD, EUR, GBP, JPY, AUD.

## `maxOffersPerDate` (type: `integer`):

Keep only the N cheapest booking-site offers per hotel and date (0 = all offers, usually 15-30). Each kept offer is one charged row, so this caps the cost. On the Apify free plan, the $5 monthly credit covers about 4,900 offers (roughly 250 hotel-dates with all offers).

## `maxConcurrency` (type: `integer`):

How many Google pages to load at once.

## `proxyConfiguration` (type: `object`):

Optional. Not needed: the Actor goes direct and falls back to Apify's datacenter proxy by itself. Google shows the booking sites of the country the request comes from (the USA by default), so pick a proxy country here to see another market's offers.

## Actor input object example

```json
{
  "hotels": [
    "https://www.google.com/travel/hotels/entity/ChcIwtLr94n32Jj1ARoKL20vMGNyZnR2ahAB",
    "Park Hyatt Tokyo"
  ],
  "days": 14,
  "nights": 1,
  "currency": "USD",
  "maxOffersPerDate": 0,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "hotels": [
        "https://www.google.com/travel/hotels/entity/ChcIwtLr94n32Jj1ARoKL20vMGNyZnR2ahAB",
        "Park Hyatt Tokyo"
    ],
    "days": 14
};

// Run the Actor and wait for it to finish
const run = await client.actor("tenfoldfleet/google-travel-hotel-rate-tracker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "hotels": [
        "https://www.google.com/travel/hotels/entity/ChcIwtLr94n32Jj1ARoKL20vMGNyZnR2ahAB",
        "Park Hyatt Tokyo",
    ],
    "days": 14,
}

# Run the Actor and wait for it to finish
run = client.actor("tenfoldfleet/google-travel-hotel-rate-tracker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "hotels": [
    "https://www.google.com/travel/hotels/entity/ChcIwtLr94n32Jj1ARoKL20vMGNyZnR2ahAB",
    "Park Hyatt Tokyo"
  ],
  "days": 14
}' |
apify call tenfoldfleet/google-travel-hotel-rate-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tenfoldfleet/google-travel-hotel-rate-tracker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/et32NpZ9btelX2ZN8/builds/2nbkfyPcdp2sJtUSv/openapi.json
