# Tokopedia Scraper — Product Search, Prices & Sold Counts (`haketa/tokopedia-scraper`) Actor

Scrape Tokopedia product search results by keyword or URL. Extract product name, IDR price, rating, review count, sold count, discount, shop details, category breadcrumb, and images. Fast HTTP extraction for market research, price monitoring, and lead generation.

- **URL**: https://apify.com/haketa/tokopedia-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** E-commerce, Business
- **Features:** Limited permissions
- **Stats:** 11 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Tokopedia Scraper — Product Search, Prices, Sold Count & Shop Data

[![Apify Actor](https://img.shields.io/badge/Apify-Actor-blue)](https://apify.com/haketa/tokopedia-scraper)
[![Marketplace](https://img.shields.io/badge/Marketplace-Tokopedia%20\(Indonesia\)-42b549)](https://www.tokopedia.com)
[![No Auth](https://img.shields.io/badge/Auth-None%20Required-success)]()
[![Scale](https://img.shields.io/badge/Pagination-1%2C000%2B%20Products-purple)]()
[![Export](https://img.shields.io/badge/Export-JSON%20%7C%20CSV%20%7C%20Excel%20%7C%20API-orange)]()

**Extract product search results from [Tokopedia](https://www.tokopedia.com), Indonesia's #1 e-commerce marketplace, in seconds — no login, no coding, and no browser overhead.** This **Tokopedia scraper** pulls complete product listings — product title, price in Indonesian Rupiah (`price` & numeric `priceRaw`), original pre-discount price, discount percentage, star rating, customer review count, **units sold (`soldCount` & `soldCountLabel`)**, cash-on-delivery availability (`isCOD`), category breadcrumb, product images/videos, and full **seller shop details** (`shopName`, `shopCity`, `shopUrl`, Official Store & Power Badge status). Give it one or more keywords like `iphone 15` or `sepatu nike`, or paste any Tokopedia search URL, and **scrape Tokopedia** product data at scale.

Export every result to **JSON, CSV, Excel, or API**.

> Built for Southeast Asia e-commerce analysts, brand protection and MAP-monitoring teams, price-comparison platforms, dropshippers, B2B seller lead-generation workflows, and market researchers who need fast, reliable **Tokopedia data**.

***

### ⚡ At a glance

| Feature | Details |
|---|---|
| **Target marketplace** | [Tokopedia](https://www.tokopedia.com) (`tokopedia.com` — Indonesia) |
| **Input modes** | Keyword list (`searchKeywords`) and/or filtered Tokopedia search URLs (`startUrls`) |
| **Sort options** | Relevance (`23`), Newest (`5`), Top sales / Best sellers (`8`), Price low→high (`11`), Price high→low (`10`), Highest rating (`9`) |
| **Core product fields** | `id`, `name`, `url`, `price`, `priceRaw` (IDR), `originalPrice`, `discountPercentage`, `ratingAverage`, `countReview`, `soldCount`, `soldCountLabel`, `isCOD`, `imageUrl`, `videoUrl`, `categoryBreadcrumb` |
| **Shop & seller fields** | `shopId`, `shopName`, `shopUrl`, `shopCity`, `shopIsOfficial`, `shopIsPowerBadge` |
| **Pagination & scale** | 60 products per page request (`rowsPerPage: 60`) with automatic deep pagination — supports **1,000+ products per keyword** and multi-keyword runs with global de-duplication |
| **Authentication & proxy** | No login or API key required; runs out-of-the-box without expensive residential proxies |
| **Export formats** | JSON, CSV, Excel (XLSX), HTML, XML, RSS, and Apify REST API |

***

### 🔎 Why scrape Tokopedia?

[Tokopedia](https://www.tokopedia.com) is the flagship e-commerce marketplace in Indonesia — Southeast Asia's largest digital economy and the fourth most populous nation in the world — hosting hundreds of millions of active SKUs across consumer electronics, fashion, beauty, automotive, groceries, and home goods. Its search results provide a live, quantitative pulse of Indonesian retail demand: exact prices in Indonesian Rupiah (IDR), promotional discount depth, customer ratings, review velocity, verified **units sold (`terjual`)**, and the merchants behind every listing.

Collecting this intelligence manually is slow and fragile. Search queries span hundreds of pages, pricing and stock change daily, and browser-based scrapers are slow and costly. Copy-pasting product cards into a spreadsheet does not scale.

This **Tokopedia data extractor** automates the entire workflow over lightweight HTTP requests. It walks page after page of 60 products per request, normalizes prices and sold-count badges into clean numbers, de-duplicates across pages and keywords by `id`, and delivers analysis-ready records in seconds — turning Tokopedia into a programmable **Tokopedia API**.

**Common reasons teams scrape Tokopedia:**

- **Price monitoring & dynamic repricing** — track competitor prices (`priceRaw`) and discount percentages (`discountPercentage`) across your category on a daily or hourly schedule.
- **Demand & sales-velocity research** — sort by Top Sales (`sortOrder: "8"`) and analyze `soldCount` (`100+ terjual`, `1rb+ terjual`) to identify best-selling SKUs and revenue leaders.
- **Brand protection & unauthorized seller detection** — search your brand name to audit every listing, verify `shopIsOfficial` vs. third-party resellers, and flag grey-market discounting.
- **B2B merchant & supplier lead generation** — compile lists of active Indonesian sellers with `shopName`, `shopUrl`, `shopCity`, `shopIsOfficial`, and `shopIsPowerBadge` for wholesale outreach or marketplace onboarding.
- **Assortment & category analytics** — map category trees (`categoryBreadcrumb`), COD adoption (`isCOD`), and regional seller distribution (`shopCity`) across thousands of products.

***

### ✨ What this Tokopedia scraper does

- ✅ **Multi-keyword & URL search** — pass any number of `searchKeywords` (`["iphone 15", "sepatu nike", "kursi kantor"]`) or paste pre-filtered Tokopedia search URLs into `startUrls`. Leave both empty and the actor automatically collects a diverse 100-item sample across 8 popular Indonesian product categories.
- ✅ **Unlocked 1,000+ deep pagination** — fetches up to **60 products per request** (`rowsPerPage: 60`) and automatically paginates page-by-page without restrictive ceilings. Set `maxItemsPerSearch: 0` (unlimited) and `maxTotalItems: 1000`+ to extract **1,000+ unique products** in a single run.
- ✅ **Parsed units-sold demand signal** — extracts Tokopedia's Bahasa Indonesia sales badges (`"100+ terjual"`, `"5 terjual"`) into both a clean integer floor (`soldCount`) and the original badge string (`soldCountLabel`).
- ✅ **Dual price formatting & auto-computed discounts** — provides both formatted Rupiah strings (`"Rp451.440"`) and clean integers (`451440`) for `priceRaw` and `originalPriceRaw`, and automatically computes `discountPercentage` whenever a pre-discount price exists.
- ✅ **Complete seller & shop intelligence** — every product record includes `shopId`, `shopName`, `shopUrl`, `shopCity` (e.g. `"Jakarta Barat"`, `"Surabaya"`, `"Bandung"`), `shopIsOfficial` (Official Store badge), and `shopIsPowerBadge` (Power Merchant status).
- ✅ **6 native sort orders** — sort results by Relevance (`23`), Newest arrivals (`5`), Top sales / Best sellers (`8`), Price low to high (`11`), Price high to low (`10`), or Highest customer rating (`9`).
- ✅ **Global de-duplication** — tracks every product by its unique Tokopedia `id` across all pages and keywords so overlapping searches never produce duplicate rows.
- ✅ **Ultra-fast, low-cost HTTP execution** — runs without a headless browser, pulling **100–500+ products in ~5–15 seconds** on minimal memory (512 MB).

***

### 🎯 Use cases

| Team / Role | How they use Tokopedia data |
|---|---|
| **E-Commerce & Marketplace Managers** | Benchmark SKU pricing, discount depth, and review counts against competing Official Stores (`shopIsOfficial: true`) on Tokopedia. |
| **CPG & Consumer Electronics Brands** | Monitor Minimum Advertised Price (MAP) compliance and identify unauthorized sellers across Jakarta, Surabaya, Medan, and Bandung (`shopCity`). |
| **Product Sourcing & Dropshippers** | Combine `sortOrder: "8"` (Top sales) with `soldCount` and `ratingAverage` to discover high-velocity, high-margin products. |
| **B2B Lead Generation & Logistics Sales** | Build targeted prospect lists of high-volume Power Merchants (`shopIsPowerBadge: true`) and Official Stores by category and city. |
| **Venture Capital & Market Researchers** | Quantify category market share, price elasticity, and regional merchant density across Indonesia's digital retail landscape. |

***

### 📥 Input

Provide one or more **search keywords** or **start URLs**. All fields are optional and prefilled so you can click **Start** immediately.

| Parameter | Type | Default / Prefill | Description |
|---|---|---|---|
| `searchKeywords` | array\<string> | Prefill: `["iphone 15"]` | Product keywords to search on Tokopedia (e.g. `["iphone 15", "laptop asus", "sepatu nike"]`). Leave empty for a built-in multi-category sample. |
| `sortOrder` | string (select) | `"23"` | Sort order: `"23"` Relevance, `"5"` Newest, `"8"` Top sales / Best sellers, `"11"` Price low→high, `"10"` Price high→low, `"9"` Highest rating. |
| `maxItemsPerSearch` | integer | Default: `0` (Prefill: `100`) | Max products to collect per keyword. `0` = auto/unlimited (governed by `maxTotalItems`). |
| `maxTotalItems` | integer | `0` | Overall cap across all keywords combined. `0` = unlimited. Set `1000`+ for bulk multi-page extraction. |
| `rowsPerPage` | integer | `60` | Products fetched per page request (`1`–`60`). Keep at `60` for maximum speed and fewest requests. |
| `startUrls` | array\<string> | `[]` | Optional. Full Tokopedia search URLs (e.g. `https://www.tokopedia.com/search?q=laptop&pmin=5000000`). Preserves URL query filters. |
| `proxyConfiguration` | object | `{ "useApifyProxy": false }` | Proxy settings. Default works out of the box; optional Apify Proxy can be enabled for massive crawls. |

#### Sort order reference

| `sortOrder` value | Tokopedia sorting | Best for |
|---|---|---|
| `"23"` | Relevance (best match) | General product & brand search (default) |
| `"8"` | Top sales / best sellers | Finding highest-volume winners (`soldCount`) |
| `"5"` | Newest arrivals | Tracking newly listed products & trends |
| `"11"` | Price: low to high | Finding cheapest suppliers & wholesale offers |
| `"10"` | Price: high to low | Auditing premium SKUs & bundles |
| `"9"` | Highest customer rating | Sourcing top-rated products & reputable shops |

#### Example input — fast single-keyword search

```json
{
  "searchKeywords": ["iphone 15"],
  "sortOrder": "23",
  "maxItemsPerSearch": 100,
  "maxTotalItems": 0,
  "rowsPerPage": 60,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

#### Example input — 1,000+ products deep category extraction

```json
{
  "searchKeywords": ["iphone 15", "samsung galaxy s24", "xiaomi redmi", "laptop asus"],
  "sortOrder": "8",
  "maxItemsPerSearch": 0,
  "maxTotalItems": 1200,
  "rowsPerPage": 60,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

***

### 📤 Output

Each scraped product is stored as one structured JSON object in the Apify Dataset (with both **Overview** and **Full detail** table views). Here is a real record from a verified run:

```json
{
  "id": "11611885554",
  "name": "SUPCASE Case Compatible for iPhone 15 Pro Max 15 Pro UB Unicorn Beetle MagPro SP",
  "url": "https://www.tokopedia.com/supcaseofficial/case-compatible-for-iphone-15-pro-max-15-pro-supcase-ub-unicorn-beetle-magpro-sp-1729866394374277081",
  "price": "Rp451.440",
  "priceRaw": 451440,
  "originalPrice": "Rp570.000",
  "originalPriceRaw": 570000,
  "discountPercentage": 21,
  "priceRange": null,
  "rating": null,
  "ratingAverage": 5,
  "countReview": 0,
  "soldCount": 5,
  "soldCountLabel": "5 terjual",
  "isCOD": true,
  "wishlist": false,
  "imageUrl": "https://p16-images-sign-sg.tokopedia-static.net/.../white-pad-v1:200:200.jpeg",
  "videoUrl": "https://vod-stream.tokopedia.net/view/ttvideo?source=QeEaKL&ttvid=v10c21g...",
  "categoryId": 65,
  "categoryName": null,
  "categoryBreadcrumb": "handphone-tablet/aksesoris-handphone/hard-case-handphone",
  "shopId": "8357431",
  "shopName": "Supcase Official ID",
  "shopUrl": "https://www.tokopedia.com/supcaseofficial",
  "shopCity": "Jakarta Barat",
  "shopIsOfficial": true,
  "shopIsPowerBadge": false,
  "gaKey": "handphone-tablet/aksesoris-handphone/hard-case-handphone",
  "sourceEngine": null,
  "searchKeyword": "iphone 15",
  "searchUrl": "https://www.tokopedia.com/search?q=iphone+15&ob=23&source=search",
  "scrapedAt": "2026-11-01T23:58:32.387Z"
}
```

***

### 📋 Output fields & coverage reference

#### 📦 Product Identity, Media & Category

| Field | Type | Coverage | Description |
|---|---|---|---|
| `id` | string | 🟢 High (100%) | Unique Tokopedia product ID (used for global de-duplication). |
| `name` | string | 🟢 High (100%) | Full product listing title. |
| `url` | string | 🟢 High (100%) | Canonical product page URL on `tokopedia.com`. |
| `imageUrl` | string | 🟢 High (100%) | Primary product thumbnail/image URL. |
| `videoUrl` | string / null | 🟡 Conditional (~25%) | Product video stream URL when the seller has uploaded a video. |
| `categoryId` | integer / null | 🟢 High (100%) | Tokopedia numeric department/category ID. |
| `categoryBreadcrumb` | string / null | 🟢 High (99%+) | Full hierarchical category slug path (e.g. `handphone-tablet/aksesoris-handphone/hard-case-handphone`). |
| `categoryName` | string / null | 🟡 Conditional | Legacy category name field (use `categoryBreadcrumb` for reliable taxonomy). |
| `gaKey` | string / null | 🟢 High (99%+) | Analytics category path identifier. |

#### 💰 Pricing & Discounts (IDR)

| Field | Type | Coverage | Description |
|---|---|---|---|
| `price` | string | 🟢 High (100%) | Formatted display price in Indonesian Rupiah (e.g. `"Rp451.440"`). |
| `priceRaw` | integer | 🟢 High (100%) | Clean numeric price in IDR (e.g. `451440`) ready for sorting and math. |
| `originalPrice` | string / null | 🟡 Conditional (~40%) | Formatted pre-discount price string when the item is on sale. |
| `originalPriceRaw` | integer / null | 🟡 Conditional (~40%) | Numeric pre-discount price in IDR when discounted. |
| `discountPercentage` | integer / null | 🟡 Conditional (~40%) | Discount percentage (`1`–`99`), provided by Tokopedia or computed from `priceRaw` / `originalPriceRaw`. |
| `priceRange` | string / null | 🟡 Conditional (~5%) | Price range string when a multi-variant listing displays a span. |
| `isCOD` | boolean | 🟢 High (100%) | `true` if Cash on Delivery (`"Bisa COD"`) is supported on the listing. |

#### ⭐ Demand, Ratings & Reviews

| Field | Type | Coverage | Description |
|---|---|---|---|
| `soldCount` | integer / null | 🟢 High (~85%) | Numeric units-sold floor parsed from the badge (e.g. `100` for `"100+ terjual"`). |
| `soldCountLabel` | string / null | 🟢 High (~85%) | Raw Bahasa Indonesia units-sold badge string (e.g. `"100+ terjual"`, `"5 terjual"`). |
| `ratingAverage` | number / null | 🟢 High (~82%) | Average customer star rating (`1.0`–`5.0`) once the product has been rated. |
| `countReview` | integer | 🟢 High (100%) | Number of customer reviews (`0` on unreviewed listings). |
| `rating` | number / null | 🟡 Conditional | Legacy numeric rating field (prefer `ratingAverage`). |
| `wishlist` | boolean | 🟢 High (100%) | Wishlist flag (`false` for anonymous search sessions). |

#### 🏪 Seller & Shop Information

| Field | Type | Coverage | Description |
|---|---|---|---|
| `shopId` | string | 🟢 High (100%) | Unique Tokopedia seller shop ID. |
| `shopName` | string | 🟢 High (100%) | Seller storefront name. |
| `shopUrl` | string | 🟢 High (100%) | Direct URL to the seller's shop on `tokopedia.com`. |
| `shopCity` | string | 🟢 High (100%) | Seller city/regency in Indonesia (e.g. `"Jakarta Barat"`, `"Kota Surabaya"`). |
| `shopIsOfficial` | boolean | 🟢 High (100%) | `true` if the seller is a verified **Official Store** (Mall). |
| `shopIsPowerBadge` | boolean | 🟢 High (100%) | `true` if the seller holds **Power Merchant / Power Badge** status. |
| `searchKeyword` | string | 🟢 High (100%) | The search keyword that returned this product. |
| `searchUrl` | string | 🟢 High (100%) | Full Tokopedia search URL for provenance. |
| `scrapedAt` | string | 🟢 High (100%) | ISO 8601 timestamp of extraction. |

***

### 🔁 Pagination & 1,000+ products scale

The **Tokopedia scraper** handles multi-page pagination automatically:

1. **60 products per page:** Each request fetches up to `rowsPerPage: 60` listings using `page=N` and `start=(N-1)*60`.
2. **Unlocked 1,000+ pagination per keyword & across keywords:** By default, `maxItemsPerSearch` is `0` (auto/unlimited, governed by `maxTotalItems`), with no artificial 100-item ceiling. A single broad keyword (e.g. `"iphone 15"` or `"sepatu pria"`) can paginate across dozens of pages to collect **1,000+ unique products**, or you can combine multiple keywords with `maxTotalItems: 2000`+.
3. **Cross-search de-duplication:** Every product ID is tracked in a global `Set` across the entire run, ensuring **0 duplicates** even when two keywords (`"iphone 15"` and `"iphone 15 pro"`) surface overlapping listings.
4. **Empty-run protection:** If you start the actor with no keywords and no URLs (and `maxTotalItems: 0`), it automatically runs 8 popular Indonesian search terms and caps the demo sample at 100 items so empty runs finish in seconds. If you explicitly set `maxTotalItems: 1000` even on an empty run, it honors your `1000` target across the default terms.

***

### ⚙️ How to use

1. **Open the actor** in Apify Console and enter your **Search keywords** (`searchKeywords`).
2. **Pick a sort order:** Keep `"23"` for relevance or choose `"8"` for Top sales / Best sellers.
3. **Set your target volume:** Leave the prefill (`maxItemsPerSearch: 100`) for a quick 5-second run, or set `maxItemsPerSearch: 0` and `maxTotalItems: 1000` for a 1,000-product bulk extraction.
4. **Click Start** and watch products populate the dataset.
5. **Download or integrate:** Export **JSON, CSV, or Excel**, or connect the run to **Google Sheets, Make, Zapier, n8n, BigQuery, Snowflake, or webhooks**.

#### Calling via Python SDK

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run_input = {
    "searchKeywords": ["iphone 15", "sepatu nike"],
    "sortOrder": "8",  # Top sales / best sellers
    "maxItemsPerSearch": 500,
    "maxTotalItems": 1000,
    "rowsPerPage": 60,
}

run = client.actor("haketa/tokopedia-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['name']} | {item['price']} | Sold: {item['soldCount']} | Shop: {item['shopName']} ({item['shopCity']})")
```

#### Calling via JavaScript / Node.js SDK

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });

const run = await client.actor('haketa/tokopedia-scraper').call({
    searchKeywords: ['laptop asus', 'kursi kantor'],
    sortOrder: '23',
    maxItemsPerSearch: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Collected ${items.length} unique Tokopedia products.`);
```

#### Calling via cURL (REST API)

```bash
curl -X POST "https://api.apify.com/v2/acts/haketa~tokopedia-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "searchKeywords": ["iphone 15", "sepatu nike", "kursi kantor"],
    "sortOrder": "8",
    "maxItemsPerSearch": 300,
    "maxTotalItems": 900,
    "rowsPerPage": 60
  }'
```

***

### 📊 Dataset views & popular Indonesian search categories

The actor includes two ready-made dataset views in Apify Console:

| Dataset View | Included Columns | Best For |
|---|---|---|
| **Product Search Results (Overview)** | `id`, `name`, `url`, `price`, `priceRaw`, `originalPrice`, `discountPercentage`, `ratingAverage`, `countReview`, `soldCount`, `soldCountLabel`, `imageUrl`, `categoryBreadcrumb`, `shopName`, `shopUrl`, `shopCity`, `shopIsOfficial`, `shopIsPowerBadge`, `isCOD`, `searchKeyword`, `scrapedAt` | Quick spreadsheet exports, price comparisons, and demand sorting |
| **Full detail** | All 32 output fields including `videoUrl`, `priceRange`, `categoryId`, `shopId`, `gaKey`, `searchUrl`, and `wishlist` | Data warehouses, BI pipelines, and complete catalog audits |

#### High-volume Bahasa Indonesia keyword ideas

| Category | Sample `searchKeywords` |
|---|---|
| **Smartphones & Gadgets** | `"iphone 15"`, `"samsung galaxy s24"`, `"xiaomi redmi note"`, `"tws bluetooth"`, `"powerbank fast charging"` |
| **Computers & Office** | `"laptop asus"`, `"macbook air m3"`, `"monitor gaming"`, `"keyboard mechanical"`, `"kursi kantor ergonomis"` |
| **Fashion & Footwear** | `"sepatu nike"`, `"sepatu lari pria"`, `"kaos pria oversize"`, `"tas wanita import"`, `"jam tangan pria"` |
| **Beauty & Personal Care** | `"sunscreen wajah"`, `"serum vitamin c"`, `"parfum wanita tahan lama"`, `"lip tint"` |
| **FMCG & Groceries** | `"kopi arabika"`, `"minyak goreng"`, `"susu uht"`, `"madu murni"`, `"vitamin c"` |

***

### 💡 Pro tips for best results

- **Use Bahasa Indonesia keywords for local categories:** Global brand names (`iphone 15`, `macbook air`, `sony wh-1000xm5`) work as-is, while generic categories yield 10× more listings in Indonesian (`sepatu lari`, `tas wanita`, `kursi kerja`, `kopi arabika`, `skincare wajah`).
- **Pass advanced URL filters via `startUrls`:** If you want to filter by minimum/maximum price (`pmin` / `pmax`), minimum rating (`rt=4,5`), or condition (`condition=1` for new, `2` for used), apply those filters on `tokopedia.com/search` and paste the URL into `startUrls`.
- **Keep `rowsPerPage: 60`:** Fetching 60 items per page minimizes HTTP round-trips and lets the actor collect 600 products in just 10 page requests (~8 seconds).

***

### ⚠️ Honest limitations

- **Search-level fields only:** This actor extracts the rich product card data returned by Tokopedia's search engine (which already includes price, discount, rating, review count, sold count, category breadcrumb, and shop details). Full long-form HTML product descriptions and per-variant stock counts require visiting individual product detail pages and are not part of this fast search scraper.
- **Sold count granularity:** Tokopedia reports `terjual` badges in rounded tiers on high-volume listings (e.g. `"100+ terjual"`, `"250+ terjual"`, `"1rb+ terjual"`), so `soldCount` represents the verified minimum floor.

***

### ❓ FAQ

**Do I need a Tokopedia account, cookies, or API key?**
No. The actor works anonymously out of the box with zero authentication.

**Do I need expensive residential proxies to scrape Tokopedia?**
No. Unlike browser scrapers that get blocked by Akamai on desktop pages, this actor uses lightweight mobile API headers that work reliably without residential proxy costs.

**How fast is a 1,000-product run?**
At 60 products per page, 1,000 products require only ~17 page requests and typically finish in **15–30 seconds**.

**Why are `originalPrice` and `discountPercentage` null on some items?**
They are populated only when the seller is running an active strike-through discount (~40% of listings). Non-discounted items have `price` and `priceRaw` at 100% fill rate.

**Can I filter Official Stores vs. regular sellers?**
Yes — every record includes `shopIsOfficial` (`true`/`false`) and `shopIsPowerBadge` (`true`/`false`), making it trivial to filter in Excel, SQL, or Python.

***

### 🔗 Related Asian & global e-commerce scrapers

Explore our other high-speed marketplace scrapers:

- [Tiki.vn Scraper — Vietnam #1 Marketplace Products, Prices & Sold Volume](https://apify.com/haketa/tiki-scraper)
- [Rakuten Ichiba Scraper — Japan #1 Marketplace Product Search & Reviews](https://apify.com/haketa/rakuten-scraper)
- [Mercari Japan Scraper — C2C Marketplace Listings & Sold Comps](https://apify.com/haketa/mercari-scraper)
- [Shopify Store Scraper — Full Catalog, Variants & Pricing](https://apify.com/haketa/shopify-store-scraper)
- [Lelong.my Scraper — Malaysia E-Commerce Product Listings](https://apify.com/haketa/lelong-my-scraper)
- [Flipp Scraper — North America Grocery Flyer & Online Deals](https://apify.com/haketa/flipp-scraper)

***

### 📋 Changelog

- **v1.2 (2026-11)** — Unlocked **1,000+ deep pagination** by setting `maxItemsPerSearch` default to `0` (auto/unlimited governed by `maxTotalItems`), lifting page ceilings to 500 pages per keyword, and enforcing global cross-keyword product ID de-duplication; expanded README documentation.
- **v1.1 (2026-11)** — Added `soldCount`, `soldCountLabel` (`terjual` parser), and `isCOD` (`Bisa COD` parser) from `labelGroups`; verified 500-item benchmark in ~10s with 0 duplicates.
- **v1.0 (2026-08)** — Initial pure-HTTP GraphQL (`SearchProductQueryV4`) release with iOS device header rotation and automatic discount calculation.

# Changelog

This Actor's version history is a separate document: https://apify.com/haketa/tokopedia-scraper/changelog.md

# Actor input Schema

## `searchKeywords` (type: `array`):

Type any products you want to find on Tokopedia (for example 'iphone 15', 'sepatu nike', 'kursi kantor'). Each keyword runs its own search. Leave empty and the scraper will collect a ready-made mix of popular products so you always get results.

## `sortOrder` (type: `string`):

Choose how Tokopedia orders the products it returns.

## `maxItemsPerSearch` (type: `integer`):

How many products to collect for each keyword. Set 0 for no limit (auto/unlimited, governed by Max products in total).

## `maxTotalItems` (type: `integer`):

Overall cap across every keyword combined. Set 0 for unlimited.

## `rowsPerPage` (type: `integer`):

How many products to fetch per request (up to 60). Higher means fewer requests. The default works well for most runs.

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

Optional for power users: paste full Tokopedia search or category URLs to scrape them directly. Most people can leave this empty and just use the search keywords above.

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

Proxy settings for the run. The default works out of the box. For very large extractions you can enable a residential proxy to keep results flowing smoothly.

## Actor input object example

```json
{
  "searchKeywords": [
    "laptop asus",
    "sepatu adidas"
  ],
  "sortOrder": "23",
  "maxItemsPerSearch": 100,
  "maxTotalItems": 0,
  "rowsPerPage": 60,
  "startUrls": [
    "https://www.tokopedia.com/search?q=laptop"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `id` (type: `string`):

Tokopedia product ID

## `name` (type: `string`):

Product title/name

## `url` (type: `string`):

Product page URL on tokopedia.com

## `price` (type: `string`):

Display price (e.g. Rp370.000)

## `priceRaw` (type: `string`):

Numeric price in Indonesian Rupiah

## `originalPrice` (type: `string`):

Pre-discount price if discounted

## `originalPriceRaw` (type: `string`):

Numeric pre-discount price in IDR

## `discountPercentage` (type: `string`):

Discount percentage (0-100)

## `priceRange` (type: `string`):

Price range string for multi-variant products

## `rating` (type: `string`):

Numeric rating score

## `ratingAverage` (type: `string`):

Average star rating (1-5)

## `countReview` (type: `string`):

Number of customer reviews

## `soldCount` (type: `string`):

Numeric units-sold floor (e.g. 100 for '100+ terjual')

## `soldCountLabel` (type: `string`):

Raw units-sold label from Tokopedia (e.g. 100+ terjual)

## `isCOD` (type: `string`):

Whether cash-on-delivery (Bisa COD) is available

## `wishlist` (type: `string`):

Whether product is on wishlist

## `imageUrl` (type: `string`):

Main product image URL

## `videoUrl` (type: `string`):

Product video URL if available

## `categoryId` (type: `string`):

Tokopedia category ID

## `categoryName` (type: `string`):

Category name

## `categoryBreadcrumb` (type: `string`):

Full category path (e.g. handphone-tablet/aksesoris)

## `shopId` (type: `string`):

Seller shop ID

## `shopName` (type: `string`):

Seller shop name

## `shopUrl` (type: `string`):

Seller shop URL on tokopedia.com

## `shopCity` (type: `string`):

Seller location city

## `shopIsOfficial` (type: `string`):

Whether an official brand store

## `shopIsPowerBadge` (type: `string`):

Power seller badge status

## `gaKey` (type: `string`):

Google Analytics category key

## `sourceEngine` (type: `string`):

Search source engine identifier

## `searchKeyword` (type: `string`):

The keyword used for this search result

## `searchUrl` (type: `string`):

The search URL that produced this result

## `scrapedAt` (type: `string`):

ISO 8601 timestamp of extraction

# 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 = {
    "searchKeywords": [
        "iphone 15"
    ],
    "maxItemsPerSearch": 100,
    "startUrls": [],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/tokopedia-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 = {
    "searchKeywords": ["iphone 15"],
    "maxItemsPerSearch": 100,
    "startUrls": [],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/tokopedia-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "searchKeywords": [
    "iphone 15"
  ],
  "maxItemsPerSearch": 100,
  "startUrls": [],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call haketa/tokopedia-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,haketa/tokopedia-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/cLBnVARIDIQTD5UnG/builds/fNUwsBdMiTPyFkze2/openapi.json
