Hotel Reviews Scraper (Booking.com + Agoda) avatar

Hotel Reviews Scraper (Booking.com + Agoda)

Pricing

from $1.20 / 1,000 reviews

Go to Apify Store
Hotel Reviews Scraper (Booking.com + Agoda)

Hotel Reviews Scraper (Booking.com + Agoda)

Paste Booking.com or Agoda hotel URLs, or hotel names such as The Savoy London, and get guest reviews: score, liked and disliked text, reviewer country, traveler type, stay dates, hotel reply. A name can pull one hotel from both sites. Free summary row. $1.80 per 1,000 reviews, failures free.

Pricing

from $1.20 / 1,000 reviews

Rating

0.0

(0)

Developer

Gautham Krishna

Gautham Krishna

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 hours ago

Last modified

Categories

Share

Get guest reviews from Booking.com and Agoda in one actor, for hotel managers, travel researchers and analysts comparing properties.

Use cases, each with a ready-to-run example:

Paste hotel URLs from either site and the actor detects which one it is, or type hotel names such as "The Savoy London". Each review comes back as one clean row with the score, the liked and disliked text, the reviewer's country, traveler type, room type, stay dates, review date, language and the hotel's reply. A name can be looked up on both sites in one run, and the actor scrapes both only when the two listings are the same hotel. A free summary row per hotel gives the review count, average score, score bands, date range and the split per site.

You pay only for reviews returned. Hotels that fail or have no reviews cost nothing.

What you get

One dataset item per review.

FieldWhat it is
sitebooking or agoda, detected from the URL, or the site you chose for names
hotelName, hotelId, hotelUrlThe hotel the review belongs to
reviewSourceWho collected the review. Agoda pages also show Booking.com reviews, so Agoda rows say Agoda or Booking.com
reviewIdThe site's own id for the review
rating, ratingScaleGuest score. Both sites use a 10-point scale
titleReview headline
positive, negativeWhat the guest liked and disliked, when the site splits them
textThe full review text. For split reviews it is Liked: ... and Disliked: ... joined
reviewerNameThe public display name shown on the site, or null for anonymous reviews
reviewerCountry, reviewerCountryCodeWhere the guest is from
travelerTypeCouple, Family, Solo traveler, Group, Business traveler
roomType, nights, checkInDate, checkOutDateThe stay being reviewed
reviewDateWhen the review was posted, in UTC
languageLanguage of the review text, such as en, de, zh-CN. null when the guest left only a score
helpfulVotesHelpful votes, when the site shows them
hotelResponse, hotelResponseDateThe property's public reply. Booking.com does not show a reply date
inputThe URL or name you passed
matchedHotelOnly on rows from a hotel name. The hotel the name matched, with its location as the site shows it

With hotelSummary on, each hotel also gets one free row with status: "summary", described below.

The actor never collects emails, phone numbers or profile links.

Input

{
"hotelUrls": [
"https://www.booking.com/hotel/gb/the-savoy.html",
"https://www.agoda.com/the-peninsula-hong-kong/hotel/hong-kong-hk.html"
],
"maxReviewsPerHotel": 100,
"sortBy": "newest",
"languages": ["en", "de"]
}
FieldDefaultNotes
hotelUrlsemptyBooking.com /hotel/<country>/<name>.html links in any language version, and Agoda hotel or review page links. Agoda links with a hotel_id or hid parameter also work
hotelNamesemptyHotel names with the city, such as The Savoy London. See Hotel names below. Pass URLs, names or both
nameSitebookingWhich site to search the names on, booking, agoda or both. See Both sites from one name below
maxReviewsPerHotel100Stops after this many reviews per hotel
sortBynewestnewest, relevant, highest or lowest. On Agoda, relevant uses Agoda's "Most helpful" order
languagesallISO codes such as en, fr, ja, zh. The site filters before sending, so you do not pay for reviews you do not want
hotelSummaryfalseAdds one free summary row per hotel. See Free summary row below
onlyNewSinceLastRunfalseSee Monitoring below
publishedAfteremptySee Monitoring below
maxConcurrency5Hotels scraped in parallel

Monitoring: only new reviews and a date cutoff

Two optional inputs turn a scheduled run into a feed of new reviews. Both are off by default, and a run without them works exactly as before.

OptionWhat it does
onlyNewSinceLastRunReturns only reviews this scraper has not returned to you before for the same hotel and filters, and nothing older than the newest one it returned last time. The first run returns the usual results and remembers them
publishedAfterOnly reviews published on or after a date: 2026-10-01, 2026-10-01T12:00:00Z (UTC), or a relative value such as 7 days

With sortBy: "newest" the run stops at the first page that holds nothing new, so a daily run reads only the pages it needs. With other orders it still skips old reviews, but it reads further to find new ones. You pay only for the reviews returned. The memory is a key-value store named hotel-reviews-scraper-monitor in your own Apify account, one record per hotel and language filter. Delete that store to start over. A hotel with nothing new comes back as a free no_reviews row.

Run it on a schedule

A weekly run with onlyNewSinceLastRun: true and sortBy: "newest" gives you the new guest reviews for the hotels you track. We ran the same 69 Booking.com and Agoda hotels on 15 Oct and again on 20 Oct. The 20 Oct run returned 28 reviews, none returned on 15 Oct, and 57 hotels with nothing new came back as free no_reviews rows.

  1. Set your input with onlyNewSinceLastRun: true and click Save as a new task.
  2. On the task page, click Actions, then Schedule, and pick how often it runs. Apify's schedules guide covers cron times and time zones.
  3. On the task's Integrations tab, choose where each run's results go.
IntegrationWhat it does
SlackPosts a message to your channel when a run finishes
Google DriveSaves each run's results as a file in your Drive
WebhookSends the finished run, with its dataset ID, to your own URL
Make, Zapier, n8nAdds each new row to a Google Sheet, a CRM or a database

Each review has a stable reviewId, so a sheet or database can skip rows it already holds.

Hotel names instead of URLs

Put names in hotelNames and pick the site in nameSite.

{
"hotelNames": ["The Savoy London", "Mandarin Oriental Bangkok", "Hotel Arts Barcelona"],
"nameSite": "booking",
"maxReviewsPerHotel": 100
}

The actor types each name into the site's own search box, the way you would, and reads the hotels it suggests. It then scrapes the one hotel the name matches. Every review row from a name carries matchedHotel, so you can see which hotel you got:

{
"status": "ok",
"site": "booking",
"hotelId": "280149",
"hotelName": "The Savoy",
"hotelUrl": "https://www.booking.com/hotel/gb/the-savoy.html",
"reviewSource": "Booking.com",
"reviewId": "2e0f2f561783aa35",
"rating": 9,
"ratingScale": 10,
"title": null,
"positive": "All the staff behaved in a professional manner, always put the customer first",
"negative": "The late timing of cleaning the suites, staff would turn up at about 5pm, to clean the room. Then the turn down could happen any time after 5pm which seemed strange.",
"text": "Liked: All the staff behaved in a professional manner, always put the customer first\nDisliked: The late timing of cleaning the suites, staff would turn up at about 5pm, to clean the room. Then the turn down could happen any time after 5pm which seemed strange.",
"reviewerName": "Ann",
"reviewerCountry": "United Kingdom",
"reviewerCountryCode": "GB",
"travelerType": "Solo traveler",
"roomType": "Superior Queen Room",
"nights": 3,
"checkInDate": "2026-10-07",
"checkOutDate": "2026-10-10",
"reviewDate": "2026-10-10T21:04:53Z",
"language": "en",
"helpfulVotes": 0,
"hotelResponse": "Dear Ann, Thank you for staying with us at The Savoy and for taking the time to complete a guest satisfaction survey. We are so happy to hear you had a great Savoy experience and enjoyed the personal touches and service from the team. We do value guest feedback and I will share your additional comments with our housekeeping team, I do hope this did not interrupt your stay at any point. Thank you again for sharing your thoughts and we very much look forward to warmly welcoming you back to The Savoy in the future. With best regards, Debra Patterson, Quality Leader",
"hotelResponseDate": null,
"input": "The Savoy London",
"matchedHotel": "The Savoy, London, Greater London, United Kingdom"
}

How a name is matched:

  • Every word you typed must be in the hotel's name or its location.
  • The hotel's name must start with a word you typed.
  • The hotel's name must not hold a word such as "near" or "view" that you did not type, which skips rentals named after a landmark such as "Peaceful 2BR Retreat Near Burj Al Arab".
  • Words such as "the", "hotel" and "hostel" are ignored, and accents do not matter.
  • When several hotels match, the ones whose location holds the most of your words stay.
  • A hotel is an exact match when every word of its name is one you typed or part of its own location.
  • The actor scrapes the only match left, or else the first exact match.
  • Two listings with the same name in the same place, such as "The Savoy" and "The Savoy Hotel" in London on Agoda, count as one hotel, and the site's first listing wins.

A name is ambiguous, and nothing is scraped, when two or more hotels still match and none is a clear exact match. That covers chains typed without the branch ("Hilton London"), two real hotels with the same name ("Wombat's City Hostel Munich" has two branches in Munich), and an exact match listed below a longer name that starts with your words. You get one free row listing up to 5 candidates with their URLs, so you can pass the right URL in hotelUrls on the next run:

{"input": "Wombat's City Hostel Munich", "status": "ambiguous", "site": "booking", "message": "2 Booking.com hotels match this name equally well, so none was scraped. Pass the URL of the one you want in hotelUrls, or add more of its name", "candidates": [{"hotelName": "Wombat's City Hostel Munich Hauptbahnhof", "location": "Munich, Bavaria, Germany", "hotelId": "180960", "hotelUrl": "https://www.booking.com/hotel/de/wombats-hostel-munich.html"}, {"hotelName": "Wombat's City Hostel Munich Werksviertel", "location": "Munich, Bavaria, Germany", "hotelId": "7049815", "hotelUrl": "https://www.booking.com/hotel/de/wombats-the-city-hostel-munich-werksviertel.html"}]}

A name that matches no hotel also gives one free row:

{"input": "Hotel d'Angleterre Copenhagen", "status": "not_found", "site": "booking", "message": "No Booking.com hotel matches this name. Check the spelling, add the city, or pass the hotel's URL in hotelUrls"}

Searching a name is never charged. A URL is always the most precise input.

Both sites from one name

Set nameSite to both and each name is looked up on Booking.com and on Agoda.

{
"hotelNames": ["The Savoy London", "Mandarin Oriental Bangkok", "Hotel Arts Barcelona"],
"nameSite": "both",
"hotelSummary": true,
"maxReviewsPerHotel": 100
}

Each site first picks its hotel by the name rules above. The actor then checks that the two listings are one hotel.

  • The names must agree. Both have the same words once the location is set aside, or one name holds all the words of the other ("Hotel Emma" and "Hotel Emma at Pearl on the Riverwalk").
  • An extra word that marks a different listing breaks the match, such as "Apartments", "Suite", "2BR" or a branch number.
  • Both listings must be in the same country.
  • Their map pins must be within 1 km when the names have the same words, and within 250 m when one name only holds the other.

When the two picks fail the check, or one site has no clear pick, the actor looks among the other site's results for that name for a listing that passes the check against the site that did pick. That finds a hotel listed under a newer name, such as "Eco Boutique Hostal Grau" on Booking.com for "Hostal Grau Barcelona". When Agoda lists the paired hotel twice, the actor takes the listing with the most Agoda reviews.

Nothing unsure is paired. When only one site has a clear match, that site is scraped and the other gets a free row saying why:

{"input": "Hotel Sacher Wien", "status": "not_found", "site": "agoda", "message": "No Agoda hotel matches this name at the location of the Booking.com match, Hotel Sacher Wien, Vienna, Vienna (state), Austria, so only Booking.com was scraped"}

When each site picks a different hotel, neither is scraped, because one of them is wrong and nothing says which. Each site gets a free mismatch row with its pick and URL:

{"input": "The Siam Hotel Bangkok", "status": "mismatch", "site": "agoda", "message": "Agoda's match, The Siam Hotel, Bangkok, Thailand, and Booking.com's match, Bangkok Siam, Bangkok, Bangkok Province, Thailand, are not the same hotel by name and location. They are 7.6 km apart. Neither was scraped. Pass the URL of the hotel you want in hotelUrls, or add more of its name", "candidates": [{"hotelName": "The Siam Hotel", "location": "Bangkok, Thailand", "hotelId": "296765", "hotelUrl": "https://www.agoda.com/partners/partnersearch.aspx?hid=296765"}]}

Agoda pages also show Booking.com reviews. For a paired hotel those are the same reviews the Booking.com rows already hold, so the Agoda rows keep only Agoda's own reviews and you never pay twice for one review. In our check on The Savoy, 780 of the 789 Booking.com reviews with text that Agoda showed were word for word on Booking.com. A hotel found on Agoda alone keeps both kinds, as before.

maxReviewsPerHotel applies on each site, so 10 gives up to 10 Booking.com reviews and up to 10 Agoda reviews. Every row says its site, and each site's rows carry that site's matchedHotel.

We tested 76 real hotel names with both on 17 October 2026 (run IeiOtf8dAMnbcczKR), covering luxury hotels, resorts, chains and hostels in Europe, Asia, the Middle East, the Americas, Africa and Australia, and checked every pair by hand.

OutcomeNames
Same hotel found and scraped on both sites64
Paired with the wrong hotel0
Scraped on one site only, because the other site's search box did not suggest the hotel6
Ambiguous on both sites, free rows with candidates5
Each site picked a different hotel, free mismatch rows1

The 64 pairs had their two map pins a median of 20 m apart, and at most 497 m for a large resort (The Ritz-Carlton Bali). All 591 Agoda reviews of the paired hotels were Agoda's own. The run took 5.5 minutes for 76 names at the default concurrency of 5, well inside the default 1-hour run timeout. One of the six one-site hotels, Hotel d'Angleterre Copenhagen, had no reviews on Agoda and is not in Booking.com's search.

Free summary row

Set hotelSummary to true to get one more row per hotel, after its reviews. It is never charged and needs no extra request, because it is worked out from the reviews already returned and the figures each site sends with them. Hotels that return no review get no summary row.

FieldWhat it is
sitebooking, agoda, or both for a hotel matched on both sites
hotelNameThe hotel's name, Booking.com's when both sites were scraped
matchDistanceMetersOnly with both. How far apart the two sites put the hotel's map pin
returnedReviewsFigures for the reviews this run returned, all sites together: count, averageRating, oldestDate, newestDate, ratingDistribution in Agoda's score bands (9+, 8-9, 7-8, 6-7, <6), lowRatingPercent (below 6 of 10), hotelReplyPercent, and counts of travelerTypes, reviewerCountries (top 10), languages and reviewSources
bySiteOne block per site with the hotel's ID, name, URL and matchedHotel, the site's own siteRating, siteReviewCount and siteSubRatings for all of the hotel's reviews, Agoda's siteRatingDistribution, and the count, average and date range of the reviews returned from that site

On Agoda, siteRating and siteReviewCount cover Agoda's own guest reviews. Booking.com shows no score bands, so its siteRatingDistribution is null. With onlyNewSinceLastRun, returnedReviews covers only the new reviews.

A real summary row from the test run:

{
"status": "summary",
"input": "The Savoy London",
"site": "both",
"hotelName": "The Savoy",
"matchDistanceMeters": 133,
"returnedReviews": {
"count": 20,
"averageRating": 9.1,
"oldestDate": "2024-05-25T03:07:00Z",
"newestDate": "2026-10-15T12:32:16Z",
"ratingDistribution": {
"9+": 16,
"8-9": 2,
"7-8": 0,
"6-7": 0,
"<6": 2
},
"lowRatingPercent": 10,
"hotelReplyPercent": 70,
"travelerTypes": {
"Couple": 12,
"Solo traveler": 6,
"Family with young children": 1,
"Group": 1
},
"reviewerCountries": {
"United Kingdom": 8,
"United States": 3,
"Belgium": 2,
"Japan": 2,
"Australia": 1,
"Canada": 1,
"Ireland": 1,
"Russia": 1,
"South Korea": 1
},
"languages": {
"en": 12,
"ja": 2,
"nl": 2,
"ko": 1,
"ru": 1
},
"reviewSources": {
"Agoda": 10,
"Booking.com": 10
}
},
"bySite": {
"booking": {
"hotelId": "280149",
"hotelName": "The Savoy",
"hotelUrl": "https://www.booking.com/hotel/gb/the-savoy.html",
"matchedHotel": "The Savoy, London, Greater London, United Kingdom",
"siteRating": 9.4,
"siteReviewCount": 1433,
"siteRatingDistribution": null,
"siteSubRatings": {
"Location": 9.7,
"Cleanliness": 9.7,
"Value for money": 8.5,
"Facilities": 9.5,
"Comfort": 9.8,
"Staff": 9.7,
"Free Wifi": 9.5
},
"returnedReviews": {
"count": 10,
"averageRating": 8.6,
"oldestDate": "2026-10-07T08:01:27Z",
"newestDate": "2026-10-15T12:32:16Z"
}
},
"agoda": {
"hotelId": "11070",
"hotelName": "The Savoy Hotel",
"hotelUrl": "https://www.agoda.com/the-savoy-hotel/hotel/london-gb.html",
"matchedHotel": "The Savoy Hotel, London, United Kingdom",
"siteRating": 9.2,
"siteReviewCount": 210,
"siteRatingDistribution": {
"9+": 144,
"8-9": 25,
"7-8": 9,
"6-7": 5,
"<6": 4
},
"siteSubRatings": {
"Cleanliness": 9.6,
"Facilities": 9.2,
"Location": 9.6,
"Room comfort and quality": 9.3,
"Service": 9.5,
"Value for money": 8.4
},
"returnedReviews": {
"count": 10,
"averageRating": 9.6,
"oldestDate": "2024-05-25T03:07:00Z",
"newestDate": "2026-08-18T05:09:56Z"
}
}
},
"message": "Free summary. returnedReviews covers the 20 reviews this run returned. siteRating and siteReviewCount in bySite are each site's own figures for all of the hotel's reviews."
}

Each hotel once per run

When two inputs in one run reach the same hotel, the first one in your list scrapes it and each later one gets a free duplicate row. This covers a name and a URL for one hotel, a URL pasted twice, and two URL variants such as the-savoy.html and the-savoy.en-gb.html. The actor compares the site's own hotel ID, so you never pay twice for the same reviews. For this, every entry in hotelUrls counts as earlier in the list than any entry in hotelNames.

{"input": "The Savoy London", "status": "duplicate", "site": "booking", "hotelUrl": "https://www.booking.com/hotel/gb/the-savoy.html", "matchedHotel": "The Savoy, London, Greater London, United Kingdom", "message": "Same Booking.com hotel as the input https://www.booking.com/hotel/gb/the-savoy.html, so its reviews are listed once", "hotelId": "280149", "duplicateOf": "https://www.booking.com/hotel/gb/the-savoy.html"}

We tested 60 real hotel names on Booking.com (run m64YscdPzyfbXwzDF) and 50 on Agoda (run w0cRzFMU4LtVNgzlP) on 16 October 2026. The names cover luxury hotels, chains, boutique hotels and hostels in Europe, Asia, the Americas, Africa and Australia.

Booking.comAgoda
Names tried6050
Matched the right hotel and returned reviews5245
Matched a wrong hotel00
Ambiguous, free row with candidates32
Not found, free row53

Of the 5 Booking.com names not found, 2 never appear in Booking.com's own search box, Clink78 Hostel London and Hotel d'Angleterre Copenhagen. The other 3 are on Booking.com under another name. "Hotel Ritz Madrid" is now "Mandarin Oriental Ritz, Madrid", "Hostal Grau Barcelona" is "Eco Boutique Hostal Grau", and "Hôtel des Grands Boulevards Paris" is "Grands Boulevards Experimental". The actor does not guess at renamed hotels, so type the name the site shows now, or pass the URL. The 3 Agoda names not found were "Ibis Styles Bangkok Khaosan Viengtai", "Hotel G Singapore" and "The Manila Hotel", which Agoda's search box did not suggest for those words.

Output example

Real rows from a test run on 2026-10-10.

[
{
"status": "ok",
"site": "booking",
"hotelId": "14518094",
"hotelName": "Schlaffässer Ferienhaus Berger",
"hotelUrl": "https://www.booking.com/hotel/de/ferienhaus-berger-bad-karlshafen.html",
"reviewSource": "Booking.com",
"reviewId": "a52123065d1efb62",
"rating": 10,
"ratingScale": 10,
"title": "Ein tolles Erlebnis",
"positive": "Einfach alles spitze, die Vermieter super nett. Es ist alles vorhanden was man so braucht und es ist alles sehr sauber. Wir haben uns sehr wohl gefühlt.",
"negative": "Da gibt es nichts.",
"text": "Liked: Einfach alles spitze, die Vermieter super nett. Es ist alles vorhanden was man so braucht und es ist alles sehr sauber. Wir haben uns sehr wohl gefühlt.\nDisliked: Da gibt es nichts.",
"reviewerName": "Nadine",
"reviewerCountry": "Germany",
"reviewerCountryCode": "DE",
"travelerType": "Family",
"roomType": "Double Room with Garden View",
"nights": 2,
"checkInDate": "2026-08-28",
"checkOutDate": "2026-08-30",
"reviewDate": "2026-08-31T17:34:40Z",
"language": "de",
"helpfulVotes": 0,
"hotelResponse": "Vielen Dank für die tolle Bewertung! 😊 Es freut uns sehr, dass Sie sich bei uns wohlgefühlt haben. Bis zum nächsten Mal!",
"hotelResponseDate": null,
"input": "https://www.booking.com/hotel/de/ferienhaus-berger-bad-karlshafen.html"
},
{
"status": "ok",
"site": "agoda",
"hotelId": "344324",
"hotelName": "Residence & U",
"hotelUrl": "https://www.agoda.com/residence-u/hotel/goyang-si-kr.html",
"reviewSource": "Agoda",
"reviewId": "225149880",
"rating": 8.4,
"ratingScale": 10,
"title": "Very nice place",
"positive": null,
"negative": null,
"text": "This residence&u Near shop, restaurants, park, department store.\nThe room are very convenient and very clean.\nGm team and all staff very kindness and helpful.",
"reviewerName": "AKSORN",
"reviewerCountry": "Thailand",
"reviewerCountryCode": "TH",
"travelerType": "Business traveler",
"roomType": "Studio Double",
"nights": 5,
"checkInDate": "2019-06-12",
"checkOutDate": "2019-06-17",
"reviewDate": "2019-06-22T02:42:00Z",
"language": "en",
"helpfulVotes": 0,
"hotelResponse": "감사합니다.\n\n매번 킨텍스 행사를 통해서 오시는 손님들을 저희는 환영합니다.\n\n다음 번에 또 행사가 있으시면 또 방문 해 주시기 바랍니다.\n\n또 뵙기를 희망 합니다.",
"hotelResponseDate": "2019-07-03T01:50:45Z",
"input": "https://www.agoda.com/residence-u/hotel/goyang-si-kr.html"
}
]

When a hotel gives no reviews, you get one free row instead, for example:

{"input": "https://www.booking.com/hotel/no/luxury-arctic-cabin.html", "status": "no_reviews", "site": "booking", "hotelUrl": "https://www.booking.com/hotel/no/luxury-arctic-cabin.html", "message": "This hotel has no reviews"}

Other statuses are not_found (the URL or name points to no hotel), ambiguous (a name matches several hotels), mismatch (with both, the two sites picked different hotels), duplicate (an earlier input in the run already covers this hotel), invalid_url, invalid_input, error and partial (stopped part way, the reviews before the stop are kept). With hotelSummary on, the summary rows have status: "summary".

Pricing

Pay per event. One review event per review in your dataset.

ReviewsNo discountBronzeSilverGold
1,000$1.80$1.60$1.40$1.20
10,000$18.00$16.00$14.00$12.00
100,000$180.00$160.00$140.00$120.00

Bronze, Silver and Gold are Apify Store discount tiers, and Apify's Pricing tab shows them as Starter, Scale and Business. Apify decides which tier an account is on.

Status rows for failed, empty or duplicate hotels, summary rows, and searching hotel names, are never charged. If you set a maximum charge for a run, the actor stops cleanly when it is reached.

How it works

The actor reads the same public JSON that the hotel pages load in a logged-out browser. It does not render pages in a browser, so runs are fast and cheap. Booking.com returns 25 reviews per request and Agoda 50. Requests go through Apify residential proxies with a fresh IP on every block or empty answer.

In our test of 69 real hotels by URL (38 Booking.com, 31 Agoda, big city hotels and single holiday homes, run bKFygJYdKAjnJbiJE on 16 October 2026), 59 returned reviews. The 10 that returned nothing had no reviews in the site's review data.

More from heyitsgautham

Other actors from the same account.

FAQ

Do I need a Booking.com or Agoda account? No. The actor only reads what anyone can see without logging in.

Can I get all reviews of a hotel? Yes. Set maxReviewsPerHotel above the hotel's review count. Booking.com hotels with thousands of reviews page through 25 at a time.

Why do Agoda results include Booking.com reviews? Agoda shows reviews from its sister site on its own pages. The reviewSource field tells them apart, so you can filter them out.

Are reviews translated? No. You get the text in the language the guest wrote it. Use languages to keep only the ones you want.

Can I give a hotel name instead of a URL? Yes. Put it in hotelNames with the city, such as The Savoy London, and choose the site in nameSite. See Hotel names above.

Can I get one hotel's reviews from both Booking.com and Agoda? Yes. Set nameSite to both. The actor scrapes both sites only when the two listings are the same hotel by name, country and map pin. See Both sites from one name above.

Can I get the average score and score breakdown without reading every review? Yes. Set hotelSummary to true for one free summary row per hotel with the average, score bands, date range and each site's own rating and review count.

Can I search by city instead of hotel URL? Not in this actor. It takes hotel page URLs or hotel names, one hotel each.

Limitations

  • Only Booking.com and Agoda. Other domains return invalid_url.
  • Hotel names are searched on the site in nameSite, or on both with both. URLs always use their own site, and the actor does not look a URL's hotel up on the other site.
  • A name finds a hotel only when the site's search box suggests it. A hotel listed under a newer name needs that name or its URL.
  • newest order on Agoda follows Agoda's own list. Agoda keeps its own reviews and the Booking.com reviews it shows in separate blocks, so the two are not merged by date across pages.
  • Agoda language filtering supports these codes: en, fr, de, it, es, ja, zh, zh-cn, zh-tw, zh-hk, ko, ru, pt, pt-br, nl, th, ms, vi, sv, id, pl, no, cs, tr, ca, hu, he, ar, lv.
  • Booking.com does not publish a date for the hotel's reply.
  • Agoda sometimes answers with an empty or partial list. The actor checks several IPs and keeps the fullest answer, which adds a few seconds per Agoda hotel.
  • Both sites can change their pages at any time. If something breaks, open an issue and it will be fixed.