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

Scrape Hwahae ratings, review counts, rankings, prices, brands, discounts, and Korean beauty product URLs from public search pages.

- **URL**: https://apify.com/automation-lab/hwahae-reviews-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** E-commerce
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.02 / 1,000 review signal records

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 Reviews Scraper

Scrape Hwahae Korean beauty product review signals without logging in. This actor collects product and goods records from public Hwahae search and ranking pages, including ratings, review counts, brand names, prices, discounts, badges, and URLs.

### What does Hwahae Reviews Scraper do?

Hwahae Reviews Scraper turns public Hwahae discovery pages into structured datasets for Korean beauty research.

It helps you monitor:

- ⭐ product ratings
- 💬 review counts
- 🧴 product and goods names
- 🏷️ brands and discounts
- 📈 ranking/search context
- 🖼️ images and public URLs

The actor focuses on reliable public search and ranking data. Hwahae product detail pages can show an AWS WAF challenge to direct HTTP clients, so the MVP avoids fragile detail-page review text and extracts stable review-summary signals instead.

### Who is it for?

#### Cosmetics brands

Track how your products and competing products appear in Hwahae search results.

#### Ecommerce category analysts

Compare review volumes, ratings, prices, and discounts across Korean beauty categories.

#### Agencies and market researchers

Build repeatable Korean beauty monitoring workflows for clients.

#### Retail and merchandising teams

Spot high-review products, fast-moving goods, and promotional price signals.

### Why use this actor?

Manual Hwahae research is slow when you need many keywords or category checks.

This actor gives you:

- ✅ structured product and goods rows
- ✅ Korean brand and product names
- ✅ review count and rating metrics
- ✅ prices, discounts, and sold-out flags
- ✅ repeatable runs for monitoring
- ✅ dataset export to JSON, CSV, Excel, and API

### What data can you extract?

| Field | Description |
|---|---|
| `searchKeyword` | Keyword used for a search run |
| `sourceUrl` | API or page URL used as source |
| `itemType` | `goods`, `product`, or `ranking_product` |
| `productId` | Hwahae product identifier when available |
| `goodsId` | Hwahae commerce goods identifier when available |
| `brandName` | Public brand name |
| `productName` | Product name |
| `goodsName` | Commerce goods listing name |
| `rating` | Average rating shown by Hwahae |
| `reviewCount` | Public review count |
| `price` | Current/discount price when available |
| `originalPrice` | Original price when available |
| `discountRate` | Discount percentage |
| `imageUrl` | Product or goods image |
| `rank` | Ranking/search rank when available |
| `badges` | Hwahae commerce badges |
| `isSoldOut` | Sold-out flag when available |
| `scrapedAt` | ISO timestamp |

### How much does it cost to scrape Hwahae review data?

This actor uses pay-per-event pricing.

- A small start event is charged once per run.
- A per-item event is charged for each saved record.
- You control spend with `maxItems`.

For first tests, keep `maxItems` around 50.

### Quick start

1. Open the actor on Apify.
2. Enter one or more Korean search keywords.
3. Optionally add Hwahae search or ranking URLs.
4. Set `maxItems`.
5. Run the actor.
6. Export the dataset.

### Input options

#### Search keywords

Use Korean beauty terms, brands, or product names.

Examples:

- `토리든`
- `선크림`
- `수분크림`
- `클렌징오일`

#### Start URLs

Use public Hwahae pages such as:

- `https://www.hwahae.co.kr/search?q=%ED%86%A0%EB%A6%AC%EB%93%A0`
- `https://www.hwahae.co.kr/rankings?english_name=category&theme_id=2`

#### Maximum records

`maxItems` limits saved records across all keywords and URLs.

### Example input

```json
{
  "searchKeywords": ["토리든", "선크림"],
  "startUrls": [
    { "url": "https://www.hwahae.co.kr/rankings?english_name=category&theme_id=2" }
  ],
  "maxItems": 100
}
````

### Example output

```json
{
  "searchKeyword": "토리든",
  "sourceUrl": "https://gateway.hwahae.co.kr/v14/commerce/search/goods?...",
  "itemType": "goods",
  "goodsId": 54413,
  "goodsUrl": "https://www.hwahae.co.kr/goods/.../54413?goods_tab=review_ingredients",
  "brandName": "토리든",
  "goodsName": "[only화해] 다이브인 저분자 히알루론산 세럼 100ml",
  "rating": 4.61,
  "reviewCount": 83328,
  "price": 27900,
  "discountRate": 36,
  "scrapedAt": "2026-07-01T00:00:00.000Z"
}
```

### Tips for better results

- Use Korean keywords for best recall.
- Combine brand and category terms.
- Use ranking URLs when you want category/trending context.
- Increase `maxItems` only after a small test run succeeds.
- Deduplicate downstream on `goodsId` or `productId`.

### Limitations

Hwahae product detail pages can trigger AWS WAF challenges for direct scrapers.

This actor intentionally extracts public search/ranking review signals instead of forcing fragile detail-page review text collection.

### Integrations

Use the output with:

- Google Sheets for category monitoring
- BigQuery or Snowflake for trend analysis
- BI dashboards for Korean beauty reporting
- Alerts when review counts or ranks change
- Brand intelligence workflows

### API usage with Node.js

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/hwahae-reviews-scraper').call({
  searchKeywords: ['토리든', '선크림'],
  maxItems: 100,
});
console.log(run.defaultDatasetId);
```

### API usage with Python

```python
from apify_client import ApifyClient

client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('automation-lab/hwahae-reviews-scraper').call(run_input={
    'searchKeywords': ['토리든', '선크림'],
    'maxItems': 100,
})
print(run['defaultDatasetId'])
```

### API usage with cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/automation-lab~hwahae-reviews-scraper/runs?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"searchKeywords":["토리든","선크림"],"maxItems":100}'
```

### MCP usage

Use this actor from Apify MCP:

`https://mcp.apify.com/?tools=automation-lab/hwahae-reviews-scraper`

Add it in Claude Code:

```bash
claude mcp add apify-hwahae --url "https://mcp.apify.com/?tools=automation-lab/hwahae-reviews-scraper"
```

Or configure an MCP client with JSON:

```json
{
  "mcpServers": {
    "apify-hwahae": {
      "url": "https://mcp.apify.com/?tools=automation-lab/hwahae-reviews-scraper"
    }
  }
}
```

Example prompts:

- "Run Hwahae Reviews Scraper for 토리든 and summarize top products by review count."
- "Compare 선크림 products by rating and discount rate."
- "Export Hwahae category ranking data to a CSV."

### Data quality notes

The actor uses public Hwahae API/page data and keeps raw identifiers where available.

Ratings and review counts are point-in-time values from Hwahae.

### FAQ

#### Why do product detail pages not return full review text?

Hwahae detail pages may require a browser WAF token. This actor avoids that fragile path and uses public search/ranking data.

#### Why do I see fewer rows than expected?

The keyword may have fewer public goods results than `maxItems`. Add more keywords or ranking URLs.

### Legality

Only scrape publicly available data and respect Hwahae's terms, privacy rules, and applicable laws.

Do not use the output for spam, harassment, or unauthorized profiling.

### Related scrapers

Explore other automation-lab actors for ecommerce and market intelligence workflows:

- https://apify.com/automation-lab/google-shopping-scraper
- https://apify.com/automation-lab/amazon-products-scraper
- https://apify.com/automation-lab/product-review-scraper

### Version notes

#### 0.1

Initial release focused on public Hwahae search/ranking review signals.

### Field mapping details

Search API rows are emitted as `goods` items.

Search page embedded product rows are emitted as `product` items.

Ranking embedded rows are emitted as `ranking_product` items.

### Monitoring workflow

Run the same keywords daily or weekly.

Compare `reviewCount`, `rating`, `price`, and `rank` over time.

Alert when competitors gain review volume quickly.

### Category workflow

Use broad category keywords such as `선크림`, `토너`, or `클렌징폼`.

Sort by `reviewCount` to identify established winners.

Sort by `discountRate` to spot aggressive promotions.

### Brand workflow

Use brand keywords such as `토리든`.

Review which goods listings dominate search results.

Compare official goods, bundles, and promotions.

### Export formats

Apify datasets can be exported as:

- JSON
- CSV
- Excel
- XML
- RSS
- API responses

### Support

If a public Hwahae page changes or a keyword returns unexpected data, open an issue with the run input and run URL.

# Actor input Schema

## `searchKeywords` (type: `array`):

Korean beauty, brand, product, or category keywords to search on Hwahae.

## `startUrls` (type: `array`):

Optional Hwahae search or ranking URLs. Product/goods detail pages can be protected by AWS WAF, so search/ranking pages are most reliable.

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

Maximum product/goods review summary records to save.

## Actor input object example

```json
{
  "searchKeywords": [
    "토리든",
    "선크림"
  ],
  "startUrls": [
    {
      "url": "https://www.hwahae.co.kr/search?q=%ED%86%A0%EB%A6%AC%EB%93%A0"
    },
    {
      "url": "https://www.hwahae.co.kr/rankings?english_name=category&theme_id=2"
    }
  ],
  "maxItems": 20
}
```

# Actor output Schema

## `overview` (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 = {
    "searchKeywords": [
        "토리든",
        "선크림"
    ],
    "startUrls": [
        {
            "url": "https://www.hwahae.co.kr/search?q=%ED%86%A0%EB%A6%AC%EB%93%A0"
        },
        {
            "url": "https://www.hwahae.co.kr/rankings?english_name=category&theme_id=2"
        }
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/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 = {
    "searchKeywords": [
        "토리든",
        "선크림",
    ],
    "startUrls": [
        { "url": "https://www.hwahae.co.kr/search?q=%ED%86%A0%EB%A6%AC%EB%93%A0" },
        { "url": "https://www.hwahae.co.kr/rankings?english_name=category&theme_id=2" },
    ],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/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 '{
  "searchKeywords": [
    "토리든",
    "선크림"
  ],
  "startUrls": [
    {
      "url": "https://www.hwahae.co.kr/search?q=%ED%86%A0%EB%A6%AC%EB%93%A0"
    },
    {
      "url": "https://www.hwahae.co.kr/rankings?english_name=category&theme_id=2"
    }
  ],
  "maxItems": 20
}' |
apify call automation-lab/hwahae-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Hwahae Reviews Scraper",
        "description": "Scrape Hwahae ratings, review counts, rankings, prices, brands, discounts, and Korean beauty product URLs from public search pages.",
        "version": "0.1",
        "x-build-id": "f0tE9casiA69MdxyM"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/automation-lab~hwahae-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-automation-lab-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/automation-lab~hwahae-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-automation-lab-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/automation-lab~hwahae-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-automation-lab-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": {
                    "searchKeywords": {
                        "title": "Search keywords",
                        "type": "array",
                        "description": "Korean beauty, brand, product, or category keywords to search on Hwahae.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "Hwahae start URLs",
                        "type": "array",
                        "description": "Optional Hwahae search or ranking URLs. Product/goods detail pages can be protected by AWS WAF, so search/ranking pages are most reliable.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxItems": {
                        "title": "Maximum records",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum product/goods review summary records to save.",
                        "default": 20
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
