Skip to content
Google Hotels

Destination search

One page (~20) of the properties Google Hotels lists for a destination.

POST/v1/hotels/search
3 credits3 per page of results; an empty page and failed requests are free

Each 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

POSThttps://api.scrapercompany.com/v1/hotels/search

Authenticate 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 in search_information.location.

  • adultsintegerdefault 2min 1, max 10

    Adults in the room. Encoded as one guest entry each, the way Google's own control sends them.

  • currencystringdefault USD

    ISO 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 us

    Two-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 relevance

    Result order, as Google's Sort by control.

    One ofhighest_ratinglowest_pricemost_reviewedrelevance

  • price_mininteger | nullmin 0

    Minimum nightly price in currency.

  • price_maxinteger | nullmin 0

    Maximum nightly price in currency.

  • free_cancellationbooleandefault false

    Only properties Google lists with free cancellation.

  • special_offersbooleandefault false

    Only properties with a special offer.

  • eco_certifiedbooleandefault false

    Only 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 8

    One 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_token of 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 of3.544.5

  • hotel_classarray of integerdefault []max items 4

    Star classes to include, 2-5.

  • amenitiesarray of integerdefault []max items 19

    Amenity 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 13

    Property-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).

200 response
{
  "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
  }
}
Arrays are shortened to their first items.

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 fields
    • search_parameters.enginestringrequired

      One ofgoogle_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 ofrelevancelowest_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 fields
    • search_information.total_resultsinteger | nullrequired

      Total properties Google reports for the search.

    • search_information.locationstring | nullrequired

      Place Google resolved q to.

    • 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; MIXED when 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 fields
      • search_information.available_property_types[].idintegerrequired

        Pass in property_types to 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 fields
    • properties[].typestringrequired

      Google blends vacation rentals into the default list; this says which each result is.

      One ofhotelvacation_rental

    • properties[].property_tokenstringrequired

      Google property token; pass it to /v1/calendar or /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 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 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 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 the amenities filter 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 apartment or Sleeps 2; usually empty for hotels.

    • properties[].thumbnailstring | nullrequired
    • properties[].imagesarray of objectrequired
      Show 2 child fields
      • properties[].images[].thumbnailstringrequired

        Image URL as Google sent it (card size).

      • properties[].images[].originalstringrequired

        Largest rendition of the same image; equals thumbnail when no larger size is available.

    • properties[].nearby_placesarray of objectrequired
      Show 3 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 usual or Great 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, or code_<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 fields
      • properties[].rate.currencystring | nullrequired

        ISO 4217 code every figure in rate is in.

      • properties[].rate.check_instring (date) | nullrequired

        Stay Google priced (equals the requested stay whenever total is 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/base were parsed from the display strings; taxes and fees are then null and base is 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 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 unless rate.total is known.

      Show 15 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 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 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 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_token on /v1/hotels/search, next_page_token on /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_rating or price_max, or prices not verified for the requested market.

  • metaobjectrequired
    Show 4 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 fields
      • meta.egress.modestringrequired

        One ofdirectproxy

      • meta.egress.classstringrequired

        Route class: direct, dc, isp, resi, mobile or unblocker.

        One ofdirectdcispresimobileunblocker

      • 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.

StatusMeaningRetry?
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 is a list of problems for schema errors, or a string for semantic checks performed by the endpoint.

{"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

  1. Export your key: export SCRAPERCOMPANY_API_KEY=sk_... (no key yet? request access).
  2. Copy the cURL example above and run it in a terminal.
  3. Or open the interactive playground on api.scrapercompany.com, paste your key and pick this endpoint.

Credits

3 credits per successful call (3 per page of results; an empty page and failed requests are free). Failed, blocked and empty results are free. Credit metering is in beta and does not block requests yet.