Export public Google Hotels search results for destinations, stay dates, and guest counts. This Google Hotels API-ready hotel price scraper returns one hotel per dataset row with prices, ratings, review counts, amenities, images, and Google Travel links for spreadsheets, databases, and travel workflows.
Who is it for?
Hotel revenue managers, travel agencies, travel-tech builders, destination analysts, and accommodation pricing teams can use this Actor for repeatable destination/date price monitoring.
Why use this Actor?
- Compare hotel inventory for cities, neighborhoods, landmarks, or named properties.
- Track publicly displayed nightly rates for specific stay dates.
- Export structured hotel rows instead of manually copying Google Hotels cards.
- Preserve the requested currency and the currency Google actually displays.
- Process several destination queries in one run while keeping partial results if one query fails.
Input example
{
"queries": ["hotels in New York", "hotels near Eiffel Tower"],
"checkInDate": "2026-09-15",
"checkOutDate": "2026-09-17",
"adults": 2,
"currency": "USD",
"language": "en",
"country": "US",
"maxResultsPerQuery": 20,
"includeDetails": false
}
Dates must be in the future and use YYYY-MM-DD. Checkout must be after check-in.
Output example
{
"query": "hotels in New York",
"checkInDate": "2026-09-15",
"checkOutDate": "2026-09-17",
"adults": 2,
"childrenAges": [],
"requestedCurrency": "USD",
"currency": "USD",
"language": "en",
"country": "US",
"hotelName": "Example Hotel",
"propertyToken": "example-token",
"googleTravelUrl": "https://www.google.com/travel/hotels/entity/example-token",
"propertyType": "hotel",
"description": null,
"address": null,
"latitude": null,
"longitude": null,
"hotelClass": 4,
"rating": 4.4,
"reviewCount": 1280,
"locationRating": null,
"pricePerNight": 219,
"pricePerNightDisplay": "$219",
"totalPrice": null,
"totalPriceDisplay": null,
"priceAvailable": true,
"amenities": ["Pool", "Free Wi-Fi"],
"images": ["https://example.com/hotel.jpg"],
"checkInTime": null,
"checkOutTime": null,
"ecoCertified": false,
"offers": [],
"detailStatus": "not_requested",
"status": "succeeded",
"diagnostics": [],
"scrapedAt": "2026-08-13T12:00:00.000Z"
}
Fields unavailable on a particular public result remain null or an empty array, so exports keep a stable shape.
Input settings
| Field | Type | Description |
|---|---|---|
queries |
string[] | Destinations, landmarks, neighborhoods, or hotel names; 1–20 queries. |
checkInDate |
string | Future check-in date in YYYY-MM-DD format. |
checkOutDate |
string | Checkout date after check-in. |
adults |
integer | Adult guests, from 1 to 20. |
childrenAges |
integer[] | Ages of child guests, from 0 to 17. |
currency |
string | Requested three-letter currency code, such as USD or EUR. |
language |
string | Two-letter Google interface language code. |
country |
string | Two-letter Google search region code. |
maxResultsPerQuery |
integer | Maximum unique hotels saved for each query. |
includeDetails |
boolean | Request public property-detail enrichment when available. Search rows are preserved if enrichment is unavailable. |
includeOffers |
boolean | Include the public booking-offer ladder when Google displays it. |
minPrice, maxPrice |
number | Optional nightly-price filters. |
minRating |
number | Optional minimum guest rating from 0 to 5. |
hotelClasses |
integer[] | Optional hotel star classes to keep. |
proxyConfiguration |
object | Optional Apify Proxy configuration. |
API usage
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~google-hotels-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"queries":["hotels in Paris"],"checkInDate":"2026-10-20","checkOutDate":"2026-10-22","maxResultsPerQuery":10}'
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/google-hotels-scraper').call({ queries: ['hotels in Paris'], checkInDate: '2026-10-20', checkOutDate: '2026-10-22', maxResultsPerQuery: 10 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClient
client = ApifyClient(token='YOUR_APIFY_TOKEN')
run = client.actor('fetch_cat/google-hotels-scraper').call(run_input={'queries': ['hotels in Paris'], 'checkInDate': '2026-10-20', 'checkOutDate': '2026-10-22', 'maxResultsPerQuery': 10})
items = client.dataset(run['defaultDatasetId']).list_items().items
Use the run's default dataset after it succeeds.
MCP and AI agents
Connect through Apify MCP to let compatible AI clients run hotel searches and consume structured results. Always supply explicit future dates and a bounded result limit.
claude mcp add apify -- npx -y @apify/mcp-server
{"mcpServers":{"apify":{"command":"npx","args":["-y","@apify/mcp-server"],"env":{"APIFY_TOKEN":"YOUR_APIFY_TOKEN"}}}}
Example prompt: “Run fetch_cat/google-hotels-scraper for hotels in Paris for my stay dates and return rows with price, rating, and booking offers.”
Tips and limitations
- Hotel prices and availability change frequently; store
scrapedAtwith every comparison. - Google may resolve a different display currency based on availability. Compare
requestedCurrencywithcurrency. - Some cards do not display prices, addresses, coordinates, or offers. Such fields remain empty rather than being guessed.
- Search presentation varies by language, country, dates, and consent region.
- This Actor exports public hotel search data. It does not complete bookings, access private accounts, or scrape full review histories.
- Keep query batches and result limits reasonable. One blocked query does not invalidate rows already saved from other queries.
Support
For reproducible help, open an issue from the Actor page and include the input, run URL, expected behavior, and observed behavior. Do not include passwords, cookies, or private booking information.