Here is the thing most people hit when they try to scrape Agoda reviews: there is no public endpoint you can just call. Agoda's partner and affiliate APIs cover rates and availability only. None of them let you read a property's guest reviews. So the moment you want the actual words guests wrote, you are on your own.
And it gets trickier. The reviews you see on an Agoda hotel page are not in the HTML you get from a plain request. They load separately, after the page. On top of that, Agoda serves reviews in 33 languages, and by default they are fragmented across those languages, so a naive scrape gives you a lopsided slice of what guests actually said.
This post shows the honest Python starting point, why it stalls, and then a no-code shortcut that returns clean rows with one call. If you would rather read a longer writeup, there is a full how to scrape Agoda reviews guide on our site too.
What you can pull from a review
Every review row includes the core identity (hotelId, hotelName, hotelUrl, reviewId, source), the rating on Agoda's 0 to 10 score scale plus a word label (score, ratingText), the written content (title, text, and where available positives / negatives), the stay context (travelerType, roomType, checkInDate, checkOutDate, lengthOfStay), the reviewer basics (reviewerName, reviewerCountry), the date (reviewDate), any attached reviewPhotos, the hotel's ownerResponse if the property replied, and a markdownContent block that is ready to drop straight into an LLM prompt.
One honesty note: positives and negatives (the split liked / disliked fields) are usually empty for Agoda-native reviews. Agoda's own reviews come as one body of text. The separated liked / disliked structure mostly shows up on reviews sourced from Booking.com or Priceline, which you can optionally pull in. Do not build a pipeline that assumes every review has neat liked / disliked lists, because most will not.
Why scraping Agoda reviews is hard
- There is no public reviews API. The official Agoda APIs are for rates and availability, so reviews are simply not on offer through a supported channel.
- Reviews load dynamically. The hotel page HTML you get from a simple GET does not contain the structured review text, so parsing the page source gets you nothing useful.
- Language fragmentation. With 33 review languages, a single-pass scrape tends to return whatever the page defaults to, not the full picture.
- Two scoring worlds. Agoda uses a 0 to 10 score, not 1 to 5 stars, so any tooling that assumes a five-star scale will mangle your data.
- Blocking and URL shape. Hotel URLs vary by region and Agoda actively guards against automated access. Handling that reliably is a project on its own.
Three ways to get the data
| Approach | Setup | Handles blocking + dynamic load | Reviews coverage | Cost model |
|---|---|---|---|---|
| DIY Python | You write and maintain it | You build it yourself | Whatever you can reach | Your time + proxies |
| Agoda Hotel Reviews Scraper (Apify) | Paste a URL or ID | Yes, done for you | All reviews, all 33 languages, optional extra sources | Pay per review returned |
| Official Agoda API | Partner account | N/A | None, reviews are not offered | Not available |
Option A: DIY in Python
Start where everyone starts, a request to the hotel page. The problem shows up immediately: the review text is not in the response body.
import httpx
url = "https://www.agoda.com/bayswater-inn-hotel/hotel/london-gb.html"
r = httpx.get(url, headers={"User-Agent": "Mozilla/5.0"}, timeout=30)
print(r.status_code)
print("reviewComment" in r.text) # -> False, the reviews are not in the page HTML
The reviews arrive through a separate call the page makes after it loads, and that call is guarded. To do this properly you would reverse engineer that flow, rotate proxies, deal with region-specific URL shapes, page through results, normalize the 0 to 10 score, and keep it all working as the site changes. Doable, but it is a maintenance job, not a one-off script.
Option B: the no-code / API shortcut
If you would rather skip the maintenance, the Agoda Hotel Reviews Scraper on Apify does the fetching, paging, and normalizing for you. The actor handles blocking and URL resolution for you, so you just hand it hotels and get rows back.
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("factden/agoda-hotel-reviews-scraper").call(run_input={
"hotelUrls": ["https://www.agoda.com/bayswater-inn-hotel/hotel/london-gb.html", "11019"],
"maxReviews": 500,
"sortBy": "newest",
"reviewSources": ["agoda"],
"languages": [],
})
for review in client.dataset(run["defaultDatasetId"]).iterate_items():
print(review["score"], review["ratingText"], review["text"][:60])
A few things worth knowing:
- You can paste full Agoda hotel URLs or bare numeric hotel IDs like
"11019". Mix and match in the same list. -
languages: []means give me everything in one combined stream. Pass a subset of Agoda's 33 languages if you only want specific ones. -
reviewSources: ["agoda"]keeps it Agoda-native. Add Booking.com or Priceline, or clear the list to pull all sources. - Filter with
sortBy,fromDate/toDate, andminRating/maxRating(remember, that is on the 0 to 10 scale). - There are two datasets. The default Reviews dataset is one row per guest review. The Hotels dataset gives you one aggregate row per hotel with the overall score, review counts, per-source breakdown, and location.
Track reputation over time
Reviews are most useful as a trend, not a snapshot. Set fromDate to the day after your last pull and put the run on an Apify Schedule (say, every morning). Each run then grabs only the reviews posted since last time, so you build an incremental reputation feed for a property or a whole competitive set without re-pulling history.
What comes back: the fields per review
| Group | Fields |
|---|---|
| Core |
hotelId, hotelName, hotelUrl, reviewId, source
|
| Rating |
score (0 to 10), ratingText
|
| Text |
title, text, positives, negatives
|
| Stay |
travelerType, roomType, checkInDate, checkOutDate, lengthOfStay
|
| Reviewer |
reviewerName, reviewerCountry
|
| Dates + owner |
reviewDate, ownerResponse
|
| Media | reviewPhotos |
| AI-ready | markdownContent |
A trimmed sample row:
{
"hotelId": 11019,
"hotelName": "Park Avenue Bayswater Inn Hyde Park",
"hotelUrl": "https://www.agoda.com/bayswater-inn-hotel/hotel/london-gb.html",
"reviewId": "1149287470",
"source": "Agoda",
"title": "Above average",
"text": "All in all good hotel, can't complain but wasn't the best.",
"score": 6,
"ratingText": "Good",
"reviewDate": "2026-07-20",
"reviewerName": "Tiffany",
"reviewerCountry": "Australia",
"travelerType": "Couple",
"roomType": "Double Room",
"checkInDate": "2026-07-03",
"checkOutDate": "2026-07-07",
"lengthOfStay": 4,
"ownerResponse": null,
"markdownContent": "# Park Avenue Bayswater Inn Hyde Park review (Agoda)\n\n**Score:** 6/10 - Good\n..."
}
Grab a free sample dataset
Want to see the real shape before running anything? Download the free sample dataset and inspect the exact fields, including a few reviews with photos and owner responses.
FAQ
Is there an official Agoda reviews API? No. Agoda's partner and affiliate APIs are for rates and availability. There is no supported way to read a property's guest reviews, which is the gap this actor fills, with no key and no partner account.
Do I need to find hotel IDs? No. Paste the normal Agoda hotel URL and you are done. If you happen to have the numeric ID, you can pass that instead, either works.
Can I get reviews in a specific language? Yes. Agoda carries 33 review languages. Leave languages empty for all of them in one stream, or pass the ones you want.
Why are positives and negatives empty on some reviews? Agoda-native reviews come as a single block of text, so the split liked / disliked fields are usually null. Those fields populate mainly on reviews sourced from Booking.com or Priceline.
How does pricing work? Pay per review returned, with no start fee, and nothing at all if a run returns zero reviews. Rates run from 4.00 USD per 1,000 reviews down to 2.00 USD per 1,000 at higher volume.
Can I monitor reviews on a schedule? Yes. Combine fromDate with an Apify Schedule to pull only new reviews each run and build an incremental reputation feed. Full walkthrough in the Agoda hotel reviews API listing and the docs repo.
Related
- Expedia Hotel Reviews Scraper if you need the same for Expedia.
- Trip.com and Ctrip Reviews Scraper for Trip.com and Ctrip properties.
- Doing B2B software instead of hotels? See how to scrape G2 reviews.
Questions, or a field you wish it extracted? Drop a comment.
Top comments (0)