Hotel Reviews, All Sites
Give it a hotel name or its Tripadvisor, Booking.com, Google Hotels, Agoda and Trip.com links and it returns what guests say on every site in one dataset: one row per review with the rating on one 1-5 scale (the original kept), text, date and hotel reply, plus a free summary row per hotel with each site's rating, review counts and category scores compared with the city.
Sample output
One row as the API returns it. Long text is shortened here; names inside text read [name].
| Field | Value |
|---|---|
| platform | booking |
| reviewId | Booking___c6397d1e2a854aa3 |
| productName | The Savoy |
| date | 2026-09-30 |
| title | Wonderful stay |
| pros | Staff and location. |
| cons | Breakfast queue. |
| ratingOverall | 4.5 |
| language | en |
| country | US |
| extras | {"rawRating":9,"rawScale":10,"score10":9,"travelerType":"COUPLES"} |
Call it from code or from your agent
This is the request. Small runs answer in the same call; large ones return a run ID.
curl -X POST https://scrapers-api.arcadiumdata.io/v1/scrapers/hotel-reputation/runs \
-H "Authorization: Bearer $ARCADIUM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": {
"hotels": [
{
"name": "The Savoy London",
"bookingUrl": "https://www.booking.com/hotel/gb/the-savoy.html"
}
],
"maxReviewsPerSource": 5
}
}'What each row holds
Every row says what it is in rowType: review rows are charged, coverage and error rows are free.
The review 35 fields
| Field | Type | What it holds |
|---|---|---|
| reviewId | string | Stable review id in the form '<Platform>___<native id>'. Use it to deduplicate between runs. |
| reviewIdSource | 'native' when the id comes from the site, 'derived' when it is a hash of the content (less stable). | |
| reviewUrl | Link to the single review, null when the site has none. | |
| title | string | Review headline, null when the site has none. |
| text | Review text in the language it was written in. Null when the review has no text. | |
| pros | string | What the reviewer liked, for sites that ask separately (Capterra, TrustRadius, Glassdoor, Booking). Null otherwise. |
| cons | string | What the reviewer disliked, for sites that ask separately. Null otherwise. |
| ratingOverall | number | Overall rating on a 0 to 5 scale (Booking: its 1-10 score divided by 2, original in extras.score10). Null when missing. |
| ratings | Sub-ratings as an object, e.g. { value: 5, cleanliness: 4 }. Keys depend on the site; empty object when there are none. | |
| date | string | Date the review was written, ISO format yyyy-mm-dd. Null if unknown. |
| reviewerRole | Job title or role the reviewer states. No names. Null if not given. | |
| reviewerIndustry | Industry the reviewer states. Null if not given. | |
| reviewerCompanySize | Company size bracket of the reviewer, e.g. '51-200 employees'. Null if not given. | |
| reviewerTimeUsed | How long the reviewer used the product, as the site words it. Null if not given. | |
| switchedFrom | Product the reviewer switched from, null if not given. | |
| alternativesConsidered | Alternatives the reviewer considered, comma-separated, null if not given. | |
| reasonForChoosing | Why the reviewer chose this product, free text, null if not given. | |
| reasonForSwitching | Why the reviewer left the previous product, free text, null if not given. | |
| adviceToOthers | Advice the reviewer gives others (Glassdoor: advice to management), null if not given. | |
| incentivized | True when the site marks the review as incentivized (for example a gift card). Null when the site does not say. | |
| incentive | The site's raw incentive label, null if none. | |
| reviewerVerified | True when the site marks the review as verified. Null when the site does not say. | |
| vendorResponse | Reply of the owner, vendor, developer or employer, null when there is none. | |
| helpfulVotes | Number of helpful or useful votes, null when the site shows none. | |
| language | string | Language of the review text as a two-letter code, null if unknown. |
| country | string | Country of the reviewer or the storefront where it applies (lower case code), otherwise null. No personal data. |
| extras | object | Site-specific extras, e.g. trip type, visit date, translated text, photo URLs, owner reply date. Keys are listed in the README. |
| scrapedAt | ISO timestamp of when the row was collected. | |
| hotelName | 'hotel-summary' rows: the hotel name. | |
| tripadvisor | 'hotel-summary' rows: Tripadvisor rating 1-5, review count, reviews per star and how the hotel was matched. | |
| booking | 'hotel-summary' rows: Booking score10, rating (score / 2), review count, stars, city and categoryScores with the city range and vsCity (above, within, below). | |
| 'hotel-summary' rows: Google Hotels rating 1-5, number of Google reviews, reviews per star, topic breakdown (mentions, positive, negative per topic) and how the hotel was matched. | ||
| agoda | 'hotel-summary' rows: Agoda's own guests: score10, rating (score / 2), number of ratings, stars, city, categoryScores with the city average, and the combined score of every provider Agoda shows. | |
| tripcom | 'hotel-summary' rows: Trip.com score10, rating (score / 2), review count, category scores (location, facilities, service, cleanliness), positive and negative counts and the advertised from-price. | |
| combined | 'hotel-summary' rows: the ratings of all requested sites weighted by review count, when two or more sites were read. |
What it is about 5 fields
| Field | Type | What it holds |
|---|---|---|
| platform | string | Source site, lower case, e.g. 'tripadvisor', 'capterra', 'googleplay', 'appstore'. |
| productName | string | Name of the reviewed hotel, business, product or app. |
| productUrl | Page of the reviewed hotel, business, product or app on the source site. | |
| entityId | The site's own id of the reviewed entity (place id, product id, app id). | |
| product | Summary of the reviewed entity repeated on each row: { platform, entityId, name, url, rating, reviewCount, category, vendor, website }. rating and reviewCount are the site's overall figures. |
Coverage rows, free 9 fields
| Field | Type | What it holds |
|---|---|---|
| stated | Coverage rows: total the site states for the entity, null when it does not say. | |
| delivered | Coverage rows: number of rows delivered for the entity in this run. | |
| skippedSeen | Coverage rows: items skipped because an earlier run already delivered them (only-new mode). | |
| duplicates | Coverage rows: repeats the site returned that were dropped. | |
| stopReason | Coverage rows: why reading stopped. limit (your maximum reached), end (no more pages), dateFrom (older than your date), onlyNew (reached already delivered items), budget (run charge limit), cap (site-side depth limit), error (ended by a failure), filter (ended with a filter active). | |
| capSource | Coverage rows: who limited the result, 'user' (your maximum or budget) or 'site' (a limit of the website). Null if nobody. | |
| shortfall | Coverage rows: true when the result may be incomplete: fewer rows than the site states with no maximum or filter set, an error, or the site's paging changed during the run. shortfallReason says which. | |
| shortfallReason | Coverage rows: why shortfall is true. below_stated (fewer rows than the site states, no maximum or filter), error (ended by a failure), unstable_paging (the site changed its list while it was read, so rows inside the range read may be missing even though your maximum or date ended the run). Null when shortfall is false. | |
| pagingGaps | Coverage rows: number of pages the site served inconsistently that could not be repaired by re-reading. Above 0 means shortfallReason unstable_paging. |
Error rows, free 3 fields
| Field | Type | What it holds |
|---|---|---|
| input | Error and coverage rows: the input (URL, id or search text) the row is about. Example: 'https://www.example.com/page'. | |
| code | Error rows: machine-readable reason. One of invalid_input (fix the input), not_found (page does not exist), blocked (site refused, retry later), unavailable (temporary error, retry later), filter_unsupported (the filter cannot be applied on this site), no_match (name search found nothing). | |
| message | Error rows: short human-readable explanation. Do not parse it, use code. |
What it can't do
- It does not return reviewer names, profile links or photos.
- It reads only what the site shows to a visitor without an account.
- Reviews the site has removed or hidden are not returned.
What you send
Every field is optional. The example request above fills the ones shown here.
| Field | Type | What it does |
|---|---|---|
| hotels | array | Hotel names, or objects that tie one hotel's pages together. A plain name is looked up on Tripadvisor (and Google Hotels with 'Also search Google by name'); Booking, Agoda and Trip.com have no name search, so for them or Google use the object form, for example {"name": "The Savoy", "bookingUrl": "https://www.booking.com/hotel/gb/the-savoy.html"}. Object fields: name, tripadvisorUrl, bookingUrl, bookingId, googleUrl, agodaUrl, agodaId, tripcomUrl, tripcomId. |
| maxReviewsPerSource | integer | Maximum number of reviews to collect from each site for each hotel (up to 50,000). Reviews are always read newest first. Booking shows about the last three years. Also accepted as `maxItemsPerQuery`, `maxReviewsPerHotel` or `maxReviews` (other hotel review actors). Default 100. |
More options (13)
| Field | Type | What it does |
|---|---|---|
| startUrls | array | Tripadvisor, Booking.com, Agoda or Trip.com hotel pages, or Google Hotels pages. Each link goes to its site by host and counts as its own hotel; use the object form of 'Hotels' to pair pages into one summary. Example: https://www.booking.com/hotel/gb/the-savoy.html. A `startUrls` list written for a single-site Tripadvisor, Booking or Google reviews actor works here unchanged. |
| bookingHotelIds | array | Numeric Booking.com hotel IDs. Rows from an ID carry no hotel name or Booking rating, so prefer the hotel link when you have it.Default [] |
| searchGoogleByName | boolean | Also look each hotel name up on Google Hotels and read Google's own reviews: one more source per hotel, so up to twice the reviews (and cost) per name. Off by default; Google links in the object form or in the hotel links are always read.Default false |
| ratings | array of string | Only reviews with these star ratings (1 to 5). Tripadvisor filters on the site. Booking scores are converted to stars first (score divided by 2, rounded) and filtered after download. Leave empty for all. Also accepted as `reviewRatings` (Tripadvisor actor values, ALL_REVIEW_RATINGS = all). |
| languages | array of string | Two-letter language codes such as en or de. Applied to every source. Leave empty for all. Also accepted as `reviewsLanguages` (ALL_REVIEW_LANGUAGES = all). |
| travelerTypes | array of string | Only reviews from these kinds of travelers, applied to every source (Tripadvisor trip type, Booking guest type, Google, Agoda and Trip.com traveler type). Leave empty for all.Default [] |
| dateFrom | string | Only keep reviews published on or after this date (YYYY-MM-DD, or a relative span such as 30 days or 2 months; empty = no filter). Paging stops once reviews are older. Also accepted as `lastReviewDate`, `cutoffDate`, `reviewsStartDate` or `reviewsFromDate`. |
| onlyNewReviews | boolean | Return only reviews not delivered by earlier runs that used the same state key. Skipped reviews are not charged.Default false |
| stateKey | string | Name of the incremental state used by 'Only new reviews' (letters, digits and dashes, up to 40 characters). Use different keys for independent schedules. Example: weekly-monitoring.Default "default" |
| includeSummary | boolean | Add one row with rowType 'hotel-summary' (not charged) per hotel: the Tripadvisor rating and review count, the Booking score and count with Booking's category averages compared with the city, and the Google rating with its topic breakdown. Costs a few extra small requests per hotel.Default true |
| includeErrorRows | boolean | Add one row with rowType 'error' (not charged) for each input or site that could not be read, e.g. no confident Tripadvisor match.Default true |
| includeCoverageRows | boolean | Add one free row with rowType 'coverage' per hotel and source: the review total the site states, how many were delivered, why paging ended and whether anything is missing. Not charged.Default true |
| markEdited | boolean | With 'Only new reviews': also deliver reviews seen before whose text changed in the last 7 days, marked extras.changeType 'edited'. Edited reviews are charged like new ones.Default true |
Questions people ask before they top up
What does a run cost?
Each review costs $0.001, which is $1.00 per 1,000. A run that delivers rows also pays a $0.001 start fee.
A run that returns rows costs at least $0.005, start fee included. Failed runs, empty runs and duplicate rows cost $0. You set the most a run may cost, and it stops there.
Can I get only the reviews added since my last run?
Yes, with the onlyNewReviews option. Return only reviews not delivered by earlier runs that used the same state key. Skipped reviews are not charged.
Do you ever return personal data?
Not about reviewers or users. Reviewer names, profile links, photos, emails and phone numbers are not collected. When a name appears inside a review or a reply, it is replaced with [name].
Job titles and company sizes stay where a site shows them, because they describe a role rather than a person. On YouTube, channel names and URLs are the publisher labels YouTube shows publicly.
How fresh is the data?
Each run reads the live site when you start it, so rows are as current as the site itself.
More from Reviews
Rating, sub-ratings, pros, cons, tenure, current or former employee
$3.00per 1,000 reviews
Score, pros, cons, traveler type, room, nights, hotel reply
$1.00per 1,000 reviews
Rating, title, text, sub-ratings, trip type, owner reply
$0.75per 1,000 reviews
Rating, room, service and location scores, translation, reply
$0.50per 1,000 reviews
Score, text, translation, traveler type, room, nights, reply
$1.00per 1,000 reviews
Rating, text, language, reactions, owner reply
$0.25per 1,000 reviews