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

Scrape public Agoda hotel guest reviews: rating, text, stay dates, room type, traveler type, and country. HTTP reviews API alternative for hotel comps.

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

## Pricing

from $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.
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

> **Disclaimer:** Unofficial tool — not affiliated with, sponsored by, or endorsed by Agoda Company Pte. Ltd. or its affiliates. Data is read from publicly accessible hotel review pages only. No login. You are responsible for complying with applicable law (including GDPR where personal data appears) and the site’s terms. No warranty on accuracy or availability. Provided for informational and research use.

**Agoda reviews scraper** for public hotel guest reviews: rating, title, text, stay dates, room type, traveler type, and country. Paste a hotel URL or a numeric hotel ID and export one JSON row per review. This is an **Agoda API alternative** for reputation tracking and hotel comps. Run it from **Python**, **Node.js**, **cURL**, or **Apify MCP**.

| Hotel reviews | Room rates and calendar | Vacation rental pace | OTA price board |
| :--- | :--- | :--- | :--- |
| Agoda Reviews Scraper ◄── you are here | [Booking.com Occupancy Scraper](https://apify.com/crawloop/booking-com-occupancy-scraper) | [Airbnb Occupancy Scraper](https://apify.com/crawloop/airbnb-occupancy-monitor) | [Google Hotels Scraper](https://apify.com/crawloop/google-hotels-scraper) |

VRBO calendars sit beside the Airbnb Actor: [VRBO Occupancy Scraper](https://apify.com/crawloop/vrbo-occupancy-scraper).

### When to use

- Export guest reviews for one hotel or a short list of hotel URLs and IDs
- Keep rating, stay dates, room type, traveler type, and country on the same row
- Schedule a run that saves only review IDs you have not stored yet
- Call an **Agoda scraper** from Python, Node.js, or an AI assistant and download JSON

### When not to use

- **Room rates and sold nights** — use [Booking.com Occupancy Scraper](https://apify.com/crawloop/booking-com-occupancy-scraper)
- **A cross-OTA price board** — use [Google Hotels Scraper](https://apify.com/crawloop/google-hotels-scraper)
- **Vacation-rental calendars** — use [Airbnb Occupancy Scraper](https://apify.com/crawloop/airbnb-occupancy-monitor) or [VRBO Occupancy Scraper](https://apify.com/crawloop/vrbo-occupancy-scraper)
- **Account, booking, or extranet data** — public review pages only, no login
- **A filter that keeps only one review provider** — rows that appear on the hotel page are saved together
- **A whole-catalog crawl** — one run accepts at most 50 hotels and 1000 reviews per hotel

### Key features

- Hotel page URL or numeric hotel ID
- Rating, title, text, positives, negatives, and helpful votes
- Booking.com rows that appear on the same public page, with liked and disliked text folded into `text` when there is no single body
- Check-in, check-out, length of stay, room type, and traveler type
- Reviewer display name and country when the page publishes them
- Hotel score and review count copied onto every review row
- Sort by newest, highest rating, lowest rating, or most helpful
- Optional minimum rating, cutoff date, and original language code
- Monitor mode for scheduled runs on a named Key-Value store
- HTTP fetch at 256 MB, no browser

### Input

| Field | Required | Description |
| :--- | :--- | :--- |
| `hotelUrls` | One of these | Hotel page URLs or numeric hotel IDs |
| `startUrls` | One of these | The same hotel pages in the request-list editor |
| `maxReviewsPerHotel` | No | Saved reviews per hotel. Default 20, maximum 1000 |
| `maxHotels` | No | Hotels per run. Default 10, maximum 50 |
| `sort` | No | `recent`, `ratingHigh`, `ratingLow`, or `helpful` |
| `minRating` | No | Minimum score on a 10-point scale. `0` keeps every rating |
| `cutoffDate` | No | Keep reviews on or after `YYYY-MM-DD` |
| `language` | No | Original language code, such as `en` or `ja` |
| `monitorMode` | No | Push only review IDs that are not already in the named store |
| `monitorStoreName` | No | Named Key-Value store for scheduled runs. Default `agoda-reviews-monitor` |
| `proxyConfiguration` | No | Leave off unless a run is blocked |

#### Input example

```json
{
  "hotelUrls": ["https://www.agoda.com/marina-bay-sands/hotel/singapore-sg.html"],
  "maxReviewsPerHotel": 20,
  "sort": "recent",
  "minRating": 8
}
```

### Output

Each dataset item is one guest review.

| Field | Description |
| :--- | :--- |
| `reviewId` | Review id |
| `hotelId` / `hotelName` | Hotel id and name |
| `hotelScore` / `hotelScoreText` / `hotelReviewCount` | All-guest score, label, and count |
| `rating` / `ratingText` | This review, on a 10-point scale |
| `title` / `text` | Title and body |
| `positives` / `negatives` | Split text when the page provides it |
| `reviewDate` | Review date |
| `checkInDate` / `checkOutDate` / `lengthOfStay` | Stay |
| `reviewerName` / `reviewerCountry` / `travelerType` | Guest details published with the review |
| `roomType` | Room name on the review |
| `provider` | Source label on the page |
| `helpfulVotes` | Helpful-vote count |
| `language` | Original language code when present |
| `hotelUrl` | Page used for the row |
| `scrapedAt` | UTC time the row was built |

#### Output example

```json
{
  "reviewId": "1169301862",
  "hotelId": "185945",
  "hotelName": "Marina Bay Sands",
  "hotelUrl": "https://www.agoda.com/marina-bay-sands/hotel/singapore-sg.html",
  "hotelScore": 8.8,
  "hotelScoreText": "Excellent",
  "hotelReviewCount": 35624,
  "provider": "Agoda",
  "rating": 10,
  "ratingText": "Exceptional",
  "title": "The best hotel",
  "text": "A clear stay with a city view.",
  "positives": "Pool",
  "negatives": null,
  "reviewDate": "2026-09-30",
  "checkInDate": "2026-08-13",
  "checkOutDate": "2026-08-16",
  "lengthOfStay": 3,
  "reviewerName": "Guest",
  "reviewerCountry": "Japan",
  "travelerType": "Family with young children",
  "roomType": "Premier Double",
  "helpfulVotes": 2,
  "language": "ja",
  "scrapedAt": "2026-10-06T00:00:00Z"
}
```

### Use cases

| Job | What you get |
| :--- | :--- |
| Reputation export | Newest reviews for one hotel URL, with rating and text |
| Comp set | The same cutoff date across a short list of hotel IDs |
| Scheduled watch | `monitorMode` on a named store so the next run keeps only new review IDs |
| Guest mix | Traveler type, room type, country, and language on each row |
| Rate context | `hotelId` for [Booking.com Occupancy Scraper](https://apify.com/crawloop/booking-com-occupancy-scraper) when you also need the calendar |

### Integration examples

Replace `APIFY_TOKEN` with your Apify token. The Actor name is `crawloop/agoda-reviews-scraper`.

#### Node.js

```javascript
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("crawloop/agoda-reviews-scraper").call({
  hotelUrls: ["https://www.agoda.com/marina-bay-sands/hotel/singapore-sg.html"],
  maxReviewsPerHotel: 20,
  sort: "recent",
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("crawloop/agoda-reviews-scraper").call(run_input={
    "hotelUrls": ["https://www.agoda.com/marina-bay-sands/hotel/singapore-sg.html"],
    "maxReviewsPerHotel": 20,
    "sort": "recent",
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~agoda-reviews-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"hotelUrls":["https://www.agoda.com/marina-bay-sands/hotel/singapore-sg.html"],"maxReviewsPerHotel":20,"sort":"recent"}'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp).
Connect your Apify account, then call this Actor by its Store name.

Example prompts:

- "Run Agoda Reviews Scraper for Marina Bay Sands and return the newest 20 reviews as JSON"
- "Scrape Agoda hotel reviews with a minimum rating of 8 and summarize traveler type, room type, and country"
- "Chain Agoda Reviews Scraper, then Booking.com Occupancy Scraper, for the same hotel's reviews and sold nights"

### Suite next step

After the review export, run [Booking.com Occupancy Scraper](https://apify.com/crawloop/booking-com-occupancy-scraper) for public room rates and the availability calendar. For a cross-OTA price board, use [Google Hotels Scraper](https://apify.com/crawloop/google-hotels-scraper).

### FAQ

#### Does this Agoda scraper log in?

No. It reads the public review list for a hotel URL or numeric hotel ID.

#### What does one dataset row mean?

One saved guest review. The hotel score is copied onto that row so you can filter without a second dataset.

#### Are Booking.com reviews included?

Yes, when they appear on the same public hotel page. If the body is empty, liked and disliked text is joined into `text`. There is no separate provider filter.

#### Why is a scheduled run empty?

`monitorMode` stores review IDs. The first run pushes the reviews it sees and stores those IDs. Later runs push a row only when the ID was not stored before. A cutoff date in the future also returns no rows.

#### Can I keep one language?

Set `language` to an original language code such as `en` or `ja`. Leave it empty to keep every language the page returns.

# Actor input Schema

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

Agoda hotel page URLs or numeric hotel IDs. One per line.

## `startUrls` (type: `array`):

Agoda hotel page URLs. Same job as Hotel URLs.

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

Stop after this many saved reviews for each hotel.

## `maxHotels` (type: `integer`):

Hard cap on hotels processed in one run.

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

Order requested from the public review list.

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

Keep reviews with this rating or higher, on Agoda's 10-point scale. 0 keeps every rating.

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

Keep reviews dated on or after this day (YYYY-MM-DD). Leave empty to keep every date.

## `language` (type: `string`):

Optional original-language code, such as en or ja. Leave empty for every language.

## `monitorMode` (type: `boolean`):

Save review IDs in a named Key-Value store and push only IDs that were not saved on a previous run. The first run stores the baseline and still pushes those reviews.

## `monitorStoreName` (type: `string`):

Named Key-Value store shared by scheduled runs. The default run store is discarded after each run.

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

Leave proxy off. The public review call works over HTTP without a browser. Turn on Apify proxy only if a run is blocked.

## Actor input object example

```json
{
  "hotelUrls": [
    "https://www.agoda.com/marina-bay-sands/hotel/singapore-sg.html"
  ],
  "maxReviewsPerHotel": 20,
  "maxHotels": 10,
  "sort": "recent",
  "minRating": 0,
  "monitorMode": false,
  "monitorStoreName": "agoda-reviews-monitor",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Default dataset items.

# 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/marina-bay-sands/hotel/singapore-sg.html"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/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/marina-bay-sands/hotel/singapore-sg.html"] }

# Run the Actor and wait for it to finish
run = client.actor("crawloop/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/marina-bay-sands/hotel/singapore-sg.html"
  ]
}' |
apify call crawloop/agoda-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawloop/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/sLTg0nlscVj9HderP/builds/7vFa0GsIk7Z4t1elt/openapi.json
