Agoda Reviews Scraper avatar

Agoda Reviews Scraper

Pricing

from $0.05 / 1,000 reviews

Go to Apify Store
Agoda Reviews Scraper

Agoda Reviews Scraper

Agoda reviews of any hotel, by URL, ID, name or a whole city: Agoda and Booking.com reviews with text, rating, date, traveler type, country and hotel reply. Filter by traveler type, language, rating and date; monitor new reviews. Export JSON, CSV or Excel.

Pricing

from $0.05 / 1,000 reviews

Rating

0.0

(0)

Developer

Nice Dev

Nice Dev

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

6 days ago

Last modified

Security

Limited permissions

Share

🏨 What is Agoda Reviews Scraper?

Agoda Reviews Scraper extracts the Agoda reviews of any hotel on Agoda, one row per review: score, title, full text, what the guest liked and disliked, date, traveler type, country, room, the hotel's reply and the hotel's own scores. It reads the reviews written on Agoda and the Booking.com reviews Agoda publishes, for one hotel, a list of hotels, a hotel found by its name, or every hotel of a city. It works as an Agoda reviews API alternative: run it on a schedule, call it from your code, or plug it into Make, Zapier or n8n.

Paste a hotel URL, type a hotel name or a city, click Start, and download the reviews in JSON, CSV or Excel. No login, nothing to set up: a page of up to 200 reviews (100 Agoda and 100 Booking.com) is read at a time, and a hotel with thousands of reviews is read to its last one (set Max reviews per hotel and Max reviews to 0: by default a run saves 100 reviews per hotel and 1,000 in all).

📋 What data can you extract from Agoda reviews?

One item per review, 62 fields:

CategoryWhat you get
⭐ Scorethe review score out of 10 and Agoda's word for it — 9.5, Exceptional
📝 The reviewtitle, full text, what the guest liked and what the guest disliked, the photos attached
🌍 Languagethe language it was written in; when Agoda translated it, the translation and the original text
🧳 The guestfirst name, country, traveler type (couple, solo, family, group, business), room, nights stayed, number of reviews written, expert reviewer
📅 Datesthe date and time of the review, check-in and check-out, the month of the stay
👍 Voteshow many guests found the review helpful or not helpful
💬 Hotel replythe hotel's answer, who signed it and when
🏨 The hotelid, name, link, city and country, overall score and Agoda's word for it, number of reviews and of written reviews, Agoda and Booking.com scores and counts apart, scores per criterion with the average Agoda compares them to (cleanliness, location, staff…), how many reviews fall in each score band
📍 Hotel detailsaddress, GPS position, stars, type of accommodation, what guests talk about (topics with their share of positive and negative mentions), the facilities they mention, the latest scores, scores per traveler type, Agoda's highlights (option)
🔗 SourceAgoda or Booking.com, the link to the reviews of the hotel, what you gave to find the hotel, the time of the run

Every field, with an example, is listed in the Output section below.

Fields marked hotel details in the Output tab (address, GPS position, stars, accommodation type, topics, facilities mentioned, latest scores, scores per traveler type, highlights) are filled when Add hotel details to each review is on (off by default).

✅ Why use Agoda Reviews Scraper?

  • 🏨 One row per review, Agoda and Booking.com together: each row says where the review was written and carries the hotel's name, scores and number of reviews, so a spreadsheet of a whole city needs no join.
  • 🌆 A hotel, a list, a name or a whole city in one run: URLs, hotel ids, hotel names and cities add up; a hotel met twice is read once.
  • 🎯 Filters Agoda does itself: traveler type (couples, families, solo…) and review language. The other reviews are never read, so you never pay for them.
  • 🔎 Filters on score, date, words and hotel reply: complaints only (reviewsMaxRating), the last 7 days, the reviews that mention breakfast or bed bugs, only the reviews the hotel answered.
  • 🔔 New reviews only: tick Only new reviews and schedule the Actor: each run returns, and charges as a review, only the reviews it never delivered before. With the default cap of 100 reviews per hotel, a later run usually reads only the first page of each hotel, where the reviews already known cost nothing; without a cap, each hotel is read to its last page, and each known review read again after its first page costs a small filter check (see Monitoring below).
  • ♾️ Every review of a hotel: thousands of reviews, read page after page and written as they come, nothing held back until the end.
  • 🌐 The review as written and as translated: Agoda translates reviews into the language of the site; the row keeps both.
  • 🔁 Same input and output names as other Agoda review scrapers: paste the JSON you already use, it runs as it is (see Tips).
  • 🔌 API, scheduling, monitoring, integrations (Make, Zapier, n8n, Google Sheets…) and JSON/CSV/Excel export via the Apify platform.

🚀 How to scrape Agoda reviews

  1. Create a free Apify account.
  2. Open Agoda Reviews Scraper and paste one or more Hotel URLs (the address of a hotel page on Agoda, in any language).
  3. Or type Hotel names (Park Hyatt Tokyo), Hotel IDs, or Cities (Bali): the first hotels of a city are read, up to Max hotels per city (10 by default).
  4. Set Max reviews per hotel (100 by default, 0 = every review) and click Start.
  5. Download the dataset in JSON, CSV, Excel or via API.

💰 How much does it cost to scrape Agoda reviews?

This Actor uses pay per event pricing: a price per review saved (one row per review), a price per hotel for the hotel details (Add hotel details to each review, off by default: the profile is read once per hotel, never per review), and a small price per run start. Filters Agoda does itself (traveler type, review languages) cost nothing more: the reviews they leave out are never read. Filters Agoda does not offer (score, dates, words, hotel reply, photos, season) are applied by the Actor on every review it reads: a review you keep costs its normal price, a review read and dropped by one of these filters costs a small filter check (filter-check). With Only new reviews, a review a previous run already delivered (or dropped) is never saved or charged as a review again: on the first page of a hotel it costs nothing, and read again on a later page it costs one filter check, once per run. See the Pricing tab for the amounts. Platform usage (compute, proxy) is included in the price.

⚙️ Input

Every review of one hotel (maxItems 0 lifts the cap of 1,000 reviews per run, which also stops a run with maxReviewsPerHotel 0):

{
"startUrls": [{ "url": "https://www.agoda.com/the-magani-hotel-and-spa/hotel/bali-id.html" }],
"maxReviewsPerHotel": 0,
"maxItems": 0
}

Hotels by name and by id, the latest English and French reviews of couples:

{
"hotelNames": ["Park Hyatt Tokyo"],
"propertyIds": ["335650"],
"travelerType": "couples",
"reviewLanguages": ["English", "Français"],
"reviewsSort": "newest",
"maxReviewsPerHotel": 100
}

Every 4-star hotel of a city, only the good reviews of the last year:

{
"locations": ["Bali"],
"minStars": 4,
"maxStars": 4,
"maxHotelsPerCity": 20,
"maxReviewsPerHotel": 50,
"reviewsMinRating": 8,
"reviewsAfter": "1 year"
}

Complaints that mention noise or bed bugs and that the hotel answered:

{
"propertyIds": ["335650"],
"reviewsSort": "lowest_rating",
"reviewsMaxRating": 5,
"keywords": ["noise", "bed bugs"],
"withResponseOnly": true
}

Monitoring: the new reviews of the hotels, every day:

{
"startUrls": [{ "url": "https://www.agoda.com/the-magani-hotel-and-spa/hotel/bali-id.html" }],
"onlyNew": true,
"stateKey": "magani-daily",
"maxReviewsPerHotel": 0,
"maxItems": 0
}
FieldNotes
startUrlsHotel pages copied from the address bar (any site language): one hotel per URL, its reviews up to maxReviewsPerHotel (100 by default). Max 1 000 URLs, e.g. https://www.agoda.com/the-magani-hotel-and-spa/hotel/bali-id.html.
propertyIdsAgoda hotel ids when you already have them, e.g. 335650. Added to the URLs.
hotelNamesHotels as you would type them on Agoda, e.g. Park Hyatt Tokyo: looked up in Agoda's own suggestions before the run (the log says which hotel each name gave).
locations, cityIdsCities as typed on the site (Paris, Bali) or Agoda city ids (15470): the reviews of the first hotels of each city, one search per destination (up to 100 in locations and 100 in cityIds).
maxHotelsPerCityHotels read per city, in the order of sortBy (10 by default; a big city holds about 4 500 hotels, keep it small).
sortByOrder of the hotels of a city: recommended (the default, the only stable one), review_high_to_low, review_low_to_high.
minStars, maxStarsHotel filter for a city: stars from 1 to 5, e.g. 4. Asked from Agoda: the other hotels are never read.
minHotelRating, minReviewCountHotel filter for a city: the hotel's own score out of 10, e.g. 8.5.
propertyTypesHotel filter for a city: Hotel, Apartment, Resort, Villa, Hostel, Guest House… A hotel given by URL, id or name is read whatever its type.
excludePropertyIdsHotel ids to skip even when a city lists them, e.g. 335650.
maxReviewsPerHotelCap on the reviews saved for each hotel, Agoda and Booking.com together: 100 by default, 0 = every review of the hotel. maxItems still caps the whole run: set it to 0 too to read them all.
maxItemsStop after this many reviews for the whole run, all hotels together (0 = unlimited, 1000 by default). A run it stops says so in its log and in its last message.
reviewsSortOrder of the reviews read: newest (default), highest_rating, lowest_rating, most_helpful. Agoda lists the reviews in the language of the site (and the ones it translated) first, then each other language apart, each group in this order: with a cap, the first ones in that order are kept.
reviewProvidersSources to keep: agoda, booking, or both (default). Both come in the same request at no extra cost.
travelerTypeReviews of one type of traveler, done by Agoda: all, business, couples, solo, families_young_children, families_teens, groups.
reviewLanguagesReviews written in these languages, done by Agoda: the English name (French), the name Agoda shows (Français, 日本語), an ISO code (fr) or Agoda's own number. English covers every English of the site. An unknown name is refused before the run, with the names accepted.
reviewsMinRating, reviewsMaxRatingScore bounds out of 10, e.g. 8 (0 = no bound). With Highest rating first or Lowest rating first the reading of a hotel stops at the bound.
reviewsAfter, reviewsBeforeReview date range: 2026-01-01 (the whole day), or a period before now (7 days, 3 months, 1 year). With Most recent first, once a review older than reviewsAfter is met, the older ones are skipped unread and not charged.
keywordsKeep the reviews whose text, title, liked part or disliked part holds one of these words, e.g. breakfast or bed bugs (whole words, case and accents ignored).
withResponseOnlyKeep only the reviews the hotel answered.
withPhotosOnlyKeep only the reviews with at least one guest photo.
seasonsKeep the stays of these seasons, read on the check-in date: mar_to_may, jun_to_aug, sep_to_nov, dec_to_feb. Booking.com reviews have no stay date: with this filter, only Agoda reviews are read, and the Booking.com ones are not charged.
languageLanguage of the site, e.g. en-us, fr-fr, ja-jp. Agoda translates some reviews into it: the row then holds the translation in reviewComments and the original in originalText and originalTitle.
includeHotelDetailsAdd the hotel's address, GPS position, stars and accommodation type, the topics and facilities guests mention, its latest scores, its scores per traveler type and Agoda's highlights to every review of the hotel (off by default, charged once per hotel).
onlyNew, stateKey, resetStateMonitoring: only the reviews never delivered under this memory key, e.g. magani-daily; resetState forgets the memory. A known review read again after the first page of its hotel costs a filter check. Change the key (or tick resetState once) when you change a filter.
AdvancedproxyConfiguration (Apify proxy by default, included in the price; the residential proxy is not available), maxConcurrency, minRequestIntervalMs, maxRequestsPerMinute, maxRequestRetries, debugLog.

📦 Output

A review as the run saved it (the two lists of scores per criterion are shortened to two criteria):

{
"id": 1185557602,
"hotelReviewId": 1185557602,
"source": "agoda",
"reviewProviderText": "Agoda",
"rating": 10,
"ratingText": "Exceptional",
"reviewTitle": "Magani hotel",
"reviewComments": "We have stopped at this hotel on 3 times previously the staff are amazing service very good and we are going to book there again for our 2027 holiday ",
"reviewPositives": null,
"reviewNegatives": null,
"reviewDate": "2026-09-23T11:11:00+07:00",
"checkInDate": "2026-09-03T00:00:00+07:00",
"checkOutDate": "2026-09-19T00:00:00+07:00",
"stayMonth": "September 2026",
"reviewerName": "John",
"reviewerCountryName": "Australia",
"reviewerCountryCode": "au",
"reviewerGroupName": "Couple",
"reviewerRoomTypeName": "Deluxe Room",
"reviewerLengthOfStay": 16,
"helpfulVotes": 0,
"unhelpfulVotes": 0,
"language": "en",
"translatedTo": null,
"originalTitle": null,
"originalText": null,
"responseText": null,
"responderName": null,
"responseDate": null,
"reviewImages": [],
"isExpertReviewer": false,
"reviewerReviewCount": 0,
"reviewUrl": "https://www.agoda.com/the-magani-hotel-and-spa/reviews/bali-id.html",
"hotelId": 335650,
"hotelName": "The Magani Hotel and Spa",
"hotelUrl": "https://www.agoda.com/the-magani-hotel-and-spa/hotel/bali-id.html",
"city": null,
"country": null,
"hotelRating": 9.1,
"hotelRatingText": "Exceptional",
"hotelReviewCount": 3964,
"hotelWrittenReviewCount": 2828,
"agodaReviewsCount": 2294,
"bookingReviewsCount": 1615,
"agodaAggregateReviewScore": 9,
"bookingAggregateReviewScore": 9.4,
"ratingDistribution": {
"exceptional": 1415,
"excellent": 452,
"veryGood": 128,
"good": 68,
"belowExpectation": 42
},
"sourceInput": "https://www.agoda.com/the-magani-hotel-and-spa/hotel/bali-id.html",
"hotelAddress": null,
"latitude": null,
"longitude": null,
"starRating": null,
"accommodationType": null,
"agodaAggregateDetailedReviewScore": [
{ "id": "cleanliness", "score": 9.2, "cityAverage": 8.7 },
{ "id": "location", "score": 9.2, "cityAverage": 8.1 }
],
"bookingAggregateDetailedReviewScore": [
{ "id": "cleanliness", "score": 9.5, "cityAverage": 8.9 },
{ "id": "location", "score": 9.5, "cityAverage": 8.5 }
],
"reviewTopics": null,
"facilityMentions": null,
"agodaRecentScores": null,
"bookingRecentScores": null,
"travelerTypeScores": null,
"recommendationHighlights": null,
"scrapedAt": "2026-10-01T09:30:00.000Z"
}

You can download the dataset in various formats such as JSON, HTML, CSV or Excel.

All 62 fields

FieldsWhat you get
id, hotelReviewId1185557602: Agoda's id of the review (both fields hold it; it is what onlyNew and the de-duplication use)
source, reviewProviderTextagoda, booking.com (or another site Agoda republishes), and the source as Agoda writes it: Agoda, Booking.com
rating, ratingText9.5 out of 10, Exceptional (the site's word, from 6 up: below 6 it prints the number alone and ratingText is null)
reviewTitle, reviewCommentsthe title and the full text (in the site language when Agoda translated it)
reviewPositives, reviewNegativeswhat the guest liked and disliked (Booking.com reviews give them, Agoda reviews give the text instead)
reviewDate2026-09-23T11:11:00+07:00, date and time of the review in the site's time zone
checkInDate, checkOutDate, stayMonththe stay reviewed: 2026-09-03T00:00:00+07:00, September 2026
reviewerName, reviewerCountryName, reviewerCountryCodeJohn, Australia, au
reviewerGroupName, reviewerRoomTypeName, reviewerLengthOfStayCouple, Deluxe Room, 16 nights
helpfulVotes, unhelpfulVoteshow many guests voted the review helpful or not
language, translatedTothe language it was written in (en) and the one Agoda translated it into (null when it did not)
originalTitle, originalTextthe title and the text as the guest wrote them, only when Agoda translated the review
responseText, responderName, responseDatethe hotel's answer, who signed it, when (ISO 8601 date and time with the site's time zone, like reviewDate: 2026-09-02T23:06:07.533+07:00; null when the hotel did not answer)
reviewImagesthe photo URLs the guest attached
isExpertReviewer, reviewerReviewCountwhether Agoda marks the guest as an expert reviewer, and how many reviews the guest wrote
reviewUrlthe review page of the hotel on Agoda, the same whatever the way the hotel was given
hotelId, hotelName, hotelUrl335650, The Magani Hotel and Spa, the link of the hotel's page on Agoda (for a hotel given by id or name, with no results page and no profile read: a link to Agoda's search of the hotel's city with the hotel selected)
city, countrythe hotel's city and country: given by a city search; for a hotel given by URL, id or name, filled with Add hotel details to each review
hotelRating, hotelRatingText, hotelReviewCountthe hotel's combined score, Agoda's word for it and its number of reviews: 9.1, Exceptional, 3964 (a hotel with no combined score on Agoda: its Agoda score, and its Agoda and Booking.com reviews added up)
hotelWrittenReviewCounthow many of those reviews have a text: 2828 (Agoda lists only these, the others are scores alone); null for a hotel with no combined score
agodaReviewsCount, bookingReviewsCountreviews written on Agoda and Booking.com reviews published on Agoda: 2294, 1615
agodaAggregateReviewScore, bookingAggregateReviewScorethe hotel's score from each source: 9, 9.4
agodaAggregateDetailedReviewScore, bookingAggregateDetailedReviewScorethe hotel's scores per criterion for each source: cleanliness, facilities, location, room comfort, staff performance, value for money, each with cityAverage, the average Agoda compares it to (for example the 5-star hotels of the area)
ratingDistributionhow many of Agoda's own reviews of the hotel fall in each band: exceptional (9+), excellent, very good, good, below expectation (Booking.com's when Agoda has none: the bands do not add up to hotelReviewCount)
sourceInputwhat you gave that led to this hotel, as you typed it: the link (query included), the id, the name or the city
hotelAddress, latitude, longitude, starRating, accommodationTypethe hotel details (address, GPS position, stars, type), only with Add hotel details to each review
reviewTopicshotel details: what guests talk about: { "topic": "Location", "mentions": 105, "positivePercent": 98, "neutralPercent": 0, "negativePercent": 1, "rating": "Excellent" }
facilityMentionshotel details: the facilities guests mention, per source: { "source": "agoda", "facility": "Swimming pool", "mentions": 109 }
agodaRecentScores, bookingRecentScoreshotel details: the latest scores Agoda shows for each source: [10, 10, 8.4, 9.6]
travelerTypeScoreshotel details: the score, number of reviews, scores per criterion and score bands for each type of traveler and source (couples, solo, families, groups, business)
recommendationHighlightshotel details: Agoda's short highlights of the hotel: Excellent rating for service and cleanliness
scrapedAtISO timestamp of the run

💡 Tips

How to get more reviews

Set maxReviewsPerHotel to 0 for every review of a hotel (The Magani, Bali: 1,506 reviews, all read), and maxItems to 0 to lift the cap of the run. For a whole city, raise maxHotelsPerCity.

How to reduce costs

The price is per review, so the levers are maxReviewsPerHotel, maxItems, maxHotelsPerCity and the filters. The filters Agoda does itself (travelerType, reviewLanguages) are the cheapest way to narrow a run: the other reviews are never read. A review dropped by reviewsMinRating, reviewsMaxRating, reviewsAfter, reviewsBefore, keywords, withResponseOnly, withPhotosOnly or seasons costs only the filter check, lower than a review, and the run summary tells how many were dropped. Leave Add hotel details to each review off unless you need the address or the GPS position: the hotel's name, city (for a hotel found in a city), scores per source and per criterion and counts are on every row anyway. onlyNew for recurring runs: you never pay twice for the same review. Keep Max reviews per hotel at 100 for daily monitoring: a later run reads no further than where that cap stopped the earlier one (usually the first page of each hotel), and the reviews already known there cost nothing. With 0, every page of the hotel is read again and each known review on a page after the first costs a filter check (a hotel of 1,500 reviews: about 1,300 checks a run).

Filters done by Agoda and filters done by the Actor

Agoda filters by traveler type and by review language itself (and, through the API, by room type: roomTypeIds takes the numbers of the room filter of the hotel page). It has no filter on the score, the date, a word, the hotel's reply, the photos or the season: the Actor reads the reviews and drops the ones you did not ask for, each one charged a filter check. Two ways to pay less: Most recent first with reviewsAfter skips, unread and not charged, the reviews older than the date once one is met; Highest rating first with reviewsMinRating (or Lowest rating first with reviewsMaxRating) does the same past the bound. Agoda sorts each language apart (the language of the site first), so a hotel is still read to its last page: a review in another language within your dates comes out too. A cap of maxReviewsPerHotel counts the reviews that pass the filters: the hotel is read until that many are kept, or to its last review.

Several hotels and cities in one run

Fill startUrls, propertyIds, hotelNames, locations and cityIds together: the sources add up, a hotel met twice is read once and its rows say which source found it first (sourceInput): propertyIds, then hotelNames, then the links (startUrls, hotelUrl). The reviews of a city are those of its first hotels in the order of sortBy, filtered by minStars, maxStars, minHotelRating, minReviewCount and propertyTypes.

Monitoring: only the new reviews

Tick Only new reviews (onlyNew) and schedule the Actor. The first run returns everything; each later run skips the reviews already delivered, and the ones your filters already dropped: they are not saved again and never charged as reviews (one exception: a review only too recent for a Reviews before given as a period like 1 month is read again, with its small filter fee, until the period reaches it; then it comes out). Agoda lists the reviews by language (the language of the site first, then each other language), so each hotel is read to its last page: a new review in another language is not missed. On the first page of each hotel (up to 100 reviews of each source), the reviews already known cost nothing; each known review read again on a later page costs one filter check (filter-check), once per review and per run. With Max reviews per hotel above 0, a later run reads no further than where that cap stopped the earlier one: a run right after it returns nothing, and a new review comes out when Agoda lists it within those first reviews (set it to 0 to catch every new review, at the price of reading, and checking, every page again). The memory lives in a named key-value store of your account (agoda-reviews-scraper-seen, up to 150,000 reviews per key) and is only updated with reviews that really reached the dataset, so a failed run never hides anything. Give each schedule its own stateKey (two schedules sharing a key would hide each other's reviews), and tick resetState once to start over. Changing a filter (score, dates, keywords, replies)? Use a new stateKey, or tick resetState once: the reviews the old filter dropped are remembered, and would not come back under the same key. A list of more than about 70 hotels where almost nothing is new may end with "Stopped early: most reviews found were already delivered…" before its last hotels: split it into several tasks.

Already using another Agoda reviews scraper?

The input of the other Agoda review scrapers runs here as it is: hotelUrl and hotelUrls (a link or an id), enabledProviders (Agoda, Booking.com), languages (the same as reviewLanguages; a regional code such as en-us or ja-jp is read as its language), cutoffDate, reviewsStartDate and fromDate (the same as reviewsAfter), toDate (the same as reviewsBefore), rating (exceptional, excellent, very_good, good, below_expectation: bands that do not touch are kept as they are, such as exceptional and good) aggregateRatings, maxItemsPerSearch (the same as maxReviewsPerHotel), includeOtherSites (false = Agoda reviews only) and ratingFilter (a minimum score or score bands). The orders of reviews of the others are read too: sortBy or reviewsSort set to newest, recent, most_recent or mostHelpful is Reviews order. language is ONE site locale (en-us): a competitor's language written as a list (["en", "fr"]) is refused by the form, give the review languages in reviewLanguages instead. The names of the reviews are theirs too: hotelReviewId, reviewTitle, reviewComments, reviewerCountryName, reviewerGroupName, responseText, agodaAggregateReviewScore… A pipeline built on their output reads these rows without a change. For example:

{
"hotelUrl": "https://www.agoda.com/the-magani-hotel-and-spa/hotel/bali-id.html",
"rating": ["excellent", "exceptional"],
"enabledProviders": ["Agoda", "Booking.com"],
"maxReviewsPerHotel": 100,
"aggregateRatings": true
}

🔌 Integrations and API

Call the Actor via the Apify API, the JavaScript or Python clients, or connect it with integrations and webhooks (Make, Zapier, n8n, Google Sheets, Slack, Airtable…). The dataset can be fetched as JSON or CSV from any tool.

🤖 Use with AI agents (MCP)

AI agents (Claude, ChatGPT, Cursor…) can find and run this Actor through the Apify MCP server, billed to their Apify account like any run. It returns one item per Agoda review. Actor id: nice_dev/agoda-reviews-scraper; MCP server with this Actor only: https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/agoda-reviews-scraper.

Smallest input, for a cheap first call:

{
"startUrls": [{ "url": "https://www.agoda.com/the-magani-hotel-and-spa/hotel/bali-id.html" }],
"maxReviewsPerHotel": 10
}

Key output fields: hotelName, rating, reviewTitle, reviewComments, reviewDate, reviewerCountryName, reviewerGroupName, source and hotelRating.

Cost: see the pricing section above and the Pricing tab. Cap each call with maxReviewsPerHotel and maxItems and, through the API, with the run option maxTotalChargeUsd.

❓ FAQ

The Actor only reads what Agoda shows publicly to any anonymous visitor. It logs in to nothing. Reviews can contain personal data (a first name, a country, a photo), which is protected by GDPR: do not store it without a legitimate reason. You are responsible for using the data in compliance with Agoda's Terms of Use and applicable law. This Actor is not affiliated with Agoda or Booking.com.

Does it need a login or a proxy?

No login. The proxy is included in the price: leave the default setting (the residential proxy is not available). A request the site turns away is retried at once on a new proxy session (without a proxy, after a pause of 5 seconds, doubled at each retry up to 150 seconds).

Is the data safe to open in Excel or to show on a web page?

Reviews are the guests' own words, copied as they are. A text can begin with -, +, = or @ (a title such as -20% on the bill): Excel and Google Sheets may read such a cell of a CSV file as a formula or as a number. The Actor leaves the text as it is, so that the JSON and the API give the real value: when you open a CSV, import these columns as text. On a web page, escape every field like any text written by a stranger. The photo and link fields hold an http(s) URL or nothing.

Known limitations

  • Agoda lists a hotel's reviews by page of 100 Agoda and 100 Booking.com reviews: maxReviewsPerHotel up to 100 costs one request per hotel, and each 100 more reviews of a source one more.
  • The order is Agoda's: the reviews in the language of the site (and the ones Agoda translated) come first, then each other language apart, each group sorted (Most recent first, Highest rating first…), and the Actor sorts each page of up to 200 within it. With a cap, the reviews kept are the first ones in that order: not always the N most recent or best of the whole hotel (a recent review in another language may come after older ones in the language of the site). Without a cap (0) every review is returned.
  • Traveler type is one type at a time. A language a hotel has no review in gives no review for that hotel, not an error.
  • Agoda has no filter on the score, the date, a word or the hotel's reply: they are applied by the Actor, which has to read the reviews first (see Pricing).
  • Agoda sometimes answers a page of reviews without the reviews it counts: the Actor asks for that page again, alone, up to 10 times — never the whole hotel again. A page still empty (or blocked, or out of time) leaves the hotel with the reviews read so far, counted in the run's summary and listed in the FAILED_REQUESTS record; a hotel with none of them gives no row and is not charged.
  • A hotel or a search the site does not know (a name with no suggestion, an id with no reviews page, a search URL that answers 404) is skipped and named in the log, the others go on; the run's last line counts it ("1 source of the input not found"). A run where nothing given is known ends without reviews, and its last message names the first one.
  • onlyNew remembers review ids, not their content: a review edited or answered by the hotel since is not returned again.
  • With onlyNew, a review a filter dropped stays dropped under the same stateKey. One exception: a review too recent for a Reviews before given as a period (1 month) is read again, with its small filter fee, until the period reaches it; then it comes out.
  • Two runs sharing the same stateKey at the same time may both return the same new review.
  • A run that reads far more reviews than it saves stops early, always at the same place, with "Stopped early" in its last message, and the last hotels of its list are not read. It happens with a filter that keeps very few of the reviews read, like a narrow date range, over big hotels (each hotel is read to its last page), or with a list of more than about 70 hotels under Only new reviews when almost nothing is new (the first page of each hotel is read for free). Split the list into several tasks (about 5 big hotels each for a narrow date range).

A run that reaches its timeout stops itself about 45 seconds before it: no new page is asked, what it read is saved and, with onlyNew, remembered, and the run ends Succeeded with "Stopped before the run's timeout". Resurrect it to go on from there, or give the next run a longer timeout (Run options).

A run the platform stops without warning (out of memory, run timeout)

  • Resurrect it: it goes on from where it stood at most a minute before the stop. What it had read since is read again, and the reviews already saved are skipped: none is delivered or charged twice, and maxItems still counts them.
  • With onlyNew, the memory is saved after each write (at most once every 2 seconds): resurrect the stopped run and the reviews it had saved meanwhile join the memory; leave it stopped for good, and the next run may return the reviews of its last 2 seconds once more.

Something doesn't work?

The last line of the log counts the reviews saved, the hotels read, the reviews filtered out, the reviews already delivered by a previous run, the sources of the input not found, and the requests that failed after every retry. Those requests are listed, with the reason, in the FAILED_REQUESTS record of the run's key-value store; the sources not found are named in the log. A run that saved nothing and had failed requests fails, and its last message gives the cause — run without a proxy and refused by Agoda on every try, it says to keep the proxy on, instead of "run it again". A run that saved reviews but lost most of its requests for good (at least as many failed requests as pages read, for example 9 hotels of 10 refused) fails too, with its reviews kept: run it again.

If Agoda changes its pages, you are told instead of paying for blank rows. If the first 20 reviews read all lack their score, date, source, title, guest name, traveler type or hotel name — or if Agoda stops giving the reviews' ids or its list of review sources — the run saves nothing more, stops and fails, and its last message names the missing field: at most those first reviews are charged. A run of fewer reviews (a scheduled onlyNew run that finds a few new ones, a small Max reviews per hotel) is checked at its end, from 5 reviews: its reviews are already saved, and the run fails with the missing field instead of ending green.

🛟 Support

Open an issue in the Issues tab with a link to your run: the run log and the FAILED_REQUESTS record of the key-value store show exactly which hotels or pages failed and why.