Hotel Reviews Scraper (Booking.com & Agoda)
Pricing
from $2.00 / 1,000 results
Hotel Reviews Scraper (Booking.com & Agoda)
Scrape guest reviews for a hotel from Booking.com or Agoda — rating, review text, author nationality, stay date, room type, and the hotel's response. No login.
Pricing
from $2.00 / 1,000 results
Rating
0.0
(0)
Developer
Farhan Febrian Nauval
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 days ago
Last modified
Categories
Share
Extract guest reviews for a hotel from Booking.com or Agoda — rating, review text, the guest's nationality, stay dates, room type, and the hotel's written response. No account or login required.
Why use this actor
- No account, login, or API key required.
- Two sources, one actor — pick Booking.com or Agoda per run.
- Rich per-review detail — rating, title, what the guest liked/disliked, room booked, stay dates, traveler type, and helpful-vote count.
- The hotel's reply is included — when a hotel responds to a review, that response text and date come through too.
- Agoda reviews are pre-aggregated across Agoda's own guests and reviews originally left on Booking.com, so you get broader coverage from a single call.
- Stable JSON output ready for spreadsheets, dashboards, databases, or sentiment pipelines.
- Runs on a schedule, retries automatically, and exports to JSON, CSV, or Excel.
How it works
- Pick a source (Booking.com or Agoda) and paste the hotel's page URL — for Agoda you can paste the URL or just its numeric property ID.
- Choose how you want reviews sorted (newest, oldest, highest/lowest rating, most relevant) and set a cap per hotel and for the whole run.
- Run it. The actor opens each hotel's review list and pushes one clean record per review, working through pages until it hits your cap or runs out of reviews.
You do not manage any scrapers, browsers, or blocks — the actor handles that automatically and returns clean records.
Input
Booking.com:
{"source": "booking","hotels": ["https://www.booking.com/hotel/id/ktm-resort-batam.html"],"sortBy": "newest","maxReviewsPerHotel": 100,"maxReviews": 500,"solveAttempts": 5,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Agoda (URL or numeric property ID both work):
{"source": "agoda","hotels": ["11295575"],"sortBy": "highest_rating","maxReviewsPerHotel": 100,"maxReviews": 500,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
| Field | Type | Description |
|---|---|---|
source | string | booking or agoda. |
hotels | array | Booking: the hotel's Booking.com page URL(s). Agoda: the hotel's Agoda page URL(s), or its numeric Agoda property ID. |
sortBy | string | newest, oldest, highest_rating, lowest_rating, or most_relevant. Agoda has no separate "oldest first", so it falls back to newest. |
maxReviewsPerHotel | integer | Cap on reviews pulled per hotel. 0 = all available. |
maxReviews | integer | Overall cap for the run, across all hotels. 0 = no limit. |
solveAttempts | integer | Booking.com only — how many times to retry the initial unlock on a fresh IP. More = more reliable. |
proxyConfiguration | object | Residential is recommended (default). |
Output
One record per review.
Booking.com:
{"_input": "https://www.booking.com/hotel/id/ktm-resort-batam.html","_source": "S1-booking-reviewlist","_scrapedAt": "2026-08-06T10:05:23Z","recordType": "REVIEW","source": "booking","hotelName": "KTM Resort Batam","hotelUrl": "https://www.booking.com/hotel/id/ktm-resort-batam.html","reviewId": "63a25c73ebdad386","authorName": "Poovendran","authorNationality": "Malaysia","authorCountryCode": "my","rating": 8.0,"reviewTitle": "Stay in Ktm Resort","positiveText": "Breakfast buffet and friendly staff","negativeText": "A bit far from the main city, distance wise it's near but too many cars in the road making it more than half an hour to go to the city","reviewText": null,"roomType": "Deluxe Villa","travelerType": "Solo traveler","stayCheckIn": "2026-07-23","stayCheckOut": "2026-07-26","numNights": 3,"reviewDate": "2026-07-30T02:00:28Z","hotelResponse": null,"hotelResponseDate": null,"helpfulVotes": 0,"language": "en"}
Agoda (with a hotel response):
{"_input": "11295575","_source": "S1-agoda-hotelreviews","_scrapedAt": "2026-08-06T10:05:59Z","recordType": "REVIEW","source": "agoda","hotelName": "Desa Potato Head Bali","hotelUrl": null,"reviewId": 1127366899,"authorName": "Rebecca","authorNationality": "Australia","authorCountryCode": "au","rating": 10.0,"reviewTitle": "Fantastic stay","positiveText": null,"negativeText": null,"reviewText": "We had a great stay at potato head, staying in one of their ocean front rooms. The staff and service were wonderful and really attentive. Will be back! ","roomType": "Oceanfront Studio","travelerType": "Couple","stayCheckIn": "2026-05-30T00:00:00+07:00","stayCheckOut": "2026-06-01T00:00:00+07:00","numNights": 2,"reviewDate": "2026-06-03T05:00:00+07:00","hotelResponse": "Dear Rebecca, \n\nThank you for your wonderful review! We are delighted to hear that you had a great stay with us and enjoyed your Ocean Front room... (truncated)","hotelResponseDate": "2026-06-03T18:55:13.253+07:00","helpfulVotes": 0,"language": null,"reviewSourceProvider": "Agoda"}
| Field | Type | Description |
|---|---|---|
hotelName | string | Hotel name. |
hotelUrl | string | The Booking.com page URL you provided (null for Agoda, which is looked up by numeric ID). |
reviewId | string/number | Unique id for the review. |
authorName | string | Reviewer's display name (null if they reviewed anonymously). |
authorNationality | string | Reviewer's country, as shown on the review. |
authorCountryCode | string | Two-letter country code for the flag icon shown next to the reviewer. |
rating | number | Score out of 10. |
reviewTitle | string | Headline the guest gave their review, if any. |
positiveText | string | What the guest liked (Booking splits pros/cons this way; Agoda only for reviews written that way). |
negativeText | string | What the guest disliked. |
reviewText | string | Free-form review body, used when the source doesn't split it into pros/cons (mainly Agoda). |
roomType | string | Room type the guest stayed in, when the source records it. |
travelerType | string | e.g. "Solo traveler", "Couple", "Family". |
stayCheckIn / stayCheckOut | string | Dates of the reviewed stay. |
numNights | integer | Length of stay in nights. |
reviewDate | string | When the review was posted. |
hotelResponse | string | The hotel's written reply to the review, if any. |
hotelResponseDate | string | When the hotel replied (Agoda only). |
helpfulVotes | integer | "Helpful" votes the review received, if the source shows one. |
reviewSourceProvider | string | Agoda only — which platform the review was originally posted on (Agoda's aggregated reviews include ones sourced from Booking.com and other channels). |
Notes & limits
- Booking.com unlocks the hotel's page once per run and reuses that unlock for every additional Booking hotel URL you add — only the first hotel (or a re-check after a long gap) pays the full unlock cost.
- Sorting on Agoda: there's no dedicated "oldest first" option on Agoda's side, so choosing
oldestthere falls back to the same ordering asnewest. - Volume: both sources page through as many reviews as are available, up to your caps. Very large hotels (thousands of reviews) will take longer and use more proxy bandwidth the higher you set
maxReviewsPerHotel. - Proxy: Residential is recommended and set as the default.
Other actors
See the sibling scrapers in this collection — booking-hotels-scraper and agoda-hotels-scraper — for hotel search results and live room rates from the same two sites.