# Kkday Reviews Scraper (`stealth_mode/kkday-reviews-scraper`) Actor

Scrape verified traveler reviews from KKday.com by tour ID. Collect ratings, review bodies, author info, travel dates, images, and helpfulness counts — perfect for travel analysts, tour operators, and sentiment researchers.

- **URL**: https://apify.com/stealth_mode/kkday-reviews-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Categories:** Automation, Developer tools, Travel
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 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/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

## KKday Reviews Scraper: Extract Tour Reviews & Ratings

***

### What Is KKday.com?

KKday is a leading Asia-based travel experience platform offering thousands of tours, activities, and travel products across the region. Each product page hosts user-submitted reviews containing rich sentiment data — ratings, written feedback, travel dates, and photos. Collecting this data manually is impractical at scale. The **KKday Reviews Scraper** automates extraction, delivering structured review records ready for analysis.

***

### Overview

The **KKday Reviews Scraper** targets the review section of any KKday tour product page using its numeric Tour ID. It is designed for:

- **Tour operators** monitoring guest sentiment about their own or competitor products
- **Travel analysts** conducting market research and reputation tracking
- **Data scientists** building sentiment analysis or NLP training datasets
- **Researchers** studying traveler behavior in Asian tourism markets

***

### Input Format

The scraper accepts a JSON configuration object — no URL required, just the Tour ID:

```json
{
  "tour_id": "262755",
  "sort_by": "RATING_DESC",
  "page": 1,
  "max_items_per_url": 200,
  "ignore_url_failures": true
}
```

#### Field Reference

| Field | Type | Description |
|---|---|---|
| `tour_id` | string | Numeric Tour ID extracted from the product URL. Example: `product/262755-disney-adventure-cruise-singapore` → `262755` |
| `sort_by` | string | Sort order for reviews. See options below. |
| `page` | integer | Page number to start collecting from. Default: `1` |
| `max_items_per_url` | integer | Maximum number of reviews to collect. Default: `20` |
| `ignore_url_failures` | boolean | If `true`, run continues even if a request fails. Recommended for large collections. |

#### `sort_by` Options

| Value | Label |
|---|---|
| `RATING_DESC` | Rating: High to Low |
| `RATING_ASC` | Rating: Low to High |
| `POSTDATE_DESC` | Date: New to Old |
| `IMAGE_DESC` | Image: Most to Least |
| `HELPFUL_DESC` | Helpful: Most to Least |

> **Tip:** Use `POSTDATE_DESC` to monitor the latest reviews for a tour over time. Use `HELPFUL_DESC` to surface the most community-validated feedback first.

***

### Output Format

Each record represents one traveler review:

#### Sample Output Structure

```json
{
  "id": 4227113,
  "external_type": "kkday",
  "need_translate": true,
  "images": [],
  "title": {
    "origin": "很棒的體驗",
    "translated": "Great experience"
  },
  "body": {
    "origin": "這次住在海景陽台房,迪士尼氣氛ㄧ級棒,喜歡迪士尼的一定要體驗一次",
    "translated": "This time I stayed in a sea-view balcony room, the Disney atmosphere was amazing, anyone who likes Disney should definitely experience it."
  },
  "rating": 5,
  "helpful_count": 0,
  "author": {
    "name": "唐",
    "traveller_type": "02",
    "avatar": "https://image.kkday.com/v2/image/get/s1.kkday.com/member/default_image/png"
  },
  "go_date": "2026-03-30",
  "post_date": "2026-05-11 13:19:06",
  "from_url": "https://www.kkday.com/api/_nuxt/cpath/fetch-product-comments-v2?page=1&sort=RATING_DESC&prodId=262755"
}
```

#### Field Definitions

| Field | Meaning |
|---|---|
| `ID` | Unique identifier for the review record |
| `External Type` | Review source or verification type (e.g., verified purchase) |
| `Need Translate` | Boolean flag indicating whether the review is in a non-primary language and may require translation |
| `Images` | Array of image URLs attached to the review by the traveler |
| `Title` | Short headline of the review |
| `Body` | Full review text written by the traveler |
| `Rating` | Numeric star rating (typically 1–5) |
| `Helpful Count` | Number of other users who marked the review as helpful |
| `Author` | Display name or alias of the reviewer |
| `Go Date` | Date the reviewer actually took the tour |
| `Post Date` | Date the review was published on KKday |

***

### How to Use

1. **Find the Tour ID** — Open any KKday product page. The ID is the number in the URL: `product/262755-disney-adventure-cruise` → `262755`.
2. **Configure the input** — Set `tour_id`, choose a `sort_by` order, and set your desired `max_items_per_url`.
3. **Set the start page** — Use `page: 1` for a full collection from the beginning, or a higher value to resume from a specific point.
4. **Run and export** — Download results as JSON or CSV for use in spreadsheets, dashboards, or NLP pipelines.

**Common issues:**

- If no results are returned, verify the Tour ID is correct and the product page is publicly accessible.
- Set `ignore_url_failures: true` to prevent single failures from stopping a batch run.

***

### Use Cases & Business Value

- **Reputation monitoring:** Track how a tour's rating evolves over time
- **Competitor benchmarking:** Compare sentiment across similar tours in a destination
- **Content moderation research:** Analyze flagged or translated reviews at scale
- **NLP datasets:** Build training data for hospitality-focused sentiment models
- **Marketing insights:** Identify recurring praise or complaints to improve product positioning

***

### Conclusion

The **KKday Reviews Scraper** turns traveler feedback into structured, analyzable data. With flexible sorting, pagination control, and 11 output fields per review, it provides everything needed to monitor sentiment, benchmark products, or power data-driven decisions in the travel industry.

# Actor input Schema

## `tour_id` (type: `string`):

Enter Tour ID. For example, product/262755-disney-adventure-cruise-singapore -> 262755

## `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
{
  "tour_id": "262755",
  "page": 1,
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# Actor output Schema

## `results` (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 = {
    "tour_id": "262755",
    "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/kkday-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 = {
    "tour_id": "262755",
    "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/kkday-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 '{
  "tour_id": "262755",
  "page": 1,
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call stealth_mode/kkday-reviews-scraper --silent --output-dataset

```

## MCP server setup

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