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` |
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):
{
"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 -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:
{
"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 -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"}'{
"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 -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}'{
"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"
}What each review carries
| Field | Meaning |
|---|---|
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.