# Korea Price Comparison (Danawa) - Naver Shopping Alternative (`koreadata-lab/danawa-price-compare`) Actor

Korea price comparison from Danawa, Korea's #1 price-comparison site: lowest price across shops, shop count, rating, reviews, maker, specs with English keys and price drops between runs. A robots.txt-respecting Naver Shopping alternative.

- **URL**: https://apify.com/koreadata-lab/danawa-price-compare.md
- **Developed by:** [Koreadata Lab](https://apify.com/koreadata-lab) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 product results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/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

## Korea Price Comparison (Danawa) - Lowest Price, Specs, Price Drops | Naver Shopping Alternative

**Korea price comparison** (가격비교) data from **Danawa (다나와)**, Korea's #1 price-comparison site for electronics and appliances. This Danawa scraper returns the **lowest price in Korea** (다나와 최저가) across shops for any product keyword, plus the number of shops, rating, review count, maker and model, **structured specs with English keys**, English category names, and **price changes vs your previous run**. If you were looking for a **Naver Shopping price scraper or Naver Shopping API alternative**: Naver's shopping search API ended on 2026-07-31 and Naver Shopping pages disallow crawling, so Danawa's public search pages are the practical, robots.txt-respecting source for Korean price comparison.

> **Live-tested on Apify: YES (2026-10-29).** 80 product rows with all fields filled from the public search page.

### Why this actor

- **A Naver Shopping alternative for prices:** Korean lowest price, shop count and price history without touching Naver Shopping.
- **Price-comparison data, not a single shop:** `lowestPriceKrw` is the minimum across `shopCount` shops.
- **Specs as data:** Danawa's spec line (e.g. `수조용량: 4.0L / 연속사용: 8시간 / 소비전력: 680W`) is parsed into `specs` (Korean keys) and `specsEn` (`tankCapacity`, `continuousUseTime`, `powerConsumption` and more).
- **Price tracking:** `previousLowestPriceKrw` and `priceChangeKrw` vs the last run. Schedule it daily for a price-drop feed.
- **Respectful:** honors Danawa's robots.txt `Crawl-delay: 10` (1 page every 10 s, single request).

### Input

```json
{ "keywords": ["가습기", "RTX 5070"], "sort": "priceASC", "maxPagesPerKeyword": 2, "priceCompareOnly": true }
```

Sort: `saveDESC` popularity (default), `priceASC`, `priceDESC`, `dateDESC`, `opinionDESC`. Up to 30 keywords and 10 pages (40 products each) per keyword.

### Output

Example (illustrative values), one product on a first run:

```json
{
  "keyword": "가습기", "rank": 1, "productCode": "124298665", "productName": "조지루시 STAN EE-FAH50K",
  "maker": "조지루시", "makerRomanized": "Jojirusi", "brand": null, "modelName": "EE-FAH50K",
  "lowestPriceKrw": 392060, "shopCount": 22, "isPriceComparison": true, "priceNote": null,
  "rating": 4.6, "reviewCount": 37, "wishlistCount": 47904, "registeredMonth": "2026-09",
  "categoriesKo": ["계절가전", "가습기/공기청정기", "가습기"], "categoriesEn": ["Seasonal appliances", "Humidifiers & air purifiers", "Humidifier"],
  "specsKo": ["가습기", "가열식", "자동세척", "[가습]", "수조용량: 4.0L", "연속사용: 8시간", "[규격]", "소비전력: 680W"],
  "specs": {"수조용량": "4.0L", "연속사용": "8시간", "소비전력": "680W"},
  "specsEn": {"tankCapacity": "4.0L", "continuousUseTime": "8시간", "powerConsumption": "680W"},
  "previousLowestPriceKrw": null, "priceChangeKrw": null,
  "url": "https://prod.danawa.com/info/?pcode=124298665",
  "imageUrl": "https://img.danuri.io/catalog-image/665/298/124/a.jpeg", "fetchedAt": "2026-10-29T06:00:00.000Z"
}
```

On later runs with `trackHistory` on, `previousLowestPriceKrw` holds the last run's price and `priceChangeKrw` the difference (negative = price drop). `priceNote` is set when Danawa shows a non-standard price type, such as `출시가` (launch price).

### Pages used

- `https://search.danawa.com/?query=...&page=...&sort=...`: the public search page (allowed by robots.txt). Data is read from the Next.js server-component payload embedded in the HTML, with the schema.org ItemList as a fallback (names and URLs only).

### Limitations

- 40 products per page, and slow by design (10 s per page because of the robots crawl-delay).
- No per-shop offer list and no reviews (the product detail page is out of scope for v0.1).
- Adult-only products are skipped.
- Spec values are kept in Korean. Only the keys are translated, from a static map.
- This is an unofficial integration and may break if Danawa changes its site. The run warns when the fallback parser was used.

### API keys

None. This actor reads public pages only, takes no credentials and stores none.

### Pricing (pay per event)

- `product-result`: **$3.00 per 1,000 product results** (includes English spec keys and price change vs your previous run).
- Actor start: Apify's synthetic `apify-actor-start` event, a fraction of a cent per run.
- **Platform usage is included.** You pay only the event prices above; the Apify compute of the run is not billed to you separately.
- Set **Max total charge** for a run to cap spend; the actor stops early when it is reached.

### FAQ

**Do I need an API key or a Danawa account?**
No. The actor reads Danawa's public search pages, with no login and no key.

**How fresh is the data?**
Each run loads the search pages live, so prices are Danawa's lowest prices at the moment of the run. Nothing is cached except the last price per product, which is used for `priceChangeKrw`.

**Can I schedule it daily?**
Yes, and that is the main use: with an Apify Schedule and `trackHistory` on, every run reports price changes since the previous run, which gives you a daily Korean price-drop feed.

**What does a typical run cost?**
One page of 40 products costs about $0.12. 100 product results cost about $0.30. The example input above (2 keywords, 2 pages each, up to 160 products) costs at most about $0.48.

**Is this legal, and where does the data come from?**
The data comes from Danawa's public search pages, which robots.txt allows, fetched at the crawl-delay Danawa asks for. No login, no personal data. It is not affiliated with Danawa or Naver; you are responsible for how you use the results.

# Actor input Schema

## `keywords` (type: `array`):

Product keywords (Korean or model numbers), e.g. 가습기, RTX 5070, 갤럭시 S26. Max 30.

## `sort` (type: `string`):

Danawa sort order.

## `maxPagesPerKeyword` (type: `integer`):

40 products per page. Danawa's robots.txt asks for a 10-second crawl delay, so each page takes ~10 s.

## `priceCompareOnly` (type: `boolean`):

Skip single-shop listings and keep products compared across multiple shops.

## `trackHistory` (type: `boolean`):

Save lowest prices in a named key-value store and output the change vs your previous run.

## `historyStoreName` (type: `string`):

Named key-value store for price history.

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

Optional. Usually not needed at this request rate.

## Actor input object example

```json
{
  "keywords": [
    "가습기",
    "로봇청소기"
  ],
  "sort": "saveDESC",
  "maxPagesPerKeyword": 1,
  "priceCompareOnly": true,
  "trackHistory": true,
  "historyStoreName": "danawa-price-history",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All result rows in the default dataset.

# 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 = {
    "keywords": [
        "가습기",
        "로봇청소기"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("koreadata-lab/danawa-price-compare").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 = { "keywords": [
        "가습기",
        "로봇청소기",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("koreadata-lab/danawa-price-compare").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 '{
  "keywords": [
    "가습기",
    "로봇청소기"
  ]
}' |
apify call koreadata-lab/danawa-price-compare --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,koreadata-lab/danawa-price-compare"
        }
    }
}
```

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/G5w0rYlAyXdJQOC09/builds/yWnj0B5FzcVDcVxyZ/openapi.json
