Destination search
One page (~20) of the properties Google Hotels lists for a destination.
/v1/hotels/searchEach property carries its property_token (feed it to /v1/calendar or /v1/offers), rating, class, amenities, images, coordinates, deal signal and the lowest price for the stay, itemised into base, taxes, fees and total with provenance. Vacation rentals add their seller rows. Page on with pagination.next_page_token, resending the same body.
One upstream call per page. Prices follow the market Google sees the request from; warnings says when that market could not be verified.
Request
https://api.scrapercompany.com/v1/hotels/searchAuthenticate with your API key in the x-api-key header (see Authentication).
Body
JSON object. Unknown fields are rejected with 422.
- qstringrequiredmin length 2, max length 200
Destination query exactly as a traveller would type it into Google Hotels, e.g.
hotels in Montreal,Paris,hotels near JFK. Google resolves it to a place; the response reports which insearch_information.location. - adultsintegerdefault
2min 1, max 10Adults in the room. Encoded as one guest entry each, the way Google's own control sends them.
- currencystringdefault
USDISO 4217 code for the returned prices. Major currencies include AED, AUD, BRL, CAD, CHF, CNY, EUR, GBP, HKD, INR, JPY, KRW, MXN, NZD, SGD, USD; all 39 supported codes are listed in the enum.
39 allowed values
AED, ARS, AUD, BRL, CAD, CHF, CLP, CNY, COP, CZK, DKK, EGP, EUR, GBP, HKD, HUF, IDR, ILS, INR, JPY, KRW, MXN, MYR, NOK, NZD, PEN, PHP, PLN, QAR, RON, SAR, SEK, SGD, THB, TRY, TWD, USD, VND, ZAR
- glstringdefault
usTwo-letter Google country (market). Sets the market; the currency is requested separately.
251 allowed values
ad, ae, af, ag, ai, al, am, ao, aq, ar, as, at, au, aw, ax, az, ba, bb, bd, be, bf, bg, bh, bi, bj, bl, bm, bn, bo, bq, br, bs, bt, bv, bw, by, bz, ca, cc, cd, cf, cg, ch, ci, ck, cl, cm, cn, co, cr, cu, cv, cw, cx, cy, cz, de, dj, dk, dm, do, dz, ec, ee, eg, eh, er, es, et, fi, fj, fk, fm, fo, fr, ga, gb, gd, ge, gf, gg, gh, gi, gl, gm, gn, gp, gq, gr, gs, gt, gu, gw, gy, hk, hm, hn, hr, ht, hu, id, ie, il, im, in, io, iq, ir, is, it, je, jm, jo, jp, ke, kg, kh, ki, km, kn, kp, kr, kw, ky, kz, la, lb, lc, li, lk, lr, ls, lt, lu, lv, ly, ma, mc, md, me, mf, mg, mh, mk, ml, mm, mn, mo, mp, mq, mr, ms, mt, mu, mv, mw, mx, my, mz, na, nc, ne, nf, ng, ni, nl, no, np, nr, nu, nz, om, pa, pe, pf, pg, ph, pk, pl, pm, pn, pr, ps, pt, pw, py, qa, re, ro, rs, ru, rw, sa, sb, sc, sd, se, sg, sh, si, sj, sk, sl, sm, sn, so, sr, ss, st, sv, sx, sy, sz, tc, td, tf, tg, th, tj, tk, tl, tm, tn, to, tr, tt, tv, tw, tz, ua, ug, uk, um, us, uy, uz, va, vc, ve, vg, vi, vn, vu, wf, ws, xk, ye, yt, za, zm, zw
- hlstringdefault
enpattern ^[a-z]{2,3}(-[A-Za-z]{2,4})?$Interface language. Display strings follow it; hotel amenity names are always English.
- sort_bystringdefault
relevanceResult order, as Google's Sort by control.
One of
highest_ratinglowest_pricemost_reviewedrelevance - price_mininteger | nullmin 0
Minimum nightly price in
currency. - price_maxinteger | nullmin 0
Maximum nightly price in
currency. - free_cancellationbooleandefault
falseOnly properties Google lists with free cancellation.
- special_offersbooleandefault
falseOnly properties with a special offer.
- eco_certifiedbooleandefault
falseOnly eco-certified properties.
- check_instring (date)required
First night of the stay,
YYYY-MM-DD. - check_outstring (date)required
Departure date, after
check_in; at most 30 nights. - children_agesarray of integerdefault
[]max items 8One age (0-17) per child. Google prices on each age; the response is rejected if Google priced a different party.
- page_tokenstring | nullpattern ^[A-Za-z0-9_\-+/=]{1,200}$
Opaque cursor from
pagination.next_page_tokenof the previous page. Resend the same query, stay, occupancy and filters with it, exactly as with SearchAPI. - min_ratingnumber | null
Minimum guest rating: 3.5, 4.0 or 4.5.
One of
3.544.5 - hotel_classarray of integerdefault
[]max items 4Star classes to include, 2-5.
- amenitiesarray of integerdefault
[]max items 19Amenity filter ids: 1 Free parking, 3 Parking, 4 Indoor pool, 5 Outdoor pool, 6 Pool, 7 Fitness center, 8 Restaurant, 9 Free breakfast, 10 Spa, 11 Beach access, 12 Child-friendly, 15 Bar, 19 Pet-friendly, 22 Room service, 35 Free Wi-Fi, 40 Air-conditioned, 52 All-inclusive available, 53 Wheelchair accessible, 61 EV charger.
- property_typesarray of integerdefault
[]max items 13Property-type filter ids: 12 Beach hotels, 13 Boutique hotels, 14 Hostels, 15 Inns, 16 Motels, 17 Resorts, 18 Spa hotels, 19 Bed and breakfasts, 20 Other, 21 Apartment hotels, 22 Minshuku, 23 Japanese-style business hotels, 24 Ryokan.
Example request
curl -X POST "https://api.scrapercompany.com/v1/hotels/search" \
-H "x-api-key: $SCRAPERCOMPANY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"q": "hotels in Montreal",
"adults": 2,
"currency": "CAD",
"gl": "ca",
"check_in": "2026-11-30",
"check_out": "2026-12-02"
}'Response
200 — One page of destination results; stay totals keep base, taxes and fees apart. Metered responses carry x-credits-charged and x-credits-remaining headers (see credit headers).
{
"search_parameters": {
"engine": "google_hotels_search",
"q": "hotels in Montreal",
"check_in_date": "2029-03-14",
"check_out_date": "2029-03-16",
"adults": 2,
"currency": "CAD",
"gl": "ca",
"hl": "en",
"sort_by": "relevance"
},
"search_information": {
"total_results": 5778,
"location": "Montreal",
"location_data_id": "0x4cc91a541c64b70d:0x654e3138211fefef",
"nights": 2,
"returned": 7,
"priced": 7,
"requested_currency": "CAD",
"returned_currency": "CAD",
"currency_matches_request": true,
"requested_market": "CA",
"available_property_types": [
{
"id": 19,
"name": "Bed and breakfasts"
},
{
"id": 18,
"name": "Spa hotels"
}
]
},
"properties": [
{
"type": "hotel",
"property_token": "ChgImtDg_rW5k8iWARoLL2cvMXRzamQ4NncQAQ",
"name": "Radisson Hotel Montreal Airport",
"data_id": "0x4cc9178df6e67b8d:0x96904dcb5fd8281a",
"description": "Modern lodging with a restaurant & an indoor pool, plus free WiFi & an airport shuttle.",
"link": "https://www.choicehotels.com/quebec/montreal/radisson-hotels/cnc37?mc=llgoxxpx",
"gps_coordinates": {
"latitude": 45.4851544,
"longitude": -73.6909316
},
"country": "CA",
"check_in_time": "3:00 PM",
"check_out_time": "11:00 AM",
"hotel_class": "4-star hotel",
"extracted_hotel_class": 4,
"rating": 3.5,
"reviews": 2535,
"reviews_histogram": {
"1": 443,
"2": 220,
"3": 396,
"4": 674,
"5": 802
},
"location_rating": 3.1,
"proximity_to_things_to_do_rating": 3.2,
"proximity_to_restaurants_rating": 2.8,
"proximity_to_transit_rating": 2.5,
"airport_access_rating": 4.6,
"reviews_breakdown": [
{
"name": "Fitness",
"description": "Fitness",
"total": 199,
"positive": 119,
"neutral": 13,
"negative": 67
},
{
"name": "Pool",
"description": "Pool",
"total": 107,
"positive": 78,
"neutral": 7,
"negative": 22
}
],
"amenities": [
"Breakfast ($)",
"Free Wi-Fi"
],
"amenity_codes": [
[
1,
165
],
[
1,
29
]
],
"thumbnail": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWk0lycQOr7G_2oWSLSEpBlBBfN0wY5jwgISonycKD0xeg__AHXxCEpS3XqlR9IcD1alML-r6P2EvsCMBx_Lt3KN8sOYNRZU4Jouiz7gc8JcjOskWyeb7HyYDCnqD1bR4L-24cbbvm9TvXHm=s150-w92-h150-n-k-no",
"images": [
{
"thumbnail": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWk0lycQOr7G_2oWSLSEpBlBBfN0wY5jwgISonycKD0xeg__AHXxCEpS3XqlR9IcD1alML-r6P2EvsCMBx_Lt3KN8sOYNRZU4Jouiz7gc8JcjOskWyeb7HyYDCnqD1bR4L-24cbbvm9TvXHm=s287-w287-h192-n-k-no-v1",
"original": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWk0lycQOr7G_2oWSLSEpBlBBfN0wY5jwgISonycKD0xeg__AHXxCEpS3XqlR9IcD1alML-r6P2EvsCMBx_Lt3KN8sOYNRZU4Jouiz7gc8JcjOskWyeb7HyYDCnqD1bR4L-24cbbvm9TvXHm=s10000"
}
],
"nearby_places": [
{
"name": "Côte-de-Liesse / No 6400",
"category_code": 2,
"transportations": [
{
"type": "Walking",
"type_code": 2,
"duration": "2 min"
}
]
}
],
"deal": "27% less than usual",
"deal_description": "Great Deal",
"deal_kind": "below_usual_price",
"rate": {
"currency": "CAD",
"check_in": "2029-03-14",
"check_out": "2029-03-16",
"nights": 2,
"price_per_night": "$121",
"price_per_night_before_taxes": "$102",
"extracted_price_per_night": 121,
"extracted_price_per_night_before_taxes": 101.67969,
"total_price": "$242",
"total_price_before_taxes": "$203",
"base": 203.35938,
"taxes": 38.640625,
"fees": 0,
"total": 242,
"before_taxes": 203.36,
"from_display_text": false
},
"provenance": {
"schema_version": 1,
"observation_id": "rateobs_0123456789abcdef0123456789abcdef",
"collection_id": "ratecol_0123456789abcdef0123456789abcdef",
"observed_at": "2026-09-30T22:46:08.123Z",
"source": "google_hotels_search",
"source_kind": "search_listing",
"collector": "scrapingme.google_hotels_search",
"source_property_id": "ChgImtDg_rW5k8iWARoLL2cvMXRzamQ4NncQAQ",
"requested_market": "CA",
"requested_currency": "CAD",
"returned_currency": "CAD",
"egress_mode": "direct",
"price_basis": "stay_total_including_taxes_and_fees",
"derivation": "normalized_upstream"
}
},
{
"type": "vacation_rental",
"property_token": "ChkQzZioqLvP4IUiGg0vZy8xMXpjZmhoMzJwEAI",
"name": "HoMa Loft 206 – Bright, Modern & Easy Parking",
"link": "https://www.host-me.ca/properties/69e924482b031c00122c840e",
"gps_coordinates": {
"latitude": 45.54264831542969,
"longitude": -73.53958129882812
},
"country": "CA",
"check_in_time": "4:00 PM",
"check_out_time": "10:00 AM",
"location_rating": 2.9,
"proximity_to_restaurants_rating": 2.5,
"airport_access_rating": 3.9,
"amenities": [
"Air conditioning",
"Kid-friendly"
],
"excluded_amenities": [
"No balcony",
"No crib"
],
"essential_info": [
"Entire apartment",
"Sleeps 2"
],
"thumbnail": "https://lh3.googleusercontent.com/grass-proxy/AIM7gW39AJ5sNUqWYbyQkdBH2YHq7dV63MGIYm0DnOBPevzdmKuKVhPt19sLNF1TWMEzHBW2kN-KopL4tXsF2coEPixiQxcAV6aM2SWxYoWA73riNVMyRVNI3QHt-96hRHLb5couboHdgW6G-tN6pu_pOwPJZdNGqL_RGKM9UOM7G9cUNeoBDdsqXM6hNg=s150-w92-h150-n-k-no",
"images": [
{
"thumbnail": "https://lh3.googleusercontent.com/grass-proxy/AIM7gW39AJ5sNUqWYbyQkdBH2YHq7dV63MGIYm0DnOBPevzdmKuKVhPt19sLNF1TWMEzHBW2kN-KopL4tXsF2coEPixiQxcAV6aM2SWxYoWA73riNVMyRVNI3QHt-96hRHLb5couboHdgW6G-tN6pu_pOwPJZdNGqL_RGKM9UOM7G9cUNeoBDdsqXM6hNg=s287-w287-h192-n-k-no-v1",
"original": "https://lh3.googleusercontent.com/grass-proxy/AIM7gW39AJ5sNUqWYbyQkdBH2YHq7dV63MGIYm0DnOBPevzdmKuKVhPt19sLNF1TWMEzHBW2kN-KopL4tXsF2coEPixiQxcAV6aM2SWxYoWA73riNVMyRVNI3QHt-96hRHLb5couboHdgW6G-tN6pu_pOwPJZdNGqL_RGKM9UOM7G9cUNeoBDdsqXM6hNg=s10000"
}
],
"nearby_places": [
{
"name": "Montréal-Pierre Elliott Trudeau International Airport",
"category_code": 3,
"transportations": [
{
"type": "Taxi",
"type_code": 0,
"duration": "35 min"
},
{
"type": "Public transport",
"type_code": 3,
"duration": "1 hr 30 min"
}
]
}
],
"rate": {
"currency": "CAD",
"check_in": "2029-03-14",
"check_out": "2029-03-16",
"nights": 2,
"price_per_night": "$152",
"price_per_night_before_taxes": "$138",
"extracted_price_per_night": 152.34,
"extracted_price_per_night_before_taxes": 138.49,
"total_price": "$305",
"total_price_before_taxes": "$277",
"base": 185,
"taxes": 27.70375,
"fees": 91.98,
"total": 304.68378,
"before_taxes": 276.98,
"from_display_text": false
},
"sources": [
{
"source": "host-me",
"raw_source": "host-me",
"displayed_prices": [
"$138",
"$152"
],
"partner_id": "420480647",
"logo": "//www.gstatic.com/travel-hotels/branding/icon_default.png",
"price_per_night": "$152",
"price_per_night_before_taxes": "$138",
"extracted_price_per_night": 152,
"extracted_price_per_night_before_taxes": 138,
"has_free_cancellation": true,
"free_cancellation_until": "Oct 16",
"free_cancellation_time": "4:00 PM",
"is_featured": true
}
],
"provenance": {
"schema_version": 1,
"observation_id": "rateobs_0123456789abcdef0123456789abcdef",
"collection_id": "ratecol_0123456789abcdef0123456789abcdef",
"observed_at": "2026-09-30T22:46:08.123Z",
"source": "google_hotels_search",
"source_kind": "search_listing",
"collector": "scrapingme.google_hotels_search",
"source_property_id": "ChkQzZioqLvP4IUiGg0vZy8xMXpjZmhoMzJwEAI",
"requested_market": "CA",
"requested_currency": "CAD",
"returned_currency": "CAD",
"egress_mode": "direct",
"price_basis": "stay_total_including_taxes_and_fees",
"derivation": "normalized_upstream"
}
}
],
"brands": [
{
"id": 33,
"title": "Accor Live Limitless",
"children": [
{
"id": 8,
"title": "Fairmont Hotels and Resorts"
},
{
"id": 47,
"title": "Novotel"
}
]
},
{
"id": 18,
"title": "Best Western International",
"children": [
{
"id": 155,
"title": "Best Western"
},
{
"id": 104,
"title": "Best Western Plus"
}
]
}
],
"pagination": {
"records_from": 1,
"records_to": 20,
"next_page_token": "CBI="
},
"warnings": [
"prices reflect this server's egress, not a verified CA exit; configure a market proxy for market-matched results"
],
"meta": {
"wire_bytes": 214986,
"elapsed_s": 1.89,
"egress": {
"mode": "direct",
"class": "direct",
"pool": "direct",
"attempts": 1,
"path": [
"direct/direct:ok"
]
},
"skipped_records": 0
}
}Response fields
Fields marked required are always present; others appear when they apply.
- search_parametersobjectrequired
Echo of the effective request. Optional filters appear only when set.
Show 20 child fieldsHide child fields
- search_parameters.enginestringrequired
One of
google_hotels_search - search_parameters.qstringrequired
- search_parameters.check_in_datestring (date)required
- search_parameters.check_out_datestring (date)required
- search_parameters.adultsintegerrequired
- search_parameters.children_agesarray of integerrequired
One age per child; empty when none.
- search_parameters.currencystringrequired
Requested currency, upper-case.
- search_parameters.glstringrequired
Market country code, lower-case.
- search_parameters.hlstringrequired
- search_parameters.sort_bystringrequired
One of
relevancelowest_pricehighest_ratingmost_reviewed - search_parameters.price_mininteger
Present only when set in the request.
- search_parameters.price_maxinteger
Present only when set in the request.
- search_parameters.min_ratingnumber
3.5, 4.0 or 4.5. Present only when set in the request.
- search_parameters.hotel_classarray of integer
Present only when set in the request.
- search_parameters.amenitiesarray of integer
Present only when set in the request.
- search_parameters.property_typesarray of integer
Present only when set in the request.
- search_parameters.free_cancellationboolean
Present only when true.
- search_parameters.special_offersboolean
Present only when true.
- search_parameters.eco_certifiedboolean
Present only when true.
- search_parameters.next_page_tokenstring
Page token this page was fetched with. Present only when one was sent.
- search_informationobjectrequired
Show 11 child fieldsHide child fields
- search_information.total_resultsinteger | nullrequired
Total properties Google reports for the search.
- search_information.locationstring | nullrequired
Place Google resolved
qto. - search_information.location_data_idstring | nullrequired
Google's place id for
location. - search_information.nightsintegerrequired
- search_information.returnedintegerrequired
Properties on this page.
- search_information.pricedintegerrequired
Properties on this page with a known stay total.
- search_information.requested_currencystringrequired
- search_information.returned_currencystring | nullrequired
Currency the prices came back in;
MIXEDwhen properties differ; null when no property carried a currency. - search_information.currency_matches_requestbooleanrequired
False when Google returned another currency (also reported in
warnings). - search_information.requested_marketstringrequired
gl, upper-cased. - search_information.available_property_typesarray of objectrequired
Property-type filters Google offers for this destination.
Show 2 child fieldsHide child fields
- search_information.available_property_types[].idintegerrequired
Pass in
property_typesto filter. - search_information.available_property_types[].namestring | nullrequired
Null for an id without a known name.
- propertiesarray of objectrequired
About 20 per page.
Show 34 child fieldsHide child fields
- properties[].typestringrequired
Google blends vacation rentals into the default list; this says which each result is.
One of
hotelvacation_rental - properties[].property_tokenstringrequired
Google property token; pass it to
/v1/calendaror/v1/offers. - properties[].namestringrequired
- properties[].data_idstring | nullrequired
Google Maps data id (
0x...:0x...). - properties[].descriptionstring | nullrequired
- properties[].linkstring | nullrequired
The property's own website, when Google lists one.
- properties[].gps_coordinatesobject | nullrequired
Show 2 child fieldsHide child fields
- properties[].gps_coordinates.latitudenumberrequired
- properties[].gps_coordinates.longitudenumberrequired
- properties[].countrystring | nullrequired
ISO 3166-1 alpha-2 country code.
- properties[].check_in_timestring | nullrequired
As displayed, e.g.
3:00 PM. - properties[].check_out_timestring | nullrequired
As displayed, e.g.
11:00 AM. - properties[].hotel_classstring | nullrequired
As displayed, e.g.
4-star hotel. - properties[].extracted_hotel_classinteger | nullrequired
Star class, 1-5.
- properties[].ratingnumber | nullrequired
Guest rating out of 5.
- properties[].reviewsinteger | nullrequired
Number of reviews.
- properties[].reviews_histogramobject | nullrequired
Review count per star rating, keyed
1-5(only the stars Google reported). Null when Google gave none.Show 5 child fieldsHide child fields
- properties[].reviews_histogram.1integer
- properties[].reviews_histogram.2integer
- properties[].reviews_histogram.3integer
- properties[].reviews_histogram.4integer
- properties[].reviews_histogram.5integer
- properties[].location_ratingnumber | nullrequired
Overall location score, out of 5. Null when Google has no score.
- properties[].proximity_to_things_to_do_ratingnumber | nullrequired
Score for proximity to things to do, out of 5. Null when Google has no score.
- properties[].proximity_to_restaurants_ratingnumber | nullrequired
Score for proximity to restaurants, out of 5. Null when Google has no score.
- properties[].proximity_to_transit_ratingnumber | nullrequired
Score for proximity to public transit, out of 5. Null when Google has no score.
- properties[].airport_access_ratingnumber | nullrequired
Score for airport access, out of 5. Null when Google has no score.
- properties[].reviews_breakdownarray of objectrequired
Review topics with mention counts; empty when Google gave none.
Show 6 child fieldsHide child fields
- properties[].reviews_breakdown[].namestringrequired
Review topic, e.g.
Fitness. - properties[].reviews_breakdown[].descriptionstringrequired
- properties[].reviews_breakdown[].totalintegerrequired
Reviews that mention the topic.
- properties[].reviews_breakdown[].positiveintegerrequired
- properties[].reviews_breakdown[].neutralintegerrequired
total - positive - negative, never below 0. - properties[].reviews_breakdown[].negativeintegerrequired
- properties[].amenitiesarray of stringrequired
Amenity names. Hotel amenity names are always English; rentals use Google's own labels.
- properties[].amenity_codesarray of array of integerrequired
Raw
[flag, code]pairs from the card. Codes are not theamenitiesfilter ids; codes without a known name appear only here. The flag does not mark an amenity as absent. - properties[].excluded_amenitiesarray of stringrequired
Amenities a rental states it lacks, e.g.
No balcony; usually empty for hotels. - properties[].essential_infoarray of stringrequired
Rental basics such as
Entire apartmentorSleeps 2; usually empty for hotels. - properties[].thumbnailstring | nullrequired
- properties[].imagesarray of objectrequired
Show 2 child fieldsHide child fields
- properties[].images[].thumbnailstringrequired
Image URL as Google sent it (card size).
- properties[].images[].originalstringrequired
Largest rendition of the same image; equals
thumbnailwhen no larger size is available.
- properties[].nearby_placesarray of objectrequired
Show 3 child fieldsHide child fields
- properties[].nearby_places[].namestringrequired
- properties[].nearby_places[].category_codeinteger | nullrequired
Google's place category code, as sent.
- properties[].nearby_places[].transportationsarray of objectrequired
- properties[].dealstring | nullrequired
Deal text, e.g.
27% less than usualorGreat price for a 4-star hotel. Null when there is no deal. - properties[].deal_descriptionstring | nullrequired
Badge Google renders:
Deal,Great Deal,Great Price, or another label. - properties[].deal_kindstring | nullrequired
below_usual_price,great_price, orcode_<n>for a deal type not yet mapped. Null when there is no deal. - properties[].rateobject | nullrequired
Lowest price for the stay. Null when the card carried no price, or Google priced other dates and the price was removed (see
warnings).Show 16 child fieldsHide child fields
- properties[].rate.currencystring | nullrequired
ISO 4217 code every figure in
rateis in. - properties[].rate.check_instring (date) | nullrequired
Stay Google priced (equals the requested stay whenever
totalis set). - properties[].rate.check_outstring (date) | nullrequired
- properties[].rate.nightsinteger | nullrequired
- properties[].rate.price_per_nightstring | nullrequired
Nightly display string including taxes and fees, e.g.
$121. - properties[].rate.price_per_night_before_taxesstring | nullrequired
Nightly display string before taxes (base + mandatory fees); the price Google's card shows.
- properties[].rate.extracted_price_per_nightnumber | nullrequired
total / nights, rounded to 2 decimals: nightly price including taxes and fees. - properties[].rate.extracted_price_per_night_before_taxesnumber | nullrequired
Google's exact nightly figure before taxes:
(base + fees) / nights. - properties[].rate.total_pricestring | nullrequired
Whole-stay display string including taxes and fees.
- properties[].rate.total_price_before_taxesstring | nullrequired
Whole-stay display string before taxes.
- properties[].rate.basenumber | nullrequired
Whole-stay room price before taxes and fees.
- properties[].rate.taxesnumber | nullrequired
Whole-stay taxes.
- properties[].rate.feesnumber | nullrequired
Whole-stay mandatory fees (e.g. a rental's cleaning fee), kept separate from taxes.
- properties[].rate.totalnumber | nullrequired
Whole-stay price:
base + taxes + fees. Null when Google showed only a nightly display price. - properties[].rate.before_taxesnumber | nullrequired
Whole-stay
base + fees, rounded to 2 decimals (SearchAPI's before-taxes basis). - properties[].rate.from_display_textbooleanrequired
True when Google sent no itemised amounts and
total/basewere parsed from the display strings;taxesandfeesare then null andbaseis the displayed before-taxes total.
- properties[].sourcesarray of objectrequired
Seller rows Google attached to the card; mostly vacation rentals, usually empty for hotels.
Show 13 child fieldsHide child fields
- properties[].sources[].sourcestringrequired
Seller name, with country-domain variants merged (e.g.
Booking.com). - properties[].sources[].raw_sourcestringrequired
Seller name as displayed.
- properties[].sources[].displayed_pricesarray of stringrequired
Every price string on the row, as displayed, including a lone one whose basis Google does not label.
- properties[].sources[].partner_idstring | nullrequired
Google's partner id for the seller.
- properties[].sources[].logostring | nullrequired
Logo URL; may be protocol-relative (
//...). - properties[].sources[].price_per_nightstring | nullrequired
Nightly display string including taxes and fees. Null unless the row shows a before-taxes / all-in pair.
- properties[].sources[].price_per_night_before_taxesstring | nullrequired
Nightly display string before taxes. Null unless the row shows a pair.
- properties[].sources[].extracted_price_per_nightnumber | nullrequired
Nightly price including taxes and fees.
- properties[].sources[].extracted_price_per_night_before_taxesnumber | nullrequired
Nightly price before taxes.
- properties[].sources[].has_free_cancellationbooleanrequired
- properties[].sources[].free_cancellation_untilstring | nullrequired
Last free-cancellation date as displayed, e.g.
Oct 16. - properties[].sources[].free_cancellation_timestring | nullrequired
e.g.
4:00 PM. - properties[].sources[].is_featuredbooleanrequired
True for rows from Google's featured list.
- properties[].provenanceobject | nullrequired
Provenance of
rate; null unlessrate.totalis known.Show 15 child fieldsHide child fields
- properties[].provenance.schema_versionintegerrequired
Provenance schema version (currently 1).
- properties[].provenance.observation_idstringrequired
Deterministic id of this price observation (
rateobs_...). - properties[].provenance.collection_idstringrequired
Id shared by every price from one upstream fetch (
ratecol_...). - properties[].provenance.observed_atstringrequired
UTC observation time, ISO-8601.
- properties[].provenance.sourcestringrequired
Upstream source, e.g.
google_hotels_calendar. - properties[].provenance.source_kindstringrequired
Kind of source, e.g.
calendar,offer,ota_calendar,official. - properties[].provenance.collectorstringrequired
Identifier of the collector that produced the price.
- properties[].provenance.source_property_idstringrequired
Property identifier at the source.
- properties[].provenance.requested_marketstring | nullrequired
- properties[].provenance.requested_currencystring | nullrequired
- properties[].provenance.returned_currencystring | nullrequired
- properties[].provenance.egress_modestringrequired
How the request reached the source, e.g.
direct. - properties[].provenance.price_basisstringrequired
What the price represents, e.g.
room_base_before_taxes_and_fees. - properties[].provenance.derivationstringrequired
How the figure was derived, e.g.
normalized_upstream. - properties[].provenance.upstream_rate_idstring | nullrequired
Source-native rate/room id when available.
- brandsarray of objectrequired
Show 3 child fieldsHide child fields
- brands[].idintegerrequired
Google brand id.
- brands[].titlestringrequired
Brand name; empty string when Google did not name it.
- brands[].childrenarray of objectrequired
Sub-brands.
Show 2 child fieldsHide child fields
- brands[].children[].idintegerrequired
- brands[].children[].titlestringrequired
- paginationobjectrequired
Pages overlap by a few results (page 2 starts before page 1 ends); de-duplicate by
property_token.Show 3 child fieldsHide child fields
- pagination.records_frominteger | nullrequired
1-based position of the first result on this page.
- pagination.records_tointeger | nullrequired
1-based position of the last result on this page.
- pagination.next_page_tokenstring | nullrequired
Send it back (as
page_tokenon/v1/hotels/search,next_page_tokenon/v1/serp/google_hotels) with the same query, stay, party and filters for the next page. Null on the last page.
- warningsarray of stringrequired
Notices about this page: prices removed because Google priced other dates, a currency other than the one requested, results outside a requested
hotel_class,min_ratingorprice_max, or prices not verified for the requested market. - metaobjectrequired
Show 4 child fieldsHide child fields
- meta.wire_bytesintegerrequired
Bytes received from Google.
- meta.elapsed_snumberrequired
Seconds spent fetching from Google.
- meta.egressobjectrequired
How the request reached Google.
Show 5 child fieldsHide child fields
- meta.egress.modestringrequired
One of
directproxy - meta.egress.classstringrequired
Route class:
direct,dc,isp,resi,mobileorunblocker.One of
directdcispresimobileunblocker - meta.egress.poolstringrequired
Route pool that served the request.
- meta.egress.attemptsintegerrequired
Routes tried, including the successful one.
- meta.egress.patharray of stringrequired
Each attempt as
<class>/<pool>:<outcome>, in order.
- meta.skipped_recordsintegerrequired
Result cards that could not be read and were left out.
Errors
Errors return a JSON body with a detail field. Failed requests are not charged. See Errors for the full list and retry advice.
| Status | Meaning | Retry? |
|---|---|---|
401Unauthorized | Missing or invalid API key. {"detail":"missing or invalid API key"} | No, fix the request |
402Payment Required | Not enough credits for this request. Only returned once credit enforcement is switched on; during the beta metering runs in shadow mode and never blocks. {"detail":"insufficient credits: this request costs 5, 0 available. Credits renew 2026-11-01."} | No, fix the request |
404Not Found | The property, stay, job or record was not found. {"detail":"job not found"} | No, fix the request |
422Unprocessable Content | Request validation failed. {"detail":[{"loc":["body","name"],"msg":"Field required","type":"missing"}]} | No, fix the request |
429Too Many Requests | Too many requests: the key's requests-per-minute limit was exceeded, or (once credit enforcement is on) the plan's concurrent-request limit. No rate-limit or Retry-After headers are sent; back off and retry. {"detail":"rate limit 60/min exceeded"} | Yes, with backoff |
502Bad Gateway | The upstream source failed, blocked the request or returned an unusable answer. Safe to retry later; failed requests are not charged. {"detail":"RuntimeError"} | Yes, with backoff |
Try it
- Export your key:
export SCRAPERCOMPANY_API_KEY=sk_...(no key yet? request access). - Copy the cURL example above and run it in a terminal.
- Or open the interactive playground on api.scrapercompany.com, paste your key and pick this endpoint.