TRAVEL
Google Hotels - Prices & Booking Offers
Search Google Hotels for any place and dates.
About this data
Search Google Hotels for any place and dates. Each hotel becomes one row with its lowest price per night and per stay, rating, reviews, star class, coordinates and every booking site's offer (Booking.com, Agoda, Trip.com, the hotel's own site...). Failures are reported, not charged.
From the actor’s Apify Store listing. The per-call endpoint may return a bounded subset; its own description is below.
Buy per call over x402
One endpoint at api.ssh.autos. Each call is one JSON POST, paid in USDC with no account or API key, and answered in the same HTTP response.
POST /v1/google/hotels/search
One Google Hotels result page, up to three properties: property name and ID, class, aggregate rating/review count, description, coordinates, website, images and the page's stay dates, nightly/stay price and stated taxes where available.
The actor verifies priced rows against the requested stay.
Dates default to a one-night stay seven days ahead.
Booking-site offer expansion is excluded.
Input
Send a JSON body to POST https://api.ssh.autos/v1/google/hotels/search.
| Field | Type | Required | Notes |
|---|---|---|---|
query | string | required | 2–150 characters |
checkIn | string | optional | pattern ^\d{4}-\d{2}-\d{2}$ |
checkOut | string | optional | pattern ^\d{4}-\d{2}-\d{2}$ |
adults | integer | optional | 1–4; default 2 |
currency | string | optional | pattern ^[A-Z]{3}$; default "USD" |
country | string | optional | pattern ^[A-Z]{2}$; default "US" |
maxResults | integer | optional | 1–3; default 3 |
Returned fields
The answer is JSON: records, a list of up to 3, and summary, the run status and counts. Each record has these 43 fields; a field the source does not publish comes back null.
43 fields per record
| Field | Type | Notes |
|---|---|---|
searchQuery | string | The query as entered. |
searchedQuery | string | What was searched on Google Hotels for this query (for example 'hotels in Lisbon'; a 'near' search that found nothing is retried with 'in'). |
matchedPlace | string | Place Google matched the query to. |
position | integer | Position in Google's results for the query (1 = first). |
name | string | Hotel or rental name. |
entityId | string | Google Hotels property id. |
url | string | Google Hotels page for the property. |
propertyType | string | hotel or vacationRental. one of hotel, vacationRental |
hotelClass | integer | Star class (1-5) when Google shows one. |
hotelClassText | string | Class as shown, for example '4-star hotel'. |
rating | number | Average guest rating out of 5. |
reviewCount | integer | Number of reviews behind the rating. |
ratingBreakdown | array of objects | Share and count of reviews per star. |
address | string | Street address (with offers). |
phone | string | Phone number (with offers). |
latitude | number | Latitude. |
longitude | number | Longitude. |
countryCode | string | ISO country code of the property. |
website | string | Hotel's own website. |
googleMapsId | string | Google Maps feature id (hotels only). |
checkInTime | string | Check-in time. |
checkOutTime | string | Check-out time. |
checkInDate | string | Check-in date searched (YYYY-MM-DD). |
checkOutDate | string | Check-out date searched (YYYY-MM-DD). |
nights | integer | Nights in the stay. |
adults | integer | Adults searched. |
childrenAges | array of integers | Ages of children searched. |
currency | string | Currency of every price in the row. |
pricePerNight | number | Lowest nightly price with taxes and fees. |
pricePerNightText | string | Lowest nightly price as shown. |
totalPrice | number | Lowest price for the whole stay with taxes and fees. |
totalPriceText | string | Stay price as shown. |
taxesAndFees | number | Taxes and fees included in the stay price. |
lowestPriceSite | string | Site offering the lowest nightly price (with offers). |
lowestPriceUrl | string | Link to that offer (with offers). |
dealText | string | Deal label, for example '23% less than usual'. |
typicalPriceLow | string | Low end of what the hotel typically costs for these dates (with offers). |
typicalPriceHigh | string | High end of what the hotel typically costs for these dates (with offers). |
offerCount | integer | Number of booking-site offers (with offers). |
offers | array of objects | Every booking-site offer, cheapest first (with offers). |
imageUrls | array of strings | Up to 10 photo links. |
detailLevel | string | offers when the row carries booking-site offers, else search. one of search, offers |
scrapedAt | string | UTC time of the run. |
Example call
npx agentcash@latest fetch https://api.ssh.autos/v1/google/hotels/search -m POST -b '{"query": "Lisbon", "maxResults": 2}'
The example values come from the API spec or the actor’s own sample input. Running it is a paid call.
What is and isn’t charged
You pay the call price for
- An answer, including a definitive “not found” or an empty result.
- Confirmed no matches returns records: [] (charged: it is an answer).
Free
- Invalid input (422), busy (503), source failure (502), timeout (504) and calls whose client hung up are never charged.
- Invalid input and source failures are not charged.
Prefer a subscription? Run it on Apify
This data source is a public actor on the Apify Store: Google Hotels Scraper - Prices & Booking Offers. Run it with your Apify account and plan for larger, scheduled or exported runs; it may offer more input options than the per-call endpoint.
How x402 payment works
- Your client sends the request. The API answers
402 Payment Requiredwith the price and where to pay. - The client pays from its own wallet: USDC on Base or Solana over x402, or over MPP on Tempo. No account, sign-up or API key.
- The client retries with the payment attached and gets the JSON answer in the same call. You are only charged for answers.
The AgentCash CLI in the example does all three steps for you and pays from your AgentCash wallet. Any x402 or MPP client works the same way.
Machine-readable: openapi.json · llms.txt