# Tokopedia Scraper: Products, Prices, Stock, Reviews and Shops (`themineworks/tokopedia-scraper`) Actor

Scrape Tokopedia by keyword, category, shop or product link: price, original price, discount, rating, sold count, stock, shop city and Mall or Power Shop badge, images and category. Optional variants with price and stock, reviews and shop rows. No login.

- **URL**: https://apify.com/themineworks/tokopedia-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.81 / 1,000 products

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, Stock, Reviews and Shops

[![5,469 Tokopedia products with price, discount, sold count, stock and shop badge in 59 seconds](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/tokopedia-scraper-hero.png)](https://console.apify.com/actors/acu5OMt5Ofpwf1FOD/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

From **The Mine Works**, makers of [Lazada Scraper](https://apify.com/themineworks/lazada-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [Shopee Scraper](https://apify.com/themineworks/shopee-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), with over 290,000 runs across 310+ public actors.

Updated 31 Oct 2026: first release. Keywords, search links, category links, shop links and product links on tokopedia.com; Tokopedia's own filters for price, city, Mall or Power Shop, 4 stars and up, COD, discount and condition; price, original price, discount, rating, sold count, stock and the shop's city and badge on every row; optional product page details with every variant's price and stock, optional reviews and optional shop rows. Bookmark this Actor on its Store page so it is one click away next time.

### Why choose this actor?

- **The numbers a seller compares, in columns.** `price`, `original_price`, `discount_percent`, `rating`, `sold_count` and `stock` are separate fields in rupiah, next to `shop_name`, `shop_city` and `shop_badge` (Mall, Power Shop or regular). Sort a keyword by units sold or by discount without cleaning any text.
- **Stock on every row, every variant with details.** Search rows carry the stock Tokopedia holds for the listed item. Turn on `includeDetails` and each product also gets every variant (size, colour) with its own price, original price, stock and link, plus the exact sold count and the star breakdown.
- **Tokopedia's own filters.** Price range, shop city or province (DKI Jakarta, Bandung, Jawa Timur and the rest), Mall or Power Shop only, 4 stars and up, cash on delivery, discounted only, new or used. Tokopedia applies them, so a filtered search reads only what you asked for.
- **Pay per row, nothing for errors.** Links that are not Tokopedia links, products that no longer exist, searches with no results, the summary row and duplicates found by two inputs are never charged. No Tokopedia account.

[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/acu5OMt5Ofpwf1FOD/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Part of The Mine Works E-commerce and marketplaces family:** [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [AliExpress Scraper](https://apify.com/themineworks/aliexpress-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Kleinanzeigen.de Scraper](https://apify.com/themineworks/kleinanzeigen-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral).

### Try it in one minute

Paste this into the input (JSON view) and press Start. It returns the first 40 products for "sepatu lari" (running shoes). It took 6 seconds in our test run:

```json
{
  "searchQueries": ["sepatu lari"],
  "maxItems": 40
}
```

Put several keywords on separate lines, or paste category, shop or product links. A product that two of your inputs find is delivered once.

Apify's free plan includes $5 of credit every month, which covers about 3,600 products at this actor's price.

#### Copy to your AI assistant

```text
themineworks/tokopedia-scraper on Apify. Reads Tokopedia (tokopedia.com, Indonesia) by keyword, search link, category link, shop link or product link and returns one flat row per product with price and original price in IDR, discount, rating, sold count, stock, shop id, name, link, city and badge (official_store for Mall, power_shop, regular), images, category and labels such as COD, with no login. Call ApifyClient("TOKEN").actor("themineworks/tokopedia-scraper").call(run_input={"searchQueries": ["sepatu lari"], "maxItems": 100}), then client.dataset(run["defaultDatasetId"]).list_items().items. Inputs: searchQueries (keywords or tokopedia.com/search links), categoryUrls (tokopedia.com/p/... links or category ids), shopUrls (shop links or shop names), productUrls (product links), maxItems (per input, default 100, at most 6,000), sortBy (relevance, reviews, newest, price_low, price_high), minPrice and maxPrice (IDR), locations (city or province names such as DKI Jakarta, Bandung, Jawa Timur), shopType (any, official, power_shop, official_or_power_shop), minRating, codOnly, discountedOnly, condition (any, new, used), includeDetails (bool: variants with price and stock, description, specifications, brand, exact sold count, review count, star breakdown), includeReviews (bool) with maxReviewsPerProduct, reviewSort (newest, most_helpful, highest_rating, lowest_rating) and reviewStars (for example [1,2]), includeShops (bool: one row per shop). Product rows have record_type "product" and carry product_id, parent_id, tts_product_id, tts_sku_id, name, url, price, price_text, original_price, discount_percent, currency, rating, sold_count, sold_text, stock, min_order, shop_id, shop_tts_id, shop_name, shop_domain, shop_url, shop_city, shop_tier, shop_badge, is_official_store, is_power_shop, image_url, images, video_url, category_id, category_name, category_breadcrumb, is_cod, is_preorder, is_local_product, is_ad, labels, found_by, search_keyword, source_input, sort_by, position, search_page, total_results, scraped_at, and with details also variants, variant_groups, variant_count, description, specifications, brand, condition, weight_grams, max_order, created_at, status, category_path, category_ids, review_count, rating_count, rating_breakdown, campaign, wholesale, video_urls and details_scraped. Review rows (record_type "review") carry review_id, product_id, product_name, product_url, rating, text, variant_name, created_at, created_text, reviewer_name, is_anonymous, like_count, image_urls, video_urls, seller_response, bad_rating_reason, shop_id and shop_name. Shop rows (record_type "shop") carry shop_id, shop_name, shop_domain, shop_url, shop_city, shop_district, shop_tier, shop_badge, shop_tier_name, followers, active_products, items_sold, transactions, showcase_count, open_since, is_open, shop_rating, shop_rating_count and shop_rating_breakdown. Each run also writes one row with _type "summary", one with _type "info" when products were delivered, and a row with _type "error" for each input that could not be read; none of these is charged. Full spec: GET https://api.apify.com/v2/acts/themineworks~tokopedia-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
```

### Key features

- **Every way into Tokopedia.** Keywords as you type them in the search box, search links with their filters, category links (`/p/...`) or ids, shop links or shop names, product links, and app share links. Any link works in any field; the actor reads it by its shape.
- **200 products per request.** Search, category and shop lists come 200 products at a time from the API tokopedia.com calls itself, up to Tokopedia's own limit of 6,000 results per search.
- **Product pages on demand.** `includeDetails` reads the product pages 6 at a time: every variant with its own price, stock and link, total stock, description, specifications, brand, weight, condition, exact sold count, review count, star breakdown, all pictures, the full category path and any running flash sale.
- **Reviews as rows.** `includeReviews` adds each product's reviews: stars, text, date, the variant bought, likes, buyer photos and the seller's reply. Sort by newest, most helpful, highest or lowest rating, and keep only the stars you want, for example 1 and 2 for complaints.
- **Shops as rows.** `includeShops` adds one row per shop: city and district, Mall or Power Shop badge, followers, active products, items sold, transactions, open since and the shop's rating with its star breakdown.
- **Pictures that keep working.** Tokopedia's own picture links expire within a day. The actor returns the same pictures on Tokopedia's permanent image address.
- **Stops cleanly.** An input with no results ends after one request. A request is tried at most three times, each time on a new IP, and three failed requests in a row end the run. The run stops at `maxItems`, at the last page, at your max cost and before its time limit, keeping every row. The summary row says why.

### How to use it

#### Basic: products for a keyword

```json
{
  "searchQueries": ["tas wanita", "rice cooker"],
  "maxItems": 200
}
```

Each keyword is its own search of up to 200 products. Indonesian words return the most products.

#### Price monitoring: one category, a price band, Mall stores only

```json
{
  "categoryUrls": ["https://www.tokopedia.com/p/olahraga/perlengkapan-lari/sepatu-lari-wanita"],
  "minPrice": 300000,
  "maxPrice": 1500000,
  "shopType": "official",
  "sortBy": "price_low",
  "maxItems": 1000
}
```

Run it on a schedule and compare `price`, `original_price` and `stock` on `product_id` from one run to the next.

#### Competitor research: one shop's catalogue with variants

```json
{
  "shopUrls": ["https://www.tokopedia.com/decathlon"],
  "maxItems": 500,
  "includeDetails": true
}
```

Every product of the shop with each size and colour as its own entry in `variants`, with price and stock.

#### Local sellers: one city, cash on delivery, 4.5 stars and up

```json
{
  "searchQueries": ["sepatu"],
  "locations": ["Bandung", "DKI Jakarta"],
  "codOnly": true,
  "minRating": 4.5,
  "maxItems": 300
}
```

#### Complaints research: low star reviews of the best sellers

```json
{
  "searchQueries": ["powerbank"],
  "sortBy": "reviews",
  "maxItems": 20,
  "includeReviews": true,
  "maxReviewsPerProduct": 100,
  "reviewStars": [1, 2],
  "reviewSort": "most_helpful"
}
```

#### Specific products from Clay, n8n or an AI agent

```json
{
  "productUrls": ["https://www.tokopedia.com/tomkinsofficial/tomkins-primal-alpha-hitam-putih-sneakers-wanita-sepatu-olahraga"]
}
```

One row with the full product page, the star breakdown and the shop's city and badge. Up to 5,000 links per run, 6 per request.

#### Seller list for a keyword

```json
{
  "searchQueries": ["kopi arabika"],
  "maxItems": 200,
  "includeShops": true
}
```

The products plus one row per shop that sells them, with followers, items sold and the shop rating.

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| `searchQueries` | array of strings | empty | Keywords, or Tokopedia search links. |
| `categoryUrls` | array of strings | empty | Category links (`tokopedia.com/p/...`) or category ids. |
| `shopUrls` | array of strings | empty | Shop links or shop names. |
| `productUrls` | array of strings | empty | Product links or share links. |
| `maxItems` | integer | `100` | Most products per keyword, category or shop, 1 to 6,000. |
| `sortBy` | string | `relevance` | `relevance`, `reviews`, `newest`, `price_low` or `price_high`. |
| `minPrice`, `maxPrice` | integer | empty | Price range in rupiah. |
| `locations` | array of strings | empty | Shop cities or provinces as Tokopedia writes them. |
| `shopType` | string | `any` | `official` (Mall), `power_shop` or `official_or_power_shop`. |
| `minRating` | number | empty | Lowest star rating, for example 4.5. |
| `codOnly` | boolean | `false` | Cash on delivery only. |
| `discountedOnly` | boolean | `false` | Discounted products only. |
| `condition` | string | `any` | `new` or `used`. |
| `includeDetails` | boolean | `false` | Read product pages: variants, description, exact sold count. |
| `includeReviews` | boolean | `false` | Add review rows. |
| `maxReviewsPerProduct` | integer | `20` | Reviews per product, 1 to 2,000. |
| `reviewSort` | string | `newest` | `most_helpful`, `highest_rating` or `lowest_rating`. |
| `reviewStars` | array | empty | Only these star ratings, for example `[1, 2]`. |
| `includeShops` | boolean | `false` | Add one row per shop. |
| `proxyConfiguration` | object | Apify Proxy | Leave as is. |

Give at least one keyword or link. Up to 100 keywords, categories and shops and 5,000 product links per run.

### What data do you get?

One row per product, and with the options on, one row per review and per shop. `record_type` says which. The summary, info and error rows have a `_type` field instead, so a filter on either field separates them.

| Field | What it is |
|---|---|
| `product_id`, `parent_id` | Tokopedia product id and the parent id that groups its variants |
| `tts_product_id`, `tts_sku_id`, `shop_tts_id` | TikTok Shop ids Tokopedia returns, for joining with TikTok Shop data |
| `name`, `url` | Product name and link, without tracking parameters |
| `price`, `price_text` | Current price in rupiah and as Tokopedia shows it (Rp333.900) |
| `original_price`, `discount_percent` | Price before discount and the discount in percent |
| `rating` | Average stars, 1 to 5 |
| `sold_count`, `sold_text` | Units sold as a number and as shown (100rb+ terjual); exact with details |
| `stock`, `min_order` | Units in stock and the smallest order |
| `shop_id`, `shop_name`, `shop_domain`, `shop_url`, `shop_city` | The seller |
| `shop_tier`, `shop_badge`, `is_official_store`, `is_power_shop` | Mall (official store), Power Shop or regular |
| `image_url`, `images`, `video_url` | Permanent picture links and the product video |
| `category_id`, `category_name`, `category_breadcrumb` | Category of the product |
| `is_cod`, `is_preorder`, `is_local_product`, `is_ad`, `labels` | Offer labels on the card |
| `found_by`, `search_keyword`, `source_input`, `sort_by`, `position`, `search_page`, `total_results` | Where the row came from |
| `variants`, `variant_groups`, `variant_count` | Every variant with price, original price, discount, stock, order limits, link and picture (details) |
| `description`, `specifications`, `brand`, `condition`, `weight_grams`, `max_order`, `created_at`, `status` | From the product page (details) |
| `category_path`, `category_ids`, `category_url` | Full category path (details) |
| `review_count`, `rating_count`, `rating_breakdown`, `rating_satisfaction_text`, `reviews_with_photos` | Reviews and stars per level (details) |
| `campaign`, `wholesale`, `cashback_percent`, `preorder_days`, `size_chart_url`, `video_urls` | Flash sale, wholesale tiers and more (details) |
| `review_id`, `rating`, `text`, `variant_name`, `created_at`, `created_text`, `reviewer_name`, `like_count`, `image_urls`, `seller_response`, `bad_rating_reason` | Review rows |
| `followers`, `active_products`, `items_sold`, `transactions`, `showcase_count`, `open_since`, `is_open`, `shop_rating`, `shop_rating_count`, `shop_rating_breakdown`, `shop_tier_name`, `shop_district` | Shop rows |

#### Stable fields for automations

These keep their name and meaning across versions, so a sheet, a Zap or an agent can rely on them:

- `record_type`: `product`, `review` or `shop`.
- `product_id`: the key to compare runs on. Search rows of a product with variants carry the id of the variant Tokopedia lists; `parent_id` is the same for all its variants.
- `price` and `original_price`: whole rupiah, numbers, never text.
- `sold_count`: from search results it is the lower bound of Tokopedia's rounded label; with `includeDetails` it is the exact count. Compare like with like.
- `stock`: from search results the stock of the listed variant; with `includeDetails` the total of all variants (each variant's own stock is in `variants`).
- `shop_badge`: `official_store`, `power_shop` or `regular`.
- `details_scraped`: `true` when the product page was read; `details_error` says why when it was not.

#### Output examples

A product from a keyword search (`sepatu lari`):

```json
{
  "record_type": "product",
  "product_id": "103323996829",
  "parent_id": "103323996828",
  "tts_product_id": "1735371592845854697",
  "name": "SPOTEC Running Arnold Sepatu Olahraga Lari Pria Wanita - 0192",
  "url": "https://www.tokopedia.com/spotec/spotec-running-arnold-sepatu-olahraga-lari-pria-wanita-0192-1735371592845854697-1735371591763462121",
  "price": 333900,
  "price_text": "Rp333.900",
  "original_price": 389900,
  "discount_percent": 14,
  "currency": "IDR",
  "rating": 5,
  "sold_count": 100,
  "sold_text": "100+ terjual",
  "stock": 19,
  "min_order": 1,
  "shop_id": "11162592",
  "shop_name": "Spotec",
  "shop_url": "https://www.tokopedia.com/spotec",
  "shop_city": "Kab. Tangerang",
  "shop_tier": 2,
  "shop_badge": "official_store",
  "is_official_store": true,
  "is_power_shop": false,
  "image_url": "https://images.tokopedia.net/img/cache/700/aphluv/1997/1/1/9c6f47aafcdf4c0e957ade4cc9ccb37a~.jpeg",
  "category_id": "62",
  "category_name": "Olahraga",
  "category_breadcrumb": "olahraga/perlengkapan-lari/sepatu-lari-pria",
  "is_cod": true,
  "is_local_product": true,
  "labels": ["Hemat s.d 8% Pakai Bonus", "Bisa COD", "Beli Lokal", "Harga Diskon"],
  "found_by": "search",
  "search_keyword": "sepatu lari",
  "sort_by": "relevance",
  "position": 8,
  "search_page": 1,
  "total_results": 97079
}
```

A product link with its product page (lists cut to one or a few entries):

```json
{
  "record_type": "product",
  "product_id": "2436506346",
  "name": "TOMKINS Primal Alpha - Hitam Putih Sneakers Wanita Sepatu Olahraga",
  "url": "https://www.tokopedia.com/tomkinsofficial/tomkins-primal-alpha-hitam-putih-sneakers-wanita-sepatu-olahraga",
  "price": 424000,
  "original_price": 429000,
  "discount_percent": 1,
  "stock": 0,
  "sold_count": 517,
  "sold_text": "500+ terjual",
  "rating": 4.9,
  "review_count": 279,
  "rating_breakdown": { "1": 1, "2": 0, "3": 3, "4": 11, "5": 264 },
  "rating_satisfaction_text": "98% pembeli merasa puas",
  "shop_name": "TOMKINS",
  "shop_city": "Kota Bandung",
  "shop_badge": "official_store",
  "brand": "Tomkins",
  "condition": "new",
  "status": "WAREHOUSE",
  "weight_grams": 1000,
  "category_path": ["Fashion Wanita", "Sepatu Wanita", "Sneakers Wanita"],
  "specifications": [{ "name": "Kondisi", "value": "Baru" }, { "name": "Berat Satuan", "value": "1 kg" }],
  "variant_groups": [{ "name": "ukuran sepatu", "options": ["38", "39", "40", "41", "42", "33", "35", "36", "37"] }],
  "variants": [
    { "product_id": "2436506365", "name": "38", "price": 424000, "original_price": 429000, "discount_percent": 1, "stock": 0, "is_buyable": false, "url": "https://www.tokopedia.com/tomkinsofficial/tomkins-primal-alpha-hitam-putih-sneakers-wanita-sepatu-olahraga-38" }
  ],
  "variant_count": 9,
  "details_scraped": true,
  "found_by": "product_link"
}
```

A review row:

```json
{
  "record_type": "review",
  "review_id": "2361526959",
  "product_id": "102701672625",
  "product_name": "NBCROSS Sepatu Pria Sneakers Kanvas Sepatu Sekolah Sepatu Lari Pria Wanita Hitam Putih  Strip",
  "rating": 5,
  "text": "Keren",
  "variant_name": "GY-1019 - 39",
  "created_at": "2026-10-22T09:59:18.000Z",
  "created_text": "1 minggu lalu",
  "reviewer_name": "Mahendra",
  "like_count": 0,
  "image_urls": ["https://images.tokopedia.net/img/cache/700/aphluv/1997/1/1/deeb261a99434f20b553b7a11464fcd4~.jpeg"],
  "shop_name": "NB CROSS Store"
}
```

A shop row:

```json
{
  "record_type": "shop",
  "shop_id": "3875195",
  "shop_name": "MILLS OFFICIAL",
  "shop_url": "https://www.tokopedia.com/mills-official-978",
  "shop_city": "Kab. Tangerang",
  "shop_district": "Kosambi",
  "shop_badge": "official_store",
  "shop_tier_name": "Mall",
  "followers": 101675,
  "active_products": 1161,
  "items_sold": 130136,
  "transactions": 81505,
  "open_since": "March 2022",
  "is_open": true,
  "shop_rating": 4.9,
  "shop_rating_count": 101374,
  "shop_rating_breakdown": { "1": 354, "2": 188, "3": 628, "4": 3823, "5": 96381 }
}
```

An error row for a product link that no longer exists (nothing charged):

```json
{ "_type": "error", "error_type": "not_found", "identifier": "https://www.tokopedia.com/decathlon/zz-not-a-product-123", "reason": "Tokopedia has no product at this link (it may have been removed or renamed). Nothing was charged." }
```

### Pricing

Pay per event: you pay for the rows you receive, plus a flat $0.003 per run, whatever memory you choose.

| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
| `product-scraped` | Once per product row from the search results | $1.35 per 1,000 | $1.20 per 1,000 | $1.00 per 1,000 | $0.81 per 1,000 |
| `product-with-details` | Once per product row that carries its product page (`includeDetails`, or a product link), instead of `product-scraped` | $3.60 per 1,000 | $3.10 per 1,000 | $2.60 per 1,000 | $2.16 per 1,000 |
| `review-scraped` | Once per review row | $0.45 per 1,000 | $0.40 per 1,000 | $0.34 per 1,000 | $0.27 per 1,000 |
| `shop-scraped` | Once per shop row (`includeShops`) | $1.35 per 1,000 | $1.20 per 1,000 | $1.00 per 1,000 | $0.81 per 1,000 |
| `run-start` | Once per run, after the first product row is stored | $0.003 | $0.003 | $0.003 | $0.003 |

The price of one row is the price per 1,000 divided by 1,000. A product row is charged once, as one of the two product events, never both.

Never charged:

- inputs that are not Tokopedia links, products and shops that do not exist, searches with no results (each gets an error row);
- a product that a second input of the same run finds again, and products outside your price or rating range;
- a product whose page could not be read: it is delivered from the search results and charged as `product-scraped`, with `details_error` saying why;
- the summary, info and error rows;
- a run that delivers no product: the start fee is charged only after the first product row is stored;
- anything past your "Max cost per run". The actor checks the budget before each batch of rows and stops while the total is still below your limit, so the run ends SUCCEEDED with a partial result and a status message saying so.

### Run it on a schedule

1. Open the actor in Apify Console, set your input and click **Save as a new task**.
2. In the task, open **Schedules**, click **Add schedule** and pick how often (every morning, every Monday, and so on).
3. Compare runs on `product_id`: `price`, `original_price`, `discount_percent`, `stock` and `sold_count` show what moved.
4. Optional: add an integration (Google Sheets, Slack, a webhook) so each run lands where your team works.

### FAQ

#### What does this actor read?

The same GraphQL API tokopedia.com calls in your browser to fill its search, category, shop and product pages and their reviews, as anyone sees them without logging in. It does not log in, add anything to a cart or read account data.

#### How many products can I get?

Up to 6,000 per keyword, category or shop: that is where Tokopedia itself stops serving results. Tokopedia repeats some products across pages, so a full 6,000 usually gives fewer unique products (5,469 for "sepatu" in our test). For more, split a search with price ranges or locations, or give several categories.

#### Why is `sold_count` sometimes a round number?

Search results show a rounded label such as "100rb+ terjual" (100 thousand and more), which becomes 100000. With `includeDetails` the product page gives the exact count, and `sold_text` keeps Tokopedia's own label.

#### Why does a product show stock 0?

It is out of stock, or the seller has taken it off sale for now (`status` is `WAREHOUSE` with details). With details, `stock` is the total of all variants and each variant has its own stock in `variants`.

#### What do the shop badges mean?

`official_store` is Tokopedia's Mall (official brand stores), `power_shop` is Power Shop (formerly Power Merchant Pro, sellers that meet Tokopedia's service levels), `regular` is every other shop. `shopType` filters on them.

#### Why do some shops show 0 items sold?

Many shops that opened since October 2024 show 0 items sold and 0 transactions in Tokopedia's shop data, although their products show sold counts. The actor returns what Tokopedia reports; the sold counts on their product rows are the better measure.

#### Which locations can I filter on?

The ones in Tokopedia's Lokasi filter: DKI Jakarta, Jabodetabek, Bandung, Medan, Surabaya, every province (Jawa Barat, Jawa Timur, Bali and so on) and every city and regency (Kab. Bandung, Tangerang Selatan and so on). A name Tokopedia does not know gets an error row and is left out.

#### How long does a run take?

In our tests: 6 seconds for the "Try it" input, 24 seconds for 2,000 products, 59 seconds for the 6,000 results of one keyword, 67 seconds for 300 products with their product pages, and 27 seconds for 12 products with details, 34 reviews and 9 shops. The default time limit is 3,600 seconds; the actor stops before it and keeps every row.

#### Do I need an account, cookies or a proxy?

No. The actor uses Apify Proxy, included in the price. Product pages need the ordinary cookies tokopedia.com gives every first visitor; the actor gets them with one small request to Tokopedia's public sitemap. Nothing is solved and no browser runs.

#### Which formats can I download?

JSON, CSV, Excel, XML, RSS and HTML from the run's Storage tab or through the API. The dataset has five ready views: Products, Prices and sales, Product details, Reviews and Shops. In CSV and Excel, lists such as `variants` are flattened into columns such as `variants/0/price`.

#### Can I use it from Claude, ChatGPT or Cursor (MCP)?

Yes, through Apify's MCP server. Connector URL: https://mcp.apify.com/?tools=themineworks/tokopedia-scraper

- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code: `claude mcp add -t http tokopedia-scraper "https://mcp.apify.com/?tools=themineworks/tokopedia-scraper"`

#### Is it legal to scrape Tokopedia?

The actor reads public product, price, review and shop data that Tokopedia shows to anyone without logging in. Reviewer names are shown as Tokopedia shows them, masked when the buyer chose to stay anonymous; leave reviews off if you do not need them. You are responsible for how you use the data and for following the site's terms and the law, including Indonesia's personal data protection law. This is general information, not legal advice. Tokopedia is a trademark of PT Tokopedia; this actor is independent and not affiliated with it.

### Integrations

- **Google Sheets**: send each run's products to a sheet with Apify's Google Sheets integration; one row per product fits a sheet as is.
- **Make, Zapier and n8n**: start a run and read its dataset with the Apify apps and nodes, for example "Tokopedia price drops in our category every morning to Slack".
- **Webhooks**: have Apify call your URL when a run succeeds, then fetch the dataset.
- **API and SDKs**: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- **MCP clients**: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.

### More from The Mine Works

**E-commerce and marketplaces**

- [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [AliExpress Scraper](https://apify.com/themineworks/aliexpress-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Kleinanzeigen.de Scraper](https://apify.com/themineworks/kleinanzeigen-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Carsales.com.au Scraper](https://apify.com/themineworks/carsales-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [eBay Product Listings Scraper](https://apify.com/themineworks/ebay-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Shopify Store Scraper](https://apify.com/themineworks/shopify-store-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [🛒 TikTok Shop Scraper](https://apify.com/themineworks/tiktok-shop-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Walmart Product & Price Scraper](https://apify.com/themineworks/walmart-product-price-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Vinted Scraper](https://apify.com/themineworks/vinted-listings-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Social media and video**

- [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Leads and business directories**

- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [2GIS Places Scraper](https://apify.com/themineworks/2gis-places-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Marketing, SEO and reviews**

- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google News Scraper](https://apify.com/themineworks/google-news?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**LinkedIn**

- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Real estate**

- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Science, health and government data**

- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [OpenAlex Scraper](https://apify.com/themineworks/openalex-scholarly-works?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Jobs and hiring**

- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Company and business data**

- [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [SEC EDGAR Filings Scraper](https://apify.com/themineworks/sec-edgar-filings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Food and local services**

- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Developer and AI tools**

- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**More tools**

- [G2 Reviews Scraper](https://apify.com/themineworks/g2-reviews-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naver Blog Scraper](https://apify.com/themineworks/naver-blog-posts-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [WeChat Article Scraper 微信公众号文章](https://apify.com/themineworks/wechat-article-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Taobao Products Scraper 淘宝 天猫](https://apify.com/themineworks/taobao-products-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

### Support

Found an input that returns fewer products than the site, or a field that comes back empty? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For a field you need or a new source, email dmineworks@gmail.com.

*Search Tokopedia by keyword, category, shop or product link and get every product back as one row, with price, original price, discount, rating, sold count, stock, the shop's city and badge, and optional variants, reviews and shops, no login.*

# Actor input Schema

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

Search words, one per line, as you would type them in the Tokopedia search box. Indonesian words return the most products, for example sepatu lari, tas wanita, rice cooker. A Tokopedia search link (tokopedia.com/search?q=...) works here too and keeps its own filters. Each line is one search, up to maxItems products.

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

Tokopedia category links such as https://www.tokopedia.com/p/olahraga/perlengkapan-lari/sepatu-lari-wanita, or a category id such as 3577. Each category returns up to maxItems products.

## `shopUrls` (type: `array`):

Tokopedia shop links such as https://www.tokopedia.com/decathlon, or just the shop name from the link (decathlon). Each shop returns up to maxItems products from its catalogue, with your filters applied.

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

Tokopedia product links such as https://www.tokopedia.com/tomkinsofficial/tomkins-primal-alpha-hitam-putih-sneakers-wanita-sepatu-olahraga. Each link returns one row with the full product page: every variant with its own price and stock, description, specifications and the star breakdown. Share links (tk.tokopedia.com) are followed once.

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

The most products to return for each keyword, category or shop, 1 to 6,000. Tokopedia serves at most 6,000 results per search; split a bigger one with price ranges or locations. Product links are not counted here.

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

The order of the results, as in the sort menu on Tokopedia. A search link that already carries a sort keeps its own.

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

Lowest price in rupiah, for example 100000. Tokopedia applies it, and the actor checks it again on every row.

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

Highest price in rupiah, for example 300000.

## `locations` (type: `array`):

Only products from shops in these cities or provinces, as Tokopedia writes them in its Lokasi filter: DKI Jakarta, Jabodetabek, Bandung, Surabaya, Medan, Jawa Barat, Jawa Timur, Bali and so on. Tokopedia's numeric city ids (fcity) work too. A name Tokopedia does not know gets an error row and is left out.

## `shopType` (type: `string`):

Only products from Mall (official) stores, from Power Shops, or from either, as in Tokopedia's Jenis toko filter.

## `minRating` (type: `number`):

Only products rated at least this many stars, 1 to 5, for example 4.5. From 4 up, Tokopedia's own 4 stars and up filter is used too. Products with no rating yet are left out when this is set.

## `codOnly` (type: `boolean`):

Only products that can be paid on delivery (Bisa COD).

## `discountedOnly` (type: `boolean`):

Only products on discount (Harga Diskon).

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

New, used or both.

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

On: each product's page is read too (6 products a request): every variant with its own price and stock, total stock, description, specifications, brand, weight, condition, exact sold count, review count, star breakdown, all pictures, full category path and any flash sale. Each such row is charged as product-with-details instead of product-scraped. Off: rows come from the search results, which is faster.

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

On: the reviews of each delivered product come as extra rows with record_type review: stars, text, date, variant bought, likes, photos and the seller's reply. Each review is charged as a review-scraped event.

## `maxReviewsPerProduct` (type: `integer`):

How many reviews to deliver for each product, 1 to 2,000. Used only when Include product reviews is on.

## `reviewSort` (type: `string`):

Used only when Include product reviews is on.

## `reviewStars` (type: `array`):

Only reviews with these star ratings, for example 1 and 2 for complaints. Leave empty for all. Used only when Include product reviews is on.

## `includeShops` (type: `boolean`):

On: one extra row (record_type shop) for each shop behind the delivered products and each shop link: city, Mall or Power Shop badge, followers, active products, items sold, transactions, open since, shop rating and star breakdown. Each shop row is charged as a shop-scraped event.

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

Leave as is: the actor uses Apify's datacenter proxy, which Tokopedia answered every time in our tests, moves to a new IP when one is refused, and moves to Indonesian residential IPs only if two datacenter sessions in a row are refused. Choose a group or country here only if you want that one pool.

## Actor input object example

```json
{
  "searchQueries": [
    "sepatu lari"
  ],
  "maxItems": 40,
  "sortBy": "relevance",
  "shopType": "any",
  "codOnly": false,
  "discountedOnly": false,
  "condition": "any",
  "includeDetails": false,
  "includeReviews": false,
  "maxReviewsPerProduct": 20,
  "reviewSort": "newest",
  "includeShops": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `summary` (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": [
        "sepatu lari"
    ],
    "maxItems": 40,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

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