# Hwahae Reviews Scraper (`stealth_mode/hwahae-reviews-scraper`) Actor

Scrape verified beauty product reviews from Hwahae.com — Korea's leading cosmetics review platform. Extract ratings, user feedback, images, and metadata filtered by age group and star rating. Perfect for brand monitoring and product research.

- **URL**: https://apify.com/stealth\_mode/hwahae-reviews-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Categories:** Automation, Developer tools, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Hwahae.com Reviews Scraper: Extract K-Beauty Product Reviews

---

### What Is Hwahae.com?

Hwahae (화해) is one of South Korea's most trusted beauty and cosmetics platforms, hosting millions of user-generated product reviews across skincare, makeup, and haircare categories. Its review data is particularly valuable for understanding consumer sentiment in the competitive K-beauty market. Manually collecting this data is impractical at scale — the **Hwahae Reviews Scraper** automates extraction with granular filtering options.

---

### Overview

The **Hwahae.com Reviews Scraper** pulls structured review data for any product on the platform, with support for filtering by age group and star rating. It is built for:

- **Brand managers** monitoring product perception across demographics
- **Market researchers** analyzing K-beauty consumer trends
- **E-commerce teams** benchmarking competitor products
- **Data scientists** building sentiment analysis datasets

---

### Input Format

```json
{
  "product_id": "2078467",
  "age_group": "20",
  "rating": "5",
  "offset": 20,
  "max_items_per_url": 200,
  "ignore_url_failures": true
}
````

| Field | Type | Description |
|---|---|---|
| `product_id` | `string` | Product ID from the Hwahae URL. Example: `/en/products/db/2078467/reviews` → `2078467` |
| `age_group` | `select` | Filter reviews by reviewer age group: `"10"` = 10s, `"20"` = 20s, `"30"` = 30s, `"40"` = 40s+. Leave blank for all ages. |
| `rating` | `select` | Filter by star rating: `"5"` through `"1"`. Leave blank to return all ratings. |
| `offset` | `integer` | Starting position for pagination. Use `0` to start from the first review, or a higher number to resume a previous run. Default: `0`. |
| `max_items_per_url` | `integer` | Maximum reviews to collect per product. Default: `20`. |
| `ignore_url_failures` | `boolean` | If `true`, the scraper continues past errors instead of stopping. Recommended: `true` for bulk runs. |

> **Tip:** To find a product ID, open any Hwahae product review page and extract the numeric segment from the URL: `.../products/db/**2078467**/reviews`.

***

### Output Format

**Sample output**

```json
{
  "id": 10858722,
  "rating": 5,
  "good_text": "Sau khi thoa, tôi cảm thấy da được cấp ẩm sâu sắc và đầy đủ. Nhờ có các hạt vi mô, da tôi vẫn giữ độ ẩm tươi mát cho đến sáng hôm sau mà không bị căng chút nào.\n\nNgay cả khi da tôi đang trong tình trạng nhạy cảm hoặc bị kích ứng, sản phẩm này vẫn không gây cảm giác nóng rát hay gây mụn. Tôi hoàn toàn yên tâm và quyết định sử dụng nó thường xuyên.",
  "bad_text": "Về cơ bản không có điểm yếu nào đáng kể, nhưng nếu phải chỉ ra thì kết cấu sản phẩm hơi nặng một chút. Với những người thích kem dưỡng ẩm nhẹ hơn, có thể ban đầu sẽ cảm thấy hơi dầu hoặc nặng nề.",
  "addition_text": "",
  "blind": 0,
  "created_at": "2026-05-27T01:37:34",
  "modified_at": "2026-05-27T01:37:34",
  "like_count": 0,
  "comment_count": 0,
  "is_liked": false,
  "is_scrapped": false,
  "is_followed": false,
  "user_review_count": 10,
  "is_ggom_event": false,
  "ggom_event_popup_text": null,
  "is_validated": true,
  "validation_popup_text": null,
  "images": [],
  "user": {
    "id": 12101016,
    "nickname": "온하늘isa",
    "image_url": null,
    "gender": "여성",
    "birth_year": 1999,
    "is_active": true,
    "is_admin": false,
    "profile_options": [
      {
        "id": 4,
        "option_key": "skin_type_combination",
        "option_name": "복합성"
      },
      {
        "id": 13,
        "option_key": "skin_concern_atopy",
        "option_name": "아토피"
      },
      {
        "id": 15,
        "option_key": "skin_concern_black_head",
        "option_name": "피지/블랙헤드"
      },
      {
        "id": 18,
        "option_key": "skin_concern_wrinkle",
        "option_name": "주름/탄력"
      },
      {
        "id": 19,
        "option_key": "skin_concern_pore",
        "option_name": "모공"
      },
      {
        "id": 21,
        "option_key": "skin_concern_dead_skin",
        "option_name": "각질"
      }
    ],
    "email_id": "is********"
  },
  "product": {
    "id": 2078467,
    "encrypted_product_id": "21b600c77e682bfcc6ce638b27315bc8",
    "name": "아토베리어365 크림",
    "image_url": "https://img.hwahae.co.kr/products/2078467/2078467_20231121171749.jpg",
    "brand": {
      "id": 711,
      "name": "에스트라",
      "alias": "AESTURA",
      "full_name": "에스트라 (AESTURA)"
    }
  },
  "likes": [],
  "is_recommended": true,
  "view_count": 13,
  "review_type": "SHOPPING",
  "rewrite_badge": "REPURCHASE",
  "is_translated": true,
  "original_product": null,
  "from_url": "https://www.hwahae.com/en/products/db/2078467/reviews"
}
```

Each review record contains up to 28 fields:

#### Review Content

| Field | Meaning |
|---|---|
| `ID` | Unique review identifier |
| `Rating` | Star rating given by the reviewer (1–5) |
| `Good Text` | Reviewer's positive comments about the product |
| `Bad Text` | Reviewer's negative comments or drawbacks |
| `Addition Text` | Any supplementary notes added by the reviewer |
| `Images` | Array of image URLs attached to the review |
| `Review Type` | Category of review (e.g., standard, event-based) |
| `Is Recommended` | Whether the reviewer recommends the product |
| `Is Translated` | Whether the review has been auto-translated |
| `Original Product` | The original product referenced if translation applies |

#### Timestamps

| Field | Meaning |
|---|---|
| `Created At` | When the review was first submitted |
| `Modified At` | Last edit timestamp |

#### Engagement Metrics

| Field | Meaning |
|---|---|
| `Like Count` | Total likes received on the review |
| `Comment Count` | Number of comments on the review |
| `View Count` | How many times the review has been viewed |
| `Is Liked` | Whether the current session user has liked the review |
| `Is Scrapped` | Whether the review has been bookmarked/saved |

#### Reviewer Info

| Field | Meaning |
|---|---|
| `User` | Reviewer profile metadata (username, profile image, etc.) |
| `User Review Count` | Total number of reviews written by this user |
| `Is Followed` | Whether the reviewer is followed by the current user |
| `Likes` | Detailed like metadata |

#### Visibility & Validation

| Field | Meaning |
|---|---|
| `Blind` | Whether the review is hidden/moderated |
| `Is Validated` | Whether the review passed Hwahae's verification process |
| `Validation Popup Text` | Message shown if validation is triggered |
| `Rewrite Badge` | Badge displayed if the reviewer rewrote their review |

#### Event Flags

| Field | Meaning |
|---|---|
| `Is Ggom Event` | Whether the review is part of a Ggom promotional event |
| `Ggom Event Popup Text` | Popup message associated with the Ggom event |

#### Product Reference

| Field | Meaning |
|---|---|
| `Product` | Product metadata linked to this review |

***

### How to Use

1. **Get the product ID** — Open a Hwahae product review page and copy the numeric ID from the URL (e.g., `2078467`).
2. **Set filters** — Choose `age_group` and `rating` to narrow results, or omit them for unfiltered data.
3. **Set pagination** — Use `offset: 0` for a fresh run. To paginate, increment by `max_items_per_url`.
4. **Run and export** — Download results as JSON or CSV.

**Best practices:**

- Use `rating: "1"` combined with `age_group` filters to surface demographic-specific pain points.
- For full review datasets, run multiple times incrementing `offset` by `max_items_per_url`.
- Set `ignore_url_failures: true` to ensure uninterrupted bulk collection.

***

### Use Cases & Business Value

- **Sentiment analysis:** Train NLP models on real K-beauty consumer language using `Good Text` / `Bad Text` fields
- **Demographic insights:** Compare `age_group` segments to understand which age groups respond best to a product
- **Influencer research:** Identify high-engagement reviewers via `Like Count`, `View Count`, and `User Review Count`
- **Competitive intelligence:** Benchmark your product's review profile against competitors

***

### Conclusion

The **Hwahae.com Reviews Scraper** unlocks structured access to one of Asia's richest beauty review datasets. With fine-grained filtering, rich metadata, and 28 output fields per review, it delivers actionable insights for brand strategy, product development, and market research — without manual effort.

# Actor input Schema

## `product_id` (type: `string`):

Enter Product ID. For example, /en/products/db/2078467/reviews -> 2078467

## `age_group` (type: `string`):

Select your option to filter reviews

## `rating` (type: `string`):

Select your option to sort reviews

## `offset` (type: `integer`):

The offset to start from

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "product_id": "2078467",
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# 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 = {
    "product_id": "2078467",
    "offset": 0,
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/hwahae-reviews-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 = {
    "product_id": "2078467",
    "offset": 0,
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("stealth_mode/hwahae-reviews-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 '{
  "product_id": "2078467",
  "offset": 0,
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call stealth_mode/hwahae-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Hwahae Reviews Scraper",
        "description": "Scrape verified beauty product reviews from Hwahae.com — Korea's leading cosmetics review platform. Extract ratings, user feedback, images, and metadata filtered by age group and star rating. Perfect for brand monitoring and product research.",
        "version": "0.0",
        "x-build-id": "tS7hXoNjbi45y7olM"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/stealth_mode~hwahae-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-stealth_mode-hwahae-reviews-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/stealth_mode~hwahae-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-stealth_mode-hwahae-reviews-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/stealth_mode~hwahae-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-stealth_mode-hwahae-reviews-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": {
                    "product_id": {
                        "title": "Product ID (Product ID on hwahae.com product page url, e.g. /en/products/db/2078467/reviews -> 2078467)",
                        "type": "string",
                        "description": "Enter Product ID. For example, /en/products/db/2078467/reviews -> 2078467"
                    },
                    "age_group": {
                        "title": "Filter by age group",
                        "enum": [
                            "10",
                            "20",
                            "30",
                            "40"
                        ],
                        "type": "string",
                        "description": "Select your option to filter reviews"
                    },
                    "rating": {
                        "title": "Sort by",
                        "enum": [
                            "5",
                            "4",
                            "3",
                            "2",
                            "1"
                        ],
                        "type": "string",
                        "description": "Select your option to sort reviews"
                    },
                    "offset": {
                        "title": "Offset",
                        "type": "integer",
                        "description": "The offset to start from"
                    },
                    "ignore_url_failures": {
                        "title": "Continue running even if some URLs fail to be scraped",
                        "type": "boolean",
                        "description": "If true, the scraper will continue running even if some URLs fail to be scraped."
                    },
                    "max_items_per_url": {
                        "title": "Max items per URL",
                        "type": "integer",
                        "description": "The maximum number of items to scrape per URL."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
