# Glowpick Scraper — K-Beauty Product Rankings & Ratings (글로우픽) (`kdatafactory/glowpick-scraper`) Actor

Scrape K-beauty product rankings from Glowpick (글로우픽), Korea's top consumer beauty-ranking site: rank, product name, brand, category, star rating, review count, KRW price and image as clean JSON. No personal data collected. For K-beauty market research, trend tracking and pricing.

- **URL**: https://apify.com/kdatafactory/glowpick-scraper.md
- **Developed by:** [Seok June Park](https://apify.com/kdatafactory) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Glowpick Scraper — K-Beauty Product Rankings & Ratings

Scrape **Korean beauty product rankings from [Glowpick](https://www.glowpick.com) (글로우픽)** — Korea's leading consumer-driven beauty ranking site, built on hundreds of thousands of real user reviews. Point it at Glowpick's category ranking pages and get back clean, structured JSON for every ranked product: rank, product name, brand, category, **star rating**, **review count**, **KRW price** and image.

Glowpick rankings are decided by ordinary Korean beauty consumers, not by what a store is pushing — a review-driven "what Korea actually rates highest" signal. If you need to know which K-beauty products are winning by category in Korea right now, this is the source.

> **Privacy-first.** No personal data is ever collected — no reviewer names, IDs, or profiles. Product, brand, ranking, rating, and price data only.

> **Try it free.** Apify's free plan includes $5 of monthly platform credit — roughly **2,000 results** from this actor, no credit card required. Set your input, click Start, and export JSON/CSV/Excel.

---

### What it does

- Reads Glowpick's public, **server-rendered category ranking pages** (`glowpick.com/categories/<id>?monthTerm=<n>`) — works from most IPs, including datacenter.
- Extracts each ranked product from the page's embedded JSON-LD `ItemList` (rank, name, rating, review count, image, URL), reads the category label from the breadcrumb, and enriches brand + KRW price from the page's inline app data.
- Emits one clean record per product against a stable schema.

### Input

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `categoryIds` | string[] | popular set | Glowpick category IDs (the number in `glowpick.com/categories/<id>`). Empty = a built-in default set of popular categories. E.g. `100` Hair, `44` Suncare, `88` Skin health, `96` Men's cosmetics. Each category yields its ranked TOP-20. |
| `monthTerm` | string | `"24"` | Ranking time window in months (`3`, `6`, `12`, `24`). `24` = Glowpick's default long-window ranking. |
| `maxProducts` | integer | `100` | Max products to scrape across all requested categories. |
| `proxyConfiguration` | object | none | Optional. Not required for ranking data. |

#### Input example

```json
{
  "categoryIds": ["100", "44", "88"],
  "monthTerm": "24",
  "maxProducts": 100
}
````

### Output

One dataset item per product. This is **real output** from a live run (see `samples/sample-output.json` for 40 real records):

```json
{
  "source": "glowpick",
  "product_id": "129745",
  "name": "데일리 볼륨 업 컬 크림",
  "brand": "다슈",
  "category": "헤어",
  "rank": 1,
  "rating": 4.38,
  "review_count": 80,
  "award": null,
  "price_krw": 25000,
  "url": "https://www.glowpick.com/products/129745",
  "image_url": "https://dn5hzapyfrpio.cloudfront.net/product/381/38121550-85a5-11ec-9239-3145a1882625.jpeg",
  "scraped_at": "2026-07-09T10:06:34+09:00"
}
```

#### Field notes

- `product_id` — Glowpick's stable product identifier (from the product URL).
- `rank` — 1-based position within the category ranking.
- `rating` / `review_count` — average star rating (1–5) and number of reviews behind it, straight from Glowpick's aggregate rating. Together these are the core "what Korea actually rates highly" signal.
- `brand` — brand name (Korean). Populated for every ranked product.
- `price_krw` — retail price in KRW when Glowpick lists one; `null` when no price is shown (e.g. discontinued items).
- `category` — the category label of the ranking (Korean leaf name, e.g. "헤어", "선젤").
- `award` — always `null` (see the known limitation below).

### Use cases

- **Market research for K-beauty market entry** — pull the current top-rated products by category with real ratings, review counts and KRW prices before launching a competing SKU.
- **Trend tracking** — snapshot the rankings on a schedule to see what's rising and falling in Korean consumer favor over time.
- **Pricing & dropshipping** — track top K-beauty products by category and their KRW price.
- **AI agents / analytics** — a clean, PII-free ranking feed that drops straight into an LLM or BI pipeline with no PII to scrub.

### Proxy & rate limits

The ranking data — the product this actor sells — reads from Glowpick's server-rendered JSON-LD and inline app data, and works from **most IPs, including datacenter** (the 40-record sample here was produced with **no proxy**). A residential proxy is only worth enabling for high-volume runs. The actor runs politely: effectively concurrency 1 with ≥600 ms between requests, and if a proxy tunnel hangs it retries directly so a bad tunnel never hangs the run.

### Known limitation — award badges & review text (not currently sold)

- **Award badges.** Glowpick runs annual beauty **awards**, but the category ranking pages do **not** carry a per-product award badge, so the `award` field is always `null`. It is kept in the schema for contract stability but the actor is **not** sold on award data.
- **Review text & ingredients.** Full review text and ingredient lists live on separate detail views and are not part of this actor. Review text on Glowpick is also tied to reviewer profiles, so — per our privacy rule — it is intentionally **not** collected. **This actor is sold on its ranking, rating, review-count, brand and price data, which are reliable and PII-free.**

### Legality & data ethics

- Only **public** ranking data is collected — no login, no private endpoints. Glowpick's `robots.txt` disallows `/api`, `/profiles`, `/searches` and `/webview`; this actor touches **none** of them — it reads only the public category ranking pages.
- **No personal data.** Reviewer names, IDs, and profiles are never read or stored.
- You are responsible for using the output in compliance with Glowpick's terms and applicable law. Because no personal data is emitted, output is safe to feed directly into analytics and LLM pipelines.

### ❓ FAQ

**Is it legal to scrape this data?**
This actor collects only public, non-personal catalog data — the same category rankings any visitor sees without logging in. No personal data is collected. You are responsible for how you use the data; see the legality note above.

**What does it cost in practice?**
$2.50 per 1,000 results (launch pricing) + a few cents of platform usage. Example: a 500-result daily pull costs about $1.25/day. Apify's free $5 monthly credit covers ~2,000 results.

**Do I need to configure proxies?**
No — the default settings work out of the box (the sample data here was produced with no proxy). A residential proxy is optional and only worth enabling for high-volume runs.

**How fresh is the data?**
Every run scrapes the live site at run time. Schedule the actor for recurring snapshots.

**What is NOT included?**
Award badges (the `award` field is always `null` — ranking pages don't carry them) and full review text / ingredient lists, which live on separate detail views and are intentionally not collected because review text is tied to reviewer profiles. This actor is sold on its ranking, rating, review-count, brand and price data.

### 🇰🇷 More Korean data actors

This actor is part of a suite of Korean-platform scrapers by the same maintainer:

- [hwahae-scraper](https://apify.com/kdatafactory/hwahae-scraper) — Hwahae cosmetics rankings and ingredient-safety data.
- [oliveyoung-scraper](https://apify.com/kdatafactory/oliveyoung-scraper) — Olive Young best-seller rankings and product prices.

Browse all: [apify.com/kdatafactory](https://apify.com/kdatafactory)

### Local development

```bash
npm install
## put input in ./storage/key_value_stores/default/INPUT.json, then:
npm start   # results land in ./storage/datasets/default

## polite lite test against the live site (<=2 categories, ~40 products):
GLOWPICK_SCRAPER_LITE_TEST=1 npm start
```

***

*If this actor saves you time, a rating on the [Store page](https://apify.com/kdatafactory/glowpick-scraper) helps a solo maintainer a lot. Found an issue? Open it in the Issues tab — I respond fast.*

# Actor input Schema

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

Glowpick ranking category IDs to scrape (the number in the URL glowpick.com/categories/<id>). Leave empty to scrape a built-in default set of popular categories. Each category page embeds its ranked TOP-20 products. Example IDs: 100 (Hair), 44 (Suncare), 88 (Skin health), 96 (Men's cosmetics).

## `monthTerm` (type: `string`):

Ranking window in months used by Glowpick (the ?monthTerm= query param). 24 = last 24 months (Glowpick's default long-window ranking). Smaller values (e.g. 3, 6, 12) give more recent windows.

## `maxProducts` (type: `integer`):

Maximum number of ranked products to scrape across all requested categories.

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

Optional. Glowpick's category ranking pages are server-rendered and read from most IPs, so a proxy is not required for the ranking data this actor sells. A residential proxy is only worth enabling for high-volume runs. If a proxy tunnel hangs, the actor retries the request directly.

## Actor input object example

```json
{
  "categoryIds": [
    "100",
    "44",
    "88"
  ],
  "monthTerm": "24",
  "maxProducts": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "categoryIds": [
        "100",
        "44"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kdatafactory/glowpick-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 = { "categoryIds": [
        "100",
        "44",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("kdatafactory/glowpick-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "categoryIds": [
    "100",
    "44"
  ]
}' |
apify call kdatafactory/glowpick-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=kdatafactory/glowpick-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Glowpick Scraper — K-Beauty Product Rankings & Ratings (글로우픽)",
        "description": "Scrape K-beauty product rankings from Glowpick (글로우픽), Korea's top consumer beauty-ranking site: rank, product name, brand, category, star rating, review count, KRW price and image as clean JSON. No personal data collected. For K-beauty market research, trend tracking and pricing.",
        "version": "0.1",
        "x-build-id": "thz5b0Qc9Bc7ErS5K"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/kdatafactory~glowpick-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-kdatafactory-glowpick-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/kdatafactory~glowpick-scraper/runs": {
            "post": {
                "operationId": "runs-sync-kdatafactory-glowpick-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/kdatafactory~glowpick-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-kdatafactory-glowpick-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "categoryIds": {
                        "title": "Category IDs",
                        "type": "array",
                        "description": "Glowpick ranking category IDs to scrape (the number in the URL glowpick.com/categories/<id>). Leave empty to scrape a built-in default set of popular categories. Each category page embeds its ranked TOP-20 products. Example IDs: 100 (Hair), 44 (Suncare), 88 (Skin health), 96 (Men's cosmetics).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "monthTerm": {
                        "title": "Ranking time window (months)",
                        "enum": [
                            "3",
                            "6",
                            "12",
                            "24"
                        ],
                        "type": "string",
                        "description": "Ranking window in months used by Glowpick (the ?monthTerm= query param). 24 = last 24 months (Glowpick's default long-window ranking). Smaller values (e.g. 3, 6, 12) give more recent windows.",
                        "default": "24"
                    },
                    "maxProducts": {
                        "title": "Max products",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "Maximum number of ranked products to scrape across all requested categories.",
                        "default": 100
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional. Glowpick's category ranking pages are server-rendered and read from most IPs, so a proxy is not required for the ranking data this actor sells. A residential proxy is only worth enabling for high-volume runs. If a proxy tunnel hangs, the actor retries the request directly.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
