# KKday Product Reviews Scraper (`boncross/kkday-reviews`) Actor

Scrape KKday reviews for any product. Just add a product URL and get every review with its rating, rating wording, title, full text, original and translated wording, traveller type, visit date, photos and helpful count, plus the product rating summary and photo wall. $2.00 per 1,000 reviews.

- **URL**: https://apify.com/boncross/kkday-reviews.md
- **Developed by:** [BonCross API](https://apify.com/boncross) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 review-scrapeds

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 Product Reviews Scraper

### What is KKday Product Reviews Scraper?

KKday will only show you the first 150 reviews of a product in any one order, even when the product has thousands. KKday Product Reviews Scraper reads past that. Give it a product link and it works through KKday's other orders and review topics until it has what you asked for: 600 distinct reviews from one product in a single measured run.

It's the reviews actor of four for KKday. If you want the calendar and prices, the product record, or a way to find products in the first place, the siblings are linked at the bottom.

Why this one:

- **It goes past 150.** On a product with 14,727 reviews, each order stopped at 150 on KKday's side, and the newest and lowest-rated lists shared only 20 reviews. With "Read past 150 reviews per product" on, you get the union.
- **You get both wordings.** The reviewer's original text and KKday's translation sit in separate columns, so a Taiwanese or Korean review is usable in English without losing the source.
- **A free summary row per product.** Rating, review count, sentiment topics and KKday's written summary of what reviewers say. It isn't charged.
- **A daily watch costs cents.** Sorted newest first with a date or an only-new store, a run stops at the first review you've already had. Twenty new reviews come to $0.044.
- **$2.00 per 1,000 reviews** on the Free plan, $1.40 on Business, proxy usage and platform usage included.

**BonCross Verified** means we tested this actor against the live site before release and kept the record:

- 25 of 25 live checks on its inputs and filters passed on 8 October 2026
- 13 products run on 7 October 2026, tickets, tours, a show and an eSIM: 228 reviews, 12 summaries, 1 error row
- Charges matched the rows: 12 products, 228 reviews
- An unknown product gets an uncharged row saying why

People mostly use it to watch what visitors say about an attraction over time, to compare two operators selling the same ticket, to catch a run of low ratings before the headline score moves, and to build a multilingual review set with originals and translations side by side.

### How much does it cost to scrape KKday reviews?

| Event | Free plan | Starter | Scale | Business |
|---|---|---|---|---|
| `actor-start`, per run | $0.002 | $0.002 | $0.002 | $0.002 |
| `product-resolved`, per product | $0.002 | $0.002 | $0.002 | $0.002 |
| `review-scraped`, per row returned | $0.002 | $0.0018 | $0.0016 | $0.0014 |
| `photo-page`, per photo-wall row (up to thirty photos), only when the photo wall is on | $0.0005 | $0.0005 | $0.0005 | $0.0005 |

Enterprise plans pay the Business price.

**$2.00 per 1,000 reviews** on the Free plan, $1.40 on Business, and that's all you pay. Reviews a filter removes, reviews you've already had, and summary rows cost nothing. Neither does a link KKday has no product for.

- All 580 reviews of one product: $0.002 + $0.002 + 580 × $0.002 = **$1.164** ($0.816 on Business).
- A daily watch that finds 20 new reviews: $0.002 + $0.002 + 20 × $0.002 = **$0.044** ($0.032 on Business).
- The same watch with two pages of the photo wall: $0.044 + 2 × $0.0005 = **$0.045** ($0.033 on Business).

The $5 of credits in Apify's Free plan each month buys about 2,490 reviews at the first example's size, or about 113 runs of the daily watch.

### What data comes with each review?

| | |
|---|---|
| ⭐ Rating out of five | Rating wording, such as "Excellent" |
| Review title | 💬 Review body |
| Original wording | Translated wording |
| 👤 Reviewer name | Reviewer avatar |
| Traveller type | 📅 Date posted |
| Date of visit | 👍 Helpful count |
| 📷 Review photos | Photo count |
| Product rating | Product review count |
| Sentiment tags | Written review summary |
| Review id | 🔗 Product link |

### How to scrape KKday reviews

1. [Create a free Apify account](https://console.apify.com/sign-up) and open [KKday Product Reviews Scraper](https://apify.com/boncross/kkday-reviews).
2. Paste KKday product links into "Products". A slug or a bare product number works too.
3. Choose how many reviews you want per product, and the order.
4. Press Start. The reviews fill a table you can download as Excel, CSV or JSON.

There's no code to write and nothing to install.

### ⬇️ Input

Paste product links and press Start. That returns the newest reviews of each product, up to KKday's 150, plus a summary row.

Two limits apply. "Max reviews per product" (default 200) counts each product separately, and 0 means all the reviews KKday serves. "Maximum results for the whole run" caps the total across products, and nothing past it is fetched or charged for. Remember the 150 ceiling: without "Read past 150 reviews per product", one product returns at most 150 whatever limit you set.

If you have a long list of links, "Start URLs" loads them from a file, a Google Sheet or a remote list, and adds them to anything in "Products".

#### The newest reviews of two attractions

```json
{
  "products": [
    "https://www.kkday.com/en/product/11875-erawan-museum-and-ancient-city-tickets-in-bangkok-thailand",
    "https://www.kkday.com/en/product/8332-taipei-101-observatory-ticket"
  ],
  "maxReviewsPerProduct": 100
}
```

#### As deep as KKday goes on one product

```json
{
  "products": ["https://www.kkday.com/en/product/8332-taipei-101-observatory-ticket"],
  "maxReviewsPerProduct": 1000,
  "deepScan": true
}
```

#### Recent low ratings, for a quality check

```json
{
  "products": ["https://www.kkday.com/en/product/2358-nanta-show-tickets-in-seoul"],
  "sort": "rating_asc",
  "reviewedAfter": "2026-06-01",
  "maxReviewsPerProduct": 100
}
```

#### Photo reviews, plus the product's photo wall

```json
{
  "products": ["https://www.kkday.com/en/product/152911-floating-market-day-tour-from-bangkok-thailand"],
  "withPhotosOnly": true,
  "includeReviewImages": true,
  "maxImagePages": 3
}
```

#### A daily watch that returns only new reviews

```json
{
  "products": ["https://www.kkday.com/en/product/11875-erawan-museum-and-ancient-city-tickets-in-bangkok-thailand"],
  "sort": "postdate_desc",
  "dedupStoreName": "kkday-seen-reviews",
  "maxReviewsPerProduct": 50
}
```

| Field | Notes |
|---|---|
| `products`, `startUrls` | Product links, slugs or bare product numbers. |
| `maxReviewsPerProduct`, `maxItems` | Per product (default 200, up to 20,000, 0 for all KKday serves) and for the whole run (default 0, no cap). |
| `sort` | `postdate_desc` (default), `rating_desc`, `rating_asc`, `image_desc` or `helpful`. |
| `deepScan` | Read the other orders and each review topic once the first order runs out. Off by default. |
| `minRating` | Drop reviews below this rating out of 5. Default 0 keeps all. |
| `withPhotosOnly` | Keep only reviews with at least one photo. Off by default. |
| `reviewedAfter` | Keep reviews posted on or after this date, `YYYY-MM-DD`. |
| `includeSummary` | One summary row per product. On by default. |
| `includeReviewImages`, `maxImagePages` | The product's photo wall, 30 photos a page. Off by default, 2 pages when on (1 to 50). |
| `dedupStoreName` | A store that remembers which reviews you've had. |
| `delayMs`, `maxConcurrency` | Pacing, 900 and 4 by default. |

#### For developers

- Reviews arrive ten to a page from KKday, and one order ends after fifteen pages. `deepScan` then reads the remaining orders and each review topic, skipping review ids already returned. The row's `sort` and `listingTag` say which list found it.
- When a filter or the `dedupStoreName` store keeps nothing, the read stops early: after 5 pages in a row with no review kept (across the orders `deepScan` reads), or after about three times the pages `maxReviewsPerProduct` needs.
- On `postdate_desc` the read also stops at the `reviewedAfter` date, and the first review an earlier run returned ends that order. With `deepScan` the other orders are still read until they too stop returning anything new.
- `maxConcurrency` (default 4, from 1 to 8) is requests in flight across the run, and `delayMs` (default 900, up to 10,000) the pause before each one. They're the fastest settings that ran clean, so we'd leave them unless a run reports errors.
- A run Apify restarts part-way picks up where it stopped. Rows already delivered aren't written or charged twice.
- The run statistics count the products that hold more reviews than KKday serves.

### ⬆️ Output

Each review is a row. This one is real, from the Bangkok product in the first example, read on 7 October 2026:

```json
{
  "input": "https://www.kkday.com/en/product/11875-erawan-museum-and-ancient-city-tickets-in-bangkok-thailand",
  "dataType": "review",
  "id": "4535107",
  "reviewId": "4535107",
  "url": "https://www.kkday.com/en/product/11875-erawan-museum-and-ancient-city-tickets-in-bangkok-thailand",
  "productId": "11875",
  "productTitle": "Erawan Museum and Ancient City Tickets in Bangkok",
  "productName": "Erawan Museum and Ancient City Tickets in Bangkok | Thailand",
  "rating": 5,
  "ratingScale": 5,
  "scoreDescription": "Excellent",
  "title": "Siam Old City",
  "titleOriginal": "暹邏古城",
  "titleTranslated": "Siam Old City",
  "text": "A very interesting attraction where you can change into traditional Thai clothing, as if you've traveled back in time... It's definitely worth it! Every photo you take will be unique.",
  "textOriginal": "非常有趣的景點,可換上古代的泰國傳統服飾,有如穿越到過去....值得一換喔,每張照片都非常有特色",
  "textTranslated": "A very interesting attraction where you can change into traditional Thai clothing, as if you've traveled back in time... It's definitely worth it! Every photo you take will be unique.",
  "isTranslated": true,
  "needsTranslation": true,
  "postedAt": "2026-10-03T23:07:38",
  "postedText": "2026-10-03 23:07:38",
  "visitDate": "2026-10-03",
  "authorName": "YU CHING",
  "authorAvatar": "https://image.kkday.com/v2/image/get/s1.kkday.com/member/default_image/png",
  "travellerType": "Couple",
  "travellerTypeCode": "02",
  "helpfulCount": 0,
  "images": [],
  "imageCount": 0,
  "source": "kkday",
  "productRating": 4.68,
  "productRatingScale": 5,
  "productReviewCount": 1262,
  "sort": "postdate_desc",
  "scrapedAt": "2026-10-07T18:38:33.403Z"
}
```

`text` and `title` hold KKday's translation where it has one and the original where it doesn't. The `…Original` and `…Translated` columns keep the two apart. `postedAt` is the time as KKday prints it, with no time zone.

Two other kinds of row can appear, marked by `dataType`:

- `summary`, one per product while "Include the rating summary" is on. It has the product's `rating`, `reviewCount` (KKday's total), `sources` (the review sources KKday lists, as given), `sentimentTags` (a list of `{id, name, sentiment}` topics) and `reviewSummary`, the written summary, which is empty when KKday has none. For Taipei 101 on the same day that row read 4.63 from 13,751 reviews, with six topics from Convenience to Experience.
- `reviewImages`, one per page of the photo wall. Each lists up to thirty photos with the review id, title and author it belongs to.

A link that leads nowhere gets a row too, saying what happened and what to check, and so does a product KKday wouldn't answer for on this run. Neither is charged. If a later page of reviews can't be read, the reviews before it are kept and a row marks the page where the list stopped.

### How deep can you go, and how fast?

Whole runs on Apify, start-up included, measured on 2 and 3 October 2026:

| Run | Rows | Time | Price on the Free plan |
|---|---|---|---|
| One product, 10 reviews | 10 | 6.2 s | $0.024 |
| Two products, 100 reviews each with summaries | 202 | 11.0 to 13.6 s | $0.406 |
| Twelve products, 50 reviews each with summaries | 612 | 34 s | $1.226 |

That's about three seconds a product at 50 reviews. A one-hour run fits roughly 1,200 products at that depth, and rows are saved as they arrive. For a longer list, raise the timeout or split it.

Depth is the part worth planning. One order gives you 150 reviews per product and stops. Different orders reach different reviews, which is why the deep read works: 600 distinct reviews came back from the 14,727-review product in one run. It won't return all 14,727, and no setting will.

### Limitations

- KKday serves at most 150 reviews of a product in one sort order. The deep read combines orders and topics to go further, but it can't reach every review of a very large product.
- Translations exist for some reviews only. Where KKday has none, the translated columns are empty and the original stands.
- You can't choose the translation language. You get the reviewer's wording and the translation KKday supplies.
- Traveller type is a code on the review. It's given as a readable name where KKday's own labels cover it, and the code is kept beside it.
- KKday doesn't publish operator replies on the product page, so there are none in the rows.
- The photo wall is separate from the reviews: thirty photos a page, optional, and billed per page as `photo-page`.

### Feed new reviews into your own tools

Put the daily-watch example on an Apify Schedule and you have a feed of new reviews. A webhook can push each run's rows to Slack or a Google Sheet, which is enough for a small team that wants to see yesterday's two-star reviews before lunch. For text analysis, call `POST https://api.apify.com/v2/acts/boncross~kkday-reviews/run-sync-get-dataset-items` with the input as the body and you get the rows back in the response. AI agents reach it through the Apify MCP server at `mcp.apify.com`, as the tool `boncross/kkday-reviews`.

### FAQ

#### Do I need proxies or a KKday account?

You need neither. There's no login, and proxy usage is included in the price.

#### How do I get more than 150 reviews of one product?

Switch on "Read past 150 reviews per product" and set "Max reviews per product" to the number you want. The run reads newest first until that order ends, then the other orders and each review topic, and returns each review once. It's slower than a plain read, so keep it for products with thousands of reviews.

#### How do I get only the reviews posted since my last run?

Sort newest first and name an only-new store. Each run stops paging at the first review an earlier run returned, so a daily watch reads one or two pages. If you'd rather not keep a store, set "Posted after" to a date.

#### Which column should I analyse, the original or the translation?

Use `text` if you want one column to read: it's the translation where there is one. Use `textOriginal` when the language itself matters, for example to split reviews by market.

#### What do I get for a product nobody has reviewed?

Its summary row, with a review count of 0, and no review rows. You pay the $0.002 product fee and nothing else.

#### Can I get only reviews with photos?

"Only reviews with photos" keeps those and drops the rest at no charge. The photo wall is a different thing: all the product's review photos in pages of thirty, whoever posted them.

#### Is it legal to scrape KKday reviews?

The actor reads reviews KKday shows to any visitor without an account. Reviews carry a display name and sometimes photos, which can be personal data, so check that your use fits GDPR or the equivalent where you are, and KKday's terms.

### More from BonCross

- [KKday Product Availability & Prices](https://apify.com/boncross/kkday-availability): KKday availability and prices for any product.
- [Klook Activity Details Scraper](https://apify.com/boncross/klook-activity-details): Full Klook activity records.
- [Klook Activity Availability & Prices](https://apify.com/boncross/klook-availability): Klook availability and prices.
- [Klook Activity Reviews Scraper](https://apify.com/boncross/klook-reviews): Every review Klook shows for an activity.
- [Trip.com Attraction Reviews Scraper](https://apify.com/boncross/tripcom-reviews): Trip.com reviews for any attraction.
- [Trip.com Hotel Search Scraper](https://apify.com/boncross/tripcom-hotel-search): Every hotel Trip.com lists for a destination and your dates.

### Your feedback

Seen a review on KKday that didn't come back, or a translation that landed in the wrong column? Open an issue on the Issues tab in Apify Console and include the product link. We read them all and answer there.

# Changelog

This Actor's version history is a separate document: https://apify.com/boncross/kkday-reviews/changelog.md

# Actor input Schema

## `products` (type: `array`):

KKday product URLs such as https://www.kkday.com/en/product/11875-... , product slugs, or bare product numbers.

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

KKday page addresses, with the option to load them in bulk from a file, a Google Sheet or a remote list. Use this when you have more links than you want to paste. Combined with anything in the list above.

## `maxReviewsPerProduct` (type: `integer`):

Stop after this many reviews for each product. 0 means every review KKday serves, which is at most 150 per product for one sort order.

## `maxItems` (type: `integer`):

A run-wide ceiling across every target. The per-target limit above applies to each one separately, so ten targets at 50 each returns 500; set this to cap the total. Zero means no run-wide limit. Rows that report an input the actor could not resolve are not counted here and are never charged for.

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

Order the reviews come back in.

## `deepScan` (type: `boolean`):

KKday shows at most 150 reviews of a product in any one order. With this on, once that order runs out the other orders and each review topic are read too, skipping reviews already returned, until the per-product limit is reached. Each row says which order found it. Slower; useful for products with thousands of reviews.

## `minRating` (type: `integer`):

Drop reviews below this rating out of 5. 0 keeps every review. Filtered reviews are free.

## `withPhotosOnly` (type: `boolean`):

Keep only reviews that carry at least one photo. Filtered reviews are free.

## `reviewedAfter` (type: `string`):

Keep only reviews posted on or after this date, as YYYY-MM-DD. With the newest-first sort the actor stops paging as soon as it reaches older reviews, so it never pays for pages it does not need. Leave empty for all.

## `includeSummary` (type: `boolean`):

Add one row per product carrying the rating, review count, sentiment tags and the written summary of what reviewers say.

## `includeReviewImages` (type: `boolean`):

Add rows listing the product's review photos with the review and author each belongs to.

## `maxImagePages` (type: `integer`):

How many pages of the photo wall to read, 30 photos per page.

## `dedupStoreName` (type: `string`):

Name a key-value store and the actor remembers which reviews it has already returned, so a scheduled run yields only new ones.

## `delayMs` (type: `integer`):

Pause between calls.

## `maxConcurrency` (type: `integer`):

How many requests run at once, each one paced by the delay above. The default is the fastest level measured clean; lower it only if a run reports refusals or errors.

## Actor input object example

```json
{
  "products": [
    "https://www.kkday.com/en/product/11875-erawan-museum-and-ancient-city-tickets-in-bangkok-thailand"
  ],
  "startUrls": [],
  "maxReviewsPerProduct": 200,
  "maxItems": 0,
  "sort": "postdate_desc",
  "deepScan": false,
  "minRating": 0,
  "withPhotosOnly": false,
  "reviewedAfter": "",
  "includeSummary": true,
  "includeReviewImages": false,
  "maxImagePages": 2,
  "dedupStoreName": "",
  "delayMs": 900,
  "maxConcurrency": 4
}
```

# Actor output Schema

## `dataset` (type: `string`):

KKday reviews: every row the run returned.

## `stats` (type: `string`):

Counts for the run: what was resolved, fetched, filtered and returned.

# 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 = {
    "products": [
        "https://www.kkday.com/en/product/11875-erawan-museum-and-ancient-city-tickets-in-bangkok-thailand"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("boncross/kkday-reviews").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 = { "products": ["https://www.kkday.com/en/product/11875-erawan-museum-and-ancient-city-tickets-in-bangkok-thailand"] }

# Run the Actor and wait for it to finish
run = client.actor("boncross/kkday-reviews").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 '{
  "products": [
    "https://www.kkday.com/en/product/11875-erawan-museum-and-ancient-city-tickets-in-bangkok-thailand"
  ]
}' |
apify call boncross/kkday-reviews --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,boncross/kkday-reviews"
        }
    }
}
```

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/pF0uuKzP8Ve1KCcNo/builds/MSCEaAtbp2f7R8CDJ/openapi.json
