# Google Hotels Prices by Date: rates per booking site (`steadydata/google-hotels-prices`) Actor

Google Hotels prices for your dates, per booking site: Booking.com, Expedia, Agoda, Trip.com and more, with price per night and total stay. Search by city or by hotel ID. Same input as the popular Google Hotels scraper. Pay per hotel.

- **URL**: https://apify.com/steadydata/google-hotels-prices.md
- **Developed by:** [Steadydata Team](https://apify.com/steadydata) (community)
- **Categories:** Travel, E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.95 / 1,000 hotel priceds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Prices by Date: rates per booking site

Google Hotels prices for your dates, per booking site: Booking.com, Expedia, Agoda, Trip.com and more, with price per night and total stay. Search by city or by hotel ID. Same input as the popular Google Hotels scraper. Pay per hotel.

### Why this scraper

- **Only delivered results are charged.** Inputs that fail come back as clear error
  records at no cost.
- **Your dates, checked on every page.** Google sometimes shows prices for other dates than the ones you asked for. This actor checks that the dates in each answer are yours, and a hotel without prices for your dates is skipped and not charged, so a row never carries a price for the wrong stay.
- **Every booking site, not just the cheapest.** One row per hotel with the full list: Booking.com, Expedia, Hotels.com, Agoda, Trip.com, the hotel's own site and more, each with price per night, total for the stay and the booking link. Measured on 07-10-2026: 11 to 33 sites per hotel in Amsterdam and Lisbon.
- **Same input as the popular Google Hotels scraper.** `locations`, `checkInDate`, `checkOutDate`, `adults`, `currency`, `countryCode`, `maxResults`: a schedule or integration built for that actor keeps working when you point it here. A location can also be a hotel ID or a Google Hotels link, for watching one hotel.
- **No browser.** Plain page requests, so no page-load timeouts; a city of 5 hotels ran in 12 seconds on 07-10-2026.

### Who this is for

Revenue managers and hotel owners checking their own rate against the booking sites (rate parity). Travel startups and agents comparing prices per date. Analysts and price-watchers who run the same hotels every day and want a clean history per date and per site.

### Who this is not for

This is not a booking tool: it returns prices and links, it does not reserve rooms. Prices are Google's figures at the moment of the run; the final price on the booking site can differ by taxes, fees or availability. Holiday rentals that Google lists as apartments (IDs starting with `ChoQ`) often have no per-site price list on Google; those are skipped with a reason in the run log and not charged. A city page holds about 20 hotels, so a city gives at most 20 rows per date; for more, list hotel IDs. Room types per site are not included yet.

### Input fields

| Field | Type | Required or default | What it does |
|---|---|---|---|
| `locations` | list of text | required | One per row, up to 100: a city as Google knows it (Lisbon, New York), a Google Hotels hotel ID (starts with Ch), or a Google Hotels hotel link. |
| `checkInDate` | text | required | Arrival date as YYYY-MM-DD. |
| `checkOutDate` | text | required | Departure date as YYYY-MM-DD, after check-in; up to 30 nights. |
| `additionalCheckInDates` | list of text |  | Extra arrival dates as YYYY-MM-DD, up to 30, each with the same number of nights as above: one run then covers a whole date range for price watching. |
| `adults` | number | 2 | Number of adult guests. |
| `currency` | text | USD | Three-letter currency code for all prices, for example USD, EUR, GBP. |
| `countryCode` | text | us | Two-letter market code; it also sets the country of the proxy exit. |
| `languageCode` | text | en | Language for hotel and room names. |
| `maxResults` | number | 10 | Cost ceiling per city. Google shows about 20 hotels on a city page. |

### Input example

```json
{
    "locations": [
        "Lisbon"
    ],
    "checkInDate": "2026-11-19",
    "checkOutDate": "2026-11-20",
    "adults": 2,
    "currency": "USD",
    "countryCode": "us",
    "languageCode": "en",
    "maxResults": 10
}
```

### Output example

| Field | Type | What it holds |
|---|---|---|
| `location` | text | The input row this hotel came from: the city, or the hotel ID you gave. |
| `hotelName` | text | The hotel's name as Google Hotels shows it. |
| `checkInDate` | text | Arrival date of the stay these prices are for (YYYY-MM-DD). |
| `checkOutDate` | text | Departure date of the stay these prices are for. |
| `nights` | number | Number of nights between the two dates. |
| `adults` | number | Guests the prices are for. |
| `currency` | text | Currency of every price in the row. |
| `pricePerNight` | number | Lowest price per night across all booking sites. |
| `totalRate` | number | Lowest total for the whole stay across all booking sites. |
| `cheapestSource` | text | The booking site with the lowest price per night. |
| `sourceCount` | number | How many booking sites have a price for these dates. |
| `bookingSources` | list | Every site: vendorName, ratePerNight, ratePerNightDisplay, totalRate, totalRateDisplay, isSponsored, bookingUrl. |
| `hotelId` | text | Google's hotel ID; put it in locations to watch this hotel directly. |
| `googleHotelsUrl` | text | The Google Hotels price page for these dates. |
| `countryCode` | text | The market the prices were read in. |

Error codes: `INVALID_INPUT`, `INVALID_DATES`, `UNKNOWN_CITY`, `BLOCKED`, `NO_PRICES`, `FETCH_FAILED`.

A real row from a run on 07-10-2026, with the list of 22 sites cut to two and the links shortened:

```json
{
  "location": "Amsterdam",
  "hotelName": "CityHub Amsterdam",
  "checkInDate": "2026-11-19",
  "checkOutDate": "2026-11-21",
  "nights": 2,
  "adults": 2,
  "currency": "USD",
  "pricePerNight": 85.75,
  "totalRate": 171.5,
  "cheapestSource": "Tripadvisor.com",
  "sourceCount": 22,
  "bookingSources": [
    {
      "vendorName": "Tripadvisor.com",
      "ratePerNight": 85.75,
      "ratePerNightDisplay": "$86",
      "totalRate": 171.5,
      "totalRateDisplay": "$172",
      "isSponsored": false,
      "bookingUrl": "https://www.google.com/travel/lodging/clk?pc=AA80OszicmLAlCs..."
    },
    {
      "vendorName": "Vio.com",
      "ratePerNight": 87.61,
      "ratePerNightDisplay": "$88",
      "totalRate": 175.22,
      "totalRateDisplay": "$175",
      "isSponsored": false,
      "bookingUrl": "https://www.google.com/travel/lodging/clk?pc=AA80Osxop0lCu1i..."
    }
  ],
  "hotelId": "ChkIuJKIjfb1pJVwGg0vZy8xMWJicmwzMnh3EAE",
  "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChkIuJKIjfb1pJVwGg0vZy8xMWJicmwzMnh3EAE/prices...",
  "countryCode": "US",
  "status": "ok"
}
```

### Pricing

Pay per event: one `hotel-priced` event per hotel delivered with prices for your dates, with the full list of booking sites in that one row. Hotels without prices for your dates, cities Google does not know and failed pages are not charged, and there is no separate platform-usage surcharge.

### FAQ

**How do I watch prices for several dates?**
Put the extra arrival dates in `additionalCheckInDates` (up to 30). Each takes the same number of nights as `checkInDate` to `checkOutDate`, and you get one row per hotel per arrival date, from one run; a city page is read only once. Every row carries its own `checkInDate` and `checkOutDate`, so runs from a daily schedule line up into one price history per hotel and date.

**How do I watch one specific hotel?**
Run a city once, take the `hotelId` of the hotel from the result, and put that ID in `locations` from then on. A Google Hotels hotel link works as well.

**Why is a hotel from the city page missing?**
Because Google had no prices for it on your dates, or it is a holiday rental without a per-site price list. The run log names every skipped hotel with the reason; skipped hotels are not charged.

**Which currency and market are used?**
`currency` sets the currency of every price. `countryCode` sets the market Google shows and the country of the proxy exit; booking sites can differ per market.

**Is this an alternative to the Amadeus Self-Service hotel API?**
For hotel prices per date and per booking site, yes. Amadeus switched off its self-service APIs on 17 July 2026. This actor reads Google Hotels; it does not book rooms.

**Is personal data collected?**
No. The rows hold hotels, prices and links; no reviews, names or guest data.

**What happens when the source changes?**
Sources change from time to time; that is the nature of this work. The actor is
monitored daily and fixed fast, and while it is broken you are not charged, because
only delivered results cost anything.

**Can I call it from my own code, like an API?**
Yes. Every run is available through the Apify API: start it with one HTTP request, then read
the results as JSON, CSV or Excel from the dataset endpoint, or use the official Python and
JavaScript clients. The input is the same JSON as in the input example above, so a scheduled
script, a Make or Zapier step or an AI agent can call it without any changes.

# Changelog

This Actor's version history is a separate document: https://apify.com/steadydata/google-hotels-prices/changelog.md

# Actor input Schema

## `locations` (type: `array`):

One per row, up to 100: a city as Google knows it (Lisbon, New York), a Google Hotels hotel ID (starts with Ch), or a Google Hotels hotel link.

## `checkInDate` (type: `string`):

Arrival date as YYYY-MM-DD.

## `checkOutDate` (type: `string`):

Departure date as YYYY-MM-DD, after check-in; up to 30 nights.

## `additionalCheckInDates` (type: `array`):

Extra arrival dates as YYYY-MM-DD, up to 30, each with the same number of nights as above: one run then covers a whole date range for price watching.

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

Number of adult guests.

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

Three-letter currency code for all prices, for example USD, EUR, GBP.

## `countryCode` (type: `string`):

Two-letter market code; it also sets the country of the proxy exit.

## `languageCode` (type: `string`):

Language for hotel and room names.

## `maxResults` (type: `integer`):

Cost ceiling per city. Google shows about 20 hotels on a city page.

## Actor input object example

```json
{
  "locations": [
    "Lisbon"
  ],
  "checkInDate": "2026-11-19",
  "checkOutDate": "2026-11-20",
  "adults": 2,
  "currency": "USD",
  "countryCode": "us",
  "languageCode": "en",
  "maxResults": 10
}
```

# 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 = {
    "locations": [
        "Lisbon"
    ],
    "checkInDate": "2026-11-19",
    "checkOutDate": "2026-11-20"
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadydata/google-hotels-prices").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 = {
    "locations": ["Lisbon"],
    "checkInDate": "2026-11-19",
    "checkOutDate": "2026-11-20",
}

# Run the Actor and wait for it to finish
run = client.actor("steadydata/google-hotels-prices").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 '{
  "locations": [
    "Lisbon"
  ],
  "checkInDate": "2026-11-19",
  "checkOutDate": "2026-11-20"
}' |
apify call steadydata/google-hotels-prices --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steadydata/google-hotels-prices"
        }
    }
}
```

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/RJD8GUofdAagWCNCs/builds/WNxv5lsLxFyOQipB7/openapi.json
