Klook Categories Scraper avatar

Klook Categories Scraper

Pricing

from $1.20 / 1,000 category list chargeds

Go to Apify Store
Klook Categories Scraper

Klook Categories Scraper

Get Klook's full category tree from Klook. Talks directly to Klook's own mobile app API, no login needed. Split from the mature, published klook-all-in-one-api for a focused, single-purpose workflow.

Pricing

from $1.20 / 1,000 category list chargeds

Rating

0.0

(0)

Developer

Romy

Romy

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

What does Klook Categories Scraper do?

Klook Categories Scraper scrapes Klook's full nested category tree — the app's "All" screen, every vertical down to leaf categories (Tours & experiences, Attraction tickets, Transport, Hotels, More to explore) — plus the Home tab's quick-link category row.

It talks directly to the same internal API the official Klook Android app uses, reverse-engineered by disassembling the app's native request-signing library and validated against live traffic captured from a real device. No Klook account, no API key. This is the categories slice of Klook All-in-One API, split out as its own focused Actor.

Why use Klook Categories Scraper?

  • The complete category tree — mirrors the app's "All" screen exactly, all the way down (e.g. Transport's rail passes split into Japan/Europe/Metro, not merged into one)
  • No account needed — works fully anonymously
  • Use cases: building a category id lookup table for klook-search-scraper's mainCategory/branchCategory filters, site-map/catalog generation, monitoring Klook's category taxonomy for changes

How it connects to the parent

This Actor is a narrow, batch-run spin-off of klook-all-in-one-api (an always-on Standby REST API exposing every Klook endpoint). It reuses the parent's exact, proven request-signing logic (klook-client.ts, copied verbatim) but only wraps /categories/tree and /categories, and runs as a normal input-in/dataset-out Actor instead of a Standby API.

Input

FieldTypeDescription
includeTreebooleanFetch the full nested category tree. Default true
includeCategoriesbooleanFetch the Home-tab quick-link categories. Default true

At least one of the two must be true.

Example: {} (defaults: both fetched).

Output

One row per endpoint fetched. Real example (from the parent Actor's own live-confirmed capture of GET /categories/tree, trimmed to two sections):

{
"type": "tree",
"data": {
"success": true,
"tree": {
"result": {
"category": {
"menus": [
{
"title": "Things to do",
"sub_menu_list": [
{
"title": "Tours & experiences",
"sub_menu_list": [{ "title": "Tours", "business_name": "9_Tours" }]
}
]
},
{
"title": "Transport",
"sub_menu_list": [{ "title": "Japan rail passes", "business_name": "35_Japan trains" }]
}
]
}
}
}
}
}

Known limitations

  • Requires Apify's RESIDENTIAL proxy group. Klook's edge blocks non-residential IPs with a DataDome bot-challenge page — confirmed directly from this development sandbox (a request byte-for-byte identical to a working one, sent without the proxy, came back as a DataDome JS-challenge HTML page, not JSON). All outbound requests route through Actor.createProxyConfiguration({ groups: ['RESIDENTIAL'] }).
  • Local dev smoke testing outside the Apify platform needs "Proxy external access" enabled on the account. This Actor's code was verified to be a byte-for-byte match against the parent's already-published, working klook-client.ts, and the local smoke test run during development failed exactly at the proxy-URL-acquisition step (ProxyConfiguration: The "Proxy external access" feature isn't enabled for your account) — before any request to Klook was even attempted. That's an account-tier restriction on pulling a proxy URL from outside a real platform Actor run, not a defect in this code; once deployed and actually run on Apify's platform, proxy access works through the normal SDK path.
  • categoryTree() only works with an empty query string — the app's own captured query params (app_version, is_hit_navi, platform, ...) get rejected; the default (no-param) response is identical to what the app itself gets either way, so this isn't a limitation in practice.
  • Leaf categories under the tree browse through the app's own internal search, carrying the same category ids exposed by klook-search-scraper's filters — no separate landing page per category.
  • This is an unofficial, reverse-engineered integration, not affiliated with or endorsed by Klook Travel Technology Limited.

Pricing

Pay per event. Charged $0.002 per category-list (FREE tier) — one event per row pushed to the dataset. See the Actor's Pricing tab for rates across all tiers.