# Tokopedia Scraper \[$1/1K💰] | Products | Prices | Reviews (`ahmed_jasarevic/tokopedia-scraper`) Actor

Scrape Tokopedia product listings, prices, discounts, promotions, ratings, customer reviews and seller statistics through the public GraphQL the site itself uses — no browser, no login. Built for price monitoring, market research and e-commerce analytics in Indonesia. $1 per 1,000 products.

- **URL**: https://apify.com/ahmed_jasarevic/tokopedia-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 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

Scrape Tokopedia product listings — prices, original prices, discounts, promotions, ratings, customer reviews, categories and seller statistics — through the same public GraphQL the Tokopedia site itself uses, no browser and no login, at $1 per 1,000 products.

**Built for:**

- Price monitoring and discount tracking across Tokopedia sellers
- E-commerce market research and catalog analytics in Indonesia
- Competitive pricing dashboards and promotion calendars
- Building a structured product database (category, price, rating, sold count)
- Affiliate and cashback workflows that need clean product data

### Track Tokopedia Prices, Discounts & Seller Data

Enter keywords (`laptop`, `sepatu nike`) and/or category IDs (`3964`), and each query is paginated separately (60 products per page) up to your caps. Every product is one row: nested `price` (`value`, `text`, `originalValue`, `discountPercentage`), `rating`, `soldCount`, `promotions`, `labels`, `badges`, `category`, the seller block (`shop` with tier, city, `sellerDetails` statistics), optional attached `reviews` and a `reviewSummary`, plus provenance fields (`source`, `searchKeyword`, `page`, `rank`). Sorting, price-range filters and raw Tokopedia filters (official-store tier, 4★+, condition, city) are available per query.

### How It Works

![How the Tokopedia Scraper works: keyword searches become product rows with IDR prices, reviews and shop statistics.](https://api.apify.com/v2/key-value-stores/oeuA0kLOyhbRM4fzt/records/how-it-works-tokopedia.webp)

The Actor reproduces a Chrome TLS handshake with impit and calls the public GraphQL operations behind Tokopedia search, shop and review data. No browser, login or CAPTCHA solving is involved.

Each row covers one product with IDR pricing, discounts, promotions, rating, sold count, category and shop statistics. Reviews can be attached per product, ready for price and competitor analysis.

Tokopedia sits behind Akamai Bot Manager, which fingerprints clients at the TLS layer — plain HTTP clients are not rejected, their connections stall. This actor reproduces a Chrome TLS handshake in pure HTTP with [`impit`](https://www.npmjs.com/package/impit) (`browser: 'chrome136'`) and then calls the **public, unauthenticated GraphQL operations the Tokopedia web app itself uses**:

| Purpose | Endpoint (POST) | Operation |
| --- | --- | --- |
| Products / search / category browse / prices / promotions | `https://gql.tokopedia.com/graphql/SearchProductV5Query` | `SearchProductV5Query` |
| Customer reviews | `https://gql.tokopedia.com/graphql/productReviewList` | `productReviewList` |
| Seller statistics & tier | `https://gql.tokopedia.com/graphql/ShopInfoCore` | `ShopInfoCore` |

No page rendering, cookies, login or CAPTCHA solving is involved, and no paid anti-bot service is required. The standard `proxy` input is wired in as the fallback if the TLS profile ever changes.

### Input Parameters

| Field | Type | Required | Default | Notes |
| --- | --- | --- | --- | --- |
| `searchQueries` | array | Yes | — | Keywords to search, e.g. `["laptop", "sepatu nike"]`; each is paginated separately. |
| `categoryIds` | array | No | — | Tokopedia category IDs to browse (appear as `sc` in category URLs, e.g. `"3964"`). |
| `searchTasks` | array | No | — | Per-query overrides (`query`/`categoryId`, `orderBy`, `priceMin`, `priceMax`, `filters`). Wins over the simple fields above for those queries. |
| `sortBy` | string | No | `relevance` | `relevance`, `price_asc`, `price_desc`, `newest`, `most_sold`. |
| `priceMin` / `priceMax` | number | No | — | Price range in IDR for simple queries. |
| `maxItems` | integer | No | `100` | Global product cap across all queries (hard cap 5,000). |
| `maxPagesPerQuery` | integer | No | `3` | Pages per query, 60 products each (hard cap 50). |
| `rowsPerPage` | integer | No | `60` | Products per API page (Tokopedia maximum 60). |
| `includeReviews` | boolean | No | `true` | Attach first-page reviews to a limited set of products. |
| `maxReviewsPerProduct` | integer | No | `5` | Reviews fetched per enriched product. |
| `maxProductsToEnrichReviews` | integer | No | `20` | How many products get review calls (each costs one request; `0` disables). |
| `includeSellerDetails` | boolean | No | `true` | Enrich unique shops with seller statistics. |
| `maxShopsToEnrich` | integer | No | `10` | Cap on unique shops enriched per run. |
| `proxy` | object | No | disabled | Standard Apify proxy input; enable for high-volume runs. |

Raw Tokopedia filters for `searchTasks[].filters`: `{"shop_tier":"2"}` (Official stores), `{"rt":"4,5"}` (4★+), `{"condition":"1"}` (new), `{"fcity":"165"}` (city), `{"sc":"<categoryId>"}` (category).

### Output Fields

One dataset row per product:

- **Identity:** `type`, `productId`, `name`, `url`, `image`, `source`, `searchKeyword`, `page`, `rank`, `scrapedAt`
- **Price:** `price.value`, `price.text`, `price.originalValue`, `price.discountPercentage`, `promotions`, `labels`, `badges`, `freeShipping`
- **Social proof:** `rating`, `soldCount`, `reviews[]` (`reviewId`, `rating`, `text`, `variant`, `createdAt`, `user`, `sellerResponse`), `reviewSummary`
- **Category:** `category.id`, `category.name`, `category.breadcrumb`
- **Seller:** `shop.shopId`, `shop.domain`, `shop.name`, `shop.url`, `shop.city`, `shop.tier`, `shop.tierLabel`, `shop.isOfficial`, `shop.sellerDetails` (`shopTier`, `totalTransactions`, `productsSold`, `activeProducts`, `favorites`, `openSince`, `location`, `isOpen`)

Note: Tokopedia's gateway exposes no public numeric shop rating, so `sellerDetails.shopRating` is `null`; reputation is represented by tier badge and transaction counts.

### Example Input

```json
{
  "searchQueries": ["laptop gaming"],
  "sortBy": "price_asc",
  "priceMin": 5000000,
  "maxItems": 100,
  "includeReviews": true
}
```

### Example Output

```json
{
  "type": "product",
  "productId": "103217919900",
  "name": "Howell Adaptor HDMI 8K Siku L 90 / 270 Derajat ...",
  "url": "https://www.tokopedia.com/howell-official-store/...",
  "image": "https://...",
  "category": { "id": "65", "name": "Handphone & Tablet", "breadcrumb": "..." },
  "price": { "value": 32850, "text": "Rp32.850", "originalValue": 43800, "discountPercentage": 25 },
  "rating": 5,
  "soldCount": 30,
  "promotions": ["Hemat s.d 3% Pakai Bonus", "25%", "Bisa COD"],
  "freeShipping": false,
  "shop": {
    "shopId": "7494340157664887811",
    "domain": "howell-official-store",
    "name": "Howell Official Store",
    "city": "Jakarta Utara",
    "tier": 2,
    "tierLabel": "Official Store",
    "isOfficial": true
  },
  "reviews": [
    {
      "reviewId": "2166351883",
      "rating": 5,
      "text": "sesuai deskripsi ya",
      "createdAt": "2026-06-23T08:58:05.000Z",
      "user": { "userId": "6565226", "name": "Vinaya" }
    }
  ],
  "reviewSummary": { "totalReviews": 2, "fetched": 2 },
  "source": "search",
  "searchKeyword": "laptop",
  "page": 1,
  "rank": 1,
  "scrapedAt": "2026-10-19T15:28:14.501Z"
}
```

### Automate Price & Promotion Monitoring With Schedules & Webhooks

- **Daily price checks:** schedule one run per keyword with `includeReviews: false` for a cheap listing-only pass, then diff `price.value` against yesterday's rows.
- **Promotion calendar:** track `promotions` and `discountPercentage` for a watchlist of `productId`s to see when sales start and end.
- **Official-store watch:** use the `{"shop_tier":"2"}` filter (or the per-query overrides array) to follow only Official stores; attach a dataset webhook for alerting.
- Recurring, re-run-heavy usage also improves this actor's Store recommendation signals.

### Related Actors

- [Tokopedia Search Scraper](https://apify.com/shahidirfan/tokopedia-search-scraper) — the most-used Tokopedia actor on the Store.
- [Tokopedia Product Scraper](https://apify.com/easyapi/tokopedia-product-scraper) — product-focused Tokopedia extraction.
- [Tokopedia Scraper | $0.9 / 1k | All-In-One](https://apify.com/fatihtahta/tokopedia-scraper) — all-in-one Tokopedia option at a comparable price point.
- [Tokopedia Product Scraper](https://apify.com/sian.agency/tokopedia-product-scraper) — overview + detail product scraping.
- [Tokopedia Scraper · Products, Shops & Reviews](https://apify.com/memo23/tokopedia-scraper) — products, shops and reviews coverage.

### Frequently Asked Questions

#### Why use this actor instead of the official API?

There is no official API to use: Tokopedia's **Tokopedia Open Platform was discontinued** — its partner documentation now reads "ID market: Tokopedia Open API Termination — Migrate to TikTok Shop Partner Center by September 30, 2025", and the remaining partner APIs are OAuth-based seller/affiliate tools for your own shop, not public product-search or price data. This actor reads the public GraphQL operations the Tokopedia storefront itself calls — keyless, no login, no partner approval — and returns prices, promotions, reviews and seller statistics as structured rows.

#### Is there a Tokopedia API?

No public product-data API exists today. The old Open Platform is terminated, and TikTok Shop's partner APIs cover shop management for sellers rather than marketplace-wide product search. For programmatic Tokopedia data, this actor (or its equivalents under Related Actors) is the practical route.

#### How do I monitor Tokopedia prices?

Put the keywords or category IDs in, set `maxItems`, and schedule the run (daily is typical). Each row carries `price.value`, `price.originalValue`, `price.discountPercentage` and `promotions`, so diffing consecutive datasets gives you price histories. Review and seller enrichment can be switched off for cheaper monitoring runs.

#### Can I get customer reviews and seller statistics?

Yes — `includeReviews` attaches the first page of reviews per product (bounded by `maxProductsToEnrichReviews`), and `includeSellerDetails` enriches unique shops with tier, transaction counts, products sold and location. One honest limitation: Tokopedia's gateway exposes no public numeric shop rating, so `shopRating` is `null` — tier labels (Official / Power Merchant) carry the reputation signal.

#### Do I need a login or CAPTCHA?

No. The actor calls unauthenticated GraphQL with a Chrome-like TLS handshake; no account, cookies or CAPTCHA solving are used. Free Apify accounts get a 10-product preview per run; paid accounts get the full input caps.

### For AI Agents & LLM Apps

**Purpose:** returns Tokopedia product rows (prices, promotions, ratings, reviews, seller stats) for keywords or category IDs — public GraphQL, keyless, no browser.

**Minimal input:**

```json
{ "searchQueries": ["laptop"], "maxItems": 20, "includeReviews": false }
```

**Category + sort variant:**

```json
{ "categoryIds": ["3964"], "sortBy": "price_asc", "maxItems": 50 }
```

**Output fields:** type, productId, name, url, image, category, price (value, text, originalValue, discountPercentage), rating, soldCount, promotions, labels, badges, freeShipping, shop (shopId, domain, name, city, tier, tierLabel, isOfficial, sellerDetails), reviews, reviewSummary, source, searchKeyword, page, rank, scrapedAt.

**Behaviors an agent should know:**

- `searchQueries` is required — provide it (or `categoryIds` plus entries in the overrides array) to run.
- Per-query overrides (`searchTasks`) take precedence over `sortBy` / `priceMin` / `priceMax` for the queries they contain.
- `maxItems` is a global cap (hard limit 5,000); `maxPagesPerQuery` × 60 products bounds pagination per query (hard limit 50 pages).
- Review and seller enrichment each cost extra requests — set `maxProductsToEnrichReviews: 0` and `includeSellerDetails: false` for cheap listing-only runs.
- Free accounts are capped at a 10-product preview per run regardless of input.
- `sellerDetails.shopRating` is always `null` (not exposed publicly) — use `tierLabel` / transaction counts instead.

**Billing:** pay-per-event — `result` at $0.001 per product row, `review-scraped` at $0.00045 per review, plus a run-start event.

### Legal & Compliance Disclaimer

This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Tokopedia (PT Tokopedia) or GoTo Group. It reads only public, unauthenticated GraphQL operations used by the Tokopedia storefront — no login, no account session, no CAPTCHA solving. Prices and promotions are shown as returned at scrape time and change constantly; review rows can contain usernames and comment text, so handle them as personal data under applicable law (e.g. Indonesia's PDP Law / GDPR where relevant). Users are responsible for their own compliance with Tokopedia's Terms of Service and applicable data-protection law when storing, redistributing or automating access to the collected data.

### SEO Keywords

tokopedia scraper, tokopedia api, tokopedia product scraper, scrape tokopedia products, tokopedia price monitoring, tokopedia data api, tokopedia reviews scraper, ecommerce price monitoring indonesia, indonesia marketplace scraper, product price comparison data, tokopedia seller data, marketplace product data, tokopedia alternative api, ecommerce market research indonesia, promotion tracking ecommerce, tokopedia catalog scraper, product discount data, indonesian ecommerce data, tokopedia open platform alternative, official store data indonesia

# Actor input Schema

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

Keywords to search on Tokopedia, e.g. \["laptop", "sepatu nike"]. Each query is paginated separately.

## `categoryIds` (type: `array`):

Optional Tokopedia category IDs to browse instead of (or in addition to) keywords, e.g. \["3964"] for washing machines. Category IDs appear as `sc` in Tokopedia category URLs and `category.id` in results.

## `searchTasks` (type: `array`):

Optional per-query overrides (query or categoryId, sorting, price range, extra Tokopedia filters). Overrides the simple fields above for that task.

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

Sorting applied to keywords from Search queries.

## `priceMin` (type: `integer`):

Optional minimum price filter for simple keyword queries.

## `priceMax` (type: `integer`):

Optional maximum price filter for simple keyword queries.

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

Maximum number of products to push to the dataset across all queries. Hard-capped at 5000.

## `maxPagesPerQuery` (type: `integer`):

Maximum result pages to request per query (60 products per page). Hard-capped at 50.

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

Products requested per API page (Tokopedia maximum is 60).

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

Fetch the first page of customer reviews for a limited number of products (one extra API call per enriched product).

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

Number of reviews to attach to each enriched product.

## `maxProductsToEnrichReviews` (type: `integer`):

Upper bound on how many products get review enrichment per run (each costs one extra request). Set 0 to disable review calls.

## `includeSellerDetails` (type: `boolean`):

Fetch seller statistics (tier, transactions, products sold, favorites, location) for unique shops. One extra API call per unique shop.

## `maxShopsToEnrich` (type: `integer`):

Upper bound on unique shops enriched per run.

## `proxy` (type: `object`):

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "searchQueries": [
    "laptop"
  ],
  "sortBy": "relevance",
  "maxItems": 100,
  "maxPagesPerQuery": 3,
  "rowsPerPage": 60,
  "includeReviews": true,
  "maxReviewsPerProduct": 5,
  "maxProductsToEnrichReviews": 20,
  "includeSellerDetails": true,
  "maxShopsToEnrich": 10,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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"
    ],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/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"],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/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"
  ],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/tokopedia-scraper --silent --output-dataset

```

## MCP server setup

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