# Google Hotels Prices API: OTA Rates by Date (`ocius-data/google-hotels-reliable`) Actor

Google Hotels prices API: nightly and total rates with taxes from Booking, Expedia and hotel sites, for any city and dates. Compare OTA rates. Pay per hotel.

- **URL**: https://apify.com/ocius-data/google-hotels-reliable.md
- **Developed by:** [Christian Barbosa](https://apify.com/ocius-data) (community)
- **Categories:** Travel, E-commerce, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 hotel with 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 Prices API: OTA Rates by Date

Get Google Hotels prices for any city, area or hotel name and any dates: **price per night and total stay with taxes and fees**, star class, guest rating, reviews, amenities, location, deal badges and, optionally, **the price on each booking site** (Booking.com, Expedia, Agoda, the hotel's own site and others). You pay **only per hotel saved with a price**. Destinations without results and failed requests are free.

### Why this Google Hotels scraper

- **Reliable by design.** No browser. Each blocked request is retried with exponential backoff and a new IP address. If Google keeps blocking, the Actor switches automatically from datacenter to residential proxies in your market country.
- **Your dates, your guests, your currency.** Check-in and check-out dates, adults, children with ages and any currency Google supports are sent to Google exactly as in its own interface. Every row repeats the dates, nights and currency Google priced, so you can verify them.
- **Night and stay prices that add up.** `pricePerNight` × `nights` = `priceTotal`, taxes and fees included, with the taxes shown separately when Google provides them.
- **Fair pricing.** One flat price per hotel, including every field. Hotels without a price, duplicates and errors are never charged.
- **Clear status.** Every destination ends as `OK`, `NO_RESULTS`, `BLOCKED`, `ERROR`, `INVALID_INPUT`, `TIMEOUT` or `NOT_PROCESSED`. The `RUN_SUMMARY` record explains why fewer hotels than requested were saved. If more than 20% of destinations fail, the run is marked as failed so you notice.
- **Safe on long runs.** Hotels are marked as collected only after they are saved, and saving pauses while the platform moves the run to another server, so a restart does not duplicate rows or charges.

### What data you get

| Group | Fields |
|---|---|
| Hotel | Name, Google hotel ID, star class, guest rating, number of reviews, description, photo, website, check-in and check-out times |
| Location | Latitude, longitude, country code; address and phone with **Prices per booking site** enabled |
| Price | Lowest price per night and for the whole stay, taxes and fees, currency, nights, check-in and check-out dates |
| Deals | Deal flag and Google's badge, for example "19% less than usual" or "GREAT PRICE for a 4-star hotel" |
| Amenities | The main amenities from the results page; the full list grouped by category with **Prices per booking site** enabled |
| Booking sites | Optional: each site's price per night and total, official-site flag, free cancellation and deadline, promotion and link |
| Traceability | `googleHotelsUrl`, `sourceUrl`, the input used and `scrapedAt` on every row |

The output tab has an overview table and a location table. Download as JSON, CSV or Excel, or connect through the API.

### How to use it

1. Enter one or more **destinations**: a city (`Bogotá`), a city with country (`Cartagena, Colombia`), an area or a hotel name (`Hotel Tequendama Bogotá`).
2. Set **check-in** and **check-out** dates (up to 30 nights, up to about 330 days ahead). If you leave them empty, the Actor searches 2 nights starting 14 days from today.
3. Set **adults**, **children** and, optionally, each child's age.
4. Choose the **currency**, **language** and **country** (the market you search from).
5. Optional: filter by price per night, star class, guest rating, free cancellation or special offers.
6. Optional: enable **Prices per booking site**.
7. Run the Actor.

#### Input example

```json
{
  "destinations": ["Bogotá", "Madrid, Spain"],
  "checkIn": "2026-12-10",
  "checkOut": "2026-12-13",
  "adults": 2,
  "children": 1,
  "childrenAges": [7],
  "currency": "USD",
  "language": "en",
  "country": "US",
  "hotelClass": ["4", "5"],
  "minRating": "4",
  "maxHotels": 50,
  "includeProviderPrices": false
}
```

### Example output

```json
{
  "destination": "Bogotá",
  "position": 1,
  "name": "Hilton Bogota",
  "hotelId": "ChcIhsrJyaiJ0IcJGgsvZy8xdGZzY3g5MBAB",
  "stars": 5,
  "rating": 4.7,
  "reviewsCount": 5153,
  "latitude": 4.6556989,
  "longitude": -74.055533,
  "amenities": ["Breakfast ($)", "Free Wi-Fi", "Free parking", "Outdoor pool", "Air conditioning", "Pet-friendly", "Fitness center", "Bar"],
  "currency": "USD",
  "checkIn": "2026-12-10",
  "checkOut": "2026-12-13",
  "nights": 3,
  "pricePerNight": 181.61,
  "priceTotal": 544.84,
  "priceBeforeTaxesTotal": 457.67,
  "taxesAndFeesTotal": 87.17,
  "isDeal": true,
  "dealLabel": "17% less than usual",
  "percentBelowUsual": 17,
  "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChcIhsrJyaiJ0IcJGgsvZy8xdGZzY3g5MBAB?q=Bogot%C3%A1&hl=en&gl=us&ts=...",
  "scrapedAt": "2026-11-01T19:42:29.616Z"
}
```

With **Prices per booking site** enabled, each row also has:

```json
{
  "address": "Tv. 6 #27-85, Bogotá, Colombia",
  "phone": "+57 601 7422404",
  "cheapestProvider": "Hotel prive",
  "providers": [
    { "provider": "Hotel prive", "isOfficialSite": false, "pricePerNight": 47.82, "priceTotal": 143.47, "currency": "USD", "freeCancellation": false, "freeCancellationUntil": null, "promotion": null, "link": "https://www.google.com/travel/lodging/clk?..." },
    { "provider": "ibis Bogota Museo", "isOfficialSite": true, "pricePerNight": 51.03, "priceTotal": 153.08, "currency": "USD", "freeCancellation": false, "freeCancellationUntil": null, "promotion": "Get 5-10% off with free enrollment", "link": "https://www.google.com/travel/lodging/clk?..." },
    { "provider": "Hoteles.com", "isOfficialSite": false, "pricePerNight": 51.03, "priceTotal": 153.08, "currency": "USD", "freeCancellation": true, "freeCancellationUntil": "Nov 1", "promotion": null, "link": "https://www.google.com/travel/lodging/clk?..." }
  ],
  "providerPricesStatus": "OK"
}
```

### Pricing

You pay **USD 0.003 per hotel** saved with a price. With **Prices per booking site** enabled, each hotel costs **USD 0.006**, because the Actor opens every hotel page to collect the offers from Booking, Expedia, Agoda, the official site and others. All other fields are included in both modes. Hotels without a price, duplicates, destinations without results and failed requests are not charged. Your maximum cost per run is respected: the Actor stops as soon as it is reached.

| Run | Hotels with a price | Approximate cost |
|---|---|---|
| Daily price check, 1 city | 20 | USD 0.06 (USD 0.12 with booking-site prices) |
| 5 cities, 100 hotels each | 500 | USD 1.50 |
| Market study, 1,000 hotels | 1,000 | USD 3.00 |

### Output fields

| Field | Meaning | When it is null |
|---|---|---|
| `destination`, `position` | The destination you entered and the hotel's order in the results. | Never |
| `name`, `hotelId` | Hotel name and Google Hotels ID (stable, usable to track a hotel over time). | Never |
| `googleFeatureId`, `googleHotelId`, `placeId` | Other Google identifiers. `placeId` is the Google Maps place ID. | `placeId` without booking-site prices |
| `propertyType` | `hotel` or `vacation_rental`. | Never |
| `stars`, `starsLabel` | Official star class (1-5) and Google's label. | Properties without an official class |
| `rating`, `reviewsCount` | Google guest rating (0-5) and number of reviews. | New properties without reviews |
| `address`, `phone` | Street address and phone. | Without booking-site prices (except hotel-name searches, which include them) |
| `latitude`, `longitude`, `countryCode` | Coordinates and ISO country code. | Rarely |
| `website`, `checkInTime`, `checkOutTime`, `description`, `thumbnail` | Hotel details as Google shows them. | When Google has no value |
| `amenities` | Main amenities (results page) or full list (booking-site mode), in the selected language. Amenities the hotel lacks are excluded. | Empty list when Google shows none |
| `amenityGroups` | Full amenities by category, each with `name`, `note` and `available`. | Only with booking-site prices |
| `isAvailable` | `false` only when **Include hotels without a price** is on and Google shows no price. | Never |
| `currency`, `checkIn`, `checkOut`, `nights`, `adults`, `children` | The search Google priced. | Never |
| `pricePerNight`, `priceTotal` | Lowest price per night and for the stay, taxes and fees included. | Hotels without a price |
| `pricePerNightFormatted`, `priceTotalFormatted` | Prices exactly as Google displays them, rounded. In some markets Google displays prices before taxes, so these labels can be lower than `pricePerNight` and `priceTotal`. | Hotels without a price |
| `pricePerNightBeforeTaxes` | Price per night before taxes and fees, when Google provides the breakdown. | When Google does not provide the breakdown |
| `priceBeforeTaxesTotal`, `taxesAndFeesTotal` | Stay total before taxes, and taxes and fees. When Google already includes taxes in the base price, `taxesAndFeesTotal` is 0. | Hotels without a price |
| `isDeal`, `dealLabel`, `percentBelowUsual` | Google's deal badge and, when stated, how much below the usual price. | `dealLabel` and `percentBelowUsual` without a badge |
| `providers` | Price per booking site, cheapest first. | Only with booking-site prices |
| `cheapestProvider`, `providerPricesStatus` | Cheapest site, and `OK`, `NO_OFFERS` or `FAILED` for the hotel page. | Only with booking-site prices |
| `googleHotelsUrl` | The hotel in Google Hotels with your dates, guests and currency. | Never |
| `sourceUrl` | The results page the hotel came from. | Never |
| `input` | The destination, dates, guests, currency, language, country and filters used. | Never |
| `scrapedAt` | When the data was collected (UTC). | Never |

### Statuses and errors

| Status | Meaning | What to do |
|---|---|---|
| `OK` | At least one hotel saved. The summary explains if fewer than `maxHotels` were saved (Google has no more results, filters, cost limit, or a block after some hotels were saved). | Nothing |
| `NO_RESULTS` | Google has no priced property for this search, or it did not recognize the destination and showed another place. Not charged. | Check the spelling, add the country, change dates or relax filters. |
| `BLOCKED` | Google kept blocking after all retries and proxy escalation. Not charged. | Run again later or select residential proxies. |
| `ERROR` | Google returned an unexpected page. Not charged. | Report it; the page format may have changed. |
| `INVALID_INPUT` | For example, a currency Google does not support. Not charged. | Fix the input as the message says. |
| `TIMEOUT` | The run reached its timeout before this destination returned hotels. | Increase the run timeout. |
| `NOT_PROCESSED` | Your maximum cost per run was reached before this destination. | Raise the maximum cost per run. |

Input errors such as a check-in date in the past, check-out before check-in or more than 30 nights stop the run within seconds with a message that says how to fix them.

### Known limits

- Prices change constantly and depend on the market (`country`), currency and date of the search. Two runs minutes apart can differ, as in Google Hotels itself.
- Google repeats some hotels across result pages. Duplicates are removed and not charged, so a page yields about 10 to 14 new hotels.
- Google lists some hotels without a price for your dates; they are skipped unless you enable **Include hotels without a price**.
- The results page shows up to 8 main amenities per hotel. The full list requires **Prices per booking site**.
- Price, star and rating filters are applied again before saving, using the nightly price including taxes and fees. Rows whose dates or nights differ from your search are discarded and not charged.
- Hotel-name searches return that hotel only.

### How it works

The Actor requests the same pages as the Google Hotels website and reads the data Google embeds in them. Dates, guests, currency and filters are encoded in the URL parameters the website itself uses, so results match what you see in your browser for the same market. No browser is used, which keeps runs fast and inexpensive.

### Current status

No incidents. Operational issues are posted here.

### Integrations: API, schedules, webhooks, Google Sheets and AI agents

**API.** Run the Actor and receive the hotels in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/ocius-data~google-hotels-reliable/run-sync-get-dataset-items?token=YOUR_API_TOKEN&format=json"   -H "Content-Type: application/json"   -d '{"destinations": ["Cartagena, Colombia"], "checkIn": "2026-12-15", "checkOut": "2026-12-18", "currency": "USD", "maxHotels": 20}'
```

Python, with the official `apify-client` package:

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("ocius-data/google-hotels-reliable").call(run_input={"destinations": ["Madrid"], "currency": "EUR", "includeProviderPrices": True})
for hotel in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(hotel["name"], hotel["pricePerNight"], hotel["priceTotal"], hotel["currency"])
```

**Schedules.** Save your input as a task and open **Schedules** in Apify Console to track the same destinations and dates every day (rate parity and price monitoring).

**Webhooks, Google Sheets, Zapier, Make and n8n.** In the task, open **Integrations** and add a webhook for `ACTOR.RUN.SUCCEEDED`, the Google Sheets integration, or the official Apify app in Zapier, Make or n8n (trigger "Actor run finished", action "Get dataset items").

**MCP and AI agents.** The Actor is available through the Apify MCP server (`https://mcp.apify.com`). Add `ocius-data/google-hotels-reliable` to the server's Actor list and an AI agent such as Claude can call it with plain inputs such as `{"destinations": ["Bogota"], "maxHotels": 10}`.

### FAQ

**Is it legal?** The Actor collects publicly available prices and business information about hotels. It does not collect personal data. Check the rules that apply to your use case.

**Why do prices differ from what I see?** Set the same dates, guests, currency and country. Google personalizes prices by market, and some booking sites show member or mobile prices that are not public.

**Can I monitor the same hotels every day?** Yes. Schedule the Actor and use `hotelId` to compare prices over time.

**What happens if I am charged for a hotel with a wrong price?** Open an issue with the run ID. Every case is reviewed, and confirmed defects are fixed with priority.

### Related Actors from ocius-data

Built to the same standard: a status for every input in `RUN_SUMMARY`, actionable error messages and list-based inputs, so they chain well in one workflow:

- **[Google Flights API: Prices, Itineraries & Date Grid](https://apify.com/ocius-data/google-flights-prices)**: flight prices, itineraries and the cheapest day to fly on any route.

### Changelog

- **November 2026** Fixed: `pricePerNight` now always includes taxes and fees, so `pricePerNight` × `nights` = `priceTotal` also in markets where Google displays prices before taxes. New field `pricePerNightBeforeTaxes`.
- **0.1** First version: dates, guests with children's ages, currency, language and market; price, star, rating, free-cancellation and special-offer filters; prices per booking site; hotel-name search; statuses and run summary; proxy escalation.

### Use cases

- Revenue management and competitor rate monitoring for hotels
- Travel agencies and tour operators comparing booking sites
- Market research on hotel supply and prices by city and season
- Corporate travel budgets and per diem planning
- Price alerts and deal-finding applications

### Tips

- For daily rate monitoring, keep the same dates offset, currency and country, and track `hotelId`.
- Add the country to ambiguous destinations, for example `Valencia, Spain` or `Valencia, Venezuela`.
- Use **Prices per booking site** when you need the cheapest site, free-cancellation deadlines, address or the full amenity list. Runs take longer because each hotel needs one more page.

### Support

Open an issue on the Actor page. Issues are reviewed every business day; the first response arrives within 24 business hours and critical failures are fixed or worked around within 72 hours.

# Actor input Schema

## `destinations` (type: `array`):

Cities, areas or hotel names, one per line. For example "Bogotá", "Madrid, Spain", "Hotel Tequendama Bogotá". You are charged once per hotel with a price; destinations without results are free.

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

Format YYYY-MM-DD. Leave empty to use the date 14 days from today.

## `checkOut` (type: `string`):

Format YYYY-MM-DD, after the check-in date. Stays of up to 30 nights. Leave empty for a 2-night stay.

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

Number of adult guests.

## `children` (type: `integer`):

Number of children.

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

Optional. One age (0-17) per child, for example \[5, 9]. If empty, each child is searched as 8 years old.

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

ISO currency code for all prices, for example USD, EUR, COP, MXN, GBP or BRL.

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

Language for hotel descriptions and labels, for example en, es, pt-BR or fr.

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

Two-letter code of the market you search from, for example US, CO, ES or MX. Booking sites and prices can vary by market. Residential proxies, when needed, are taken from this country.

## `minPrice` (type: `integer`):

In the selected currency, taxes and fees included. Leave empty for no minimum.

## `maxPrice` (type: `integer`):

In the selected currency, taxes and fees included. Leave empty for no maximum.

## `hotelClass` (type: `array`):

Only hotels with these official star ratings. Leave empty for all.

## `minRating` (type: `string`):

Only properties with this Google guest rating or higher.

## `freeCancellation` (type: `boolean`):

Only properties with at least one free-cancellation offer.

## `specialOffers` (type: `boolean`):

Only properties with a special offer or deal.

## `includeVacationRentals` (type: `boolean`):

Google mixes apartments and homes into hotel results. They are skipped unless you enable this option.

## `maxHotels` (type: `integer`):

The Actor stops for each destination when this number of hotels is saved or Google has no more results.

## `includeProviderPrices` (type: `boolean`):

Adds the price on each booking site (Booking.com, Expedia, Agoda, the hotel's own site and others) with links and free-cancellation flags, plus address, phone and the full amenity list. Makes one extra request per hotel, so runs take longer. Same price per hotel.

## `includeUnavailable` (type: `boolean`):

Also save hotels that Google lists without a price for these dates. They are free and marked with isAvailable = false.

## `maxRetries` (type: `integer`):

How many times a blocked request is retried with a new IP address.

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

How many requests run at the same time across all destinations.

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

By default the Actor starts with Apify datacenter proxies and switches automatically to residential proxies in the selected country if Google blocks requests.

## Actor input object example

```json
{
  "destinations": [
    "Bogotá",
    "Madrid, Spain"
  ],
  "adults": 2,
  "children": 0,
  "childrenAges": [],
  "currency": "USD",
  "language": "en",
  "country": "US",
  "hotelClass": [],
  "minRating": "",
  "freeCancellation": false,
  "specialOffers": false,
  "includeVacationRentals": false,
  "maxHotels": 20,
  "includeProviderPrices": false,
  "includeUnavailable": false,
  "maxRetries": 6,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

One row per hotel with prices, rating, location, amenities and, when requested, prices per booking site.

## `runSummary` (type: `string`):

Status per destination (OK, NO_RESULTS, BLOCKED, ERROR), field completeness and charge reconciliation.

# 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 = {
    "destinations": [
        "Bogotá",
        "Madrid, Spain"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ocius-data/google-hotels-reliable").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 = { "destinations": [
        "Bogotá",
        "Madrid, Spain",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ocius-data/google-hotels-reliable").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 '{
  "destinations": [
    "Bogotá",
    "Madrid, Spain"
  ]
}' |
apify call ocius-data/google-hotels-reliable --silent --output-dataset

```

## MCP server setup

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

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/0m8KfFeORYciwAiLy/builds/oJrVqv1xprLtT0k9M/openapi.json
