# Blibli Flash Sale & Promo Extractor (`zucchini_gopher_m2v/blibli-promo-extractor`) Actor

Track how aggressively Blibli sellers discount. Scrapes live Flash Sale products (with discount % and how much of the flash-sale quota is already claimed), the full running promo campaign catalogue, and any product matching a minimum discount or promo tag. No login or API key needed.

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

## Pricing

$1.00 / 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.

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 Flash Sale & Promo Extractor

Track how aggressively sellers on [Blibli](https://www.blibli.com) — one of
Indonesia's largest marketplaces — are cutting prices. Scrapes the live
**Flash Sale**, the full **promo campaign catalogue**, and any product
matching a **minimum discount or promo tag**.

Built for competitive pricing intelligence: which competitors are
discounting hardest, in which categories, under which campaign, and how
fast the discounted stock is actually moving.

No login, no API key, no cookies. HTTP-only — no browser.

### Three modes

Pick one per run with the `mode` input.

#### 1. `flashSale` — products in the live Flash Sale

Every product in Blibli's running Flash Sale sessions, with the discount,
both prices, the campaign it belongs to, and **how much of the flash-sale
quota is already claimed** — the closest public proxy for sell-through
speed.

```json
{
  "mode": "flashSale",
  "scheduleScope": "current",
  "flashSaleSort": "biggestDiscount",
  "minDiscountPercent": 50
}
```

A full sweep of both advertised sessions returned **1,404 products across
231 merchants**, discounts ranging 0–96%.

#### 2. `promoCampaigns` — the promo campaign catalogue

Every published promo campaign with its landing page, category tree and
exact start/end window. Useful for spotting a competitor's campaign before
it goes live, or catching promos about to expire.

```json
{ "mode": "promoCampaigns", "promoSort": "ending_soon" }
```

440 campaigns were live at the time of writing.

#### 3. `discountedProducts` — deep discounts by keyword or category

Sweep any keyword or category for products beating a discount threshold,
optionally restricted to a promo programme. This is the mode for
"who is discounting hardest in *my* category".

```json
{
  "mode": "discountedProducts",
  "searchTerms": ["laptop gaming", "skincare"],
  "categories": ["https://www.blibli.com/c3/memory-card/ME-1000006"],
  "minDiscountPercent": 50,
  "searchSort": "bestSelling"
}
```

`categories` accepts a bare code (`FA-1000099`) or a full Blibli category
URL. `promoFilter` restricts to a Blibli promo programme — `extraPromo`,
`FREE_GIFT`, `COMBO`, `WHOLESALE`, `merchantVoucher`, or a specific
campaign code.

### Output

One row per product (or per campaign in mode 2). Blibli's own fields are
passed through **verbatim** — 30+ upstream fields per product including
`price`, `flashsale`, `merchantCode`, `review`, `inventory`, `location`,
`badge` — so nothing is lost to renaming. Fields this actor adds are
prefixed with `_`:

```json
{
  "_input": "1788195600000-1788281999000",
  "_source": "S1-flashsale-v2",
  "_scrapedAt": "2026-09-01T02:47:21Z",

  "name": "Palmolive Naturals Orchid Body Wash [1 L] - Triple Pack",
  "sku": "COP-60023-00933",
  "merchantName": "Colgate Palmolive Indonesia Flagship Store",

  "_discountPercent": 54,
  "_discountSource": "upstream",
  "_contextualDiscountPercent": 57,
  "_listPrice": 380400,
  "_offerPrice": 174000,
  "_savingAmount": 206400,

  "_quotaClaimedPercent": 90,
  "_quotaStatus": "AVAILABLE",
  "_campaignCode": "CAMP-03285",
  "_isExclusive": true,

  "_scheduleStart": "2026-08-31T17:00:00Z",
  "_scheduleEnd": "2026-09-01T16:59:59Z",
  "_productUrl": "https://www.blibli.com/p/...",
  "_merchantUrl": "https://www.blibli.com/merchant/..."
}
```

Two fields deserve a note:

- **`_contextualDiscountPercent`** is the price after stacking
  payment-method and voucher promos — normally a few points deeper than the
  headline discount, and the better measure of real aggressiveness. Blibli
  only publishes it for some products, so it is nullable.
- **`_discountSource`** tells you whether Blibli published the discount
  (`upstream`) or this actor derived it from the prices (`computed`).
  Blibli omits the field entirely for reductions under 1%, which would
  otherwise leave about half the rows of a full run blank.

### Input reference

| Field | Applies to | Description |
| --- | --- | --- |
| `mode` | all | `flashSale`, `promoCampaigns`, or `discountedProducts` |
| `scheduleScope` | flashSale | `current` (live session) or `all` (every advertised session) |
| `flashSaleSort` | flashSale | `biggestDiscount`, `almostSoldOut`, `mostStockLeft`, `cheapest`, `mostExpensive`, `mostSearched`, `relevance` |
| `promoSort` | promoCampaigns | `ending_soon`, `newest`, `popularity`, `relevance` |
| `searchTerms` | discountedProducts | Keywords to sweep |
| `categories` | flashSale, discountedProducts | Category codes or Blibli category URLs |
| `minDiscountPercent` | flashSale, discountedProducts | Keep only products at or above this discount |
| `promoFilter` | discountedProducts | Restrict to a Blibli promo programme |
| `searchSort` | discountedProducts | `relevance`, `bestSelling`, `cheapest`, `mostExpensive`, `newest` |
| `maxItems` | all | Cap records (**per query** in mode 3). `0` = no limit |
| `proxyConfiguration` | all | Apify Residential + country `ID` recommended |

### Known limits

- **A search query tops out at 800 products.** Blibli's search backend
  refuses to serve past page 20 regardless of page size. Go wider by adding
  more search terms or splitting by category — not by raising `maxItems`.
- **`minDiscountPercent` is applied in two stages.** Blibli's own discount
  facet only accepts 10/25/50/75, so the threshold is snapped down to the
  nearest bucket server-side and the exact figure enforced client-side. The
  result is exact; only the number of requests differs.
- **Flash sale categories change per session.** The category list is
  session-specific; an out-of-season category code simply returns nothing.
- **No absolute stock counts.** Blibli exposes only
  `_quotaClaimedPercent` (share of the flash-sale allocation claimed) and a
  coarse `availabilityStatus`, not units remaining.
- **`maxItems` is per query in `discountedProducts` mode**, not per run —
  three queries with `maxItems: 20` yield 60 rows.

### Pricing

**$1.00 per 1,000 results** — pay-per-event, one event
(`apify-default-dataset-item`), charged per record in the dataset. No
subscription, no minimum.

| What you run | Rows | Cost |
| --- | --- | --- |
| Quick evaluation | 50 | $0.05 |
| Category sweep with a discount filter | ~200 | $0.20 |
| Full flash sale sweep, both sessions | 1,404 | $1.40 |

Store category: **ECOMMERCE** — the actor's output is marketplace product
and promotion data; no secondary category, since a second one only dilutes
search ranking without describing anything the actor does.

<details>
<summary>How this price was set</summary>

Retrieved from the Apify Store (live figures, not estimates):

| Actor | Model | Price |
| --- | --- | --- |
| `datawebot/blibli-scraper` (16 users, 5.0★/3) | pay-per-event | $0.80 / 1k primary event |
| `jupri/blibli` (20 users, 853 runs) | flat | $30 / month |
| `shahidirfan/tokopedia-search-scraper` (157 users) | pay-per-event | $1.00 / 1k |
| `pumpkin_jingo/shopee-scraper-id` | pay-per-event | $3.00 / 1k |
| `easyapi/tokopedia-product-scraper` (148 users) | pay-per-event | $4.99 / 1k |
| `codenest/amazon-deals-scraper` | pay-per-event | $0.50 / 1k |

Measured operating cost for this actor: **$0.009 per 1,000 results**
(from a real platform run: compute + residential proxy + dataset writes).

$1.00 / 1k matches the proven Tokopedia price point in the same
Indonesian-marketplace niche, sits ~25% above the only directly comparable
Blibli pay-per-event actor — a modest premium for flash-sale, quota-
depletion and promo-campaign coverage that neither Blibli competitor
offers — and stays well below the $3–$5 upper band. A 50-row trial costs
$0.05, so evaluating it is effectively free.

</details>

### Reliability

Blibli sits behind **Cloudflare**. The actor clears it HTTP-only with TLS
impersonation plus the `Referer` header Cloudflare's rule requires — no
browser, no CAPTCHA solver. On a block it retries with exponential backoff
while rotating both the TLS fingerprint and (when a proxy is configured)
the egress IP.

Runs never fail silently: a blocked run, an upstream schema change, bad
input, or a genuinely empty result each emit a diagnostic row carrying
`_error` and `_errorDetail`, so a downstream join always sees something.

A short run usually succeeds without a proxy. For long or scheduled runs,
use **Apify Residential proxy with country `ID`**.

See [CRAWLING\_METHOD.md](CRAWLING_METHOD.md) for the full WAF analysis,
endpoint map, and the field-shape traps found during recon.

# Actor input Schema

## `mode` (type: `string`):

What to extract. 'flashSale' = products in Blibli's live Flash Sale sessions (with discount % and how much of the flash-sale quota is already claimed). 'promoCampaigns' = the catalogue of every running promo campaign with its start/end window. 'discountedProducts' = products matching a minimum discount and/or a promo tag, searched by keyword or category.

## `scheduleScope` (type: `string`):

Flash Sale mode only. 'current' scrapes just the session running right now; 'all' scrapes every session Blibli advertises (usually today's plus the next one).

## `flashSaleSort` (type: `string`):

Flash Sale mode only. Order Blibli returns products in. 'biggestDiscount' surfaces the most aggressive price cuts first.

## `promoSort` (type: `string`):

Promo campaign mode only. 'ending\_soon' is the most useful for catching promos before they expire.

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

Discounted-products mode. Keywords to sweep, e.g. \["laptop gaming", "skincare"]. Each term is paged to Blibli's server-side limit of 800 products.

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

Category codes or full Blibli category URLs, e.g. \["FA-1000099"] or \["https://www.blibli.com/c3/memory-card/ME-1000006"]. Used as a filter in Flash Sale mode and as a query in discounted-products mode.

## `minDiscountPercent` (type: `integer`):

Keep only products discounted by at least this much. 0 disables the filter. In discounted-products mode this is also pushed to Blibli's own discount facet (buckets of 10/25/50/75) so pagination is not wasted on cheap deals.

## `promoFilter` (type: `string`):

Discounted-products mode. Restrict to a Blibli promo programme, e.g. 'extraPromo', 'FREE\_GIFT', 'COMBO', 'WHOLESALE', 'merchantVoucher', or a specific campaign like 'campaign\_CAMP-03285\_5407119\_FLASHSALE'. Leave empty for no promo restriction.

## `searchSort` (type: `string`):

Discounted-products mode. Order Blibli returns search results in.

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

Stop after this many records (per query in discounted-products mode). 0 means no limit -- scrape until the source is exhausted.

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

Blibli is behind Cloudflare. Apify Residential proxy with country 'ID' is recommended for long runs; short runs usually succeed without a proxy.

## Actor input object example

```json
{
  "mode": "flashSale",
  "scheduleScope": "current",
  "flashSaleSort": "biggestDiscount",
  "promoSort": "ending_soon",
  "searchTerms": [],
  "categories": [],
  "minDiscountPercent": 0,
  "searchSort": "relevance",
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

All flash sale / promo campaign / discounted product records from this run.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("zucchini_gopher_m2v/blibli-promo-extractor").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("zucchini_gopher_m2v/blibli-promo-extractor").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 '{}' |
apify call zucchini_gopher_m2v/blibli-promo-extractor --silent --output-dataset

```

## MCP server setup

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

```

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/j9pEucpBLFhkY8fzJ/builds/UwIhxApdpufyyepM0/openapi.json
