# OliveYoung Review Scraper (`parsebird/oliveyoung-review-scraper`) Actor

Extract OliveYoung product reviews from both the Global and Korean stores: rating, review text, date, reviewer nickname, skin type, skin concerns, helpful votes, and photos. Paste product links, IDs, or a mix of both storefronts.

- **URL**: https://apify.com/parsebird/oliveyoung-review-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.29 / 1,000 reviews

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### OliveYoung Review Scraper

OliveYoung Review Scraper extracts **product reviews from OliveYoung** — both the international [global.oliveyoung.com](https://global.oliveyoung.com) store and the Korean [oliveyoung.co.kr](https://www.oliveyoung.co.kr) store — including star rating, review text, date, reviewer nickname, skin type, skin concerns, helpful votes, purchased option, and photos.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Paste product links or bare product IDs from either the Global or Korean OliveYoung store, filter by star rating, and get clean, structured review data ready for sentiment analysis, complaint mining, or product research.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor: Actor ID `parsebird/oliveyoung-review-scraper` on Apify — call it with the `apify-client` SDK, e.g. `ApifyClient(token).actor("parsebird/oliveyoung-review-scraper").call(run_input={"productUrls": ["https://global.oliveyoung.com/product/detail?prdtNo=GA240824996"], "maxReviewsPerProduct": 200})`; key inputs are `productUrls` (array of Global `prdtNo=GA...` links, Korean `goodsNo=A...` links, or bare product IDs — mix both stores freely), `maxReviewsPerProduct` (integer, applies per product, 0 = unlimited, capped at 50,000), `sortBy` (`recent`, `helpful`, `highest`, or `lowest`), `starRating` (array of `"1"`-`"5"`, empty = all ratings), and `proxyConfiguration` (defaults to Apify Residential proxy, required for the target site's bot protection); output rows have `store`, `productId`, `productName`, `productUrl`, `reviewId`, `rating`, `reviewText`, `reviewDate`, `reviewerNickname`, `reviewerSkinType`, `reviewerSkinConcerns`, `helpfulCount`, `optionName`, `reviewedVariantName`, `reviewImages`, and `repeatPurchase`; full API spec is on the Apify Console API tab for this actor, and an Apify API token is required to call it programmatically.

#### What does OliveYoung Review Scraper do?

OliveYoung Review Scraper reads the same public review data any shopper on OliveYoung can see — no login required. It supports two storefronts in one actor:

- 🌐 **Global store** (`global.oliveyoung.com`) — the English-language storefront for international shoppers. Reviews here are cross-posted from the Korean store's review base and machine-translated to English.
- 🇰🇷 **Korean store** (`oliveyoung.co.kr`) — South Korea's largest K-beauty retailer, with the richest review data: reviewer skin type, skin concerns, helpful-vote counts, and repeat-purchase flags.

Other things it does:

- Accepts product links, or bare product IDs (`GA...` for Global, `A...` for Korean), in any mix within a single run.
- Sorts reviews by most recent, most helpful, highest rating, or lowest rating.
- Filters by star rating (1-5) so you can pull only complaints or only praise.
- Deduplicates automatically when the same product is given as both a URL and a bare ID.
- Uses a Residential proxy by default — OliveYoung's review APIs sit behind Cloudflare and block requests from datacenter IP ranges, including Apify's own.
- Runs on Apify's infrastructure with **scheduling**, **REST API access**, and native **JSON, CSV, Excel, HTML, and XML export**.

#### What data can you extract from OliveYoung?

| Field | Description |
|-------|-------------|
| `store` | Which storefront the review came from: `global` or `korean` |
| `rating` | Star rating, 1-5 |
| `reviewText` / `reviewDate` | Review body and normalized ISO date |
| `reviewerNickname` | Reviewer's display name (often partially masked, e.g. `sk*****`) |
| `reviewerSkinType` / `reviewerSkinConcerns` | Reviewer's skin type and skin concerns, when the store reports them |
| `helpfulCount` | Number of helpful votes the review received (Korean store) |
| `optionName` | The purchased option or variant (shade, size, set) |
| `reviewImages` | URLs of user-uploaded review photos, when present |
| `repeatPurchase` | Whether the reviewer had already bought the product before (Korean store only) |

#### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `productUrls` | string\[] | No | Sample Global product | Global (`prdtNo=GA...`) or Korean (`goodsNo=A...`) URLs, or bare product IDs |
| `maxReviewsPerProduct` | integer | No | 100 | Max reviews per product; `0` = unlimited (capped at 50,000) |
| `sortBy` | select | No | `recent` | `recent`, `helpful`, `highest`, or `lowest` |
| `starRating` | string\[] | No | `[]` (all) | Any of `"1"`-`"5"` |
| `proxyConfiguration` | object | No | Apify Residential | Proxy used to reach OliveYoung's Cloudflare-protected review APIs |

#### Output example

```json
{
  "store": "korean",
  "productId": "A000000006568",
  "productName": "우르오스 스칼프샴푸 500ml (증정기획/단품)",
  "productUrl": "https://www.oliveyoung.co.kr/store/goods/getGoodsDetail.do?goodsNo=A000000006568",
  "reviewId": "65768811",
  "rating": 5,
  "reviewText": "여자인데 피부가 지성이라 우루오스 즐겨쓰는데 너무 좋아요.",
  "reviewDate": "2026-09-05",
  "reviewerNickname": "뽀야뽀야",
  "reviewerSkinType": "A01",
  "helpfulCount": 495,
  "optionName": "우르오스 스칼프 샴푸(단품)",
  "reviewImages": ["https://image.oliveyoung.co.kr/uploads/images/gdasEditor/2026/09/05/3b5285e494684bbb858bb083bac0b4941788581815051.png"],
  "repeatPurchase": false
}
```

Korean-store text fields (`productName`, `reviewText`, `reviewerNickname`, `optionName`) are returned exactly as written on oliveyoung.co.kr — in Korean. Global-store text is pre-translated to English by OliveYoung's own review feed.

Fields that are empty for a given review (e.g. `reviewerSkinType` when the reviewer didn't set one, or `repeatPurchase` on the Global store) are left out of that row entirely, so a row is only as wide as the data OliveYoung publishes for it. Download results as JSON, HTML, CSV, or Excel from the **Storage** tab, or fetch them via the [dataset API endpoint](https://docs.apify.com/api/v2#/reference/datasets).

##### Python example

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("parsebird/oliveyoung-review-scraper").call(run_input={
    "productUrls": ["https://global.oliveyoung.com/product/detail?prdtNo=GA240824996"],
    "maxReviewsPerProduct": 200,
    "sortBy": "helpful",
    "starRating": ["1", "2"],
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["rating"], item["reviewText"][:80])
```

##### JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('parsebird/oliveyoung-review-scraper').call({
    productUrls: ['https://www.oliveyoung.co.kr/store/goods/getGoodsDetail.do?goodsNo=A000000206904'],
    maxReviewsPerProduct: 0,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].reviewerNickname, items[0].rating);
```

#### Use cases

- **Complaint analysis** — filter `starRating: ["1", "2"]` sorted by `helpful` to surface the most-upvoted negative feedback for a product.
- **Sentiment tracking** — pull every review (`maxReviewsPerProduct: 0`) for a product line and track rating trends over time with scheduled runs.
- **Skin-profile research** — cross-reference `reviewerSkinType` and `reviewerSkinConcerns` from the Korean store against ratings to see which skin types respond best to a product.
- **Cross-market comparison** — scrape the same product from both `global` and `korean` stores to compare how it's rated by international vs. domestic shoppers.

#### How to scrape OliveYoung with OliveYoung Review Scraper

1. Click **Try for free** (or **Run**) on this Actor's page.
2. Paste one or more OliveYoung product URLs or bare product IDs into Product URLs.
3. Optionally set Max reviews per product, a sort order, and a star rating filter.
4. Click **Start** and watch results land in the dataset in real time.
5. Export results as JSON, CSV, or Excel, or pull them programmatically via the [Apify API](https://docs.apify.com/api/v2).

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

This Actor uses **pay-per-event pricing** — you pay only for results, not for compute time.

| Event | Price per event | Price per 1,000 |
|-------|-----------------|------------------|
| `review-scraped` | from $0.00329 | **$3.29 – $3.99** |

A `review-scraped` event fires once for every unique review saved. Price per 1,000 reviews depends on your Apify plan tier (Free $3.99, Bronze $3.79, Silver $3.59, Gold $3.29). Scraping 1,000 reviews on a Free plan costs about $3.99. Apify's monthly platform usage credits apply to this Actor like any other. The default Residential proxy also draws from your Apify account's own proxy usage/credits, separately from the per-review price above.

#### Is it legal to scrape OliveYoung?

OliveYoung Review Scraper only collects review data that OliveYoung already publishes on public product pages without requiring a login. Scraping publicly available data is generally legal, but you're responsible for how you use the data — check OliveYoung's Terms of Use and read Apify's [guide on the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/) before running large or commercial scrapes.

#### Other review scrapers

- [Coupang Review Scraper](https://apify.com/parsebird/coupang-review-scraper) — reviews from Coupang, Korea's largest general marketplace
- [Naver Place Review Scraper](https://apify.com/parsebird/naver-place-review-scraper) — reviews from Naver Place listings
- [Trustpilot Reviews Scraper](https://apify.com/parsebird/trustpilot-reviews-scraper) — company and product reviews from Trustpilot

#### FAQ

**Do I need an OliveYoung account to use this Actor?**
No. It only reads public review data that OliveYoung serves to logged-out visitors on both storefronts.

**What's the difference between the Global and Korean review data?**
The Global store shows the same underlying Korean reviews, machine-translated to English, but strips reviewer identity fields (nickname, skin type, helpful votes) for privacy. The Korean store exposes the full reviewer profile. If you need reviewer detail, scrape the Korean `goodsNo=A...` URL for the product instead of (or alongside) the Global one.

**Why is `reviewerSkinType` a code like `A01` instead of a readable label?**
That's how the Korean store reports it — it's an internal classification code (skin type, tone, or concern), not a human-readable label. The Global store's own review feed carries no skin-profile data at all, which is why that field is empty for `store: "global"` rows.

**Why did I get fewer reviews than my Max reviews per product setting?**
The product may simply not have that many reviews, or your `starRating` filter narrowed the pool. Set `maxReviewsPerProduct` to `0` to collect everything available for a product.

**Do I need to configure the proxy?**
No — a Residential proxy is set as the default and is required for this Actor to work at all; OliveYoung's review APIs return a bot-detection challenge to Apify's own datacenter IPs. Leave the default Proxy configuration as-is unless you have a specific reason to change it.

**Can I schedule this to run automatically?**
Yes. Use Apify's built-in [Task Scheduler](https://docs.apify.com/platform/schedules) to run it daily, weekly, or at any interval, and connect it to Zapier, Make, or a webhook for downstream integrations.

**Something looks wrong or missing — how do I report it?**
Open an issue on the Actor's **Issues** tab in Apify Console, or use the **API** tab to inspect the exact request/response for your run.

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/oliveyoung-review-scraper/changelog.md

# Actor input Schema

## `productUrls` (type: `array`):

OliveYoung product page links from the Global store (prdtNo=GA...) or the Korean store (goodsNo=A...). You can also paste a bare product ID - GA... IDs are treated as global, A... IDs as Korean, and a plain number as global. Add as many products as you like.

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

Maximum reviews to collect per product. You pay per review, so keep this low for test runs. Set to 0 for all available reviews. No more than 50,000 reviews are collected per product as a safeguard - values above 50,000 are capped at 50,000.

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

Order in which reviews are collected. Decides which reviews a capped run keeps first.

## `starRating` (type: `array`):

Only collect reviews with these star ratings. Leave empty for all ratings.

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

OliveYoung blocks requests from Apify's own IP ranges, so a Residential proxy is required for reliable runs.

## Actor input object example

```json
{
  "productUrls": [
    "https://global.oliveyoung.com/product/detail?prdtNo=GA240824996"
  ],
  "maxReviewsPerProduct": 20,
  "sortBy": "recent",
  "starRating": [],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "KR"
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "productUrls": [
        "https://global.oliveyoung.com/product/detail?prdtNo=GA240824996"
    ],
    "maxReviewsPerProduct": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "KR"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/oliveyoung-review-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 = {
    "productUrls": ["https://global.oliveyoung.com/product/detail?prdtNo=GA240824996"],
    "maxReviewsPerProduct": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "KR",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/oliveyoung-review-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 '{
  "productUrls": [
    "https://global.oliveyoung.com/product/detail?prdtNo=GA240824996"
  ],
  "maxReviewsPerProduct": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "KR"
  }
}' |
apify call parsebird/oliveyoung-review-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/oliveyoung-review-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/KXD05X2gKb7gqHILb/builds/gMg3yVgfHHQendtEO/openapi.json
