# TikTok Shop Indonesia Scraper - Products, Prices & Sellers (`kulqiz/tiktok-shop-scraper`) Actor

Scrape TikTok Shop Indonesia products: prices, discounts, ratings, units sold, sellers, brands & images. Filter best-sellers, crawl all categories & subcategories, or get full product detail + reviews by URL. No proxy, no CAPTCHA setup. Pay per result.

- **URL**: https://apify.com/kulqiz/tiktok-shop-scraper.md
- **Developed by:** [KULQIZ](https://apify.com/kulqiz) (community)
- **Categories:** E-commerce, Social media, Automation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

$0.99 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## 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

## TikTok Shop Indonesia Scraper

Extract public product data from TikTok Shop Indonesia (`shop-id.tokopedia.com`): prices, discounts, ratings, units sold, sellers, images, and more. It works without proxies and clears the site's anti-bot check automatically, so you just press Run.

Built specifically for the Indonesian market, where most generic scrapers get blocked.

### Use cases

- **Product research and dropshipping**: find best-selling, high-rating products before you stock or run ads.
- **Price and promo monitoring**: track prices, discounts, and units sold across categories over time.
- **Competitor and seller analysis**: see which shops and products dominate a category.
- **Market research**: export thousands of TikTok Shop Indonesia products to a spreadsheet for analysis.

### What you can do

- Scrape the homepage and all 28 categories, with an optional subcategory crawl (150+ pages) for thousands of products.
- Filter for best-sellers by minimum units sold, minimum rating, and price range.
- Get full product detail by URL: description, all images, variants and SKUs, specifications, and customer reviews.
- No proxy, no CAPTCHA key, no setup. You only pay for products that are returned.

### Output

One row per product:

```json
{
  "product_id": "1731693242302760574",
  "title": "NYU Henna Shampoo Hair Colour - Natural Black",
  "currency": "Rp",
  "sale_price": "12.900",
  "sale_price_value": 12900,
  "origin_price": null,
  "discount": null,
  "rating": 4.8,
  "review_count": 2945,
  "sold_count": 38361,
  "shop_name": "godrejindonesia",
  "brand": "NYU",
  "image": "https://...webp",
  "url": "https://shop-id.tokopedia.com/pdp/.../1731693242302760574"
}
````

Detail runs (via `productUrls`) add `description`, `images`, `variants`, `specifications`, and `reviews`. Export as JSON, CSV, Excel, or HTML, or pull the data through the Apify API.

### Input

| Field | Description | Default |
|-------|-------------|---------|
| `crawlCategories` | Scrape homepage and all 28 categories | `true` |
| `crawlSubcategories` | Also crawl subcategories (150+ pages, far more products) | `false` |
| `maxProducts` | Stop after this many products | `1000` |
| `minSold` | Keep only products with at least this many units sold | `0` (off) |
| `minRating` | Keep only products rated at least this (1 to 5) | `0` (off) |
| `minPrice` / `maxPrice` | Price range filter, in Rupiah | `0` (off) |
| `productUrls` | Product URLs for full detail mode (description, variants, specs, reviews) | empty |
| `includeReviews` / `maxReviews` | Include customer reviews per product (detail mode) | `false` / `20` |

Find best-sellers above 1,000 units:

```json
{ "crawlCategories": true, "crawlSubcategories": true, "minSold": 1000, "maxProducts": 2000 }
```

Full detail and reviews for specific products:

```json
{ "productUrls": ["https://shop-id.tokopedia.com/pdp/.../1729653353364556550"], "includeReviews": true }
```

### How to scrape TikTok Shop Indonesia (categories and product URLs)

You pick products by category and subcategory, or by pasting product URLs for full detail and reviews. The TikTok Shop Indonesia web storefront has no public keyword search, so this tool is category and URL based.

### FAQ

**Do I need a proxy?** No, it works without one.

**Do I need a CAPTCHA solver key?** No, the slider check is handled automatically.

**Which market?** TikTok Shop Indonesia (`shop-id.tokopedia.com`).

**Is it legal?** It collects only publicly available product data, no private or login-protected content. You are responsible for following applicable laws and the site's Terms of Service.

### Custom work

Need a specific category, product set, or extra field? Send me a message.

# Actor input Schema

## `crawlCategories` (type: `boolean`):

Kunjungi homepage + 28 kategori (≈600 produk/run). Matikan untuk hanya satu URL.

## `startUrl` (type: `string`):

Dipakai hanya jika 'Crawl semua kategori' dimatikan.

## `maxProducts` (type: `integer`):

Berhenti setelah mengumpulkan sebanyak ini produk.

## `crawlSubcategories` (type: `boolean`):

Telusuri subkategori tiap kategori (~150+ halaman) untuk hasil jauh lebih banyak.

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

Isi daftar URL /pdp/... untuk ambil DETAIL lengkap (deskripsi, varian, spesifikasi, gambar) + review. Kalau diisi, mode kategori diabaikan.

## `includeReviews` (type: `boolean`):

Ambil review produk (hanya berlaku di mode detail / URL produk).

## `maxReviews` (type: `integer`):

Jumlah review yang diambil tiap produk (default 20 yang ter-render di halaman).

## `minSold` (type: `integer`):

Hanya produk dengan jumlah terjual >= nilai ini (cari produk laris). 0 = nonaktif.

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

Hanya produk dengan rating >= nilai ini (1-5). 0 = nonaktif.

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

Hanya produk dengan harga jual >= nilai ini. 0 = nonaktif.

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

Hanya produk dengan harga jual <= nilai ini. 0 = nonaktif.

## `sessionState` (type: `object`):

Tidak wajib, CAPTCHA sudah dipecahkan otomatis (gratis). Hanya untuk lewati lebih cepat.

## `captchaSolverApiKey` (type: `string`):

Tidak wajib, CAPTCHA sudah otomatis. Ini hanya fallback berbayar bila suatu saat diperlukan.

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

Scraper ini tidak butuh proxy. Aktifkan hanya jika IP-mu kena rate-limit.

## Actor input object example

```json
{
  "crawlCategories": true,
  "startUrl": "https://shop-id.tokopedia.com/",
  "maxProducts": 1000,
  "crawlSubcategories": false,
  "productUrls": [],
  "includeReviews": false,
  "maxReviews": 20,
  "minSold": 0,
  "minRating": 0,
  "minPrice": 0,
  "maxPrice": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("kulqiz/tiktok-shop-scraper").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("kulqiz/tiktok-shop-scraper").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 '{}' |
apify call kulqiz/tiktok-shop-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "TikTok Shop Indonesia Scraper - Products, Prices & Sellers",
        "description": "Scrape TikTok Shop Indonesia products: prices, discounts, ratings, units sold, sellers, brands & images. Filter best-sellers, crawl all categories & subcategories, or get full product detail + reviews by URL. No proxy, no CAPTCHA setup. Pay per result.",
        "version": "0.1",
        "x-build-id": "dxK4Km59riy7uqHyj"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/kulqiz~tiktok-shop-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-kulqiz-tiktok-shop-scraper",
                "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/kulqiz~tiktok-shop-scraper/runs": {
            "post": {
                "operationId": "runs-sync-kulqiz-tiktok-shop-scraper",
                "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/kulqiz~tiktok-shop-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-kulqiz-tiktok-shop-scraper",
                "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": {
                    "crawlCategories": {
                        "title": "Crawl semua kategori",
                        "type": "boolean",
                        "description": "Kunjungi homepage + 28 kategori (≈600 produk/run). Matikan untuk hanya satu URL.",
                        "default": true
                    },
                    "startUrl": {
                        "title": "URL awal (jika tidak crawl kategori)",
                        "type": "string",
                        "description": "Dipakai hanya jika 'Crawl semua kategori' dimatikan.",
                        "default": "https://shop-id.tokopedia.com/"
                    },
                    "maxProducts": {
                        "title": "Maksimum produk",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Berhenti setelah mengumpulkan sebanyak ini produk.",
                        "default": 1000
                    },
                    "crawlSubcategories": {
                        "title": "Crawl subkategori",
                        "type": "boolean",
                        "description": "Telusuri subkategori tiap kategori (~150+ halaman) untuk hasil jauh lebih banyak.",
                        "default": false
                    },
                    "productUrls": {
                        "title": "URL produk (mode detail)",
                        "type": "array",
                        "description": "Isi daftar URL /pdp/... untuk ambil DETAIL lengkap (deskripsi, varian, spesifikasi, gambar) + review. Kalau diisi, mode kategori diabaikan.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "includeReviews": {
                        "title": "Sertakan review",
                        "type": "boolean",
                        "description": "Ambil review produk (hanya berlaku di mode detail / URL produk).",
                        "default": false
                    },
                    "maxReviews": {
                        "title": "Maksimum review per produk",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Jumlah review yang diambil tiap produk (default 20 yang ter-render di halaman).",
                        "default": 20
                    },
                    "minSold": {
                        "title": "Minimum terjual",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Hanya produk dengan jumlah terjual >= nilai ini (cari produk laris). 0 = nonaktif.",
                        "default": 0
                    },
                    "minRating": {
                        "title": "Minimum rating",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Hanya produk dengan rating >= nilai ini (1-5). 0 = nonaktif.",
                        "default": 0
                    },
                    "minPrice": {
                        "title": "Harga minimum (Rp)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Hanya produk dengan harga jual >= nilai ini. 0 = nonaktif.",
                        "default": 0
                    },
                    "maxPrice": {
                        "title": "Harga maksimum (Rp)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Hanya produk dengan harga jual <= nilai ini. 0 = nonaktif.",
                        "default": 0
                    },
                    "sessionState": {
                        "title": "Session state (opsional/advanced)",
                        "type": "object",
                        "description": "Tidak wajib, CAPTCHA sudah dipecahkan otomatis (gratis). Hanya untuk lewati lebih cepat."
                    },
                    "captchaSolverApiKey": {
                        "title": "SadCaptcha API key (opsional/advanced)",
                        "type": "string",
                        "description": "Tidak wajib, CAPTCHA sudah otomatis. Ini hanya fallback berbayar bila suatu saat diperlukan."
                    },
                    "proxyConfiguration": {
                        "title": "Proxy (opsional, TIDAK wajib)",
                        "type": "object",
                        "description": "Scraper ini tidak butuh proxy. Aktifkan hanya jika IP-mu kena rate-limit.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
