Klook Esim Scraper
Pricing
from $6.20 / 1,000 esim package chargeds
Klook Esim Scraper
Get eSIM destination and data plan options — a niche no other Klook scraper covers 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.
What does Klook eSIM Scraper do?
Klook eSIM Scraper scrapes eSIM data plan options (data amount, validity, price per option) for one or more Klook eSIM activities, plus the eSIM homepage's popular destinations list.
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 eSIM slice of Klook All-in-One API, split out as its own focused Actor.
Why use Klook eSIM Scraper?
- eSIM-specific package data — data amount / validity / price per plan, not available from a plain activity-detail call
- A discovery entry point too —
includeDestinationspulls the eSIM homepage's popular-destination list (each carrying its ownactivity_id) so you can find eSIM activity ids without knowing them up front - No account needed — every read request works fully anonymously
- Use cases: eSIM price comparison, destination-coverage monitoring, travel-connectivity content aggregation
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 /activities/{id}/esim-packages and /esim/destinations, and runs as a normal input-in/dataset-out Actor instead of a Standby API.
Input
| Field | Type | Description |
|---|---|---|
activityIds | string[] | Klook eSIM activity ids to fetch package options for. |
includeDestinations | boolean | Fetch the eSIM homepage's popular destinations list. Default true |
currency | string | ISO code, affects package prices. Default GBP |
At least one of includeDestinations (true) or a non-empty activityIds must be set.
Example:
{ "includeDestinations": true, "activityIds": ["109393"] }
Output
One row per destination-list call and one row per activity id's packages. Real example (from the parent Actor's own live-confirmed capture of GET /esim/destinations, trimmed):
{"type": "destinations","data": {"success": true,"destinations": { "result": { "regions": [{ "name": "Japan", "activity_id": 109393 }] } }}}
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. - eSIM activities are also plain activities under the hood —
klook-activity-detail-scraperalso works on the same ids and returns the base activity detail; this Actor adds only the eSIM-specific package list. - This is an unofficial, reverse-engineered integration, not affiliated with or endorsed by Klook Travel Technology Limited.
Pricing
Pay per event. Charged $0.008 per esim-package (FREE tier) — one event per row pushed to the dataset. See the Actor's Pricing tab for rates across all tiers.