# Agoda Reviews Scraper - Hotel Ratings & Guest Replies (`s-r/agoda-reviews`) Actor

Export Agoda hotel reviews with ratings, original text, language, guest country, room and stay details, photos and hotel replies. Filter Agoda or Booking reviews, choose sorting and set a limit per hotel.

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

## Pricing

$3.00 / 1,000 reviews

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

This Agoda reviews scraper exports guest reviews for hotels worldwide, with ratings, original review text, languages, stay details and hotel replies. Paste hotel URLs or hotel IDs, choose a provider and collect a set number of reviews per hotel.

This actor is useful for hotel groups, reputation teams and travel researchers who need consistent review records across several properties. Agoda has broad hotel coverage in Asia, and the same input format works for properties in other regions. Review IDs and hotel IDs make it possible to match repeated exports to existing records in your own database.

### What this Agoda reviews scraper collects

Each dataset row represents one actual review displayed by Agoda. The actor includes a rating on a ten-point scale, the review title, the original comment when available, the publication time and the guest's display name. Additional fields include positive and negative feedback, country, traveler type, room type, length of stay, check-in and check-out dates, review photos and the hotel's response. These fields depend on what the source publishes for each review.

Agoda displays both its own guest reviews and reviews provided by Booking.com. Use `providers` to select `agoda`, `booking` or `all`. The `platform` field remains `agoda`, because that is where the exported review was displayed. The separate `provider` field identifies the review's origin. Booking records often lack guest country, room and stay information; missing fields remain absent or null rather than being inferred.

### Input

Set `hotels` to a list containing HTTPS Agoda hotel URLs, Agoda review-page URLs or numeric hotel IDs written as strings. A hotel URL can include a language prefix and booking query parameters. The collection concerns hotel reviews; dates and guest counts in a booking URL do not limit the review export. A duplicate hotel is collected once, including when its URL and ID appear in the same list.

Set `max_reviews` to an integer from 1 to 5,000. The default is 100. This limit applies per unique hotel and combines the selected providers. For example, selecting `all` with a limit of 100 returns at most 100 reviews for that hotel, across Agoda and Booking together. Selecting `agoda` applies the same limit exclusively to Agoda reviews.

The `sort` options are `recent`, `rating_high`, `rating_low` and `helpful`. Recent is the default. These settings request the source's order, so they should not be treated as a guarantee of strict chronological order for Booking reviews. In particular, an imported Booking review can appear before a newer imported review.

The optional `languages` list filters original review languages. Supported codes are `en`, `fr`, `de`, `it`, `es`, `ja`, `zh`, `ko`, `ru`, `nl`, `th`, `sv`, `id`, `no`, `da`, `he` and `pt`. An empty list selects all languages. English and Chinese include the source's available regional variants. Unknown codes cause an input error.

Language selection follows Agoda's own filter. A selected review can lack a language label, or carry a different label in the source metadata. Such reviews remain included; the actor reports the available label and leaves a missing label unset.

### Output

The default dataset contains only delivered reviews. The stable identifiers are `place_id` and `review_id`, both strings. Ratings retain Agoda's ten-point scale, recorded explicitly as `rating_scale: 10`. Publication and hotel-response timestamps use UTC, while stay dates keep the calendar date shown for the visit.

When Agoda supplies an original comment alongside a machine translation, `text` contains the original and `text_translated` contains the translation. The same rule applies to `title` and `title_translated`. For Booking reviews without a general comment, `text` joins the available positive and negative comments with a blank line. The separate `positive_text` and `negative_text` fields preserve those components.

A hotel response appears as `reply_text`, with its available timestamp and author. Those fields are omitted when there is no response. Guest verification is indicated for Agoda reviews when supported by the source; the actor does not infer verification for Booking records.

The key-value store also contains a `hotels` record with hotel names, URLs, ratings, displayed review totals, rating categories and available review totals by provider. Hotel profiles accompany delivered reviews and do not create additional review charges. The `OUTPUT` record contains delivery counts and collection status. Export the dataset to JSON, CSV, Excel or another supported Apify format for further analysis.

### Example output

This is one real review from Zoku Amsterdam (hotel ID 926696), exactly as the actor delivers it:

```json
{
  "source": "agoda-reviews",
  "platform": "agoda",
  "fetched_at": "2026-10-11T23:18:15.400Z",
  "review_id": "1124087051",
  "place_id": "926696",
  "place_name": "Zoku Amsterdam",
  "place_url": "https://www.agoda.com/zoku-amsterdam/reviews/amsterdam-nl.html",
  "provider": "agoda",
  "rating": 9.2,
  "rating_scale": 10,
  "rating_text": "Exceptional",
  "title": "Neat hotel with working space and greenhouse",
  "text": "Haven't stayed in a place like this before. Would recommend! ",
  "positive_text": null,
  "negative_text": null,
  "title_translated": null,
  "text_translated": null,
  "language": "en",
  "language_raw": "en",
  "author_name": "Oliver",
  "author_country": "United States",
  "author_country_code": "US",
  "traveler_type": "Solo traveler",
  "room_type": "Loft",
  "nights": 4,
  "stay_check_in": "2026-05-22",
  "stay_check_out": "2026-05-26",
  "stay_month": "May 2026",
  "published_at": "2026-05-26T00:26:00.000Z",
  "likes": 0,
  "is_verified": true,
  "photos": [],
  "reviewer_review_count": 0
}
```

### Use cases

- **Reputation monitoring for hotel chains:** pull the newest reviews of every property each week and compare scores by guest country or traveler type.
- **APAC market research:** collect Japanese, Chinese, Korean and Thai reviews in their original language to see what guests in each market praise or complain about.
- **Review analytics tools:** feed consistent `review_id`, `place_id` and rating fields into dashboards and sentiment models.
- **Service recovery:** filter low-rated reviews with `rating_low` sorting and check whether the hotel has replied.

### How this compares with other Agoda review scrapers

Many Agoda scrapers return hotel listings and prices and add reviews as a side feature. This actor focuses on reviews only: one row per review, original and translated text kept apart, guest country, traveler type, room type and stay dates as separate fields, the hotel's reply included, and a cursor-based continuation for large hotels. You choose between Agoda's own guests, Booking.com reviews shown on Agoda, or both, and you pay only for reviews actually delivered.

### Limits and continuation

The available collection is one source dataset per hotel, using the selected sorting and languages. Agoda's displayed review count can exceed the number accessible within that dataset. The actor collects up to 5,000 unique reviews per provider in a selected collection and removes repeated IDs. This is a collection limit, not a promise that every hotel will supply that many records.

Large runs continue automatically until the per-hotel limit is reached, the source is exhausted or the run's available time ends. The lower-level response can include an opaque `cursor` and `partial` status. To resume manually, reuse that cursor with the same hotel list, review limit, providers, sorting and languages. A missing hotel or a collection failure produces a warning and does not create a diagnostic review row. Other hotels can still produce useful results.

### Pricing

Billing is per delivered review, using the review event shown in the actor's current pricing panel. Empty results create no review charges. Hotel summaries and warnings do not count as reviews. The requested limit is a maximum; billing follows the records actually delivered after duplicate removal and applicable delivery limits.

Runs by users without a paid Apify plan deliver at most ten reviews in total. This is a delivery cap, and delivered records still follow the actor's current event price. Paid users can request the full supported limit. Consult the pricing panel before starting a large export, and set a run spending limit when appropriate for your workflow.

### FAQ

#### Can I collect only Agoda reviews?

Yes. Set `providers` to `agoda`. Select `booking` for Booking reviews displayed by Agoda, or leave the default `all` to combine both. The per-hotel review limit applies to the selected records together.

#### Why are some guest details missing?

The source does not publish every field for every review. Booking reviews generally have less guest and stay metadata. The actor returns what is available, without guessing a guest's country, room or visit dates.

#### Are ratings converted to five stars?

No. Ratings retain Agoda's ten-point scale. Use `rating_scale` when comparing these records with exports from platforms that use a five-point scale.

#### Can the export include every displayed hotel review?

The actor can return fewer records than the displayed total because the accessible source dataset, selected languages and provider limits determine availability. Check available totals and warnings when evaluating coverage. Different sorts and language filters represent separate collection choices, not a guarantee of complete historical coverage.

#### Can I use the review ID as a permanent review link?

The review ID supports record matching. Agoda does not expose a public URL for each exported review, so `place_url` links to the hotel's review page instead.

# Actor input Schema

## `hotels` (type: `array`):

Agoda HTTPS hotel/review URLs or positive numeric hotel IDs as strings. Duplicate hotels are collected once.

## `max_reviews` (type: `integer`):

Maximum delivered reviews per unique hotel, combining the selected providers.

## `providers` (type: `string`):

Review provider to include. Booking reviews are reviews displayed by Agoda.

## `sort` (type: `string`):

Agoda review sorting. Booking review dates may not follow strict chronological order.

## `languages` (type: `array`):

ISO 639-1 review language filters; empty means all languages. English and Chinese include the available regional variants.

## `cursor` (type: `string`):

Opaque continuation from a previous response. Keep hotels, max_reviews, providers, sort and languages unchanged.

## Actor input object example

```json
{
  "hotels": [
    "https://www.agoda.com/zoku-amsterdam/hotel/amsterdam-nl.html"
  ],
  "max_reviews": 100,
  "providers": "all",
  "sort": "recent",
  "languages": []
}
```

# Actor output Schema

## `results` (type: `string`):

Delivered reviews in the default dataset.

## `hotels` (type: `string`):

Free hotel profiles associated with these reviews.

## `output` (type: `string`):

Counts, continuation and warnings.

# 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 = {
    "hotels": [
        "https://www.agoda.com/zoku-amsterdam/hotel/amsterdam-nl.html"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s-r/agoda-reviews").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 = { "hotels": ["https://www.agoda.com/zoku-amsterdam/hotel/amsterdam-nl.html"] }

# Run the Actor and wait for it to finish
run = client.actor("s-r/agoda-reviews").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 '{
  "hotels": [
    "https://www.agoda.com/zoku-amsterdam/hotel/amsterdam-nl.html"
  ]
}' |
apify call s-r/agoda-reviews --silent --output-dataset

```

## MCP server setup

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

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/PI5oaSwfwl1rxHq9b/builds/gmcluAoNwzv9tp71L/openapi.json
