# Korean Reviews Bundle (Olive Young + Naver Shopping) (`ingenuous_signature/korean-reviews-bundle`) Actor

One normalized review schema across Korea's top beauty and commerce sites. v0.1: Olive Young and Naver Shopping. Pay per 50 returned reviews.

- **URL**: https://apify.com/ingenuous\_signature/korean-reviews-bundle.md
- **Developed by:** [종현 김](https://apify.com/ingenuous_signature) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$150.00 / 1,000 50 reviews

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

### What does Korean Reviews Bundle do?

Korean Reviews Bundle collects product reviews from Korea's biggest beauty and e-commerce sites and returns them in one normalized schema. Feed it product URLs or IDs from [Olive Young](https://www.oliveyoung.co.kr) and [Naver Shopping](https://shopping.naver.com), and it writes clean, structured review items to a dataset. Ratings, review text, dates, photo flags, repurchase markers, and (where the site exposes them) helpful-vote counts and reviewer skin profiles all land in the same shape, no matter which site they came from.

Because it runs on the Apify platform, you get scheduling, API access, proxy rotation, monitoring, and easy export to your pipeline out of the box.

#### Supported sources

| Source | Status | Target format | Notes |
|---|---|---|---|
| Olive Young | Available | goodsNo (`A` + 12 digits) or product page URL | Full data: helpful votes and reviewer skin profile included |
| Naver Shopping | Available | Smart Store / Brand Store product URL or bare product number | No helpful-vote count and no skin profile in the source data |
| Coupang | Not supported in v0.1 | — | Coupang URLs are skipped with a reason in the run summary and are never billed |

### Why use Korean Reviews Bundle?

- **One schema, two sites.** You don't have to reconcile two different review formats. Every item follows the same field layout, so downstream analysis, dashboards, and LLM pipelines just work.
- **K-beauty and Korean commerce intelligence.** Track sentiment on Olive Young rankings and Naver Smart Store listings in a single run.
- **Respectful by design.** The Actor reads only public review data, never logs in, and never collects reviewer names, IDs, or profile images.
- **Pay for results, not compute guesswork.** Pay-per-event pricing means you only pay when reviews actually come back, in blocks of 50 returned reviews.

### How to use Korean Reviews Bundle

1. Open the Actor in Apify Console and go to the **Input** tab.
2. Add your product IDs or URLs to **Product IDs or URLs**. Mixing sources in one run is fine.
3. Optionally set **Max reviews per product** and pick a **Sort** order.
4. Click **Start** and watch the dataset fill up.
5. Download the results or pull them through the Apify API.

No coding required. If you prefer code, call the Actor from the Apify API or SDK with the same JSON input shown below.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `productIds` | array of strings | (required) | Olive Young goodsNo or product URLs, and Naver product URLs or bare product numbers. Any other site (including Coupang) is not supported in v0.1: such targets are skipped with a reason in the `SUMMARY` record and bill nothing. |
| `maxReviewsPerProduct` | integer | 100 | Stop after this many reviews per product (max 5,000). |
| `sortType` | string | `USEFUL_SCORE_DESC` | One of `USEFUL_SCORE_DESC`, `LATEST`, `SCORE_DESC`, `SCORE_ASC`. |
| `proxyConfiguration` | object | Apify residential proxies | Residential proxies are recommended for platform runs. |

Example input:

```json
{
    "productIds": ["A000000223414", "https://brand.naver.com/mediheal/products/11983780143"],
    "maxReviewsPerProduct": 100,
    "sortType": "USEFUL_SCORE_DESC"
}
```

### Output

Each review is one dataset item. Example:

```json
{
    "source": "oliveyoung",
    "productId": "A000000223414",
    "productName": "Mediheal Tea Tree Essential Mask 10 sheets",
    "optionName": "single pack",
    "reviewId": "23845123",
    "rating": 5,
    "text": "Calmed my skin overnight. Already on my third box.",
    "date": "2026-08-29",
    "helpfulCount": 41,
    "hasPhoto": true,
    "photoPaths": ["https://image.oliveyoung.co.kr/uploads/images/goodsDetail/review/abc123.jpg"],
    "isRepurchase": true,
    "reviewType": "PHOTO",
    "reviewer": { "skinType": "oily", "skinTone": "21", "skinTroubles": ["trouble"], "isTopReviewer": false },
    "scrapedAt": "2026-09-06T03:14:22.118Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Data fields

| Field | Description |
|---|---|
| `source` | `oliveyoung` or `naver_shopping` |
| `productId` | Product identifier you requested |
| `productName` | Product name as shown on the site, or `null` |
| `optionName` | Purchased option/variant, or `null` |
| `reviewId` | Site's own review ID |
| `rating` | Star rating (number), or `null` |
| `text` | Review body text |
| `date` | Review date, `YYYY-MM-DD` (KST calendar date for Naver) |
| `helpfulCount` | Helpful/useful vote count; always `0` for Naver (not exposed) |
| `hasPhoto` | Whether the review has photos |
| `photoPaths` | Photo URLs attached to the review |
| `isRepurchase` | Repurchase flag |
| `reviewType` | Site-specific review type, or `null` |
| `reviewer` | Skin profile (Olive Young only); Naver returns empty/null values. No names, IDs, or profile images, ever |
| `scrapedAt` | Timestamp when the item was collected |

### How much does it cost to scrape Korean reviews?

The Actor uses **pay-per-event** pricing with a single event, `reviews-50`, at **USD 0.15 per event**.

- One event covers **up to 50 returned reviews**, counted per run across all products. Every started block of 50 is billed as a whole event: 1–50 reviews = 1 event ($0.15), 51–100 = 2 events ($0.30), 137 reviews = 3 events ($0.45). That works out to at most USD 3.00 per 1,000 reviews.
- Billing counts reviews **returned**, not reviews requested. A run that returns nothing bills nothing; unsupported or unrecognized targets bill nothing.
- There is no start fee and no per-item fee on top of `reviews-50`. The event price covers the platform usage of the run (compute, proxy traffic, storage); you are not billed separately for it.
- You can cap the total charge of a run with the **maximum cost per run** option when you start it; the Actor stops between products once the cap is reached, and events above the cap are never billed.

New Apify accounts can try the Actor within the free tier before spending anything.

### Tips and advanced options

- **Set `maxReviewsPerProduct` honestly.** It's the simplest way to cap both cost and run time.
- **Use residential proxies on the platform.** These sites rate-limit datacenter IPs aggressively.
- **Batch products from the same source.** A run still works with mixed targets, but keeping sources together makes logs easier to read.
- **Sort by `USEFUL_SCORE_DESC`** when you want the most informative reviews first, `LATEST` when you need recency for trend monitoring.

### FAQ, disclaimers, and support

#### Is scraping these reviews legal?

The Actor reads only public review data that any visitor can see without an account. It never logs in, and it never collects reviewer names, IDs, or profile images. Normalization drops those fields deliberately, and the test suite asserts the drop. Scraping publicly available data is generally lawful, but you're responsible for complying with each site's terms of service and the privacy laws that apply to your use case.

#### What are the known limitations?

- **Naver Shopping** exposes no helpful-vote count on its review list, so `helpfulCount` is always `0` for Naver items. It also exposes no reviewer skin profile, and it serves 20 reviews per request, so large Naver targets need more requests than you'd expect. Olive Young fills both helpful votes and skin profile.
- Review photos come back as URLs, not downloaded files.
- **Coupang is not supported in v0.1.** Coupang product URLs are recognised, skipped with a reason in the `SUMMARY` record, and never billed.
- Sites change their markup without notice; if a source breaks, open an issue.

#### Feedback

Found a bug or want another Korean source added? Use the **Issues** tab. Custom scraping solutions and integrations are available on request.

# Actor input Schema

## `productIds` (type: `array`):

Olive Young goodsNo (A + 12 digits) or product page URLs, or Naver Smart Store / Brand Store product URLs (a bare product number is treated as a Smart Store product). Other sites, including Coupang, are not supported in v0.1: such targets are skipped with a reason in the SUMMARY record and are not billed.

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

Stop after this many reviews per product.

## `sortType` (type: `string`):

Review ordering used by the site.

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

Residential proxies recommended when running on the platform.

## Actor input object example

```json
{
  "productIds": [
    "A000000223414",
    "https://brand.naver.com/mediheal/products/11983780143"
  ],
  "maxReviewsPerProduct": 100,
  "sortType": "USEFUL_SCORE_DESC",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "productIds": [
        "A000000223414",
        "https://brand.naver.com/mediheal/products/11983780143"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ingenuous_signature/korean-reviews-bundle").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 = { "productIds": [
        "A000000223414",
        "https://brand.naver.com/mediheal/products/11983780143",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ingenuous_signature/korean-reviews-bundle").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 '{
  "productIds": [
    "A000000223414",
    "https://brand.naver.com/mediheal/products/11983780143"
  ]
}' |
apify call ingenuous_signature/korean-reviews-bundle --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ingenuous_signature/korean-reviews-bundle"
        }
    }
}
```

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/uaFe6fxjJOFmFayHP/builds/qVIbWEodg1u6IQnk7/openapi.json
