# Hotel Price Comparison: Cheapest Booking Site for Any Dates (`precious_bathmat/hotel-price-comparison`) Actor

Compare a hotel's price on every booking site Google Hotels lists (Booking.com, Expedia, Agoda, Hotels.com, the hotel's own site...) across many dates. Cheapest site and night, free cancellation, price calendar. No API key, no login.

- **URL**: https://apify.com/precious_bathmat/hotel-price-comparison.md
- **Developed by:** [Mariam Ahmed](https://apify.com/precious_bathmat) (community)
- **Categories:** Travel, E-commerce
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 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

## Hotel Price Comparison: Cheapest Booking Site for Any Dates

Compare **a hotel's price on every booking site** Google Hotels lists, Booking.com, Expedia, Agoda, Hotels.com, Trip.com, KAYAK, the hotel's own site and dozens more, **across as many check-in dates as you like**. No API key, no login.

- **Every site, every date**: total for the stay and price per night, with taxes and fees as Google shows them
- **Cheapest site and cheapest night** for each hotel, and how much the price swings between dates
- **Hotel's own site vs the rest**: how often booking direct is cheapest
- **Free cancellation**: which offers have it, and until when
- **Price calendar**: the cheapest site and price for every check-in date, as a CSV
- Any **currency**, stays of **1 to 30 nights**, up to **90 check-in dates** per hotel

### What does this hotel price comparison do?

```
Hilton Garden Inn New York/Times Square Central · 3★ · 3.9 (2,761 reviews)
 2 nights, 14 check-in dates from Nov 12, 40 booking sites
 Cheapest: Nov 22 on KAYAK.com, $331 total · dearest: Nov 25, $1,068
 Same night, cheapest vs most expensive site: 69% apart (median)
 Hotel's own site cheapest on 0 of 14 dates · free cancellation from $763 (Billabook.com)
```

1. Enter **hotels**: name and city ("The Ritz London"), or the hotel's Google Hotels link.
2. Pick the **first check-in date**, the **number of nights**, **how many dates** to compare (every day, or every week) and the **currency**.
3. You get **one row per hotel, date and booking site**, **one report per hotel**, and a **price calendar**.

```mermaid
flowchart LR
    A[Hotel names<br/>or links] --> B[Google Hotels<br/>prices page]
    D[Dates, nights,<br/>currency] --> B
    B --> C[Every booking site<br/>per date]
    C --> E[Report per hotel<br/>cheapest site & night,<br/>spread, own site,<br/>free cancellation]
    C --> F[Price calendar]
```

### Who is it for?

- **Travellers and travel agents**: the cheapest site and the cheapest night before you book, with free cancellation in view
- **Hotels and revenue managers**: how your own website's price compares with Booking.com, Expedia and the rest (rate parity), date by date
- **Travel startups and deal sites**: price feeds for the hotels you cover, scheduled daily
- **Analysts**: how prices move across dates and sites for a set of competing hotels

### What data do you get?

**Prices** (dataset, one row per hotel, check-in date and booking site)

| Field | What it tells you |
|---|---|
| `hotel`, `checkIn`, `checkOut`, `nights` | Which hotel and stay |
| `site`, `rank`, `isCheapest`, `aboveCheapestPercent` | The booking site, its place from cheapest, and how much more it costs |
| `total`, `nightly`, `currency` | Price for the whole stay and per night, taxes and fees as Google shows them |
| `isOfficialSite` | The hotel's own website |
| `freeCancellation`, `freeCancellationUntil` | Free cancellation, and the last day to cancel |
| `stars`, `rating`, `reviews`, `address` | The hotel |
| `link`, `hotelUrl` | Book on that site (through Google, dates filled in); the hotel's Google page |

**Hotel report** (`REPORTS` and `REPORT_<hotel>`)

| Field | What it tells you |
|---|---|
| `name`, `address`, `phone`, `stars`, `rating`, `reviews`, `latitude`, `longitude` | The hotel |
| `cheapestDate`, `mostExpensiveDate`, `medianCheapestTotal`, `dateSwingPercent` | When to go, and how much the date matters |
| `medianSiteSpreadPercent` | How far apart the cheapest and dearest site are on the same night |
| `officialSiteCheapestPercent` | Share of dates where booking direct is cheapest |
| `cheapestSites` | Which sites are cheapest, on how many dates |
| `byDate` | Per date: cheapest site and price, highest price, sites, own-site price, cheapest with free cancellation |

`CALENDAR_CSV` has the cheapest site and price per hotel and date, ready for a spreadsheet. `RUN_SUMMARY` lists problems (for example sold-out dates) and the limits of the data.

### Example: 2 October 2026

Six hotels, **2-night stays, 14 check-in dates from 12 November**, in US dollars: **1,824 prices in 2 minutes 16 seconds**.

| Hotel | Sites | Cheapest stay | Dearest stay | Site spread (median) | Own site ever cheapest |
|---|---|---|---|---|---|
| Hilton Garden Inn Times Square Central | 40 | $331 (Nov 22, KAYAK) | $1,068 (Nov 25) | 69% | never |
| The Ritz London | 20 | $3,085 (Nov 22) | $7,608 (Nov 21) | 33% | not listed by Google |
| Hotel Arts Barcelona | 34 | $832 (Nov 22) | $1,584 (Nov 19) | 47% | never |
| Park Hyatt Tokyo | 32 | $1,873 (Nov 23, Traveluro) | $3,046 (Nov 19) | 48% | never |
| Atlantis The Palm, Dubai | 36 | $1,103 (Nov 21) | $1,195 (Nov 15) | 46% | never |
| Sarova Stanley, Nairobi | 23 | $173 (Nov 12) | $180 (Nov 15) | 139% | never |

- **The date matters more than the site in big cities**: the same Times Square room cost 3.2× more checking in on Nov 25 than on Nov 22. In Dubai and Nairobi the price barely moved.
- **The site matters everywhere**: on a typical night the most expensive site asked 33% to 139% more than the cheapest.
- **Booking direct was never the cheapest** at these six hotels on these dates.
- Hotel Arts Barcelona had **no prices for 3 of the 14 dates**, flagged in `RUN_SUMMARY`.

### Pricing

**$0.001 per price** (one hotel, date and site) and **$0.02 per hotel report**.

- 1 hotel, 7 dates, about 25 sites: **about $0.20**
- The run above (6 hotels × 14 dates): **$1.94**
- Reports only (turn off "Save every price"): **$0.02 per hotel**, still comparing every site and date

### Good to know

- **Name and city work best** ("Park Hyatt Tokyo", "Hotel Arts Barcelona"). The Actor checks that the hotel it finds matches your words and says so if it does not; a Google Hotels link is always exact.
- **Prices are live** and change often. A booking site may show a slightly different final price, and some low prices are non-refundable or room-only: check `freeCancellation`.
- **Totals include taxes and fees** as Google shows them; `nightly` is the total divided by nights. Prices are for **2 adults, 1 room**, Google's default.
- **Which sites appear depends on the hotel and the market**: from US addresses Google listed 20 to 40 sites per hotel.
- **Sponsored ads are left out**; every other site Google lists is included.
- **Sold-out dates** come back without prices and are listed in `RUN_SUMMARY`. Google shows prices up to about 11 months ahead.
- Each check-in date is one page per hotel, so 30 dates take about a minute per hotel.
- Data comes from **Google Hotels**, the prices Google shows on each hotel's page. **Not affiliated with Google or any booking site.**

### Input

| Field | Meaning |
|---|---|
| **Hotels** | Name and city, or a Google Hotels link |
| **First check-in date** | YYYY-MM-DD (default: two weeks from today) |
| **Nights** | 1 to 30 (default 1) |
| **Check-in dates to compare** | 1 to 90 (default 7) |
| **Days between check-in dates** | 1 = every day, 7 = weekly |
| **Currency** | USD, EUR, GBP, AUD, INR... |
| **Save every price** | On by default; off = reports only |

### Integrations

Export to JSON, CSV, Excel or Google Sheets, or connect through the Apify API, webhooks, Make, Zapier and n8n. **Schedule it daily** to track a hotel's prices, or your own rate parity, over time.

# Actor input Schema

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

Hotel name and city (e.g. "Hilton Garden Inn Times Square Central, New York"), or the hotel's Google Hotels link. One report per hotel.

## `checkIn` (type: `string`):

The first check-in date to compare (YYYY-MM-DD). Empty = two weeks from today.

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

Length of each stay (1 to 30).

## `dates` (type: `integer`):

How many check-in dates to compare, starting from the first (1 to 90). Each date is one page per hotel.

## `dateStep` (type: `integer`):

1 = every day, 7 = the same weekday each week.

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

Three-letter currency code, e.g. USD, EUR, GBP, AUD, INR.

## `saveOffers` (type: `boolean`):

One row per hotel, date and booking site (charged per row). Turn off to pay for the hotel reports only; they still compare every site.

## Actor input object example

```json
{
  "hotels": [
    "Hilton Garden Inn Times Square Central, New York"
  ],
  "nights": 1,
  "dates": 7,
  "dateStep": 1,
  "currency": "USD",
  "saveOffers": true
}
```

# Actor output Schema

## `prices` (type: `string`):

One row per hotel, check-in date and booking site: total, per night, % above cheapest, hotel's own site, free cancellation, link.

## `reports` (type: `string`):

Per hotel: cheapest date and site, date swing, site spread, how often the hotel's own site is cheapest, which sites win.

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

Cheapest site and price per hotel and check-in date.

## `summary` (type: `string`):

Requests, problems and the limits of the data.

# 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 Garden Inn Times Square Central, New York"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/hotel-price-comparison").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 Garden Inn Times Square Central, New York"] }

# Run the Actor and wait for it to finish
run = client.actor("precious_bathmat/hotel-price-comparison").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 Garden Inn Times Square Central, New York"
  ]
}' |
apify call precious_bathmat/hotel-price-comparison --silent --output-dataset

```

## MCP server setup

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

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/CYvOD1PRgfwMEH5Bb/builds/OlswLgjo0hF9lwov6/openapi.json
