# Agoda Hotels Reviews Scraper (`stealth_mode/agoda-hotels-reviews-scraper`) Actor

Scrape verified guest reviews from Agoda.com hotel pages — including ratings, review text, check-in dates, reviewer info, and hotel responses. Filter by keyword, sort order, and page. Perfect for hospitality analytics, reputation management, and travel research.

- **URL**: https://apify.com/stealth\_mode/agoda-hotels-reviews-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Categories:** Automation, Developer tools, Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Agoda Hotels Reviews Scraper: Extract Guest Reviews at Scale

---

### What Is Agoda.com?

Agoda.com is one of Asia's largest online travel and hotel booking platforms, hosting millions of verified guest reviews across properties worldwide. These reviews are a goldmine for competitive intelligence, sentiment analysis, and reputation monitoring — but collecting them manually is impractical at scale. The **Agoda Hotels Reviews Scraper** automates this process, extracting structured review data from any Agoda hotel detail page.

---

### Overview

This scraper targets Agoda hotel detail pages and extracts all available guest reviews with full metadata. It supports keyword filtering, flexible sort options, and pagination control — making it suitable for both targeted research and large-scale data pipelines.

**Best suited for:**
- **Hotels & hospitality brands** monitoring guest sentiment
- **OTA analysts** benchmarking competitor properties
- **Data scientists** building NLP training datasets from travel reviews
- **Travel aggregators** enriching listings with social proof data

---

### Input Format

```json
{
  "ignore_url_failures": true,
  "max_items_per_url": 200,
  "page": 3,
  "urls": [
    "https://www.agoda.com/vi-vn/the-peninsula-bangkok/hotel/bangkok-th.html"
  ],
  "sort_by": "7",
  "keyword": "happy"
}
````

| Field | Type | Description |
|---|---|---|
| `urls` | `array` | Agoda hotel detail page URLs to scrape. Accepts multiple URLs. Example: `https://www.agoda.com/the-peninsula-bangkok/hotel/bangkok-th.html` |
| `keyword` | `string` | Filter reviews containing a specific keyword (e.g., `"happy"`, `"breakfast"`, `"wifi"`). Leave empty to collect all reviews. |
| `sort_by` | `string` | Sort order for reviews. Options: `"1"` = Newest, `"2"` = Score high to low, `"3"` = Score low to high, `"7"` = Most Helpful |
| `page` | `integer` | Page number to start scraping from. Defaults to `1`. Use `3` to skip the first two pages. |
| `max_items_per_url` | `integer` | Maximum number of reviews to collect per URL. Default: `20`. Set higher (e.g., `200`) for bulk collection. |
| `ignore_url_failures` | `boolean` | If `true`, the scraper continues running when a URL fails instead of stopping the entire run. Recommended: `true` for multi-URL runs. |

> **Tip:** Use `sort_by: "7"` (Most Helpful) combined with a `keyword` filter to surface the most relevant, high-signal reviews for a specific topic.

***

### Output Format

**Sample output**

```json
{
  "is_helpful_comment": false,
  "is_review_voted": false,
  "helpful_votes": 0,
  "response_language_id": 1,
  "un_helpful_votes": 0,
  "hotel_review_id": 1079448177,
  "provider_id": 332,
  "rating": 10,
  "check_in_date_month_and_year": "February 2026",
  "encrypted_review_data": "68RogSeMEdnn2Wrb848Kzg==",
  "formatted_rating": "10.0",
  "formatted_review_date": "March 08, 2026",
  "formatted_review_helpful_text": "Did you find this review helpful?",
  "rating_text": "Exceptional",
  "responder_name": "The Peninsula Bangkok",
  "response_date_text": "",
  "response_translate_source": "en",
  "review_comments": "A wonderful property right on the Chao Praya River! Staff, Dining, facilities are amazing. Rooms are very comfortable and views of the city and Chao Praya River. Looking forward to our return!",
  "review_negatives": "",
  "review_positives": "",
  "review_provider_logo": "",
  "review_provider_text": "Agoda",
  "review_title": "Excellent Stay",
  "translate_source": "en",
  "translate_target": "en",
  "check_in_date": "2026-02-27T00:00:00+07:00",
  "check_out_date": "2026-03-02T00:00:00+07:00",
  "review_date": "2026-03-08T02:25:00+07:00",
  "reviewer_info": {
    "country_name": "United States",
    "display_member_name": "Muriel",
    "flag_name": "us",
    "review_group_name": "Couple",
    "room_type_name": "Grand Deluxe King Room",
    "country_id": 181,
    "length_of_stay": 3,
    "review_group_id": 2,
    "room_type_id": 0,
    "reviewer_reviewed_count": 0,
    "is_expert_reviewer": false,
    "is_show_global_icon": false,
    "is_show_reviewed_count": false
  },
  "original_title": "",
  "original_comment": "",
  "ugc_images": [],
  "formatted_response_date": "",
  "from_url": "https://www.agoda.com/vi-vn/the-peninsula-bangkok/hotel/bangkok-th.html"
}
```

Each review is returned as a structured record with the following fields:

#### Review Identity & Scoring

| Field | Meaning |
|---|---|
| `Hotel Review ID` | Unique identifier for the review on Agoda |
| `Provider ID` | ID of the review source/provider platform |
| `Rating` | Numeric rating score given by the reviewer |
| `Formatted Rating` | Display-formatted version of the rating (e.g., `"9.0"`) |
| `Rating Text` | Text label for the score (e.g., `"Exceptional"`, `"Good"`) |

#### Review Content

| Field | Meaning |
|---|---|
| `Review Title` | Headline written by the reviewer |
| `Review Comments` | Full review body text |
| `Review Positives` | Specific positives highlighted by the reviewer |
| `Review Negatives` | Specific negatives or complaints mentioned |
| `Original Title` | Review title in the original language before translation |
| `Original Comment` | Full review body in the original language |
| `UGC Images` | User-uploaded photos attached to the review |

#### Dates & Stay Details

| Field | Meaning |
|---|---|
| `Review Date` | Date the review was submitted |
| `Formatted Review Date` | Human-readable review date string |
| `Check In Date` | Reviewer's check-in date |
| `Check Out Date` | Reviewer's check-out date |
| `Check In Date Month And Year` | Abbreviated stay period (e.g., `"March 2024"`) |

#### Reviewer Information

| Field | Meaning |
|---|---|
| `Reviewer Info` | Reviewer profile data (name, country, traveler type, etc.) |
| `Translate Source` | Detected source language of the review |
| `Translate Target` | Target language for translation display |
| `Response Language ID` | Language ID of the hotel's response |
| `Encrypted Review Data` | Encoded internal review metadata |

#### Helpfulness & Voting

| Field | Meaning |
|---|---|
| `Helpful Votes` | Number of users who found the review helpful |
| `Un Helpful Votes` | Number of users who found the review unhelpful |
| `Is Helpful Comment` | Boolean flag — whether the review is marked as helpful |
| `Is Review Voted` | Whether the current user has voted on this review |
| `Formatted Review Helpful Text` | Display text for the helpfulness vote count |

#### Hotel Response

| Field | Meaning |
|---|---|
| `Responder Name` | Name of the hotel staff member who responded |
| `Response Date Text` | Date of the hotel's response |
| `Formatted Response Date` | Human-readable response date |
| `Response Translate Source` | Original language of the hotel response |

#### Provider Branding

| Field | Meaning |
|---|---|
| `Review Provider Logo` | Logo image URL of the review source platform |
| `Review Provider Text` | Display name of the review provider |

***

### How to Use

1. **Get hotel URLs** — Open any Agoda hotel detail page and copy the full URL (e.g., `https://www.agoda.com/the-peninsula-bangkok/hotel/bangkok-th.html`). Both localized (e.g., `/vi-vn/`) and default URLs are accepted.
2. **Configure filters** — Set `keyword` to narrow reviews by topic. Choose `sort_by` based on your analysis goal.
3. **Set volume** — Adjust `max_items_per_url` based on how many reviews you need. For sentiment analysis, `200+` is typically recommended.
4. **Set starting page** — Use `page` to resume from a specific page or skip early reviews already collected.
5. **Run and export** — Download results as JSON or CSV for use in Excel, Python, BI tools, or databases.

**Common issues:**

- If 0 results are returned, verify the URL is a hotel *detail* page, not a search results or list page.
- Localized URLs (e.g., `/vi-vn/`) are generally supported, but use the default English URL if issues arise.

***

### Use Cases & Business Value

- **Reputation management:** Track recurring complaints or praise across time periods
- **Competitive benchmarking:** Compare guest sentiment across competing properties
- **NLP & ML datasets:** Build labeled training data for sentiment classifiers
- **Marketing insights:** Identify top-performing amenities or staff mentions for promotional content
- **OTA strategy:** Understand how review scores correlate with booking behavior

***

### Conclusion

The **Agoda Hotels Reviews Scraper** turns thousands of dispersed guest reviews into clean, structured datasets ready for analysis. With keyword filtering, sort control, and rich metadata per review — including original-language text, stay dates, and hotel responses — it delivers everything needed for serious hospitality intelligence work. Start collecting today and turn guest feedback into a competitive advantage.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the Hotels details urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `keyword` (type: `string`):

Keyword to search reviews

## `sort_by` (type: `string`):

Select your option to sort reviews

## `page` (type: `integer`):

Page to start from

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://www.agoda.com/the-peninsula-bangkok/hotel/bangkok-th.html"
  ],
  "page": 1,
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "urls": [
        "https://www.agoda.com/the-peninsula-bangkok/hotel/bangkok-th.html"
    ],
    "page": 1,
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/agoda-hotels-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 = {
    "urls": ["https://www.agoda.com/the-peninsula-bangkok/hotel/bangkok-th.html"],
    "page": 1,
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

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

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

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

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.agoda.com/the-peninsula-bangkok/hotel/bangkok-th.html"
  ],
  "page": 1,
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call stealth_mode/agoda-hotels-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=stealth_mode/agoda-hotels-reviews-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Agoda Hotels Reviews Scraper",
        "description": "Scrape verified guest reviews from Agoda.com hotel pages — including ratings, review text, check-in dates, reviewer info, and hotel responses. Filter by keyword, sort order, and page. Perfect for hospitality analytics, reputation management, and travel research.",
        "version": "0.0",
        "x-build-id": "br5RafaijU0uz9SRE"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/stealth_mode~agoda-hotels-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-stealth_mode-agoda-hotels-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/stealth_mode~agoda-hotels-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-stealth_mode-agoda-hotels-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/stealth_mode~agoda-hotels-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-stealth_mode-agoda-hotels-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "urls": {
                        "title": "URLs of the Hotels details urls to scrape",
                        "type": "array",
                        "description": "Add the URLs of the Hotels details urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "keyword": {
                        "title": "Keyword to search",
                        "type": "string",
                        "description": "Keyword to search reviews"
                    },
                    "sort_by": {
                        "title": "Sort by",
                        "enum": [
                            "1",
                            "2",
                            "3",
                            "7"
                        ],
                        "type": "string",
                        "description": "Select your option to sort reviews"
                    },
                    "page": {
                        "title": "Page",
                        "type": "integer",
                        "description": "Page to start from"
                    },
                    "ignore_url_failures": {
                        "title": "Continue running even if some URLs fail to be scraped",
                        "type": "boolean",
                        "description": "If true, the scraper will continue running even if some URLs fail to be scraped."
                    },
                    "max_items_per_url": {
                        "title": "Max items per URL",
                        "type": "integer",
                        "description": "The maximum number of items to scrape per URL."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
