# Tokopedia Scraper (`scrapewise/tokopedia-scraper`) Actor

Scrape Tokopedia (Indonesia) search results and product pages: name, price, original price, discount, sold count, rating, reviews, shop name, city and Official Store flag, category, images, description, weight and stock. Filters for price, condition, rating and Official Store. Error rows are free.

- **URL**: https://apify.com/scrapewise/tokopedia-scraper.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.85 / 1,000 product delivereds

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: products, prices, discounts, sold count and shops from Indonesia's marketplace

Tokopedia Scraper collects **the products of any Tokopedia search or product page**, without an account or
cookies. Each product comes back as one clean row: name, current price in rupiah, original price and discount,
sold count, rating, the shop that sells it (name, city, Official Store flag), category, image and link. Turn on
product details to also get the description, weight, condition, minimum and maximum order, stock, review count, the
full category path, the running campaign and every product image.

It is used for price monitoring and competitor tracking in Indonesia, to find best-selling products and suppliers
before importing or reselling, to measure a brand's presence and Official Stores, and to feed product catalogs,
dashboards and AI agents with fresh marketplace data.

### At a glance

| What | Price |
|---|---|
| Product delivered | **US$ 1.00 per 1,000 products** (US$ 0.001 each) |
| Run start | US$ 0.005 per run |

- 5 keywords with 200 products each = 1,000 products = **US$ 1.01** (with or without product details).
- Error rows, duplicates and products already delivered in earlier runs (`onlyNew`) are never charged.
- `maxItems` is a hard cap, and a spending limit set on the run stops it cleanly with everything delivered so far.
- One search page brings 60 products in about one second; with details on, expect roughly one product per second.

### Quick start

```json
{
  "searchQueries": ["laptop gaming", "iphone 15"],
  "sortBy": "relevance",
  "maxItems": 100
}
```

Only best-sellers between Rp 5 and 8 million, new, rated 4+ and from Official Stores, with full product details:

```json
{
  "searchQueries": ["laptop gaming"],
  "minPrice": 5000000,
  "maxPrice": 8000000,
  "condition": "new",
  "minRating": "4",
  "officialStoreOnly": true,
  "includeDetails": true,
  "maxItems": 50
}
```

Links copied from the browser work too, search or product pages:

```json
{
  "startUrls": [
    "https://www.tokopedia.com/search?q=sneakers&ob=5",
    "https://www.tokopedia.com/<shop>/<product-slug>"
  ]
}
```

### Input

| Field | What it does |
|---|---|
| `searchQueries` | Keywords, one per line. Each keyword is one Tokopedia search. |
| `sortBy` | `relevance`, `reviews`, `newest`, `lowest price` or `highest price`, the same orders as the site. |
| `minPrice` / `maxPrice` | Price range in Indonesian rupiah (IDR). |
| `condition` | `any`, `new` or `used`. |
| `minRating` | `4` (4 stars and up) or `5`. Empty = any rating. |
| `officialStoreOnly` | Only brand Official Stores. |
| `startUrls` | Tokopedia search links (used with the filters already in the link) or product page links. |
| `includeDetails` | Opens each product page for the detail fields listed below. Off by default. |
| `maxItems` | Hard cap for the whole run (default 50, 0 = no cap). |
| `onlyNew` | For schedules: delivers only products not delivered by earlier runs of the same search. |
| `proxyConfiguration` | Apify Proxy by default. |

An empty input runs the example search (`laptop gaming`, 50 products), so you can see the output right away.

### Output

Search fields (always there):

| Field | Example |
|---|---|
| `productId` | `103066006575` |
| `name` | Product title as the shop wrote it |
| `url` | Clean product link, without tracking parameters |
| `price`, `priceText`, `currency` | `109000`, `Rp109.000`, `IDR` |
| `originalPrice`, `discountPercent` | Price before the discount and the discount in % (when there is one) |
| `rating` | Average rating, 0 to 5 |
| `soldCount`, `soldText` | Units sold and the label the site shows (`250+ terjual`) |
| `shopId`, `shopName`, `shopUrl`, `shopCity` | The seller and the city it ships from |
| `shopTier`, `isOfficialStore` | Shop tier and whether it is a brand Official Store |
| `categoryId`, `categoryName`, `categoryPath` | Category of the product |
| `imageUrl`, `videoUrl` | Main image and, when the shop uploaded one, the product video |
| `labels` | Badges shown on the card: sold label, promo, COD, free shipping |
| `isAd` | `true` for sponsored results |
| `parentProductId`, `skuId` | Parent product and SKU ids (for products with variants) |
| `position` | Position in the search results |
| `sourceQuery`, `scrapedAt` | Which keyword or link produced the row, and when |

Detail fields (with `includeDetails`, or for product links):

| Field | Example |
|---|---|
| `description` | Full product description (emails and phone numbers removed) |
| `condition` | `new` or `used` |
| `weightKg` | Shipping weight in kg |
| `minOrder`, `maxOrder`, `stock` | Order limits and stock |
| `reviewCount`, `positiveReviewText` | Number of reviews and the satisfaction line (`99% pembeli merasa puas`) |
| `categoryNames`, `categoryUrl` | Full category path as names, and the category page |
| `campaignName`, `campaignEndsAt` | Running campaign (flash sale, limited discount) and when it ends |
| `createdAt`, `status` | When the product was listed, and `ACTIVE` or not |
| `images` | Every product image in high resolution |

Real row from a run on 16 Oct 2026 (image links shortened):

```json
{
  "type": "product",
  "productId": "103066006575",
  "name": "Speaker Komputer Laptop K2071 RGB LED Speaker 2.0 – 2x3W Stereo Sound | USB 5V | Gaming & Multimedia",
  "url": "https://www.tokopedia.com/unitech-indonesia/speaker-komputer-laptop-k2071-rgb-led-speaker-2-0-2x3w-stereo-sound-usb-5v-gaming-multimedia-1734445878443214798",
  "price": 109000,
  "priceText": "Rp109.000",
  "originalPrice": 250000,
  "discountPercent": 56,
  "currency": "IDR",
  "rating": 5,
  "soldCount": 3,
  "soldText": "3 terjual",
  "shopId": "7494007749082449870",
  "shopName": "Unitech Indonesia",
  "shopUrl": "https://www.tokopedia.com/unitech-indonesia",
  "shopCity": "Jakarta Utara",
  "shopTier": 2,
  "isOfficialStore": true,
  "categoryId": "578",
  "categoryName": "Audio, Kamera & Elektronik Lainnya",
  "categoryPath": "audio-kamera-elektronik-lainnya/audio/speaker",
  "imageUrl": "https://p16-images-sign-sg.tokopedia-static.net/...~tplv-aphluv4xwc-white-pad-v1:1600:1600.jpeg",
  "labels": ["3 terjual", "Hemat s.d  3% Pakai Bonus", "56%", "Rp109.000", "Bisa COD"],
  "isAd": false,
  "parentProductId": "103066006574",
  "skuId": "1734445878443214798",
  "position": 1,
  "sourceQuery": "laptop gaming",
  "reviewCount": 1,
  "positiveReviewText": "100% pembeli merasa puas",
  "categoryNames": ["Audio, Kamera & Elektronik Lainnya", "Audio", "Speaker"],
  "condition": "new",
  "weightKg": 0.5,
  "minOrder": 1,
  "maxOrder": 55,
  "stock": 55,
  "status": "ACTIVE",
  "createdAt": "2026-02-25T13:20:10+07:00",
  "campaignName": "Diskon Terbatas",
  "campaignEndsAt": "2027-01-31 23:59:00",
  "scrapedAt": "2026-10-16T01:16:38Z"
}
```

Text fields come in the language the shop wrote them, usually Indonesian. Prices are always in rupiah (IDR).

### Errors you may see

Every error is a row with `errorCode` and is never charged:

| errorCode | Meaning |
|---|---|
| `INVALID_URL` | Not a Tokopedia search or product link |
| `INVALID_INPUT` | A field has a wrong value (for example `sortBy` or `minRating`) |
| `NOT_FOUND` | The product was removed or the link is not a product page |
| `NO_RESULTS` | The search and filters return no product on Tokopedia |
| `BLOCKED` | Tokopedia refused every attempt; run it again in a few minutes |

### Integrations, scheduling and AI agents

- **Schedule** the same searches daily in [Apify schedules](https://docs.apify.com/platform/schedules) with
  `onlyNew` on to get only newly listed products, or without it to track prices and sold counts over time.
- **Export** as JSON, CSV, Excel or XML, or read the dataset from the [Apify API](https://docs.apify.com/api/v2).
- **Connect** it to Make, n8n, Zapier or Google Sheets through
  [Apify integrations](https://docs.apify.com/platform/integrations) to push price drops to a sheet or a chat.
- **AI agents:** call it as a tool through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp)
  in Claude, ChatGPT, Cursor or any MCP client, for example "find the 100 best-selling gaming laptops on Tokopedia
  under Rp 10 million and tell me which Official Stores sell them".

### FAQ

**Do I need a Tokopedia account?** No. Everything comes from public search and product pages, without login or
cookies.

**How many products can one search return?** Up to 3,000 per keyword or link (50 pages of 60). For
more, split the keyword (brand + model) or use price ranges with `minPrice` and `maxPrice`.

**Are the filters applied to my links too?** No. A search link is used exactly as you copied it, with the filters
already in it (`ob`, `pmin`, `pmax`, `condition`, `rt`, `shop_tier`, `fcity`...). The filter fields apply to the
keywords in `searchQueries`.

**Why does the sold count look rounded?** `soldCount` is the exact number; `soldText` is the
rounded label the site shows on the card (`250+ terjual`).

**Do image links expire?** Tokopedia signs its image links; they stay valid for a long time but not forever.
Download the images you want to keep.

**Is it legal?** The Actor reads public product listings only and returns no buyer data, emails or phone numbers.
You are responsible for how you use the data under the laws that apply to you.

**Something broke or a field is missing?** Open an issue on the Actor page; issues are answered within a day.

### Limitations

- Product reviews (the text of each review) are not collected; the rating and review count are.
- Shop pages and category pages (`/p/...`) are not supported as links yet; use a keyword or a search link.
- Variant-level prices and stock are not split into rows; the row has the default variant.
- Prices, stock and sold counts are the ones Tokopedia shows at the moment of the run.

### Related scrapers

- [Shopee Scraper](https://apify.com/scrapewise/shopee-scraper): Shopee products, prices and shops in 8 countries, Indonesia included.
- [Shopee Reviews Scraper](https://apify.com/scrapewise/shopee-reviews-scraper): Shopee ratings and comments of any shop or product.
- [Trendyol Scraper](https://apify.com/scrapewise/trendyol-scraper): Trendyol (Turkey) products, prices, sellers and ratings.
- [AliExpress Scraper](https://apify.com/scrapewise/aliexpress-scraper): AliExpress products, sold counts and 40 fields.
- [1688 Scraper](https://apify.com/scrapewise/alibaba-1688-scraper): 1688 wholesale products and suppliers, with image search.

### Changelog

- **16 Oct 2026:** first version: keyword and link search with price, condition, rating and Official Store filters,
  product details (description, weight, stock, campaign, images), `onlyNew` for schedules.

# Actor input Schema

## `searchQueries` (type: `array`):

Product keywords, one per line, for example laptop gaming or iphone 15. Each keyword is one Tokopedia search. Leave empty when you paste links below.

## `sortBy` (type: `string`):

Order of the results, same options as the site. onlyNew switches Relevance to Newest.

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

Only products at or above this price in Indonesian rupiah, for example 5000000.

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

Only products at or below this price in Indonesian rupiah, for example 8000000.

## `condition` (type: `string`):

New or used products. Any = both.

## `minRating` (type: `string`):

Only products rated 4+ or 5 stars. Empty = any rating.

## `officialStoreOnly` (type: `boolean`):

On: only products sold by brand Official Stores.

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

Optional: Tokopedia search links (https://www.tokopedia.com/search?q=...) with the filters you set on the site, or product page links (https://www.tokopedia.com/<shop>/<product>).

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

On: opens each product page for description, weight, condition, min/max order, stock, review count, full category path, campaign and all images. Off: faster, every search field is still there.

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

Hard cap for the whole run, across all searches and links. 0 = no cap.

## `onlyNew` (type: `boolean`):

On: remembers the products delivered in earlier runs of the same search (in your account) and delivers only products not seen before. Skipped products are free.

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

Apify Proxy by default. Change it only if you know you need to.

## Actor input object example

```json
{
  "searchQueries": [
    "laptop gaming"
  ],
  "sortBy": "relevance",
  "condition": "any",
  "officialStoreOnly": false,
  "includeDetails": false,
  "maxItems": 50,
  "onlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (type: `string`):

No description

# 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 = {
    "searchQueries": [
        "laptop gaming"
    ],
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/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 = {
    "searchQueries": ["laptop gaming"],
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/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 '{
  "searchQueries": [
    "laptop gaming"
  ],
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/tokopedia-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/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/msqS1SXS897jHgTZC/builds/8Q3Q9HAX8BjgplkLf/openapi.json
