# Agoda Reviews Scraper (`tidyharvest/agoda-reviews-scraper`) Actor

Export Agoda and Booking.com guest reviews for any number of hotels in one run: ratings, text, dates, reviewer details, hotel replies, hotel scores. Newest first, filters, only-new mode. Built to beat Fast Agoda Reviews Scraper: from $2.60 per 1,000, no start fee.

- **URL**: https://apify.com/tidyharvest/agoda-reviews-scraper.md
- **Developed by:** [TidyHarvest](https://apify.com/tidyharvest) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.60 / 1,000 review scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Agoda Reviews Scraper

Export **Agoda guest reviews** and the **Booking.com reviews Agoda shows beside them** for as many hotels as you like in one run. Every review comes with its rating, title, written text (with the positives and negatives when the guest split them), stay dates, reviewer country, traveler type and room, the hotel's reply, and the hotel's own scores. Results come **newest first**, so a cap of 100 gives you the latest 100.

Built to beat Fast Agoda Reviews Scraper, the most used Agoda reviews actor: **several hotels per run** (it takes one), **newest-first ordering** (its rows come back in no date order), **no start fee**, and from **$2.60 per 1,000 reviews** against its $6.00 per 1,000 plus a $0.02 start fee per run on the Free plan ($3.00 plus $0.002 on the highest plan).

### What you can do with it

- **Monitor your own hotel or a competitor's:** run it on a schedule with *Only reviews not returned before* and get just the new reviews each time.
- **Compare hotels in a market:** put 50 hotels in one run and rank them by score, sub-score and recent trend.
- **Find what guests complain about:** filter by rating band, traveler type or keyword ("noise", "breakfast", "wifi") in any language.
- **Feed a sentiment or topic model:** clean text, language code and dates for every review.

### Input

| Field | What it does |
|---|---|
| `hotelUrls` | One hotel per line: its Agoda page URL (hotel or reviews page), numeric hotel ID, or the hotel's name. |
| `matchesPerName` | For a name, how many matching hotels to use (best first). Default 1. |
| `maxReviewsPerHotel` | Cap per hotel, applied after ordering. `maxItems` caps the whole run. |
| `enabledProviders` | Agoda, Booking.com, and other partner sources. Default: Agoda and Booking.com. |
| `sortBy` | Newest (default), oldest, highest rating, lowest rating, most helpful. |
| `cutoffDate` | Only reviews written on or after this date. |
| `onlyNewReviews` | Return only reviews you have not been given before for that hotel (remembered between runs). |
| `rating`, `minRating`, `maxRating` | Rating bands (Exceptional 9+, Excellent, Very good, Good, Below 6) or a numeric range. |
| `language` | Keep only reviews written in these languages. |
| `travelerType` | Business, couples, solo, families with young children, families with teens, groups. |
| `keywords` | Keep a review only if its title or text contains one of these words. |
| `aggregateRatings` | Add the hotel's scores to every row (on by default) and save the full breakdown to the `HOTEL_SUMMARIES` record. |

Example:

```json
{ "hotelUrls": ["https://www.agoda.com/ibis-budapest-city/hotel/budapest-hu.html", "Marina Bay Sands"],
  "maxReviewsPerHotel": 200, "cutoffDate": "2026-01-01", "language": ["en"] }
```

### Output

One item per review (field names follow Fast Agoda Reviews Scraper, so existing parsers keep working):

```json
{ "hotelId": 49487, "hotelName": "Ibis Budapest City", "hotelUrl": "https://www.agoda.com/ibis-budapest-city/hotel/budapest-hu.html",
  "hotelReviewId": 1064241007, "reviewProviderText": "Agoda", "rating": 8.8, "ratingText": "Excellent",
  "reviewTitle": "Excellent", "reviewComments": "One of the staff went out of the way to attend to our queries.",
  "reviewPositives": "", "reviewNegatives": "", "reviewLanguage": "en",
  "reviewDate": "2026-01-04T10:11:00+07:00", "checkInDate": "2025-12-27T00:00:00+07:00", "checkOutDate": "2025-12-31T00:00:00+07:00",
  "reviewerName": "Amalina", "reviewerCountryName": "Singapore", "reviewerGroupName": "Group",
  "reviewerRoomTypeName": "Room with 2 single beds", "reviewerLengthOfStay": 4, "helpfulVotes": 0,
  "responseDate": "2026-01-24T13:01:06+07:00", "responderName": "Ibis Budapest City", "responseText": "Thank you very much for your excellent review...",
  "agodaAggregateReviewScore": 8.4, "agodaAggregateDetailedReviewScore": [{"id": "cleanliness", "score": 8.8, "cityAverage": 8.0}],
  "bookingAggregateReviewScore": 8.7, "agodaReviewsCount": 175, "bookingReviewsCount": 1763, "overallScore": 8.6, "overallReviewCount": 2080 }
```

The `HOTEL_SUMMARIES` key-value record adds scores by traveler type, score distribution, recent trend and the topics guests mention most.

### Compared with Fast Agoda Reviews Scraper

Same hotel (Ibis Budapest City), same day: its 300 reviews were all included in this actor's 841, which came back newest first in one run of about 30 seconds costing under a tenth of a cent of platform time.

| | This actor | Fast Agoda Reviews Scraper |
|---|---|---|
| Hotels per run | many | one |
| Order | newest, oldest, rating or helpful | no date order |
| Price (Free plan) | $0.0035 per review | $0.006 per review + $0.02 per run |
| Only new reviews between runs | yes | no |
| Traveler type, keyword, rating range filters | yes | rating bands only |
| Name search | yes | no |
| Language, rating band, date, source filters, hotel scores | yes | yes |

### Pricing

Pay per review: **from $2.60 per 1,000** (`review-scraped`; $3.50 on the Free plan, lower on paid plans). No start fee. Filters, caps and "only new" apply before you are charged. A run that finds nothing fails instead of returning an empty dataset.

### Limits and notes

- Agoda lists reviews that have written text. Its headline counts also include star-only ratings, so the number of reviews returned can be lower than the count shown on the hotel page (for the test hotel above, 841 written reviews against 2,080 counted).
- Public pages only; no login. Review data is the guests' and Agoda's: check the terms that apply to your use.
- Agoda occasionally answers with a thin page; the actor re-reads such pages. If a hotel's list may still be incomplete, the run summary says so (`SUMMARY` record, `warnings`).

### Feedback and requests

We welcome feedback: a field or option you wish this had, a change to how it works, or a scraper you would like us to build.
Open an issue in the **Issues** tab of this page and tell us what you need. We read every one, and we build the requests that
come up most. If this actor works well for you, a short review helps other people find it.

# Actor input Schema

## `hotelUrls` (type: `array`):

One Agoda hotel per line: the hotel or reviews page URL, the numeric hotel ID, or the hotel's name. Add as many hotels as you like; they run in one go.

## `matchesPerName` (type: `integer`):

When a line is a hotel name, how many matching hotels to use (best matches first). 1 = just the top match.

## `maxReviewsPerHotel` (type: `integer`):

Newest first (or in the order you pick below). Large hotels have thousands of reviews, so set a cap.

## `maxItems` (type: `integer`):

Hard cap across all hotels (also caps your cost). 0 or empty = no limit.

## `enabledProviders` (type: `array`):

Agoda shows its own guest reviews and Booking.com guest reviews side by side. 'Other' adds the smaller partner sources (Priceline and similar) where they exist.

## `sortBy` (type: `string`):

The cap above is applied after this ordering.

## `cutoffDate` (type: `string`):

Skip reviews written before this date (YYYY-MM-DD).

## `onlyNewReviews` (type: `boolean`):

Remembers the reviews each hotel already gave you across runs and returns only new ones. Use it for scheduled monitoring runs.

## `rating` (type: `array`):

Keep only reviews in these bands. Empty = all.

## `minRating` (type: `number`):

Keep only reviews rated at least this (Agoda rates 0-10).

## `maxRating` (type: `number`):

Keep only reviews rated at most this (Agoda rates 0-10).

## `language` (type: `array`):

Keep only reviews written in these languages. Empty = all.

## `travelerType` (type: `string`):

Only reviews from this kind of traveler.

## `keywords` (type: `array`):

Keep a review only if its title or text contains one of these words (any language you type). Empty = all.

## `aggregateRatings` (type: `boolean`):

Adds the hotel's overall and per-source scores, sub-scores and review counts to each row, and saves the full breakdown (traveler types, score distribution, topics) to the HOTEL_SUMMARIES key-value record.

## `proxyConfiguration` (type: `object`):

Agoda refuses most cloud IPs, so the default is Apify proxy (datacenter first, residential only if that is blocked).

## Actor input object example

```json
{
  "hotelUrls": [
    "https://www.agoda.com/ibis-budapest-city/hotel/budapest-hu.html"
  ],
  "matchesPerName": 1,
  "maxReviewsPerHotel": 20,
  "enabledProviders": [
    "Agoda",
    "Booking.com"
  ],
  "sortBy": "newest",
  "onlyNewReviews": false,
  "travelerType": "",
  "aggregateRatings": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `reviews` (type: `string`):

One item per review.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "hotelUrls": [
        "https://www.agoda.com/ibis-budapest-city/hotel/budapest-hu.html"
    ],
    "maxReviewsPerHotel": 20,
    "cutoffDate": "",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidyharvest/agoda-reviews-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "hotelUrls": ["https://www.agoda.com/ibis-budapest-city/hotel/budapest-hu.html"],
    "maxReviewsPerHotel": 20,
    "cutoffDate": "",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("tidyharvest/agoda-reviews-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "hotelUrls": [
    "https://www.agoda.com/ibis-budapest-city/hotel/budapest-hu.html"
  ],
  "maxReviewsPerHotel": 20,
  "cutoffDate": "",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call tidyharvest/agoda-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tidyharvest/agoda-reviews-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/DyvwLyeXl2etfINCF/builds/fx1q3MvoSopduXU95/openapi.json
