# Klook Reviews Scraper - Activity Ratings, Photos & Text (`haketa/klook-reviews-scraper`) Actor

Scrape Klook activity, tour and experience reviews across Asia-Pacific and worldwide. Extract star ratings, full review text, translations, reviewer photos, liked counts, booked package and activity summary (city, category, score) by activity URL or ID. Export JSON, CSV, Excel.

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

## Pricing

from $2.50 / 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 web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Klook Reviews Scraper — Activity & Experience Reviews with Ratings, Photos and Translations

> **The most complete Klook review extractor on Apify.** Pull real guest reviews from **Klook** — the leading activities, tours and experiences platform across Asia-Pacific and worldwide — with the full review text, its **translation**, a 0–5 star rating, reviewer **photos**, liked counts, the exact **package booked**, and each activity's overall score, city, country and category. Built for reputation monitoring, competitor benchmarking, sentiment analysis and travel-experience market research.

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-blue)](https://apify.com/haketa/klook-reviews-scraper)
[![Live Data](https://img.shields.io/badge/Data-Live%20at%20Run%20Time-orange)]()
[![Pricing](https://img.shields.io/badge/Pricing-Pay%20Per%20Result-yellow)]()
[![Region](https://img.shields.io/badge/Region-Asia--Pacific%20%26%20Global%20%F0%9F%8C%8F-red)]()
[![Coverage](https://img.shields.io/badge/Coverage-Millions%20of%20Reviews-purple)]()
[![Photos](https://img.shields.io/badge/Includes-Reviewer%20Photos-success)]()
[![Translations](https://img.shields.io/badge/Includes-Translations-brightgreen)]()
[![No Auth](https://img.shields.io/badge/Auth-None%20Required-success)]()
[![Export](https://img.shields.io/badge/Export-JSON%20%C2%B7%20CSV%20%C2%B7%20Excel-lightgrey)]()

***

### 🎯 What this actor does

The **Klook Reviews Scraper** extracts live guest reviews from **Klook.com** — the #1 platform for booking tours, activities, attraction tickets, transport passes and experiences across Asia and beyond (Japan, Taiwan, Korea, Thailand, Singapore, Hong Kong, and worldwide). Give it an activity URL or an activity ID and it returns **every review**, one clean row per review, enriched with the activity's summary.

Klook reviews are unusually rich: each one carries a star rating, full text plus an on-platform **translation**, the reviewer's uploaded **photos**, the exact **package/option** the traveler booked, and a helpful-vote count. This actor captures all of it.

Each record can include:

- ⭐ **Rating** — 0–5 star score, rating label (e.g. *Fantastic*) and ISO review date
- 💬 **Review text** — original content plus its translation when available
- 📸 **Reviewer photos** — every image the traveler uploaded, with count
- 🎟️ **Package booked** — the exact option/package name and ID the review is about
- 👍 **Engagement** — how many users found the review helpful
- 🏙️ **Activity summary** — name, city, country, category, overall score and total review count
- 🕒 **Metadata** — `scrapedAt` ISO timestamp on every row

Whether you operate an activity, run a travel-analytics product, or research the experiences market across Asia, this actor is the **fastest path from Klook to a usable dataset** — no scraping code required.

***

### ✨ Why this actor

| ✅ This actor handles | ❌ What you'd fight doing it yourself |
|---|---|
| **Full pagination** — collects every review | Popular activities have tens of thousands of reviews |
| **Reviewer photos** extracted with URLs | Images are nested in a separate list per review |
| **Translations** captured alongside originals | Multi-language reviews need the translated field pulled |
| **Package-level attribution** | Each review ties to a specific booked option |
| **Activity summary** attached to every row | Name, city, category & score live on the page, not the review |
| **Clean deduplicated rows** | Reviews repeat across pages and need de-duping |
| **JSON / CSV / Excel export** | Raw data needs reshaping for analysis |

***

### 🚀 Quick start

#### One-click run

1. Open the actor on the [Apify Store](https://apify.com/haketa/klook-reviews-scraper) and click **Try for free**
2. Paste one or more Klook activity URLs into **Activity URLs** — e.g. `https://www.klook.com/en-US/activity/73749-thsr-one-way-ticket-taipei/`
3. Pick a **Review language** and **Sort** order, set **Max reviews per activity** (`0` for everything)
4. Hit **Start** — reviews stream into your dataset, ready to export as JSON, CSV, Excel, HTML or RSS

#### Run via API (Python)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run_input = {
    "startUrls": [
        "https://www.klook.com/en-US/activity/73749-thsr-one-way-ticket-taipei/"
    ],
    "language": "en",
    "sortBy": "most_relevant",
    "maxReviewsPerActivity": 200,
    "includeActivityInfo": True,
}

run = client.actor("haketa/klook-reviews-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["rating"], item["userName"], "|", item["reviewContent"][:80])
```

#### Run via API (JavaScript)

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('haketa/klook-reviews-scraper').call({
    startUrls: ['https://www.klook.com/en-US/activity/73749-thsr-one-way-ticket-taipei/'],
    language: 'en',
    maxReviewsPerActivity: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

***

### ⚙️ Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `startUrls` | array | – | Klook activity page URLs. All reviews are collected for each activity. |
| `activityIds` | array | – | *(Advanced)* Numeric activity IDs — the number after `/activity/`. |
| `language` | enum | `en` | Language the review text is returned in (English, Chinese, Japanese, Korean, Thai, and more). |
| `sortBy` | enum | `most_relevant` | Review order: `most_relevant` or `most_recent`. |
| `maxReviewsPerActivity` | integer | `200` | Max reviews per activity. `0` = all available. |
| `includeActivityInfo` | boolean | `true` | Attach activity name, city, country, category, score and total review count to every review. |
| `proxyConfiguration` | object | Residential | Proxy settings — an Asia-Pacific residential proxy is required and enabled by default. |

#### 📋 How to get an activity URL

1. Open **klook.com** and choose any activity, tour, ticket or experience
2. Copy the address-bar URL — it looks like `.../activity/73749-thsr-one-way-ticket-taipei/`
3. Paste it into **Activity URLs**. Add as many as you like.

***

### 📤 Output

One clean record per review, enriched with activity context:

```json
{
  "reviewId": "18171293",
  "activityId": "73749",
  "activityName": "Taiwan High Speed Rail Ticket for non-Taiwanese",
  "userName": "Lee *****",
  "userAvatar": "https://cdn.klook.com/upload/img200X200/f157...jpg",
  "rating": "5.0",
  "ratingDesc": "Fantastic",
  "reviewDate": "2026-04-01T05:42:53.000Z",
  "reviewContent": "The Taiwan High-Speed Rail ticket was on a buy-one-take-one promotion...",
  "translatedContent": "",
  "likedCount": "4",
  "hasReply": "false",
  "imageCount": "6",
  "reviewImages": "https://cdn.klook.com/user_review/...jpeg | https://cdn.klook.com/...jpeg",
  "packageName": "Buy 1 Get 1 · Taipei · Zuoying (Kaohsiung)",
  "packageId": "339074",
  "activityCity": "Taipei",
  "activityCountry": "Taiwan",
  "activityScore": "4.8",
  "activityReviewCount": "25461",
  "activityCategory": "Transport",
  "activityUrl": "https://www.klook.com/en-US/activity/73749-thsr-one-way-ticket-taipei/",
  "language": "en_US",
  "scrapedAt": "2026-08-10T13:38:51.864Z"
}
```

#### 💬 Review fields

| Field | Description |
|-------|-------------|
| `reviewId` | Unique review identifier |
| `userName` · `userAvatar` | Reviewer name and avatar URL |
| `rating` · `ratingDesc` | ⭐ Score out of 5 and label (e.g. Fantastic) |
| `reviewDate` | Review timestamp (ISO 8601) |
| `reviewContent` | Original review text |
| `translatedContent` | Translated text when different from the original |
| `likedCount` | 👍 How many users found the review helpful |
| `hasReply` | Whether the merchant replied |
| `imageCount` · `reviewImages` | 📸 Number and URLs of reviewer photos ( `|` separated) |
| `packageName` · `packageId` | 🎟️ The booked package/option the review is about |

#### 🏙️ Activity fields *(when `includeActivityInfo` is on)*

| Field | Description |
|-------|-------------|
| `activityId` · `activityName` | Activity identifier and name |
| `activityCity` · `activityCountry` | Where the activity takes place |
| `activityCategory` | Top category (Transport, Tours & experiences, Attractions…) |
| `activityScore` | Activity overall score out of 5 |
| `activityReviewCount` | Total reviews for the activity |
| `activityUrl` · `language` · `scrapedAt` | Source URL, language and timestamp |

Export everything to **JSON, CSV, Excel, HTML or RSS**, or pull it through the Apify API and integrations.

***

### 🌏 Languages & coverage

Klook operates across Asia-Pacific and globally. Reviews can be returned in any of these languages:

| | | | |
|---|---|---|---|
| 🇬🇧 English | 🇨🇳 Chinese (Simplified) | 🇹🇼 Chinese (Traditional) | 🇭🇰 Chinese (HK) |
| 🇯🇵 Japanese | 🇰🇷 Korean | 🇹🇭 Thai | 🇻🇳 Vietnamese |
| 🇮🇩 Indonesian | 🇲🇾 Malay | 🇪🇸 Spanish | 🇫🇷 French |
| 🇩🇪 German | 🇷🇺 Russian | | |

> **Tip:** English gives the widest, most readable output. Klook translates each review into the language you pick — the set of reviews collected is the same.

***

### 💡 Use cases

| Use case | How this actor helps |
|----------|----------------------|
| 🎟️ **Activity & tour operator monitoring** | Track your Klook reputation and catch recurring complaints from real guest feedback and photos. |
| 📊 **Competitor benchmarking** | Pull reviews, scores and photos for rival activities in a destination and compare side by side. |
| 💬 **Sentiment & voice-of-customer** | Feed review text and ratings into your NLP or LLM pipeline for experience-level insight. |
| 📈 **Travel-experience market research** | Study traveler preferences across Asia — which experiences delight, which disappoint, and why. |
| 📸 **UGC & photo analysis** | Collect reviewer-uploaded photos at scale for visual quality and content analysis. |
| 🤖 **ML / NLP training data** | Build large labeled review datasets (rating, language, package, images) for models. |

***

### ❓ FAQ

**How many reviews can I get per activity?**
All of them. Set `maxReviewsPerActivity` to `0` and the actor paginates to the last page. Popular activities have tens of thousands of reviews.

**Do reviews include photos?**
Yes — every reviewer-uploaded image URL is captured in `reviewImages`, with a count in `imageCount`.

**Can I get reviews in a specific language?**
Set `language` to English, Chinese, Japanese, Korean, Thai and more. Klook translates the review text; the set of reviews is the same either way.

**Do I need a proxy?**
Yes — an Asia-Pacific residential proxy is required and enabled by default.

**Which export formats are supported?**
JSON, CSV, Excel, HTML and RSS, plus programmatic access via the Apify API and integrations (Google Sheets, Zapier, Make, Airbyte and more).

***

### 🔗 Integrations

Send results wherever you work: **Google Sheets / Excel**, **Zapier · Make · n8n**, **Airbyte / databases / webhooks**, and the **Apify API** for any language.

***

### ⚖️ Legal & responsible use

This actor collects **publicly available** review information — the same content any visitor can read on an activity page without logging in. It does not access private data and does not require any user account.

You are responsible for how you use the data. Please:

- Use the output for lawful purposes such as research, analytics, reputation monitoring and benchmarking.
- Respect the reviewed platform's Terms of Service and robots directives.
- Comply with applicable data-protection laws (e.g. GDPR, CCPA) when handling personal data such as reviewer names — aggregate or anonymize where appropriate.
- Do not republish scraped content in a way that infringes copyright or database rights.

*This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Klook. All product names, logos and brands are property of their respective owners.*

***

### 🛟 Support

Need another language, an extra field, or hit an activity that won't parse? Open an issue from the actor's **Issues** tab and we'll take a look.

# Actor input Schema

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

Paste Klook activity/experience page URLs (e.g. https://www.klook.com/en-US/activity/73749-thsr-one-way-ticket-taipei/). All guest reviews are collected for each activity. Works with any Klook language path (/en-US/, /zh-CN/, /ja-JP/, etc.).

## `activityIds` (type: `array`):

Optional. Provide Klook numeric activity IDs directly — the number after '/activity/' in the URL (e.g. 73749).

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

Language the review text is returned in. Klook translates reviews into the chosen language. Choose English for the widest, most readable output.

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

Order in which reviews are collected.

## `maxReviewsPerActivity` (type: `integer`):

Maximum number of reviews to collect per activity. Set to 0 for all available reviews (popular activities can have tens of thousands).

## `includeActivityInfo` (type: `boolean`):

Attach the activity name, city, country, category, overall score and total review count to every review record.

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

Proxy configuration. An Asia-Pacific residential proxy is required and enabled by default.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.klook.com/en-US/activity/73749-thsr-one-way-ticket-taipei/"
  ],
  "activityIds": [
    "73749"
  ],
  "language": "en",
  "sortBy": "most_relevant",
  "maxReviewsPerActivity": 200,
  "includeActivityInfo": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `reviewId` (type: `string`):

Unique Klook review ID

## `activityId` (type: `string`):

Klook activity ID

## `activityName` (type: `string`):

Activity name

## `userName` (type: `string`):

Reviewer display name

## `userAvatar` (type: `string`):

Reviewer avatar URL

## `rating` (type: `string`):

Guest rating out of 5

## `ratingDesc` (type: `string`):

Rating label (e.g. Fantastic)

## `reviewDate` (type: `string`):

Review timestamp (ISO 8601)

## `reviewContent` (type: `string`):

Original review text

## `translatedContent` (type: `string`):

Translated review text (if different)

## `likedCount` (type: `string`):

How many users liked the review

## `hasReply` (type: `string`):

Whether the merchant replied

## `imageCount` (type: `string`):

Number of reviewer photos

## `reviewImages` (type: `string`):

Reviewer photo URLs ( | separated)

## `packageName` (type: `string`):

Booked package/option name

## `packageId` (type: `string`):

Booked package ID

## `activityCity` (type: `string`):

Activity city

## `activityCountry` (type: `string`):

Activity country

## `activityScore` (type: `string`):

Activity overall score out of 5

## `activityReviewCount` (type: `string`):

Total reviews for the activity

## `activityCategory` (type: `string`):

Activity top category

## `activityUrl` (type: `string`):

Activity page URL

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

Review language code

## `scrapedAt` (type: `string`):

Extraction timestamp

# 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 = {
    "startUrls": [
        "https://www.klook.com/en-US/activity/73749-thsr-one-way-ticket-taipei/"
    ],
    "maxReviewsPerActivity": 200,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/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 = {
    "startUrls": ["https://www.klook.com/en-US/activity/73749-thsr-one-way-ticket-taipei/"],
    "maxReviewsPerActivity": 200,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/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 '{
  "startUrls": [
    "https://www.klook.com/en-US/activity/73749-thsr-one-way-ticket-taipei/"
  ],
  "maxReviewsPerActivity": 200,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call haketa/klook-reviews-scraper --silent --output-dataset

```

## MCP server setup

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