Skip to content

Scrape guest reviews

Guest reviews from Tripadvisor, Booking.com, Expedia, Hotels.com and Google Hotels as structured JSON, page by page.

Overview

You get
Guest reviews for one hotel, page by page: rating, title, text, author, stay details, the property’s reply, and upstream labels like “Verified review” — each page with provenance.
Sources
Cost
2 credits per page of any source; a page with no reviews is free
Identifiers
Each source keeps its own: Tripadvisor `location_id`, Booking `pagename`, Expedia/Hotels numeric id, Google `property_token`

Note

Ratings stay on each source’s own scale: Tripadvisor 0–5, Booking.com and Expedia 0–10, Google Hotels rows keep the rating scale of the provider Google aggregated them from (Google and Tripadvisor rows score out of 5, Priceline rows out of 10). Compare sources by reading rating_scale, never by renormalizing.

Tripadvisor

Reviews are newest-first as the site orders them. location_id is the numeric id in the property URL (/Hotel_Review-g…-d208453-…). Page by offset += limit; the backend accepts up to 30 per page.

curl -X POST https://api.scrapercompany.com/v1/ota/tripadvisor/reviews \
  -H "x-api-key: $SCRAPERCOMPANY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"location_id":"208453","limit":10,"offset":0}'

A trimmed answer (the second review adds management_reply):

JSON
{
  "source": "tripadvisor",
  "property_id": "208453",
  "total": 9023,
  "offset": 0,
  "limit": 10,
  "rating_scale": 5,
  "count": 2,
  "reviews": [
    {
      "source": "tripadvisor",
      "review_id": "1079997723",
      "rating": 5,
      "title": "Hilton times square fab hotel",
      "text": "if you are coming to New York hilton times square is the best for location . large spacious rooms great service , friendly staff , highly recommend",
      "date": "2026-09-30",
      "author": "Sue B",
      "trip_type": "FAMILY",
      "stay_date": "2026-09-30",
      "management_reply": null,
      "language": "en",
      "helpful_votes": 0,
      "url": "/ShowUserReviews-g60763-d208453-r1079997723-Hilton_New_York_Times_Square-New_York_City_New_York.html",
      "provider": null,
      "labels": null,
      "stay_info": null
    },
    {
      "source": "tripadvisor",
      "review_id": "1076579565",
      "rating": 5,
      "title": null,
      "text": "Special mention to Alex, so helpful and friendly.",
      "date": "2026-09-29",
      "author": "Nina",
      "trip_type": "BUSINESS",
      "stay_date": "2026-09-29",
      "management_reply": "Dear Nina, thank you for staying with us…",
      "language": "en",
      "helpful_votes": 2,
      "url": null,
      "provider": null,
      "labels": null,
      "stay_info": null
    }
  ],
  "provenance": {
    "schema_version": 1,
    "observation_id": "rateobs_9f2c11b0a5d34e2f",
    "collection_id": "ratecol_7c1f0e93d2ab4a67",
    "observed_at": "2026-10-01T08:31:04Z",
    "source": "tripadvisor",
    "source_kind": "reviews",
    "collector": "scrapingme.ota.tripadvisor",
    "source_property_id": "208453",
    "requested_market": null,
    "requested_currency": null,
    "returned_currency": null,
    "egress_mode": "direct",
    "price_basis": "unknown",
    "derivation": "upstream",
    "upstream_rate_id": null
  },
  "wire_bytes": 15619,
  "elapsed_s": 0.412,
  "egress_mode": "direct",
  "collection_id": "ratecol_7c1f0e93d2ab4a67",
  "observed_at": "2026-10-01T08:31:04Z",
  "warnings": []
}

Booking.com

pagename is the URL slug POST /v1/ota/booking/search returns (booking.com/hotel/us/newbury-guest-house.html → newbury-guest-house).sort accepts Booking’s own enums; text filters reviews by keyword server-side (Booking counts matches upstream, so a keyworded page can return fewer rows than limit).

cURL
curl -X POST https://api.scrapercompany.com/v1/ota/booking/reviews \
  -H "x-api-key: $SCRAPERCOMPANY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pagename":"newbury-guest-house","country":"us","skip":0,"limit":10,"sort":"MOST_RELEVANT"}'

Each answer also carries Booking’s rating_scores (staff, cleanliness…) and the sorters it supports:

JSON
{
  "source": "booking",
  "pagename": "newbury-guest-house",
  "hotel_id": 236725,
  "ufi": 20061717,
  "country": "us",
  "total": 523,
  "skip": 0,
  "limit": 10,
  "sort": "MOST_RELEVANT",
  "rating_scale": 10,
  "count": 2,
  "reviews": [
    {
      "source": "booking",
      "review_id": "48b4dc6c098c149e",
      "rating": 8,
      "title": "Good value, warm and inviting staff and very neat and clean rooms.",
      "text": "No breakfast but coffee/tea in lobby, location very good and room was clean neat and comfortable.",
      "date": "2024-05-23",
      "author": "Anna",
      "author_country": "United States",
      "trip_type": "Solo traveller",
      "stay_date": "2024-05-23",
      "room_type": "Deluxe Room",
      "management_reply": "Hello Anna, we are pleased that you enjoyed your stay.",
      "language": "xu",
      "helpful_votes": 0,
      "url": "48b4dc6c098c149e",
      "provider": null,
      "labels": null,
      "stay_info": null
    }
  ],
  "rating_scores": [
    {
      "name": "Staff",
      "translation": null,
      "value": 9.3,
      "count": 258
    }
  ],
  "sorters": [
    {
      "value": "MOST_RELEVANT",
      "name": "Most relevant"
    },
    {
      "value": "NEWEST_FIRST",
      "name": "Newest first"
    },
    {
      "value": "OLDEST_FIRST",
      "name": "Oldest first"
    }
  ],
  "provenance": {
    "source": "booking_com",
    "source_kind": "reviews",
    "collector": "scrapingme.ota.booking",
    "source_property_id": "newbury-guest-house",
    "price_basis": "unknown",
    "observed_at": "2026-10-01T08:31:20Z"
  },
  "wire_bytes": 14973,
  "elapsed_s": 0.521,
  "collection_id": "ratecol_1b9d3a55e0c24c88",
  "observed_at": "2026-10-01T08:31:20Z"
}

Expedia

One page of Expedia guest reviews, newest first. Ratings are 0–10, parsed from Expedia’s own score label (“10 out of 10 Excellent”). The “Verified review” disclaimer and the “Liked: …” theme labels ride in labels, exactly as Expedia publishes them, and stay_info carries the stay summary (“Stayed 4 nights in Sep 2026”).

cURL
curl -X POST https://api.scrapercompany.com/v1/ota/expedia/reviews \
  -H "x-api-key: $SCRAPERCOMPANY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"property_id":"12570","size":10,"start_index":0,"market":"US"}'
JSON
{
  "source": "expedia",
  "property_id": "12570",
  "total": 3324,
  "offset": 0,
  "limit": 10,
  "rating_scale": 10,
  "count": 2,
  "reviews": [
    {
      "source": "expedia",
      "review_id": "6aa5f679b71e666498336ee6",
      "rating": 10,
      "title": null,
      "text": "Great hotel and location!",
      "date": "2026-09-13",
      "author": "Rebecca",
      "author_country": null,
      "trip_type": null,
      "stay_date": null,
      "room_type": null,
      "management_reply": "Dear Valued Guest, it is wonderful to receive your outstanding rating!",
      "language": "en_CA",
      "helpful_votes": 0,
      "url": null,
      "provider": null,
      "labels": [
        "Liked: Cleanliness, staff & service, amenities",
        "Verified review"
      ],
      "stay_info": "Stayed 4 nights in Sep 2026"
    }
  ],
  "provenance": {
    "source": "expedia_com",
    "source_kind": "reviews",
    "collector": "scrapingme.ota.expedia",
    "source_property_id": "12570",
    "price_basis": "unknown",
    "observed_at": "2026-10-01T08:31:41Z"
  },
  "wire_bytes": 19859,
  "elapsed_s": 0.471,
  "collection_id": "ratecol_44a1c9e7bb8d4f31",
  "observed_at": "2026-10-01T08:31:41Z"
}

Hotels.com

The same registered query, POSTed to the Hotels.com point-of-sale. Same request shape — swap POST/v1/ota/expedia/reviews for POST/v1/ota/hotels/reviews and keep the market on a Hotels.com point-of-sale (US works for both brands).

Google Hotels

Google mixes its own reviews with Tripadvisor’s, Priceline’s and others in one list; each row names its provider. Ten reviews per page; pages follows Google’s continuation token up to ten pages in one call, and next_page_token continues past that. Google publishes no absolute dates here — date is the relative string Google shows (“a month ago”).

cURL
curl -X POST https://api.scrapercompany.com/v1/hotels/reviews \
  -H "x-api-key: $SCRAPERCOMPANY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"property_token":"ChUIoben2Mv6-CYaCi9tLzA3czVwbjQQAQ","pages":1}'
JSON
{
  "source": "google",
  "property_id": "ChUIoben2Mv6-CYaCi9tLzA3czVwbjQQAQ",
  "total": null,
  "offset": 0,
  "limit": 10,
  "rating_scale": null,
  "next_page_token": "CjEIARIpCgoAP7_LACnN____EhAgaDet6skqGaNbIqMAAAAAGgn92PwCYGHGd2UYACIA:10",
  "count": 3,
  "reviews": [
    {
      "source": "google",
      "review_id": "Ci9DQUlRQUNvZENodHljRjlvT25SZmJHOVBVMHh0VTJkSlNsa3lMVmMxZVMxMWVtYxAB",
      "rating": 3,
      "title": null,
      "text": "We stayed here for one night during a trip to Chicago, and overall, the hotel served its purpose.",
      "date": "a month ago",
      "author": "Amber S",
      "author_country": null,
      "trip_type": null,
      "stay_date": null,
      "room_type": null,
      "management_reply": "Dear Amber, thank you for choosing us for your stay.",
      "language": null,
      "helpful_votes": null,
      "url": null,
      "provider": "Google",
      "labels": null,
      "stay_info": null
    },
    {
      "source": "google",
      "review_id": "ChdDSUhNMG9nS0VQLXBpdUc4aE5peXZ3RRAB",
      "rating": 4,
      "title": null,
      "text": "It is a magnificent old building with spacious rooms.",
      "date": "4 weeks ago",
      "author": "adflanagan13",
      "author_country": null,
      "trip_type": null,
      "stay_date": null,
      "room_type": null,
      "management_reply": null,
      "language": null,
      "helpful_votes": null,
      "url": "https://www.tripadvisor.com/ShowUserReviews-g35805-d87590-r1075812531",
      "provider": "Tripadvisor",
      "labels": null,
      "stay_info": null
    }
  ],
  "provenance": {
    "source": "google",
    "source_kind": "reviews",
    "collector": "scrapingme.ota.google",
    "source_property_id": "ChUIoben2Mv6-CYaCi9tLzA3czVwbjQQAQ",
    "price_basis": "unknown",
    "observed_at": "2026-10-01T08:32:02Z"
  },
  "wire_bytes": 40175,
  "elapsed_s": 0.388,
  "collection_id": "ratecol_a0e71d2c95c94b19",
  "observed_at": "2026-10-01T08:32:02Z"
}

Tip

Use POST /v1/hotels/resolve to find the property_token — it returns each candidate with its mailing address so you confirm the exact property first. See Identify a property by name and address.

What each review carries

FieldMeaning
rating
The source’s own score, on the scale in rating_scale (or the provider’s, for Google rows).
title
The review headline; null when the source shows none.
text
What the reviewer wrote. For Priceline rows Google answers liked/disliked segments instead of one text, joined with a blank line.
date
Publication date, ISO where the source gives one; the relative string otherwise (Google rows).
author
Reviewer display name.
trip_type
Stay type (FAMILY, BUSINESS, “Solo traveller”…) when the source states one.
stay_date
The verified stay’s date when the source knows it.
room_type
Room name (Booking.com).
management_reply
The property’s answer, verbatim.
labels
Upstream eligibility/quality labels: “Verified review”, “Liked: …” themes, “Verified Purchase”. Never inferred.
helpful_votes
Helpful-vote count where the source shows one.
url
Link to the source review where the source publishes one.
provider
For Google Hotels rows: who published the review (Google, Tripadvisor, Priceline…).

Paging and costs

Every source pages differently: Tripadvisor by offset += limit, Booking by skip += limit, Expedia/Hotels.com by start_index += size, Google Hotels by following next_page_token. Each page costs 2 credits for any source; a page with no reviews is free, and failed requests are free.