Google Hotels Reviews
Give it Google Hotels links or hotel names and it returns every guest review Google shows as one JSON row each: rating, original text plus Google's translation, date, trip type and party, the rooms/service/location scores, the hotel's reply, and the partner-site reviews Google lists next to its own (Tripadvisor, Trip.com and others). Each hotel also gets a free summary row with its star histogram and topic breakdown.
Sample output
One row as the API returns it. Long text is shortened here; names inside text read [name].
| Field | Value |
|---|---|
| rowType | review |
| platform | googlehotels |
| productName | Ritz Paris |
| entityId | ChUImcGKtLfWgL9OGgkvbS8wNTZuODEQAQ |
| reviewId | GoogleHotels___Ci9DQUlRQUNvZENodHljRjlvT25GSlZXbzJkV1Z0VTNwdmVGTXRVblUxY2s5aE1WRRAB |
| ratingOverall | 4 |
| ratings | {"rooms":3,"service":4,"location":3} |
| date | 2026-10-16 |
| text | 이곳은 아름다운스파 수영장 레스토랑 노을을 볼수있는곳 까지있어서 너무아름다워요 고급프랑스느낌 |
| vendorResponse | Cher [name], Thank you for taking the time to share your wonderful feedback. ... Kind regards, [name] Directrice d'hôtel, Ritz Paris |
| extras | {"source":"Google","sourceType":"google","dateText":"6 days ago","datePrecision":"day","textTranslated":"This place is so beautiful, with a lovely spa, swimming pool, restaurant, and even a spot to watch the sunset. It has a luxurious French feel.","translatedTo":"en","tripType":"vacation","travellerType":"couple","visitMonth":"2026-10","highlights":["Luxury","Romantic"],"ownerResponseDate":"2026-10-17","photoCount":null} |
| language | null |
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/google-hotel-reviews/runs \
-H "Authorization: Bearer $ARCADIUM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": {
"hotels": [
"https://www.google.com/travel/hotels/entity/ChUImcGKtLfWgL9OGgkvbS8wNTZuODEQAQ",
"Hotel Adlon Kempinski Berlin"
],
"maxReviewsPerHotel": 20,
"sort": "newest",
"reviewSource": "all",
"language": "en",
"country": "us"
}
}'What each row holds
Every row says what it is in rowType: review rows are charged, coverage and error rows are free.
The review 36 fields
| Field | Type | What it holds |
|---|---|---|
| reviewId | string | Stable review id 'GoogleHotels___<Google post id>'. The same in every language; 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 review on the partner site (Tripadvisor, Trip.com, ...) for partner reviews; null for Google reviews. | |
| title | Always null: Google hotel reviews have no headline. | |
| text | string | Review text as the reviewer wrote it (original language). Google translation in extras.textTranslated. Null for rating-only reviews. |
| pros | Always null on Google hotel reviews (shared review shape). | |
| cons | Always null on Google hotel reviews (shared review shape). | |
| ratingOverall | number | Overall rating on a 1 to 5 scale (partner ratings are scaled to 5; the raw value is in extras.rawRating and extras.rawScale). |
| ratings | object | Aspect ratings the reviewer gave, 1 to 5, e.g. { rooms: 4, service: 2, location: 5 }. Empty object when none. |
| date | string | Approximate review date yyyy-mm-dd, computed from Google's relative date ('3 months ago'); precision in extras.datePrecision. Null if unreadable. |
| reviewerRole | Always null on Google hotel reviews (shared review shape). | |
| reviewerIndustry | Always null on Google hotel reviews (shared review shape). | |
| reviewerCompanySize | Always null on Google hotel reviews (shared review shape). | |
| reviewerTimeUsed | Always null on Google hotel reviews (shared review shape). | |
| switchedFrom | Always null on Google hotel reviews (shared review shape). | |
| alternativesConsidered | Always null on Google hotel reviews (shared review shape). | |
| reasonForChoosing | Always null on Google hotel reviews (shared review shape). | |
| reasonForSwitching | Always null on Google hotel reviews (shared review shape). | |
| adviceToOthers | Always null on Google hotel reviews (shared review shape). | |
| incentivized | Always null on Google hotel reviews (shared review shape). | |
| incentive | Always null on Google hotel reviews (shared review shape). | |
| reviewerVerified | Always null on Google hotel reviews (shared review shape). | |
| vendorResponse | string | Reply of the hotel (owner response) in its original language, names redacted. Translation in extras.ownerResponseTranslated, date in extras.ownerResponseDate. |
| helpfulVotes | Always null on Google hotel reviews (shared review shape). | |
| language | Always null: Google does not state the review language. A translated review has extras.translatedTo. | |
| country | Always null: Google shows no reviewer country. No personal data. | |
| extras | object | Google hotel extras: source (Google, Tripadvisor, ...), sourceType (google/partner), dateText, datePrecision, edited, textTranslated, translatedTo, tripType (vacation/business), travellerType (solo/couple/family/friends), visitMonth, highlights, topicComments, ownerResponseTranslated, ownerResponseDate, ownerResponseDateText, photoCount, rawRating, rawScale. |
| scrapedAt | ISO timestamp of when the row was collected. | |
| ratingHistogram | Hotel summary rows: share in percent and count per star, e.g. { "5": { "percent": 86, "count": 3931 } }. | |
| topics | Hotel summary rows: Google topic breakdown, one entry per topic: { name, shortName, mentions, positive, negative, sentiment (-1 to 1), polarity }. | |
| partnerSites | Hotel summary rows: partner review sites Google lists, { name, providerId, rating, ratingScale, reviewCount, url }. | |
| rating | Hotel summary rows: Google rating of the hotel, 1 to 5. | |
| reviewCount | Hotel summary rows: number of Google reviews of the hotel. | |
| hotelClass | Hotel summary rows: star class (1-5), null when Google gives none. | |
| address | Hotel summary rows: street address of the hotel as Google shows it. | |
| countryCode | Hotel summary rows: country code of the hotel, null if unknown. |
What it is about 5 fields
| Field | Type | What it holds |
|---|---|---|
| platform | string | Always 'googlehotels' (Google Hotels / Google Travel). The site a review was first posted on is in extras.source. |
| productName | string | Name of the hotel as Google shows it. |
| productUrl | Google Hotels page of the hotel (https://www.google.com/travel/hotels/entity/<token>). | |
| entityId | string | Google's hotel entity token (Ch...). Pass it back as a hotel input to read the same hotel again. |
| product | Hotel summary repeated on each row: { platform, entityId, name, url, rating, reviewCount, category, vendor, website }. rating and reviewCount are the Google 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 | Hotels to read: a Google Hotels or Google Travel link such as https://www.google.com/travel/hotels/entity/ChUImcGKtLfWgL9OGgkvbS8wNTZuODEQAQ, the entity token alone (the Ch... part, also the entityId of every row), a hotel name with its city such as "Hotel Adlon Kempinski Berlin", or a Google Maps place link (read by its name). Each hotel returns its reviews plus one free summary row. |
| maxReviewsPerHotel | integer | Reviews to return for each hotel, 1 to 50,000 (default 100 when omitted), for example 500. Google pages up to 200 reviews per request; big hotels have 5,000+. |
| sort | string (one of 4) | Order of the reviews as Google sorts them. Newest first is needed for the date filter to stop early and for only-new-reviews mode. |
| reviewSource | string (one of 3) | Google's own reviews, the reviews of partner sites Google shows for the hotel (Tripadvisor, Trip.com, Expedia, ...), or both. Partner sites appear with a sample of their reviews and a link to each. |
| language | string | Interface language as a code such as en, de, fr or pt-BR. Reviews in other languages come with Google's translation into this language in extras.textTranslated; the text field keeps the original. Dates are read for en, de, fr, es, it, pt and nl. |
| country | string | Market as a two-letter country code, for example us, gb or de. It changes which partner sites Google lists. |
More options (8)
| Field | Type | What it does |
|---|---|---|
| topic | string | Only reviews about one topic Google lists for the hotel, for example "Location", "Breakfast", "Couples" or "Service". A hotel without that topic returns a free error row that lists its topics. |
| dateFrom | string | Only reviews on or after this date: YYYY-MM-DD or a relative span such as "30 days" or "6 months"; empty = no filter. Google shows review dates as "3 months ago", so dates are approximate to the day, week, month or year (see extras.datePrecision). |
| includeHotelSummary | boolean | Add one free row per hotel (rowType 'hotel-summary'): Google rating, review count, star histogram, the topic breakdown (mentions, positive, negative, sentiment) and the partner sites with their own rating and review count.Default true |
| onlyNewReviews | boolean | Return only reviews not delivered by a previous run with the same state key (newest first is used automatically).Default false |
| stateKey | string | Name of the saved state used by only-new-reviews mode. Use different keys for independent monitors. Example: weekly-monitoring.Default "default" |
| markEdited | boolean | With 'Only new reviews': also deliver reviews seen before whose text or rating changed in the last 7 days, marked extras.changeType 'edited'. Edited reviews are charged like new ones.Default true |
| includeErrorRows | boolean | Add a free row (rowType 'error') for each hotel that could not be read, with a machine-readable code.Default true |
| includeCoverageRows | boolean | Add one free row with rowType 'coverage' per hotel: the review total Google states, how many were delivered, why paging ended and whether anything is missing. Not charged.Default true |
Questions people ask before they top up
What does a run cost?
Each review costs $0.0005, which is $0.50 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 a previous run with the same state key (newest first is used automatically).
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
Score, text, translation, traveler type, room, nights, reply
$1.00per 1,000 reviews
Rating, text, language, reactions, owner reply
$0.25per 1,000 reviews
Rating, pros, cons, reviewer role, company size, incentive flag
$2.00per 1,000 reviews