# Indonesia Marketplace Product Scraper (`muhfalihr/indonesia-marketplace-product-scraper`) Actor

Search Indonesian marketplace product listings by keyword and extract structured data including product name, price, rating, sales signals, seller, location, and product URL. Built for market research, price discovery, competitor analysis, and automation.

- **URL**: https://apify.com/muhfalihr/indonesia-marketplace-product-scraper.md
- **Developed by:** [Muhammad Falih Romadhoni](https://apify.com/muhfalihr) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 product results

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

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Indonesia Marketplace Product Scraper

Search Tokopedia product listings by keyword and export normalized product data for market research, price discovery, competitor analysis, and automation.

> **Current marketplace coverage:** Tokopedia search results. The Actor is designed for Indonesian marketplace data, but it does not currently search other marketplaces.

### What you get

Each returned product is saved as one Dataset item, making the result easy to browse in Apify and export to JSON, CSV, or Excel. Depending on what is available in the Tokopedia search result, an item can include:

| Data | Example fields |
| --- | --- |
| Product identity | `productId`, `title`, `sourceUrl` |
| Price and promotion | `price`, `originalPrice`, `discountPercent`, `currency` |
| Marketplace signals | `rating`, `reviewCount`, `soldCount` |
| Seller and category | `seller`, `category`, `badges`, `promotion` |
| Images and context | `imageUrl`, `images`, `scrapedAt`, `provenance` |

### Quick start

1. Open the Actor on Apify and enter a product keyword in **Search query**.
2. Optionally choose the result **Page** and **Maximum items**.
3. Click **Start**.
4. Open the **Dataset** tab after the run finishes, then download or connect the results to another workflow.

Example input:

```json
{
  "query": "laptop gaming",
  "page": 1,
  "maxItems": 24
}
```

#### Input reference

| Field | Required | Default | Rules | Description |
| --- | --- | --- | --- | --- |
| `query` | Yes | — | Non-empty text | Keyword sent to Tokopedia search. |
| `page` | No | `1` | Integer ≥ `1` | One-indexed Tokopedia results page. |
| `maxItems` | No | `24` | Integer from `1` to `100` | Maximum normalized product cards returned by this run. |

Run additional pages by starting the Actor again with the next `page` value. The Actor does not automatically crawl every results page.

### Output

The Default Dataset contains one product per row: one product result equals one Dataset item. Search-level details such as pagination, request parameters, and run metadata are stored separately in the `OUTPUT` record of the Default Key-value Store.

Example product item:

```json
{
  "platform": "tokopedia",
  "productId": "fictional-product-123",
  "title": "Fictional Gaming Laptop 15",
  "description": null,
  "sourceUrl": "https://www.tokopedia.com/example/fictional-product-123",
  "imageUrl": "https://images.example.test/fictional-product-123/main.jpg",
  "images": [
    "https://images.example.test/fictional-product-123/main.jpg"
  ],
  "price": 12499000,
  "priceRange": {
    "min": 12499000,
    "max": 12499000
  },
  "originalPrice": 14999000,
  "currency": "IDR",
  "discountPercent": 16.7,
  "rating": 4.9,
  "reviewCount": 835,
  "soldCount": 1200,
  "seller": {
    "name": "Example Official Store",
    "location": "Jakarta"
  },
  "scrapedAt": "2026-08-27T00:00:00Z"
}
```

Numeric price fields use Indonesian rupiah (IDR) as whole numbers. Optional fields depend on the data exposed by the search card: `description` may be `null`, as may image, price, seller, or promotion fields when the source does not provide them.

### Pricing

This Actor uses pay-per-event pricing: **$2.50 / 1,000 product results**.

One product result means one Default Dataset item. For example, a run that returns 24 product items is charged for 24 product results. Apify displays the final usage and cost for each run in its console.

### Important limits

- Results follow Tokopedia's search ranking for the supplied keyword; they are not a precise product-catalog filter.
- Product-detail pages are not scraped. This Actor does not collect full descriptions, reviews, variants, or other detail-page-only data.
- Search-card fields can change or be absent. Treat nullable fields as optional in downstream automations.
- Product availability, price, and ranking can change at any time. Run the Actor again when you need fresh data.

### Responsible use

Use the data only for legitimate purposes and in accordance with applicable laws, Tokopedia's terms, and Apify policies. You are responsible for validating the data before using it in a business or automated decision.

### Support

For questions or support, use the contact option shown on the Actor's Apify page.

# Actor input Schema

## `query` (type: `string`):

Product search query.

## `page` (type: `integer`):

One-indexed result page.

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

Maximum number of normalized product cards returned.

## Actor input object example

```json
{
  "query": "laptop gaming",
  "page": 1,
  "maxItems": 24
}
```

# Actor output Schema

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

No description

## `metadata` (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 = {
    "query": "laptop gaming"
};

// Run the Actor and wait for it to finish
const run = await client.actor("muhfalihr/indonesia-marketplace-product-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 = { "query": "laptop gaming" }

# Run the Actor and wait for it to finish
run = client.actor("muhfalihr/indonesia-marketplace-product-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 '{
  "query": "laptop gaming"
}' |
apify call muhfalihr/indonesia-marketplace-product-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,muhfalihr/indonesia-marketplace-product-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/wEcqhdn8rFGzN4Kg4/builds/0Z9mjJFIRZMciRinW/openapi.json
