# Klook Reviews Scraper ⭐ (`shahidirfan/klook-reviews-scraper`) Actor

Extract Klook reviews with ratings, review text, traveler feedback, dates, activity details, and useful review metadata. Ideal for travel sentiment analysis, attraction research, customer experience monitoring, tourism insights, competitor analysis, and datasets.

- **URL**: https://apify.com/shahidirfan/klook-reviews-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Stats:** 3 total users, 3 monthly users, 95.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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

### What does Klook Reviews Scraper do?

Klook Reviews Scraper collects public hotel reviews from Klook and turns them into a clean dataset. Provide a Klook hotel detail URL or a numeric hotel ID, set how many reviews you want, and receive review text, translations, scores, dates, stay details, reviewer information, images, and hotel-level rating data.

The Actor is built for hotel market research, guest feedback monitoring, travel content research, competitor analysis, and datasets for reporting or AI-assisted review analysis. Results can be downloaded from Apify as JSON, CSV, Excel, XML, or connected to another workflow through the Apify API.

### Why use Klook Reviews Scraper?

- **Collect guest feedback in a structured format** - Turn public Klook review pages into records that are easier to search, compare, filter, and analyze.
- **Start with a hotel URL or ID** - Use a complete Klook hotel detail URL when you need a specific locale, or provide the numeric hotel ID directly.
- **Capture original and translated content** - Keep the original review language and text, plus translation metadata and translated text when Klook provides it.
- **Analyze hotel quality at a glance** - Each record can include its own score and label, the property average score, the overall label, and the available review count.
- **Include guest photos** - Review image URLs are captured when guests attach images to their feedback.
- **Control run size** - Set both the maximum number of reviews and the maximum number of review pages to process.
- **Handle temporary source failures** - The Actor validates responses, retries temporary errors, and recovers from short-lived access blocks without manual intervention.
- **Build repeatable monitoring workflows** - Run the Actor on demand or schedule it to track changes in guest feedback over time.

### What data can you extract from Klook?

Each dataset item represents one public Klook hotel review and includes review-level details plus useful hotel-level information.

| Field                         | Type              | Description                                                                               |
| ----------------------------- | ----------------- | ----------------------------------------------------------------------------------------- |
| `hotel_id`                    | String            | Klook hotel identifier.                                                                   |
| `hotel_url`                   | String            | Canonical Klook hotel detail URL.                                                         |
| `locale`                      | String            | Locale used in the Klook hotel URL, such as `en-US`.                                      |
| `review_page`                 | Number            | Review page from which the record was collected.                                          |
| `review_position`             | Number            | Position of the review in the collected result set.                                       |
| `review_filter_tag_id`        | String            | Klook review filter tag associated with the collection, when available.                   |
| `review_id`                   | String            | Klook review identifier, or a stable generated identifier when Klook does not expose one. |
| `user_name`                   | String            | Reviewer display name.                                                                    |
| `user_avatar_url`             | String            | URL of the reviewer's avatar, when available.                                             |
| `helpful_count`               | Number            | Number of helpful votes, when available.                                                  |
| `mark_useful`                 | Boolean or String | Helpful-vote status or marker returned with the review, when available.                   |
| `review_language`             | String            | Language code of the original review.                                                     |
| `review_time`                 | String            | Date or time shown for the review.                                                        |
| `check_in_info`               | String            | Room, occupancy, and stay information shown with the review.                              |
| `review_content`              | String            | Original review text.                                                                     |
| `needs_translation`           | Boolean           | Indicates whether Klook marks the review as needing translation.                          |
| `translated_language`         | String            | Language used for the available translation, when present.                                |
| `translated_content`          | String            | Translated review text, when present.                                                     |
| `review_score`                | String            | Individual review score.                                                                  |
| `review_score_max`            | String            | Maximum possible review score.                                                            |
| `review_score_label`          | String            | Review rating label, such as `Great` or `Fantastic`.                                      |
| `images`                      | Array             | Review image data, including available thumbnail and original image URLs.                 |
| `available_review_count`      | Number            | Total number of reviews shown as available by Klook.                                      |
| `available_review_count_text` | String            | Formatted total review count displayed by Klook.                                          |
| `hotel_avg_score`             | String            | Average score for the hotel.                                                              |
| `hotel_score_label`           | String            | Overall hotel rating label.                                                               |

Fields that are not published for a particular review are omitted or may be empty. This is expected when a guest does not provide a name, image, translation, helpful vote, or stay detail.

### How to scrape Klook hotel reviews

1. Open the Actor in Apify Console.
2. Enter a public Klook hotel detail URL in `hotelUrl`, or provide the Klook property identifier in `hotelId`.
3. Set `resultsWanted` to the maximum number of review records you want.
4. Set `maxPages` to control how many review pages the run may process.
5. Keep the default proxy configuration enabled for more consistent collection.
6. Start the run and review the dataset preview.
7. Download the results or connect the dataset to a spreadsheet, webhook, automation, or API workflow.

If both `hotelId` and `hotelUrl` are provided, `hotelId` takes precedence and `hotelUrl` is ignored. Use `hotelUrl` when the requested locale matters. If neither value is provided, the Actor uses the documented example hotel so that the run can still start.

### Input Parameters

| Parameter            | Type    | Required | Default                   | Description                                                                                                             |
| -------------------- | ------- | -------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| `hotelUrl`           | String  | No       | Klook hotel example URL   | Public Klook hotel detail URL. This also sets the review locale. A numeric hotel ID is accepted here as well.           |
| `hotelId`            | String  | No       | None                      | Klook hotel identifier, such as `272231`. When supplied, it takes precedence over `hotelUrl`.                           |
| `resultsWanted`      | Integer | No       | `20`                      | Maximum number of review records to save.                                                                               |
| `maxPages`           | Integer | No       | `2`                       | Maximum number of review pages to process. Each page can contain up to 100 reviews.                                     |
| `proxyConfiguration` | Object  | No       | Apify Proxy (residential) | Proxy settings used for the run. Apify Proxy with residential sessions is enabled by default for reliable Klook access. |

The number of saved records can be lower than `resultsWanted` when the hotel has fewer available reviews, the selected page limit is reached, or some source records do not contain usable review data.

### Output Data

The Actor writes one dataset record for each collected review. Hotel-level score and review-count fields are repeated on each record so that individual rows remain useful when exported or processed independently.

The dataset is suitable for:

- Comparing review scores across hotels or destinations.
- Finding recurring positive and negative guest comments.
- Grouping feedback by language, date, room type, or stay details.
- Reviewing guest-uploaded images alongside written feedback.
- Creating historical snapshots for hotel reputation monitoring.

### Usage Examples

#### Basic hotel URL extraction

Use a complete Klook hotel detail URL for a small first run.

```json
{
    "hotelUrl": "https://www.klook.com/en-US/hotels/detail/272231-hotel-mystays-asakusa/",
    "resultsWanted": 20,
    "maxPages": 1
}
```

#### Extract by hotel ID

Use `hotelId` when the Klook property identifier is already known. The default locale is `en-US` in this mode.

```json
{
    "hotelId": "272231",
    "resultsWanted": 50,
    "maxPages": 2
}
```

#### Larger run with Apify Proxy

Increase both limits for broader coverage and keep Apify Proxy enabled in the input.

```json
{
    "hotelUrl": "https://www.klook.com/en-US/hotels/detail/272231-hotel-mystays-asakusa/",
    "resultsWanted": 200,
    "maxPages": 3,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": ["RESIDENTIAL"]
    }
}
```

### Sample Output

The following example shows a review from Hotel Mystays Asakusa on Klook. Optional fields are included only when the source provides them.

```json
{
    "hotel_id": "272231",
    "hotel_url": "https://www.klook.com/en-US/hotels/detail/272231/",
    "locale": "en-US",
    "review_page": 1,
    "review_position": 1,
    "review_filter_tag_id": "10001",
    "review_id": "gen_c589e9c057a6a052e408bf6af2e65ea3fda7aefe",
    "user_name": "arkaye *******",
    "user_avatar_url": "https://cdn.klook.com/upload/img200X200/en_PH_02.png",
    "review_language": "en_US",
    "review_time": "2026-08-25",
    "check_in_info": "Standard Semi-double [Non-smoking] - 7 Adults, 1 child - 3 Nights",
    "review_content": "service: good, cleanliness: neat, transport access: accessible, when we come back to Tokyo I will book and recommend this hotel. We really enjoyed our stay here.",
    "needs_translation": false,
    "review_score": "4.0",
    "review_score_max": "5.0",
    "review_score_label": "Great",
    "images": [],
    "available_review_count": 1282,
    "available_review_count_text": "1K+ reviews",
    "hotel_avg_score": "4.4",
    "hotel_score_label": "Great"
}
```

### Tips for best results

- **Use a public hotel detail URL** - Copy the URL from the Klook hotel page whenever possible. The URL identifies both the property and the locale.
- **Begin with a small run** - Start with the default `resultsWanted` and `maxPages` values to confirm that the property and locale are correct.
- **Increase one limit at a time** - Raise `resultsWanted` for more records and `maxPages` for deeper page coverage.
- **Keep the locale consistent** - The locale in the hotel URL can affect the presentation of review content.
- **Keep proxy settings enabled** - Proxy configuration is recommended for stable repeated runs, especially when collecting larger datasets. Residential sessions are preferred for Klook.
- **Check the available review count** - Compare `available_review_count` with your requested limits to understand how much source data is available.
- **Expect optional fields to vary** - Reviews can differ in language, stay details, translations, helpful votes, and attached images.
- **Schedule repeat runs for monitoring** - Save each run as a dated snapshot when tracking changes in hotel reputation or guest feedback.

### Reliability and coverage

Klook can change its public pages, access rules, and response formats. The Actor checks that each response contains usable review data instead of treating every HTTP success as valid. Temporary network failures, rate limits, and short-lived access blocks are retried with bounded recovery. If a run still cannot collect data, the log reports the failed stage so the issue can be investigated without guessing.

The Actor also keeps hotel-level fields from the first review page and applies them to later pages, so average scores and review counts do not disappear from deeper results.

### Integrations and exports

Apify provides several ways to use the collected Klook review data outside the Actor run.

- **CSV and Excel** - Export rows for sorting, filtering, pivot tables, and team reporting.
- **JSON and XML** - Use structured exports in data pipelines, scripts, or storage systems.
- **Apify API** - Retrieve dataset items programmatically after a run completes.
- **Google Sheets** - Send review records to a spreadsheet for collaborative analysis.
- **Webhooks, Make, and Zapier** - Connect completed runs to notifications, databases, dashboards, or other business tools.
- **Scheduled runs** - Refresh a hotel's review dataset on a recurring schedule for monitoring workflows.

### Frequently Asked Questions

#### What does this Actor collect from Klook?

It collects public Klook hotel reviews together with reviewer details, review dates, languages, original and translated text when available, scores, stay information, images, and hotel-level rating data.

#### Do I need a Klook hotel URL?

No. You can provide either `hotelUrl` or `hotelId`. A complete hotel URL is usually the simplest option because it includes the property path and locale. If both are provided, `hotelId` takes precedence.

#### How many reviews can I collect?

You control the maximum with `resultsWanted`. The actual count depends on the number of reviews available for the hotel and the `maxPages` limit. Each review page can contain up to 100 records.

#### What is the difference between `resultsWanted` and `maxPages`?

`resultsWanted` limits the number of review records saved. `maxPages` limits how many review pages the Actor may process. Both limits apply, so a larger result target may require a larger page limit.

#### Are translated reviews included?

Yes, when Klook provides translation data. The record can include `needs_translation`, `translated_language`, and `translated_content`, in addition to the original review language and text.

#### Can I collect review images?

Yes. When a review includes image data, the `images` field contains the available image information. Reviews without images return an empty or omitted field depending on the record.

#### Can I run this Actor on a schedule?

Yes. Create an Apify schedule to run it hourly, daily, weekly, or at another interval. Scheduled runs are useful for tracking new feedback and changes in hotel ratings.

#### Why are some fields missing?

Klook does not publish every field for every review. A guest may not provide a display name, avatar, stay details, translation, helpful vote, or image. The Actor preserves available values without inventing missing information.

#### Why did a run return no reviews?

The hotel may have no public reviews, the supplied hotel ID may not match a public property, or Klook may have temporarily limited access. Check the run log for the reported stage and confirm the hotel page shows public reviews before changing the input.

#### Can I export Klook reviews to CSV or Excel?

Yes. Apify datasets can be downloaded as CSV, Excel, JSON, XML, and other supported formats. You can also access the dataset through the Apify API or connect it to automations.

#### Is it legal to collect Klook review data?

You are responsible for using the Actor lawfully. Collect only data you are permitted to access, follow Klook's terms and applicable privacy rules, and use the results responsibly. Avoid collecting or processing personal information beyond your legitimate purpose.

### Related Actors

- [Expedia Reviews Scraper](https://apify.com/shahidirfan/expedia-reviews-scraper) - Collect structured hotel and accommodation reviews from Expedia.
- [Tripadvisor Reviews Scraper](https://apify.com/shahidirfan/tripadvisor-reviews-scraper) - Gather traveler reviews and rating information from Tripadvisor listings.
- [Trip.com Hotel Reviews Scraper](https://apify.com/shahidirfan/trip-com-hotel-reviews-scraper) - Collect hotel guest reviews from Trip.com for broader travel comparison research.

### Support

For bug reports, feature requests, or questions about a run, use the Issues tab on the Actor page. Include the input used, the affected Klook hotel URL or ID, and the run ID when possible. This makes it easier to investigate missing records or source-page changes.

### Legal Notice

This Actor is intended for legitimate collection and analysis of publicly available Klook review data. You are responsible for complying with Klook's terms of use, applicable laws, privacy requirements, and any restrictions related to storing, sharing, or processing review content and images. Use collected data respectfully and only for lawful purposes.

# Actor input Schema

## `hotelUrl` (type: `string`):

A public Klook hotel detail URL. This also sets the review locale. A numeric hotel ID is also accepted here.

## `hotelId` (type: `string`):

Klook hotel ID, for example 272231. When supplied, it takes precedence over hotelUrl.

## `resultsWanted` (type: `integer`):

Maximum number of reviews to collect for the hotel.

## `maxPages` (type: `integer`):

Safety cap for review pagination. Each page can contain up to 100 reviews.

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

Apify Proxy is recommended for consistent Klook access. When Apify Proxy is enabled without a group, residential sessions are used.

## Actor input object example

```json
{
  "hotelUrl": "https://www.klook.com/en-US/hotels/detail/272231-hotel-mystays-asakusa/",
  "resultsWanted": 20,
  "maxPages": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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 = {
    "hotelUrl": "https://www.klook.com/en-US/hotels/detail/272231-hotel-mystays-asakusa/"
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/klook-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 = { "hotelUrl": "https://www.klook.com/en-US/hotels/detail/272231-hotel-mystays-asakusa/" }

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/klook-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 '{
  "hotelUrl": "https://www.klook.com/en-US/hotels/detail/272231-hotel-mystays-asakusa/"
}' |
apify call shahidirfan/klook-reviews-scraper --silent --output-dataset

```

## MCP server setup

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