# Blibli Product & Price Monitor (`zucchini_gopher_m2v/blibli-product-price-monitor`) Actor

Ekstrak nama, harga, diskon, rating, jumlah ulasan, dan status stok produk Blibli berdasarkan kata kunci atau kategori.

- **URL**: https://apify.com/zucchini\_gopher\_m2v/blibli-product-price-monitor.md
- **Developed by:** [Faisal Ahdan naufal](https://apify.com/zucchini_gopher_m2v) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.80 / 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?

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

## Blibli Product & Price Monitor

Mengekstrak detail produk dari [Blibli](https://www.blibli.com) berdasarkan kata kunci
atau kategori: **nama, harga, diskon, rating, jumlah ulasan, dan status stok** —
plus data penjual, jumlah terjual, dan lokasi gudang.

Dibuat untuk dua pekerjaan: menganalisis tren harga pasar dan melacak dinamika
kompetitor dari waktu ke waktu.

### Yang dihasilkan

Satu baris per produk per query:

```json
{
  "productSku": "BLL-70058-00122",
  "name": "SanDisk Ultra microSDXC 64GB C10 UHS-I Card 100MB/s",
  "brand": "SanDisk",
  "url": "https://www.blibli.com/p/sandisk-ultra-microsdxc-64gb/ps--BLL-70058-00122",
  "salePrice": 259000,
  "listPrice": 299000,
  "discountPercentage": 13,
  "discountAmount": 40000,
  "currency": "IDR",
  "rating": 4.8,
  "reviewCount": 465,
  "stockStatus": "AVAILABLE",
  "inStock": true,
  "stockQuantity": 97,
  "soldCount": 4178,
  "merchantName": "Blibli (Laptop - Acc) Flagship Store",
  "merchantBadge": "DIAMOND",
  "merchantRating": 4.9,
  "location": "Kota Jakarta Timur",
  "categoryHierarchy": ["Komputer & Gaming", "Media Penyimpanan", "Memory Card"],
  "isFreeShipping": true,
  "queryType": "search",
  "query": "memory card",
  "rankInQuery": 1,
  "scrapedAt": "2026-08-31T02:27:52.194Z"
}
```

`rankInQuery` merekam posisi produk di hasil pencarian — berguna untuk melacak
naik-turunnya peringkat kompetitor pada kata kunci yang sama antar-run.

### Input

| Field | Keterangan |
| --- | --- |
| `searchTerms` | Daftar kata kunci, mis. `["laptop gaming", "kopi arabika"]` |
| `categories` | URL kategori Blibli atau ID-nya, mis. `["https://www.blibli.com/c3/memory-card/ME-1000006"]` atau `["ME-1000006"]` |
| `maxItemsPerQuery` | Batas produk per query (default `100`) |
| `sortBy` | `relevance`, `bestSelling`, `popular`, `cheapest`, `expensive`, `newest` |
| `minPrice` / `maxPrice` | Saringan harga dalam rupiah |
| `includeOutOfStock` | Sertakan produk habis (default `true`) |
| `fetchProductDetails` | Buka tiap halaman produk untuk data lebih dalam (default `false`) |
| `maxConcurrency` | Permintaan paralel (default `8`) |
| `proxyConfiguration` | Disarankan proxy residensial Indonesia |

Kata kunci dan kategori boleh dipakai bersamaan dalam satu run.

#### Mencari ID kategori

Buka kategori mana pun di Blibli dan salin URL dari address bar — actor mengambil
ID-nya sendiri. `https://www.blibli.com/c3/memory-card/ME-1000006` dan
`ME-1000006` sama-sama diterima.

### Mode detail

Dengan `fetchProductDetails: false` (default), semua data diambil dari API
pencarian Blibli — satu permintaan untuk 100 produk. Cepat dan murah.

Dengan `fetchProductDetails: true`, setiap halaman produk ikut dibuka sehingga
menambah:

- `stockQuantity` — sisa stok dalam angka, bukan sekadar tersedia/habis
- `seenCount` — berapa kali produk dilihat
- `bestSellingRank` — peringkat terlaris di sub-kategorinya
- `merchantIsOfficial`, `merchantReviewCount`, `warranty`, `uniqueSellingPoint`
- `listingSalePrice` dan `priceMovedSinceListing`

Dua field terakhir layak diperhatikan. Indeks pencarian Blibli kadang tertinggal
dari halaman produk; pada pengujian, ada produk yang tampil `Rp55.999` di hasil
pencarian tapi sebenarnya `Rp42.999` di halamannya sendiri. Actor menyimpan
kedua angka dan menandai selisihnya alih-alih diam-diam memilih salah satu.

Biayanya: satu permintaan tambahan per produk.

### Batas yang perlu diketahui

Blibli hanya melayani **20 halaman per query**, jadi maksimal **2.000 produk**
per kata kunci atau kategori — batas dari situsnya, bukan dari actor ini.
Untuk memanen kategori yang lebih besar, pecah jadi beberapa query dengan
rentang harga yang berurutan:

```json
{
  "categories": ["ME-1000006"],
  "minPrice": 0,
  "maxPrice": 100000
}
```

lalu `100000`–`250000`, dan seterusnya. Tiap rentang punya jatah 2.000 sendiri.

### Harga

| Item | Tarif |
| --- | --- |
| Memulai run | $0,05 |
| Tiap produk yang dihasilkan | $0,01 |

Anda hanya membayar baris yang benar-benar masuk ke dataset. Batas biaya
maksimum run bisa Anda pasang sendiri di Apify Console.

Actor berjalan pada 1 GB memori secara default (puncak pemakaian nyata sekitar
155 MB), jadi biaya compute platform tetap rendah. Karena actor ini tidak
memakai browser headless, satu permintaan sudah mengambil 100 produk sekaligus.

### Memantau secara berkala

Untuk analisis tren, jadwalkan actor ini di Apify Scheduler (mis. tiap pagi)
dengan input yang sama persis. Setiap run menulis dataset baru dengan
`scrapedAt`; gabungkan dataset antar-run dengan `productSku` sebagai kunci untuk
mendapat deret waktu harga, diskon, rating, dan stok per produk.

### Catatan teknis

Actor ini memakai API pencarian internal Blibli dan state JSON yang ditanam di
halaman produk, bukan browser headless. Blibli menolak permintaan yang headernya
tidak konsisten dengan XHR browser sungguhan, jadi crawler mengunci profil header
ke satu identitas Chrome desktop. Karena tanpa browser, actor ini jauh lebih
cepat dan murah dibanding pendekatan Playwright/Puppeteer.

Kalau mulai muncul kegagalan berulang, turunkan `maxConcurrency` atau aktifkan
proxy residensial.

### Pengembangan lokal

```bash
npm install
npm test                      # tes unit untuk parsing dan normalisasi
apify run                     # baca input dari storage/key_value_stores/default/INPUT.json
```

# Actor input Schema

## `searchTerms` (type: `array`):

Kata kunci pencarian Blibli, satu per baris. Contoh: "laptop gaming", "kopi arabika".

## `categories` (type: `array`):

URL kategori Blibli (mis. https://www.blibli.com/c3/memory-card/ME-1000006) atau ID kategorinya langsung (mis. ME-1000006). Buka kategori di Blibli dan salin URL-nya dari address bar.

## `maxItemsPerQuery` (type: `integer`):

Batas produk yang diambil untuk tiap kata kunci/kategori. Blibli sendiri hanya melayani 2.000 hasil pertama per query — untuk menembusnya, jalankan beberapa query dengan rentang harga berbeda.

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

Menentukan produk mana yang masuk saat jumlahnya dibatasi. "bestSelling" dan "popular" cocok untuk memetakan pesaing teratas; "cheapest" cocok untuk melacak titik harga terendah.

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

Saring produk di bawah harga ini. Kosongkan untuk tanpa batas bawah.

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

Saring produk di atas harga ini. Kosongkan untuk tanpa batas atas.

## `includeOutOfStock` (type: `boolean`):

Matikan untuk hanya mengambil produk yang tersedia. Biarkan aktif kalau Anda ingin melacak kapan stok pesaing kosong.

## `fetchProductDetails` (type: `boolean`):

Membuka setiap halaman produk untuk mendapat jumlah stok pasti, jumlah dilihat, peringkat terlaris, dan garansi. Jauh lebih akurat, tapi menambah satu permintaan per produk sehingga lebih lambat dan lebih mahal.

## `maxConcurrency` (type: `integer`):

Turunkan kalau Blibli mulai memblokir; naikkan untuk menyelesaikan lebih cepat saat memakai proxy.

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

Sangat disarankan. Proxy residensial Indonesia memberi harga dan ketersediaan yang dilihat pembeli lokal.

## Actor input object example

```json
{
  "searchTerms": [
    "laptop gaming"
  ],
  "categories": [],
  "maxItemsPerQuery": 100,
  "sortBy": "relevance",
  "includeOutOfStock": true,
  "fetchProductDetails": false,
  "maxConcurrency": 8,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "ID"
  }
}
```

# Actor output Schema

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

Semua baris produk — harga, diskon, rating, ulasan, dan status stok — dari run ini.

# 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 = {
    "searchTerms": [
        "laptop gaming"
    ],
    "categories": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("zucchini_gopher_m2v/blibli-product-price-monitor").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 = {
    "searchTerms": ["laptop gaming"],
    "categories": [],
}

# Run the Actor and wait for it to finish
run = client.actor("zucchini_gopher_m2v/blibli-product-price-monitor").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 '{
  "searchTerms": [
    "laptop gaming"
  ],
  "categories": []
}' |
apify call zucchini_gopher_m2v/blibli-product-price-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zucchini_gopher_m2v/blibli-product-price-monitor"
        }
    }
}

```

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/OqSXL0fZDcNKFa0MB/builds/fycsmetPj1u0Sasbc/openapi.json
