KKday Scraper at a glance
KKday Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes id, name, url, minprice and maxprice, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.00 per 1,000 results on the Apify Free plan and from $1.70 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Web data
- Pricing
- $2.00 per 1,000 results (Free plan), from $1.70 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 23 options
- Run success
- 100.0% of completed public runs in the last 30 days
Scrape KKday travel activities by keyword, city or URL. Every row carries prices, discount, ratings, booking counts, destinations and images. Full details (description, address, coordinates, price tiers) are one toggle away, with recurring change tracking built in.
What KKday Scraper can do
- Two ways to find activities. Search by keyword, or paste KKday links: individual activity pages or keyword search-result pages, which keep paging forward from wherever you pasted them.
- Rich listing data out of the box. Price range, original price, discount percent, rating, review count, booking-demand count, destinations, tags and a cover image come straight from the search results, with no extra toggle needed.
- Full activity detail on demand. Fetch activity details, on by default, adds the long description, meeting address, coordinates and the complete price-tier list, billed only for records it actually reaches and saves.
- Availability calendar on demand. Turn on Include availability calendar to add, for every package of an activity, each date's lowest price and whether the date can be booked, for a window you choose (up to 180 days). Read-only and not billed as a separate event.
- Language and currency control. Search mode reads result pages in the site language and currency you choose; pasted links are read exactly as pasted.
- Built for schedules. Incremental monitoring tracks one search or URL set across recurring runs and returns only new and changed activities, so unchanged ones are not billed again; Resume skips activities already saved in a previous run or dataset.
Choose what to collect
These inputs let you configure KKday Scraper - Tours, Activities & Prices. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Search KKday by keyword or read pasted KKday URLs. |
querystring | Keyword for activity search, such as a city, attraction or experience. Ignored in URL mode. |
sortBystring | Order of search results (search mode and pasted results links that carry no sort of their own). Recommended is the site's default ranking. |
urlsarray | Activity pages (/product/-, or the id-only form /product/, for example https://www.kkday.com/en/product/133300-shibuya-sky-observatory-e-ticket-tokyo) or keyword search pages (/product/productlist?q=...). Search pages keep paging forward from the pasted page. Other KKday pages (city or destination pages, categories, home) are skipped with a warning. |
languagestring | Site language path, for example en or zh-tw. English pages are verified; other codes reuse the same layout. |
currencystring | Three-letter display currency applied in both search and URL modes, for example USD. |
fetchDetailsboolean | Add description, meeting address, coordinates and price tiers to each activity. An extra charge applies only to records actually enriched and saved (detail-enrichment). |
Show 16 more inputs
| Input | What it controls |
|---|---|
maxItemsinteger | Maximum number of records returned. This is the only cap that stops a run early by default. |
maxPagesinteger | Maximum search pages to read per search. Zero means no page limit. |
includeAvailabilityboolean | Adds an availability list to each activity: one entry per package and date with the lowest price and whether the date can be booked. |
availabilityDateFromstring | First date to read, as YYYY-MM-DD. Leave empty to start today. Past dates are moved to today. |
availabilityDaysinteger | How many days to read from the start date (1-180). |
availabilityOnlyAvailableboolean | Keep only the dates that can be booked and drop sold-out or closed dates. |
availabilityTimeSlotsboolean | Also read, per package and date, the bookable time slots, the sold-out and discounted flags and the price of each ticket type (SKU). One extra read per package, so runs are slower. |
resumeFromRunIdstring | Skip activity IDs already present in a previous run or dataset. See Incremental monitoring for recurring runs. |
incrementalModeboolean | Return only new or changed activities for the same state key. Cannot be combined with Resume from run when a baseline already exists. |
stateKeystring | Name for shared recurring-run state. Leave empty to derive it from mode, query or URLs, language and currency. |
emitUnchangedboolean | Return records that have not changed during incremental monitoring. Unchanged rows are billed as dataset items. |
emitExpiredboolean | Off by default. Turn on to return records that were present in a previous run but are no longer found, marked EXPIRED. Only produced once a run has fully scanned the tracked scope: not when Max items capped the run, and not when a pasted URL could not be read. This returns, and bills, extra synthetic rows, so leave it off unless you need expiry tracking. |
ignoreFieldsForChangesarray | Field names (or dotted nested paths such as priceTiers.price) that never count as a change in incremental monitoring. Rows that differ only in these fields stay UNCHANGED and are not billed. Changing this list does not reset the baseline. |
mcpConnectorsarray | Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a page per record; other connectors get a best-effort write or digest. Each connector receives a condensed summary per record, not the full record; the complete record always stays in the dataset. Leave empty to skip; this never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com). |
notionParentPageUrlstring | URL or id of the Notion page under which record pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on records written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
ididnamenameurlurlminPriceminPricemaxPricemaxPriceofficialPriceofficialPricecurrencycurrencydiscountPercentdiscountPercentratingStarratingStarratingCountratingCountbookedCountbookedCountdestinationsdestinationsShow 15 more fields
addressaddresslatitudelatitudelongitudelongitudedescriptiondescriptionpriceTierspriceTiersdisplayTagsdisplayTagsimageUrlimageUrldetailStatusdetailStatuschangeTypechangeTypechangedFieldschangedFieldsfirstSeenAtfirstSeenAtlastSeenAtlastSeenAtscrapedAtscrapedAtavailabilityStatusavailabilityStatusavailabilityavailabilityExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"id": "20000001",
"name": "Sample Harbor Sunset Cruise",
"url": "https://www.kkday.com/en/product/20000001-sample-harbor-sunset-cruise",
"minPrice": 24.5,
"maxPrice": 89,
"officialPrice": 29,
"currency": "USD",
"discountPercent": 15.5,
"ratingStar": 4.7,
"ratingCount": 1204,
"bookedCount": "8K+",
"destinations": [
"Sample Harbor"
],
"displayTags": [
"Instant Confirmation"
],
"imageUrl": "https://example.com/img/sample.jpg",
"imageUrls": [
"https://example.com/img/sample.jpg"
],
"supplierName": "Sample Supplier",
"introduction": "A relaxed evening cruise around the fictional Sample Harbor.",
"address": "1 Sample Pier, Sample City, ST",
"latitude": 25,
"longitude": 121.5,
"description": "A fictional sunset cruise with narration and drinks included, used here only as a placeholder.",
"priceTiers": [
{
"price": 24.5,
"currency": "USD",
"name": "Adult"
}
],
"detailStatus": "complete",
"changeType": "NEW",
"changedFields": [],
"firstSeenAt": "2026-01-01T00:00:00+00:00",
"lastSeenAt": "2026-01-01T00:00:00+00:00",
"scrapedAt": "2026-01-01T00:00:00+00:00"
}Ways to use this data
- Travel content and comparison sites: build destination pages with current activity prices, discounts and ratings.
- Travel agencies and OTAs: enrich a curated list of activity URLs with full descriptions, coordinates and price tiers for repackaging.
- Market and competitor researchers: track booking-demand counts, ratings and supplier names across a destination's activities over time.
- Trip-planning tools and chatbots: feed activity search results, coordinates and price tiers into your own app or assistant.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does KKday Scraper return?
The documented output for KKday Scraper includes id, name, url, minprice, maxprice, officialprice, currency and discountpercent. Availability of each field depends on the source page and the selected mode.
How much does KKday Scraper cost?
It costs $2.00 per 1,000 results on the Apify Free plan and from $1.70 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed activities on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental monitoring. Each run then returns only new and updated activities for the same state key, and unchanged ones are not billed unless you opt in with Emit unchanged.
Does Incremental monitoring flag an activity that disappeared and came back?
No. Activities are classified NEW, UPDATED or UNCHANGED, plus EXPIRED when Emit expired is on and a run fully scanned the tracked scope. An activity that vanishes and is later seen again is classified UPDATED or UNCHANGED the next time it is scanned, not as a separate reappeared state.
Why does a pasted activity URL return fewer fields than a search result?
KKday only publishes price range, discount, rating, review count, booking-demand count, destinations, tags and supplier name on its search-result pages, not on the activity page itself. Pasting a single activity link (or turning on Fetch activity details) still gets you the name, description, address, coordinates and price tiers, but those listing-only fields stay empty. To get both, search or paste a search-result URL with Fetch activity details on.
Can I use it with AI agents or MCP?
Yes. Call it through the Apify API, any Apify integration or an MCP client such as Apify's MCP server, and read the results from the dataset. The connector field for pushing results straight into Notion, Linear or Airtable is not active in the current build.
