Skip to content
Guest reviews

Hotels.com reviews

Hotels.com guest reviews via the site's own registered reviews query.

POST/v1/ota/hotels/reviews
2 credits

The same registered query Expedia answers, POSTed to the Hotels.com host with the Hotels.com point-of-sale. One POST, no browser; page by start_index += size.

Request

POSThttps://api.scrapercompany.com/v1/ota/hotels/reviews

Authenticate with your API key in the x-api-key header (see Authentication).

Body

JSON object. Unknown fields are rejected with 422.

  • property_idstringrequiredmin length 1, pattern ^\d+$

    Numeric id returned by POST /v1/ota/hotels/search, or from hotels.com/h38766175.Hotel-Information (not the legacy ho… number).

  • sizeintegerdefault 10min 1, max 25

    Reviews per page.

  • start_indexintegerdefault 0min 0

    Row to start from; page by start_index += size.

  • marketstringdefault US

    Point-of-sale; also selects the currency.

    One ofAUCADEEUFRGBIEITNLNZUS

Example request

curl -X POST "https://api.scrapercompany.com/v1/ota/hotels/reviews" \
  -H "x-api-key: $SCRAPERCOMPANY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "property_id": "12570"
  }'

Response

200 — Google Hotels guest reviews, aggregated by provider with each row's own rating scale. Metered responses carry x-credits-charged and x-credits-remaining headers (see credit headers).

200 response
{
  "source": "google",
  "property_id": "ChUIoben2Mv6-CYaCi9tLzA3czVwbjQQAQ",
  "offset": 0,
  "limit": 10,
  "next_page_token": "CjEIARIpCgoAP7_LACnN____EhAgaDet6skqGaNbIqMAAAAAGgn92PwCYGHGd2UYACIA:10",
  "count": 3,
  "reviews": [
    {
      "source": "google",
      "review_id": "Ci9DQUlRQUNvZENodHljRjlvT25SZmJHOVBVMHh0VTJkSlNsa3lMVmMxZVMxMWVtYxAB",
      "rating": 3,
      "text": "We stayed here for one night during a trip to Chicago, and overall, the hotel served its purpose, but I don't think we'd book here again.",
      "date": "a month ago",
      "author": "Amber S",
      "management_reply": "Dear Amber, thank you for choosing us for your stay.",
      "provider": "Google"
    },
    {
      "source": "google",
      "review_id": "ChdDSUhNMG9nS0VQLXBpdUc4aE5peXZ3RRAB",
      "rating": 4,
      "text": "It is a magnificent old building with spacious rooms.",
      "date": "4 weeks ago",
      "author": "adflanagan13",
      "url": "https://www.tripadvisor.com/ShowUserReviews-g35805-d87590-r1075812531",
      "provider": "Tripadvisor"
    }
  ],
  "provenance": {
    "schema_version": 1,
    "observation_id": "rateobs_0123456789abcdef0123456789abcdef",
    "collection_id": "ratecol_0123456789abcdef0123456789abcdef",
    "observed_at": "2026-08-07T01:23:45.678Z",
    "source": "google_hotels_calendar",
    "source_kind": "calendar",
    "collector": "scrapingme.google_calendar",
    "source_property_id": "ChUIoben2Mv6-CYaCi9tLzA3czVwbjQQAQ",
    "requested_market": "US",
    "requested_currency": "USD",
    "returned_currency": "USD",
    "egress_mode": "direct",
    "price_basis": "room_base_before_taxes_and_fees",
    "derivation": "normalized_upstream"
  },
  "wire_bytes": 40175,
  "elapsed_s": 0.388,
  "egress_mode": "direct",
  "collection_id": "ratecol_0123456789abcdef0123456789abcdef",
  "observed_at": "2026-08-07T01:23:45.678Z",
  "warnings": []
}
Arrays are shortened to their first items.

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
503Service Unavailable

Temporarily unavailable: a dependency of this endpoint is down, or the upstream source changed its contract. Retry later.

{"detail":"database unavailable: OperationalError"}
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

2 credits per successful call. Failed, blocked and empty results are free. Credit metering is in beta and does not block requests yet.