# Kaidee Thailand Search & Listings Scraper (`mai_amm/kaidee`) Actor

Scrapes Kaidee Thailand search results, category listings, and product details by keyword, category URL, or product URL using HTTP-only Next.js data extraction.

- **URL**: https://apify.com/mai\_amm/kaidee.md
- **Developed by:** [wiseld\_squid](https://apify.com/mai_amm) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Kaidee Thailand Search & Listings Scraper

Scrape public Kaidee Thailand search results, category listing pages, and product detail pages using lightweight HTTP requests. The actor extracts structured data from Kaidee's server-rendered Next.js payload (`__NEXT_DATA__`), so it does not need Playwright for normal runs.

### Features

- Search Kaidee by keyword, for example `iphone`, `macbook`, `honda`, or Thai keywords.
- Crawl category/listing URLs such as `https://www.kaidee.com/c29-phone_device`.
- Scrape direct product URLs such as `https://www.kaidee.com/product-371350468`.
- Optional detail enrichment for description, attributes, all images, status, timestamps, and location fields.
- Optional contact extraction. Contacts are disabled by default for safer public datasets.
- HTTP-only implementation for lower cost and faster runs.

### Input

```json
{
  "mode": "search",
  "searchQuery": "iphone",
  "minPrice": 10000,
  "maxPrice": 50000,
  "maxItems": 100,
  "maxPages": 5,
  "includeDetails": true,
  "includeContacts": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
````

### Modes

- `search`: Builds `/browse?q=...` URLs from `searchQuery` and `searchTerms`.
- `category`: Crawls `categoryUrls` or `startUrls` as listing pages.
- `product`: Crawls `productUrls` or `startUrls` as detail pages.
- `urls`: Accepts mixed `startUrls`.
- `auto`: Combines provided search terms and URLs.

### Output

Each dataset item is normalized:

```json
{
  "source": "kaidee",
  "id": 371350468,
  "url": "https://www.kaidee.com/product-371350468",
  "title": "ไอโฟน 16 โปร",
  "price": 25000,
  "currency": "THB",
  "description": "ไอโฟน 16 โปร 256 ...",
  "attributes": {
    "brand": "iPhone",
    "model": "16",
    "capacity": "256 GB"
  },
  "category": "โทรศัพท์มือถือ",
  "condition": "มือสอง",
  "location": "บางนา กรุงเทพมหานคร",
  "district": "บางนา",
  "province": "กรุงเทพมหานคร",
  "images": ["https://img.kaidee.com/...jpg"],
  "status": "live",
  "postedAt": "2026-05-02T05:18:36.256688+07:00",
  "scrapedAt": "2026-05-03T10:00:00.000Z"
}
```

When `includeDetails` is `false`, the actor saves list-page summary fields only: title, price, location, category, condition, first image, flags, seller summary, and product URL.

### Notes

- The actor does not rely on CSS class names. It parses the structured `__NEXT_DATA__` JSON embedded in Kaidee pages.
- `_next/data` JSON URLs currently return `404` for these SSR pages, so the actor intentionally reads HTML and extracts the embedded payload.
- Use `includeDetails=false` for fast, low-cost market scans. Use `includeDetails=true` when you need descriptions, attributes, and all images.

# Actor input Schema

## `mode` (type: `string`):

Use search for keyword search, category for category/listing URLs, product for product URLs, urls for mixed URLs, or auto.

## `searchQuery` (type: `string`):

Keyword to search on Kaidee, for example iphone, macbook, honda, กระเป๋า.

## `searchTerms` (type: `array`):

Multiple keywords to search. Each keyword starts a separate /browse?q=... crawl.

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

Kaidee search, category, or product URLs.

## `categoryUrls` (type: `array`):

Kaidee category/listing URLs, for example https://www.kaidee.com/c29-phone\_device.

## `productUrls` (type: `array`):

Direct product URLs, for example https://www.kaidee.com/product-371350468.

## `minPrice` (type: `integer`):

Minimum price filter for /browse search URLs.

## `maxPrice` (type: `integer`):

Maximum price filter for /browse search URLs.

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

Maximum number of listing records to save.

## `maxPages` (type: `integer`):

Maximum result pages to crawl per search/category URL. Use 0 to continue until maxItems or no next page.

## `includeDetails` (type: `boolean`):

Open product pages and extract description, attributes, all images, status, timestamps, and richer location data.

## `includeContacts` (type: `boolean`):

Include phone/email/line/contact fields found in Kaidee data. Disabled by default for safer public datasets.

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

Concurrent HTTP requests. Keep conservative for reliability.

## `proxyConfiguration` (type: `object`):

Apify proxy configuration.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "iphone",
  "startUrls": [
    {
      "url": "https://www.kaidee.com/browse?q=iphone"
    }
  ],
  "maxItems": 100,
  "maxPages": 5,
  "includeDetails": true,
  "includeContacts": false,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset containing all scraped Kaidee listings and product details.

# 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 = {
    "mode": "search",
    "searchQuery": "iphone",
    "startUrls": [
        {
            "url": "https://www.kaidee.com/browse?q=iphone"
        }
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("mai_amm/kaidee").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 = {
    "mode": "search",
    "searchQuery": "iphone",
    "startUrls": [{ "url": "https://www.kaidee.com/browse?q=iphone" }],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("mai_amm/kaidee").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "search",
  "searchQuery": "iphone",
  "startUrls": [
    {
      "url": "https://www.kaidee.com/browse?q=iphone"
    }
  ],
  "maxItems": 100
}' |
apify call mai_amm/kaidee --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=mai_amm/kaidee",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Kaidee Thailand Search & Listings Scraper",
        "description": "Scrapes Kaidee Thailand search results, category listings, and product details by keyword, category URL, or product URL using HTTP-only Next.js data extraction.",
        "version": "0.1",
        "x-build-id": "BPRbhU2X5VZV7cKih"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/mai_amm~kaidee/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-mai_amm-kaidee",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/mai_amm~kaidee/runs": {
            "post": {
                "operationId": "runs-sync-mai_amm-kaidee",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/mai_amm~kaidee/run-sync": {
            "post": {
                "operationId": "run-sync-mai_amm-kaidee",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "auto",
                            "search",
                            "category",
                            "product",
                            "urls"
                        ],
                        "type": "string",
                        "description": "Use search for keyword search, category for category/listing URLs, product for product URLs, urls for mixed URLs, or auto.",
                        "default": "search"
                    },
                    "searchQuery": {
                        "title": "Search query",
                        "type": "string",
                        "description": "Keyword to search on Kaidee, for example iphone, macbook, honda, กระเป๋า."
                    },
                    "searchTerms": {
                        "title": "Search terms",
                        "type": "array",
                        "description": "Multiple keywords to search. Each keyword starts a separate /browse?q=... crawl.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Start URLs",
                        "type": "array",
                        "description": "Kaidee search, category, or product URLs.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "categoryUrls": {
                        "title": "Category URLs",
                        "type": "array",
                        "description": "Kaidee category/listing URLs, for example https://www.kaidee.com/c29-phone_device.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "productUrls": {
                        "title": "Product URLs",
                        "type": "array",
                        "description": "Direct product URLs, for example https://www.kaidee.com/product-371350468.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "minPrice": {
                        "title": "Minimum price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum price filter for /browse search URLs."
                    },
                    "maxPrice": {
                        "title": "Maximum price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum price filter for /browse search URLs."
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of listing records to save.",
                        "default": 100
                    },
                    "maxPages": {
                        "title": "Max pages",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum result pages to crawl per search/category URL. Use 0 to continue until maxItems or no next page.",
                        "default": 5
                    },
                    "includeDetails": {
                        "title": "Include product details",
                        "type": "boolean",
                        "description": "Open product pages and extract description, attributes, all images, status, timestamps, and richer location data.",
                        "default": true
                    },
                    "includeContacts": {
                        "title": "Include contacts",
                        "type": "boolean",
                        "description": "Include phone/email/line/contact fields found in Kaidee data. Disabled by default for safer public datasets.",
                        "default": false
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Concurrent HTTP requests. Keep conservative for reliability.",
                        "default": 5
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify proxy configuration.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
