---
title: "Google Hotels API: Hotel Prices for Your Dates as JSON"
description: "One GET to /v1/google-hotels/search returns Paris hotels with nightly rate, total rate and rating for your dates as JSON. Parameters, a response and cost."
url: https://perceptlayer.com/blog/google-hotels-api
---

[Blog](https://perceptlayer.com/blog) / [API guides](https://perceptlayer.com/blog/category/api-guides)

# Google Hotels API: Hotel Prices for Your Dates as JSON

25 Aug 2026 Perceptlayer 8 min read

Google's [Hotel Prices developer guide](https://developers.google.com/hotels/hotel-prices/dev-guide) is about supplying hotel pricing data for Google's search results, and it doesn't present a way to read prices for a city and dates. To read prices for a city and dates, call `GET /v1/google-hotels/search` with a destination and a check-in and check-out date. It returns hotels with nightly rate, total rate, rating and review count as JSON, for 1 credit per call.

## Key takeaways

-   Google's Hotel Prices developer guide covers supplying pricing data to Google. It doesn't present a way to look up prices for a city and dates. Search results for a destination and dates come from `/v1/google-hotels/search`.
-   Three parameters are required: `q`, `check_in_date` and `check_out_date`. Everything else, including `currency`, `adults` and `hotel_class`, narrows the results.
-   Each property in the recorded Paris response carries `rate_per_night`, `total_rate`, `overall_rating` and a `property_token` for the reviews endpoint.
-   Every call to the three Google Hotels endpoints costs 1 credit, and failed calls cost nothing. A nightly check of 5 destinations uses 150 credits a month.

## Is there an official Google Hotels API for prices?

We didn't find one for reading prices back out, and we can't rule out that something exists outside the pages we read. Google's [Hotel Prices developer guide](https://developers.google.com/hotels/hotel-prices/dev-guide) covers how to configure your environment and supply hotel pricing data for Google's search results. It is written for the side of the market that publishes rates, not the side that wants to look them up.

That matters if you're the one who needs prices. A travel app, a rate-monitoring script or an agent comparing destinations is a consumer of that data, not a supplier. Google also documents a [Travel Partner API](https://developers.google.com/hotels/hotel-prices/api-reference/rest) for Hotel Center accounts, which sits alongside that supply-side guide.

If you are a hotel, use Google's own tooling. If you want what a traveller sees for a given city and dates, that's what the [Google Hotels API](https://perceptlayer.com/apis/google-hotels) returns as JSON: data collected from publicly available sources and returned as found at the time of the call.

## Which endpoints does the Google Hotels API have?

The [Google Hotels API](https://perceptlayer.com/apis/google-hotels) has three endpoints: autocomplete, search and reviews. All three are `GET` requests, and each costs 1 credit per successful call. Search is the one that returns prices for a destination and dates. The API is part of the [Travel APIs](https://perceptlayer.com/verticals/travel), and the table below lists each path with its required parameters.

| Path | Returns | Credits | Required parameters |
| --- | --- | --- | --- |
| `/v1/google-hotels/autocomplete` | Autocomplete | 1 | `q` |
| `/v1/google-hotels/search` | Search | 1 | `q`, `check_in_date`, `check_out_date` |
| `/v1/google-hotels/reviews` | Reviews | 1 | `property_token` |

The usual flow is search first. Each property in a search response has a `property_token`, and that token is what the reviews endpoint needs. The autocomplete endpoint takes a partial `q` and a `type` of `location`, `hotel` or `all`, which helps when you want to resolve user input into a destination or hotel name before searching.

Authentication is one header, `X-API-Key`. The [authentication docs](https://docs.perceptlayer.com/authentication) cover keys and the `api_key` query parameter, and the [quick start](https://docs.perceptlayer.com/quickstart) gets a first call running.

## How do you get hotel prices for specific dates?

To get hotel prices for specific dates, send the destination as `q` and the stay as `check_in_date` and `check_out_date` in one `GET` to the search endpoint. Add `currency` for the price format and `gl` for the country. The request below asks for Paris, 15 to 18 December 2026, in euros, and costs 1 credit.

```bash
curl "https://api.perceptlayer.com/v1/google-hotels/search?q=Paris%2C+France&check_in_date=2026-12-15&check_out_date=2026-12-18&currency=EUR&gl=fr" \
  -H "X-API-Key: $API_KEY"
```

The response echoes your inputs under `search_parameters`, and shows what was applied, including `adults: 2` and `children: 0`. Here's an excerpt of the recorded response, trimmed with `…`:

```json
{
  "search_parameters": {
    "engine": "google_hotels",
    "q": "Paris, France",
    "gl": "fr",
    "hl": "en",
    "currency": "EUR",
    "check_in_date": "2026-12-15",
    "check_out_date": "2026-12-18",
    "adults": 2,
    "children": 0
  },
  "search_information": {
    "total_results": 15000,
    "cached": false
  },
  "properties": [
    {
      "type": "hotel",
      "name": "Novotel Paris Porte de Versailles",
      "property_token": "ChkI5rWisq2xuMNRGg0vZy8xMWhfa18xc2w4EAE",
      "gps_coordinates": {
        "latitude": 48.8300073,
        "longitude": 2.2917392999999997
      },
      "check_in_time": "3:00 PM",
      "check_out_time": "12:00 PM",
      "rate_per_night": {
        "lowest": "€136",
        "extracted_lowest": 136,
        "before_taxes_fees": "€136",
        "extracted_before_taxes_fees": 135.76042
      },
      "total_rate": {
        "lowest": "€408",
        "extracted_lowest": 408,
        "before_taxes_fees": "€407",
        "extracted_before_taxes_fees": 407.28126000000003
      },
      "overall_rating": 4.6,
      "reviews": 4337,
      "hotel_class": "4-star hotel",
      "extracted_hotel_class": 4
    },
    …
  ],
  "pagination": {
    "current_from": 1,
    "current_to": 20,
    "next_page_token": "gho_jRZtj7WKgqLkF8eP.Q0JJPQ",
    …
  },
  "response_time_ms": 2501
}
```

### What do the price fields mean?

Each property has two price objects. `rate_per_night` is the nightly figure and `total_rate` covers the stay. For the Novotel, the three nights come to `€408` in `total_rate.lowest`, which is 3 × `€136`.

Each object has a display string ( `"€136"`) and an `extracted_` number ( `136`) you can sort and sum without parsing currency symbols. The `before_taxes_fees` pair gives the figure before taxes and fees. Use the numeric fields in code and keep the strings for display.

The second property in the recording, Hôtel Aramis Saint-Germain Best Western, shows `rate_per_night.lowest` of `€124` and `overall_rating` of `4.4` from `826` reviews. Rate, rating and review count are on the same object, so ranking by value takes no second request.

## Which parameters does the search endpoint take?

The search endpoint takes three required parameters, `q`, `check_in_date` and `check_out_date`, and a long list of optional filters for party size, price, star class and more. Only the types and allowed values below are documented, so the table doesn't claim defaults. The recorded response shows `adults: 2` and `children: 0` for a request that set neither.

| Parameter | Type | Notes |
| --- | --- | --- |
| `q` | string, required | Destination, up to 200 characters |
| `check_in_date` | string, required | Check-in date |
| `check_out_date` | string, required | Check-out date |
| `adults`, `children` | integer | Party size |
| `children_ages[]` | list of integer | Ages of the children |
| `currency` | string | Up to 3 characters |
| `gl`, `hl` | string | Country and language, up to 2 characters each |
| `sort_by` | integer | One of 3, 8, 13 |
| `min_price`, `max_price` | integer | Price bounds |
| `hotel_class` | integer | One of 2, 3, 4, 5 |
| `rating` | integer | One of 7, 8, 9 |
| `free_cancellation` | boolean | Filter |
| `amenities[]` | list of integer | Amenity filter |
| `property_types[]`, `brands[]` | list of integer | Type and brand filters |
| `vacation_rentals`, `eco_certified`, `special_offers` | boolean | Filters |
| `bedrooms`, `bathrooms` | integer | Size filters |
| `next_page_token` | string | Continues a result set |
| `property_token` | string | Targets one property |
| `engine` | string | One of `google_hotels` |

The response includes a `brands` list with an `id` and `name` for each brand, such as `118` for Park Hyatt and `155` for Best Western in the recording. The `brands[]` filter is a list of integers. The docs don't say where its values come from, so try it in the playground on the [Search endpoint page](https://perceptlayer.com/apis/google-hotels/search).

For a filtered search, add parameters to the same call. This one asks for 4-star hotels with free cancellation:

```bash
curl "https://api.perceptlayer.com/v1/google-hotels/search?q=Paris%2C+France&check_in_date=2026-12-15&check_out_date=2026-12-18&currency=EUR&gl=fr&hotel_class=4&free_cancellation=true" \
  -H "X-API-Key: $API_KEY"
```

## How do you page through results and read reviews?

The recorded response has `total_results` of 15000 and a `pagination` object showing `current_from: 1` and `current_to: 20`. To get the next page, pass the `next_page_token` from that object back as the `next_page_token` parameter, with the same query. Each page is its own call and its own credit. The [pagination guide](https://perceptlayer.com/blog/paginate-web-data-api-python) covers safe page loops in Python.

For reviews, take a property's `property_token` from search and call the reviews endpoint:

```bash
curl "https://api.perceptlayer.com/v1/google-hotels/reviews?property_token=ChkI5rWisq2xuMNRGg0vZy8xMWhfa18xc2w4EAE" \
  -H "X-API-Key: $API_KEY"
```

| Parameter | Type | Notes |
| --- | --- | --- |
| `property_token` | string, required | Up to 256 characters |
| `hl`, `gl` | string | Language and country, up to 2 characters |
| `category_token` | string | Up to 40 characters |
| `next_page_token` | string | Up to 256 characters, for more reviews |

We haven't recorded a reviews response for this guide, so there's no excerpt here. The [Reviews endpoint page](https://perceptlayer.com/apis/google-hotels/reviews) lists the fields, and the playground runs a real call. Search already gives you a summary per hotel: `overall_rating`, `reviews`, a star `ratings` breakdown and `reviews_breakdown` by topic. The reviews endpoint is for the review entries themselves.

For the same pattern on another Google product, see the [Google Maps reviews guide](https://perceptlayer.com/blog/google-maps-reviews-api-parameters).

## How do you run a nightly price check in Python?

A nightly price check is a loop over destinations and date windows that stores `extracted_lowest` with a timestamp, so you can compare the same stay from one night to the next. The script below runs one search and prints name, nightly rate, rating and reviews for each property. Set `API_KEY` in your environment first.

```python
import os
import requests

URL = "https://api.perceptlayer.com/v1/google-hotels/search"
HEADERS = {"X-API-Key": os.environ["API_KEY"]}

def check(destination, check_in, check_out):
    params = {
        "q": destination,
        "check_in_date": check_in,
        "check_out_date": check_out,
        "currency": "EUR",
    }
    resp = requests.get(URL, headers=HEADERS, params=params, timeout=30)
    resp.raise_for_status()
    print("credits used:", resp.headers.get("X-Credits-Used"),
          "remaining:", resp.headers.get("X-Credits-Remaining"))
    return resp.json()["properties"]

for p in check("Paris, France", "2026-12-15", "2026-12-18"):
    rate = p.get("rate_per_night", {}).get("extracted_lowest")
    print(p["name"], rate, p.get("overall_rating"), p.get("reviews"))
```

Some properties may lack a rate for your dates, so the script reads `rate_per_night` defensively. Don't assume every field exists on every property. Only the fields in the recording are shown here.

Errors come back as an HTTP status with a JSON `error` body. Handle `429` and `503` by waiting for the `Retry-After` seconds, as described in the [errors](https://docs.perceptlayer.com/errors) and [rate limit](https://docs.perceptlayer.com/rate-limits) docs. A request that timed out client-side may still have succeeded and been billed, which [retrying without paying twice](https://perceptlayer.com/blog/retry-web-api-calls-without-paying-twice) goes into. Store results, and use the [caching guide](https://perceptlayer.com/blog/cache-web-data-api-responses) so the same query isn't paid for twice in a day.

## What does a nightly hotel price check cost?

Each search is 1 credit, so the cost is the number of destination and date combinations times the number of nights you run it. Failed calls cost nothing and return `X-Credits-Used: 0`, and every successful response reports `X-Credits-Remaining`. The [credits docs](https://docs.perceptlayer.com/credits) and [pricing](https://perceptlayer.com/pricing) have the rest.

| Check | Calls per night | Credits per 30 nights | Cost |
| --- | --- | --- | --- |
| 5 destinations, 1 date window each | 5 | 150 | Within the 1,000 free credits a month |
| 20 destinations, 3 date windows each | 60 | 1,800 | 60 calls × 30 nights × 1 credit = 1,800 credits, within the Starter pack's 10,000 |

The free tier gives 1,000 credits every month after you verify an email address, with no credit card. Credits also come in prepaid packs, starting with the 10,000-credit Starter pack, and purchased credits last 12 months. See [pricing](https://perceptlayer.com/pricing) for what credits cost. Paging deeper into a result set adds one credit per extra page, so count pages as calls.

The service is prepaid. If the balance runs out, calls return `insufficient_credits` (402) and nothing more is debited.

Next step: [get a free API key](https://perceptlayer.com/signup) and run the Paris search above in the playground on the [Google Hotels API page](https://perceptlayer.com/apis/google-hotels). If you want an agent to make these calls, the [MCP docs](https://docs.perceptlayer.com/ai-agents) show how.

## APIs in this post

-   [Google Hotels **1 credit per call** · 3 endpoints](https://perceptlayer.com/apis/google-hotels)

## Frequently asked questions

### Does Google have an API to get hotel prices?

We didn't find one. Google's [Hotel Prices developer guide](https://developers.google.com/hotels/hotel-prices/dev-guide) covers supplying pricing data to Google's search results, and the pages we read don't describe reading prices for a city and dates. The Google Hotels API on Perceptlayer returns that search view as JSON from `/v1/google-hotels/search`, for 1 credit per call.

### How much does the Google Hotels API cost?

Each successful call to the search, reviews and autocomplete endpoints costs 1 credit. Failed calls cost nothing. You get 1,000 free credits a month after verifying an email. Beyond that, prepaid packs run from 10,000 credits (Starter) to 5,000,000 (Volume), and [pricing](https://perceptlayer.com/pricing) has what credits cost. A nightly check of 5 destinations is 150 credits a month.

### What parameters are required for a hotel search?

Three: `q` for the destination, `check_in_date` and `check_out_date`. Everything else is optional, including `currency`, `gl`, `hl`, `adults`, `children`, `hotel_class`, `rating`, `min_price`, `max_price` and `free_cancellation`. Check-in and check-out are strings. The recorded request writes them like `2026-12-15`.

### How do I get reviews for a specific hotel?

Run a search, copy the `property_token` from the hotel you want, and pass it to `/v1/google-hotels/reviews`. Use `next_page_token` to continue to more reviews and `category_token` to narrow by category. Each reviews call costs 1 credit. The hotel's summary rating and review count are already in the search response.

### What happens if a call fails?

You get an HTTP status and a JSON body with `error.code`, `error.message` and `request_id`. Failed calls aren't billed and return `X-Credits-Used: 0`. For `429` and `503`, wait the number of seconds in the `Retry-After` header. A call that timed out on your side may have succeeded and been billed.

travel hotels google hotels prices reviews

## More from the blog

1.  [API guides](https://perceptlayer.com/blog/category/api-guides) 25 Aug 2026 Perceptlayer 8 min read
    
    ## [Booking.com Hotel Prices API: Search, Rooms and Reviews](https://perceptlayer.com/blog/booking-com-hotel-prices-api)
    
    Eleven Booking.com endpoints as JSON: search, prices, rooms and reviews, with parameters and a 1,000-hotel price check costed in credits.
    
2.  [API guides](https://perceptlayer.com/blog/category/api-guides) 24 Jul 2026 Perceptlayer 8 min read
    
    ## [Trivago Hotel Prices API: Deals and Search as JSON](https://perceptlayer.com/blog/trivago-api-hotel-prices)
    
    Call trivago suggest, search and deals as JSON: 1 credit per call, a recorded Paris search response, and the provider\_count field in a metasearch result.
    
3.  [API guides](https://perceptlayer.com/blog/category/api-guides) 20 Jul 2026 Updated 26 Oct 2026 Perceptlayer 7 min read
    
    ## [Airbnb Listings Data API: Search, Details and Reviews](https://perceptlayer.com/blog/airbnb-listings-data-api)
    
    Search Airbnb listings by place and dates as JSON: price, rating, beds and coordinates from a recorded response, plus the listing and reviews calls.
