DEV Community

Nikita Iakovlev
Nikita Iakovlev

Posted on

Hotel Review Data in 2026 — Why Agoda Gives You Two Datasets for the Price of One

If you're collecting hotel review data, Agoda is the source most people skip and the one with the most on it. Not because it has more reviews than Booking.com, but because it carries both.

Agoda was bought in 2007 by priceline.com, the company that renamed itself Booking Holdings in 2018 and also owns Booking.com, Kayak and OpenTable. One consequence is visible on almost every hotel page: Agoda displays its own guest reviews and Booking.com's, served by separate review providers behind the same page.

A real example, pulled this month:

{
  "type": "hotel",
  "name": "The Magani Hotel And Spa",
  "hotelId": 335650,
  "agodaReviewCount": 1347,
  "bookingReviewCount": 1025
}
Enter fullscreen mode Exit fullscreen mode

That's 2,372 reviews for one mid-sized Bali hotel as of 4 September 2026, from two review pools with different reviewer bases, reachable through one page.

Why hotel review data is harder than it looks

There is no public API. Agoda has an affiliate and partner program with data access for approved partners. For everyone else — an analyst, a hotel owner benchmarking competitors, a developer building a comparison tool — there's the website.

Review counts on the page don't match what the page shows. A hotel page displays a paginated slice of reviews. The provider structure isn't visible in the HTML — you have to know that provider 332 is Agoda's own pool and 3038 is Booking.com's, and request each separately, or you silently collect half the data and never know.

The interesting fields aren't in the review text. Rating and comment are the easy part. Traveler type, room type booked, length of stay and reviewer country are what make the data analysable, and they're attached to the review record rather than rendered as prose.

Prices and availability are dynamic; reviews are not. This is the part that makes reviews the more useful target. A scraped price is stale in an hour. A review stays true to what its author wrote, give or take the occasional edit or deletion, which means a review dataset compounds while a price dataset decays.

What a review record actually contains

Real output, one review, unedited:

{
  "type": "review",
  "hotelId": 335650,
  "hotelName": "The Magani Hotel And Spa",
  "source": "agoda",
  "reviewId": 1175631129,
  "rating": 8.4,
  "title": "Magani",
  "text": "Great location, lovely staff , great breakfast & comfy bed",
  "reviewDate": "September 03, 2026",
  "checkInDate": "August 2026",
  "reviewerName": "Natalie",
  "reviewerCountry": "au",
  "travelerType": "Couple",
  "roomType": "Deluxe Room Double Bed",
  "lengthOfStay": 1,
  "reviewProvider": "Agoda",
  "helpfulVotes": 0
}
Enter fullscreen mode Exit fullscreen mode

Four fields there are worth more than the review text.

reviewerCountry turns a review set into a demand map. Which markets actually book this property, and how do their ratings differ? Australian and Chinese guests rate the same Bali hotel differently, consistently, and if you run a property you need to know in which direction.

travelerType — Couple, Solo, Family with young children, Business — segments the ratings. A hotel averaging 8.4 might be a 9.1 for couples and a 6.8 for families, and the average hides the entire problem.

roomType attributes complaints to inventory. If the 4-star average is being dragged down by one room category, that's an operational fix, not a marketing one.

lengthOfStay separates the one-night airport stopover from the week-long stay. They are different products reviewed on the same page.

checkInDate matters more than reviewDate: it tells you when the guest was actually there, which is what you need to correlate a rating drop with a renovation, a management change or a rainy season.

Who uses this

Hotel operators benchmarking competitors. Five properties in the same district, all their reviews for the last two years, segmented by traveler type. The gaps are specific and actionable in a way that a star rating never is.

Revenue managers. Rating movements lead pricing power. A property whose cleanliness sub-score has fallen half a point over two quarters will lose rate before it loses occupancy.

Investors and acquirers. Reviews are the only public operational data on a private hotel. Trajectory over three years, complaint themes, and whether ratings recovered after the last renovation.

Travel product builders. Aggregating reviews across sources for a comparison site, a recommendation engine, or a chatbot that answers "quiet hotel in Ubud, good for families" from evidence instead of marketing copy.

Sentiment and NLP work. Hotel reviews are unusually good training data: a numeric rating attached to free text, in dozens of languages, with structured metadata about who wrote it.

Running it

Agoda Reviews Scraper takes hotel page URLs and handles both review providers.

{
  "startUrls": [
    { "url": "https://www.agoda.com/the-magani-hotel-and-spa/hotel/bali-id.html" }
  ],
  "maxReviewsPerHotel": 500,
  "reviewsProvider": "all",
  "reviewsSort": "recent"
}
Enter fullscreen mode Exit fullscreen mode

reviewsProvider accepts agoda, booking or all. Use all unless you specifically want one pool. Note that these are the two large providers, not the only ones — some properties also carry smaller pools from regional partners, which this run doesn't pull.

From the API:

curl -X POST "https://api.apify.com/v2/acts/lergassy~agoda-reviews-scraper/runs" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN" \
  -d '{
    "startUrls": [{"url":"https://www.agoda.com/the-magani-hotel-and-spa/hotel/bali-id.html"}],
    "maxReviewsPerHotel": 200,
    "reviewsProvider": "all"
  }'
Enter fullscreen mode Exit fullscreen mode

Output is one hotel row per property with both review counts, then one review row per review. Sort options are recent, highest rating and lowest rating — and lowest-first is usually the more useful run, because the complaints cluster and the praise doesn't.

What you don't get

No prices. Review extraction and price extraction are separate problems, because prices depend on dates, occupancy and currency. For dated hotel pricing with the rate for your own check-in and check-out, that's Trip.com Scraper.

No reviewer identity beyond a first name and country. That's all Agoda publishes, and it's the right amount.

Hotel replies are hit and miss. Agoda does publish management responses, but adoption varies wildly by property — some hotels answer nearly every review, plenty answer none. Don't build an analysis that assumes replies exist.

Review counts vary by provider availability. Some properties have a large Agoda pool and almost no Booking.com reviews, or the reverse. The hotel row reports both counts before any reviews are pulled, so you can check coverage before committing to a large run.

Build versus buy, honestly

The hard parts here aren't conceptually hard: find the hotel id from a URL slug, call the review endpoint per provider, page through, normalise dates. A competent developer does the first version in a day.

The cost is the second year. Hotel ids get reassigned, the provider list changes per property, date formats differ by locale, and the endpoint shape shifts without notice. It's not difficult work, it's unscheduled work, arriving on the day you need the data.

The actor is free to run while it's new — you pay Apify's platform usage and nothing per review — which makes the build-versus-buy arithmetic hard to argue with. Build it if hotel data is your product. Don't if hotel data is an input to your product.


Actor: apify.com/lergassy/agoda-reviews-scraper

Related: Trip.com Scraper for dated hotel prices and ratings, Google Flights Scraper for airfare on the same trip.

Top comments (0)