# Google Hotels Price Calendar – Nightly Rates by Date (`smoldesk/google-hotel-price-calendar`) Actor

Hotel price calendar from Google Hotels: the cheapest nightly rate for every check-in date up to a year ahead, for any hotel by name or link, any currency and stay length. Optional prices per booking site (Booking.com, Expedia, official site…) for each date.

- **URL**: https://apify.com/smoldesk/google-hotel-price-calendar.md
- **Developed by:** [Smoldesk Studios](https://apify.com/smoldesk) (community)
- **Categories:** Travel, E-commerce, AI
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 date prices

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

## Google Hotels Price Calendar – Nightly Rates by Date

![Google Hotels Price Calendar: the cheapest nightly rate for every check-in date, up to a year ahead](https://raw.githubusercontent.com/smoldesk/apify-scrapers/main/assets/hotel-calendar/banner.webp)

Get a **hotel price calendar** from Google Hotels: the **cheapest nightly rate for every check-in date, up to a year ahead**, for any hotel in the world. Type a hotel name (or paste its Google Hotels link), pick the dates, nights, guests and currency, and get one row per date with the **price per night, stay total, taxes and fees**, the weekday and a flag on the **cheapest date**. Turn on **booking-site prices** to also see what **Booking.com, Expedia, Hotels.com, Agoda, Trip.com or the hotel's official site** charge for each date. No API key, no login.

A full year for one hotel takes a few seconds.

### What you can use it for

- **Find the cheapest dates** to book a hotel, or the cheapest weekend in the next six months
- **Revenue management and rate shopping**: track a competitor hotel's rates for every night of the season
- **Price monitoring**: schedule a daily run and watch how rates for future dates move as they get closer
- **Seasonality research**: compare weekday vs weekend, high vs low season, events and holidays across cities
- **Travel apps and AI agents**: show a price calendar or let an agent pick the best dates to stay
- **OTA parity checks**: compare the official site against Booking.com, Expedia and others, date by date

### How to use it

**1. Add hotels and dates.** Type a hotel name or paste its Google Hotels link, then pick the first check-in date, how many dates, nights and guests.

![Step 1: add hotels, a first check-in date and the number of dates](https://raw.githubusercontent.com/smoldesk/apify-scrapers/main/assets/hotel-calendar/how-to-1.webp)

**2. Click Start.** One hotel's whole calendar comes back in seconds. Booking-site prices add one request per date.

![Step 2: click Start and watch the run log](https://raw.githubusercontent.com/smoldesk/apify-scrapers/main/assets/hotel-calendar/how-to-2.webp)

**3. Get clean data.** One row per check-in date with the nightly price, total, taxes and the cheapest booking site. Export it as JSON, CSV or Excel, or read it through the API.

![Step 3: get one row per date and export it as JSON, CSV, Excel or via API](https://raw.githubusercontent.com/smoldesk/apify-scrapers/main/assets/hotel-calendar/how-to-3.webp)

### How to scrape a Google Hotels price calendar

1. Create a free [Apify account](https://console.apify.com/sign-up) (no credit card needed).
2. Open this Actor and add your **Hotels**: a name like `Hilton Paris Opera`, a Google Hotels link (`https://www.google.com/travel/hotels/entity/Ch…`) or an entity ID.
3. Set the **first check-in date** (empty = tomorrow), the **number of check-in dates** (up to 366), **nights per stay**, guests and **currency**.
4. Optional: turn on **Booking-site prices for each date**.
5. Click **Start**. Download the results as **JSON, CSV, Excel or HTML**, or fetch them through the [Apify API](https://docs.apify.com/api/v2).
6. To track prices over time, **schedule** the run (daily or weekly) in Apify Console.

Tips:

- Common hotel names? Add the city: `Ibis Kuala Lumpur City Centre`, `Hilton Paris Opera`. If a name doesn't match a single hotel, the Actor tells you so and charges nothing. A Google Hotels link always works.
- Stays of 1 to 28 nights are supported; prices are per night and the total covers the whole stay.
- Dates without a rate (sold out, closed, not bookable through Google) are skipped and not charged. Turn off **Only dates with a price** to get a row for every date and track sell-outs.

### Output: one row per hotel and check-in date

```json
{
  "type": "date-price",
  "hotelName": "Hilton Paris Opera",
  "entityId": "ChoIkoe_uKT777foARoNL2cvMTFiNnpyNG0xNhAB",
  "googleUrl": "https://www.google.com/travel/hotels/entity/ChoIkoe_uKT777foARoNL2cvMTFiNnpyNG0xNhAB",
  "hotelInput": "Hilton Paris Opera",
  "adults": 2,
  "childrenAges": [],
  "checkIn": "2027-08-21",
  "checkOut": "2027-08-23",
  "weekday": "Saturday",
  "nights": 2,
  "available": true,
  "pricePerNight": 266.41,
  "pricePerNightText": "€266",
  "pricePerNightWithTaxes": 291.36,
  "pricePerNightBeforeTaxes": 249.44,
  "displayedPriceIncludesTaxes": false,
  "totalPrice": 582.72,
  "totalPriceText": "€533",
  "totalBeforeTaxes": 498.88,
  "totalTaxesAndFees": 83.84,
  "currency": "EUR",
  "isCheapestDate": true,
  "scrapedAt": "2026-11-04T00:12:38.639117+00:00"
}
```

- `isCheapestDate` marks the lowest all-in nightly rate in the dates you asked for (ties are all marked).
- **Taxes:** Google shows the nightly rate with or without taxes depending on the visitor's country (from US IPs, usually without). `pricePerNight` / `pricePerNightText` are the rate exactly as Google displays it and `displayedPriceIncludesTaxes` tells you which one it is. For comparisons use `pricePerNightWithTaxes` / `totalPrice` (all-in) or `pricePerNightBeforeTaxes` / `totalBeforeTaxes`. These come from Google's tax breakdown and are filled in whenever Google provides it.

#### With booking-site prices

```json
{
  "hotelName": "JW Marriott Hotel Kuala Lumpur",
  "checkIn": "2026-11-08",
  "checkOut": "2026-11-09",
  "pricePerNight": 96.83,
  "pricePerNightWithTaxes": 119.42,
  "currency": "USD",
  "cheapestSite": "JW Marriott Hotel Kuala Lumpur",
  "cheapestSitePrice": 120,
  "bookingSitePrices": [
    {"site": "Hotels.com", "isOfficialSite": false, "pricePerNight": 121, "pricePerNightText": "$121", "totalPrice": 132, "details": "Save on the app · Earn rewards everywhere"},
    {"site": "Expedia.com", "isOfficialSite": false, "pricePerNight": 121, "pricePerNightText": "$121", "totalPrice": 132, "details": "Free Wi-Fi"},
    {"site": "JW Marriott Hotel Kuala Lumpur", "isOfficialSite": true, "pricePerNight": 120, "pricePerNightText": "$120", "totalPrice": 129, "details": "Free cancellation until Nov 5"}
  ]
}
```

Google usually lists 3–6 sites per date. Site prices are per night as the site shows them, `totalPrice` is the site's total for the stay with taxes. Which sites appear depends on the **Country** setting and on what Google shows for that hotel. The calendar price is Google's lowest rate for the date and can differ a little from the sites listed.

### Input

```json
{
  "hotels": ["Hilton Paris Opera", "https://www.google.com/travel/hotels/entity/ChUI17vV0u_fprYCGgkvbS8wZGQ5MDMQAQ"],
  "startDate": "2026-12-01",
  "days": 90,
  "nights": 2,
  "adults": 2,
  "currency": "EUR",
  "includeBookingSites": false
}
```

| Field | What it does |
|---|---|
| `hotels` | Hotel names, Google Hotels links or entity IDs |
| `startDate` / `days` / `endDate` | Check-in dates to price: from `startDate` (default tomorrow) for `days` dates (max 366), or up to `endDate` |
| `nights` | Stay length, 1–28 |
| `adults`, `childrenAges` | Guests; prices follow the room Google would offer for that party |
| `currency` | Any three-letter code: USD, EUR, GBP, JPY, AUD, SGD, MYR, INR… |
| `onlyAvailableDates` | Skip (and don't charge) dates with no rate. On by default |
| `includeBookingSites` | Prices per booking site for each date |
| `maxBookingSiteDates` | Fetch booking-site prices only for the first N dates of each hotel |
| `language`, `country` | Google `hl` / `gl` |

### Pricing

Pay per result, no subscription. You only pay for dates that are saved.

| Event | Price |
|---|---|
| Date price (one hotel, one check-in date) | **$1.00 per 1,000 dates** |
| Booking-site prices for a date (all sites listed for that date) | **$1.50 per 1,000 dates** |
| Actor start | $0.00005 per run |

Examples: a full year for one hotel (366 dates) costs about **$0.37**. Thirty dates with booking-site prices cost **$0.075**. Apify's free plan includes $5 of monthly usage, enough for about 5,000 dates.

### Use with AI agents (Claude, ChatGPT, Cursor, MCP)

Add the Actor as a tool through the Apify MCP server: `https://mcp.apify.com?actors=smoldesk/google-hotel-price-calendar`. Then paste this into your agent's system prompt or tool notes, so it knows when to call it:

```text
Tool: smoldesk/google-hotel-price-calendar (Google Hotels Price Calendar, Apify)
Use it when: the user wants a hotel's cheapest nightly rate for each check-in date (up to a year ahead), the cheapest dates to stay, how a hotel's price changes by weekday or season, or booking-site prices per date. Give a hotel name with the city, or a Google Hotels link. No login needed.
Don't use it when: the user wants a list of hotels in a city with prices for one set of dates (use smoldesk/google-hotels-scraper), room-by-room availability, flights, or a booking.
How to call: run the Actor with JSON input and read the dataset items. Results cost money per item, so keep the counts small unless the user asks for more.
Example input: {"hotels": ["Marina Bay Sands Singapore"], "days": 60, "nights": 2, "adults": 2, "currency": "SGD"}
```

Questions an agent can answer with it:

- What's the cheapest weekend to stay at Marina Bay Sands in the next two months?
- How much more does this hotel cost on Fridays and Saturdays than midweek?
- Track this hotel's price for every date in December and tell me when it drops.

**Your agent can pay for its own runs.** This Actor is approved for agentic payments on Apify, so an agent with a Skyfire token or an x402 wallet can call it and pay per result without an Apify account. Skyfire: use `https://mcp.apify.com?payment=skyfire`. x402: buy a prepaid Apify token with USDC. Setup: [Apify agentic payments docs](https://docs.apify.com/platform/integrations/x402).

### Use with AI (LangChain / LlamaIndex / CrewAI)

Each row is a flat record that an LLM or agent can read directly (hotel, date, weekday, price, taxes, cheapest flag). With LangChain (`pip install langchain-apify`):

```python
from langchain_apify import ApifyWrapper
from langchain_core.documents import Document

apify = ApifyWrapper()  # reads APIFY_API_TOKEN
loader = apify.call_actor(
    actor_id="smoldesk/google-hotel-price-calendar",
    run_input={"hotels": ["Hilton Paris Opera"], "days": 60, "nights": 2, "currency": "EUR"},
    dataset_mapping_function=lambda v: Document(
        page_content=f"{v['hotelName']}: check-in {v['checkIn']} ({v['weekday']}), {v['nights']} nights, "
                     f"{v['pricePerNight']} {v['currency']} per night, total {v['totalPrice']}",
        metadata={k: v.get(k) for k in ("entityId", "checkIn", "pricePerNight", "isCheapestDate")},
    ),
)
docs = loader.load()
```

Already have a run? Use `ApifyDatasetLoader(dataset_id="<run's dataset ID>", dataset_mapping_function=...)`. **LlamaIndex**: `ApifyActor` from `llama-index-readers-apify`. **CrewAI**: use the Apify MCP server above.

### Limitations

- **Calendar prices are Google's lowest rate per date**, not a list of every room type. For per-site rates, turn on booking-site prices.
- Some hotels don't show prices on Google at all (they aren't bookable through Google). The Actor reports this and charges nothing for them.
- Google's calendar covers about a year ahead and stays of up to 28 nights.
- If Google starts answering with captcha pages, the Actor slows down and stops early with what it has (shown in the status message) rather than hammering the site.

### FAQ

**Is it legal to scrape Google Hotels?** The Actor collects only public prices that Google shows any visitor, with no login. Check the rules that apply to your use and don't republish data in ways the source forbids.

**Do I need a Google account, API key or proxies?** No. Requests go out from the run's own IP. You can switch on an Apify datacenter proxy in the input if you prefer.

**How is this different from the [Google Hotels Scraper](https://apify.com/smoldesk/google-hotels-scraper)?** That Actor lists the hotels in a city for one set of dates. This one takes specific hotels and prices them across many dates.

**Can I get prices for a whole city across dates?** Run the Google Hotels Scraper for the city, take the `entityId` of the hotels you want, and pass them here.

### Feedback

Missing a field or found a bug? Open an issue on the [Issues tab](https://apify.com/smoldesk/google-hotel-price-calendar/issues/open). We usually answer within a day. If the Actor saved you time, a short review on this page helps other people find it.

### More Actors from Smoldesk Studios

- [Contact Details Scraper](https://apify.com/smoldesk/contact-details-scraper): emails, phone numbers, social profiles and contact forms from any list of websites, with email domains checked and junk removed, charged only when contacts are found
- [Google Maps Scraper](https://apify.com/smoldesk/google-maps-scraper): places with phones, websites, ratings and hours from any search, plus emails and social profiles from each business website, lead filters and new-place monitoring
- [WeChat Articles Scraper](https://apify.com/smoldesk/wechat-articles-scraper): WeChat Official Account (公众号) articles from keyword search, full text as Markdown, images, account IDs and publish dates, no login
- [Google Hotels Scraper](https://apify.com/smoldesk/google-hotels-scraper): hotel prices for your dates in any currency, ratings, review aspects and booking-site prices, worldwide
- [Google Trends Scraper](https://apify.com/smoldesk/google-trends-scraper): interest over time, by region and city, related queries and Trending now — no API key
- [Google Ads Transparency Scraper](https://apify.com/smoldesk/google-ads-transparency-scraper): every ad a competitor runs on Google Search, YouTube and Shopping — creatives, landing pages, countries, EU impressions and new-ad alerts
- [YouTube Scraper](https://apify.com/smoldesk/youtube-scraper): videos, Shorts, channels and comments from search, channels and playlists — exact views, likes, publish dates and durations, no API key
- [YouTube Comments Scraper](https://apify.com/smoldesk/youtube-comments-scraper): comments and replies from videos, channels, playlists or keyword searches, with likes, pinned/hearted flags and authors
- [YouTube Channel Scraper](https://apify.com/smoldesk/youtube-channel-scraper): subscribers, exact total views, join date, country and social links of any channel, plus its latest videos
- [Weibo Scraper](https://apify.com/smoldesk/weibo-scraper): Weibo search with date ranges, posts, comments, profiles and hot search (热搜), no login
- [Toutiao Scraper](https://apify.com/smoldesk/toutiao-scraper): Toutiao (今日头条) news search with dates, comments and the hot board, no login
- [Bilibili Scraper](https://apify.com/smoldesk/bilibili-scraper): videos, stats, danmaku, comments and creators from China's video site, no login
- [Tennis Scraper](https://apify.com/smoldesk/tennis-scraper): ATP, WTA, Challenger and ITF results and fixtures with odds from 15 bookmakers, H2H, players and rankings, back to the 2000s
- [Telegram Channel Scraper](https://apify.com/smoldesk/telegram-channel-scraper): public channel posts, views, reactions and subscribers
- [Substack Scraper](https://apify.com/smoldesk/substack-scraper): newsletters, subscriber counts and posts
- [Shopify Store Analyzer](https://apify.com/smoldesk/shopify-store-analyzer): apps, contacts and products of any Shopify store
- [Career Site Jobs Scraper](https://apify.com/smoldesk/career-site-jobs-scraper): live jobs from 12,000+ company career sites (Greenhouse, Lever, Workday, Ashby) with salary and seniority
- [SEEK, JobStreet & JobsDB Scraper](https://apify.com/smoldesk/seek-jobs-scraper): jobs and salaries across Australia and Southeast Asia

# Actor input Schema

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

One hotel per line: its name (add the city if the name is common, e.g. Hilton Paris Opera), a Google Hotels link (https://www.google.com/travel/hotels/entity/Ch…) or a bare entity ID from earlier results.

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

YYYY-MM-DD. Empty = tomorrow.

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

How many consecutive check-in dates to price, starting at the first check-in date (up to 366, about a year ahead). One result per hotel per date.

## `endDate` (type: `string`):

YYYY-MM-DD. Overrides 'Number of check-in dates' when set.

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

Length of stay for each check-in date (1–28). Prices are per night; the total covers the whole stay.

## `adults` (type: `integer`):

Number of adult guests.

## `childrenAges` (type: `array`):

One age per child (0–17), e.g. 5 and 9. Leave empty for no children.

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

Three-letter currency code for all prices: USD, EUR, GBP, JPY, AUD, SGD, MYR, INR, …

## `onlyAvailableDates` (type: `boolean`):

Skip check-in dates where Google shows no rate (sold out, closed or not bookable). Skipped dates are not charged. Turn off to get a row for every date, with available = false where there's no rate (useful to track sell-outs).

## `includeBookingSites` (type: `boolean`):

For every date with a price, also get the rate each booking site lists (Booking.com, Expedia, Hotels.com, Agoda, Trip.com, the official site…) with notes like free cancellation, plus the cheapest site. One extra page per date, charged as 'booking-site prices' only when sites are found. Which sites Google shows depends on the country.

## `maxBookingSiteDates` (type: `integer`):

Only fetch booking-site prices for the first N dates with a price of each hotel. Empty or 0 = all dates.

## `language` (type: `string`):

Google interface language (hl), e.g. en, de, fr, ja, es.

## `country` (type: `string`):

Google country (gl), e.g. us, gb, de, jp. Affects price formatting and which booking sites are shown.

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

Usually not needed: requests go out from the run's own IP. Turn on Apify datacenter proxy to send them through one proxy session instead. Residential proxies are ignored.

## Actor input object example

```json
{
  "hotels": [
    "Hilton Paris Opera"
  ],
  "days": 30,
  "nights": 1,
  "adults": 2,
  "childrenAges": [],
  "currency": "USD",
  "onlyAvailableDates": true,
  "includeBookingSites": false,
  "language": "en",
  "country": "us",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `calendar` (type: `string`):

One row per hotel and check-in date: nightly rate, stay total, taxes and (optionally) booking-site prices.

# 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": [
        "Hilton Paris Opera"
    ],
    "days": 30,
    "childrenAges": [],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("smoldesk/google-hotel-price-calendar").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": ["Hilton Paris Opera"],
    "days": 30,
    "childrenAges": [],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("smoldesk/google-hotel-price-calendar").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": [
    "Hilton Paris Opera"
  ],
  "days": 30,
  "childrenAges": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call smoldesk/google-hotel-price-calendar --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,smoldesk/google-hotel-price-calendar"
        }
    }
}
```

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/FAr46jMHAUvOqighI/builds/GqcCUniGgRK5pbfIF/openapi.json
