# Naver DataLab Shopping Insight Scraper (`frank_conifer_af4/naver-shopping-insight`) Actor

Get the top 500 popular Naver Shopping search keywords per category from Naver DataLab Shopping Insight, filtered by device, gender and age, with optional click trends, audience breakdowns and rank changes.

- **URL**: https://apify.com/frank_conifer_af4/naver-shopping-insight.md
- **Developed by:** [Juddroid](https://apify.com/frank_conifer_af4) (community)
- **Categories:** E-commerce, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 keyword rank rows

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

## Naver DataLab Shopping Insight Scraper

Export the top 500 popular Naver Shopping search keywords for any shopping category, filtered by device, gender and age, plus click trends and audience splits from Naver DataLab Shopping Insight (쇼핑인사이트).

### What does Naver Shopping Insight Scraper do?

Naver DataLab Shopping Insight is Korea's closest equivalent to Google Trends for e-commerce. For every Naver Shopping category it shows which search keywords led to the most clicks over a period, and how category interest moved over time. The web page only lets you page through 20 keywords at a time for one category and one filter combination. This Actor collects the same public statistics in bulk. It returns one clean row per category and keyword, plus optional click trend series and device, gender and age breakdowns, ready for spreadsheets, BI tools or AI agents.

### Why use it

- **Up to 500 keywords per category in one run.** The Actor pages through the full DataLab top 500 for you. On the website you page through it 20 at a time.
- **Category names work, not only IDs.** Type `패션의류`, `스킨케어` or `화장품/미용 > 스킨케어 > 크림`. Typos return a clear error with suggestions such as `화장품/미용 > 스킨케어 (50000190)`, and you are not charged for them.
- **Same filters as DataLab.** Device (PC or mobile), gender and age groups (10s to 60+), and any date range from 2017-08-01 up to yesterday.
- **Rank changes the website does not show.** Turn on `compareWithPreviousPeriod` to get `previousRank`, `rankChange` and `rankTrend` (up, down, same, new) for each keyword against the previous period of the same length.
- **Trend rows built for analysis.** Each trend row has the full `[{period, ratio}]` series, the peak, the average, partial-period flags, and device, gender and age shares.
- **Free category browser.** List the category tree with IDs before you run paid jobs.
- **Polite and reliable.** Requests are rate-limited, and 429/5xx responses are retried with exponential backoff. No login and no browser are needed, so runs are fast and cheap.

### What data you get

**Keyword ranking rows** (`type: "keywordRank"`), one per category and keyword:

| Field | Example | Description |
|---|---|---|
| `rank` | `1` | Popularity rank in the category for the period (1 to 500) |
| `keyword` | `ahc아이크림` | Search keyword exactly as DataLab shows it |
| `categoryId` | `50000190` | Naver Shopping category ID |
| `categoryName` / `categoryPath` | `스킨케어` / `화장품/미용 > 스킨케어` | Category name and full path |
| `categoryLevel` | `2` | Depth in the category tree (1 = top level) |
| `startDate` / `endDate` | `2026-09-16` / `2026-10-15` | Period actually queried |
| `periodPreset` | `last30days` | Preset used, or `custom` |
| `device` / `gender` / `ages` | `mo` / `f` / `20,30` | Filters used (`all` when not filtered) |
| `previousRank` / `rankChange` / `rankTrend` | `5` / `3` / `up` | Only with `compareWithPreviousPeriod`. `rankChange` > 0 means the keyword climbed. `new` means it was not in the previous top N. |
| `previousPeriod` | `2026-10-02..2026-10-08` | The comparison period |
| `naverShoppingUrl` | link | Naver Shopping search results for the keyword |
| `datalabKeywordUrl` | link | DataLab keyword page for the keyword in this category |
| `collectedAt` | ISO timestamp | When the run collected the data |

**Trend rows** (`type: "categoryTrend"`), one per category when `includeTrend` is on: `series` (`[{period, ratio, isPartial}]`), `points`, `peakPeriod`, `peakRatio`, `averageRatio`, `deviceBreakdown`, `genderBreakdown`, `ageBreakdown` (each `[{code, label, ratio, sharePct}]`), plus the same category and filter fields.

**Category rows** (`type: "category"`, browser mode only): `categoryId`, `categoryName`, `categoryPath`, `categoryLevel`, `isLeaf`, `parentId`.

**Error rows** (`type: "error"`): `input`, `error`, `suggestions`. They are never charged.

### How to use

1. Click **Try for free** and open the **Input** tab.
2. Add one or more categories. Use IDs, names such as `패션의류` or `스킨케어`, or paths such as `화장품/미용 > 스킨케어 > 크림`. Not sure which ones exist? Turn on **List categories**, run once for free, and copy the IDs.
3. Choose a period preset (last 7, 30 or 90 days, or last year), or set a custom start and end date.
4. Optionally set the device, gender and age filters, the number of keywords per category, the previous-period comparison and the click trend.
5. Click **Start**. Download the results as JSON, CSV or Excel, or read them through the API.

```json
{
  "categories": ["패션의류", "화장품/미용 > 스킨케어", "50000167"],
  "period": "last30days",
  "device": "mo",
  "gender": "f",
  "ages": ["20", "30"],
  "maxRank": 100,
  "compareWithPreviousPeriod": true,
  "includeTrend": true,
  "timeUnit": "week"
}
```

To browse the category tree for free:

```json
{ "listCategories": true, "categories": ["화장품/미용"], "listDepth": 2 }
```

### Output example

Keyword row (taken from a real run and trimmed):

```json
{
  "type": "keywordRank",
  "status": "ok",
  "rank": 2,
  "keyword": "트위드자켓",
  "categoryId": 50000000,
  "categoryName": "패션의류",
  "categoryPath": "패션의류",
  "categoryLevel": 1,
  "startDate": "2026-10-09",
  "endDate": "2026-10-15",
  "periodPreset": "last7days",
  "timeUnit": "date",
  "device": "all",
  "gender": "all",
  "ages": "all",
  "previousRank": 5,
  "rankChange": 3,
  "rankTrend": "up",
  "previousPeriod": "2026-10-02..2026-10-08",
  "naverShoppingUrl": "https://search.shopping.naver.com/search/all?query=%ED%8A%B8%EC%9C%84%EB%93%9C%EC%9E%90%EC%BC%93",
  "collectedAt": "2026-10-16T08:23:46.852Z"
}
```

Trend row (series and age split trimmed):

```json
{
  "type": "categoryTrend",
  "status": "ok",
  "categoryId": 50000190,
  "categoryPath": "화장품/미용 > 스킨케어",
  "startDate": "2026-07-18",
  "endDate": "2026-10-15",
  "timeUnit": "week",
  "points": 14,
  "peakPeriod": "2026-09-07",
  "peakRatio": 100,
  "averageRatio": 87.3,
  "series": [
    { "period": "2026-07-13", "ratio": 83.119, "isPartial": true },
    { "period": "2026-07-20", "ratio": 88.303, "isPartial": false },
    { "period": "2026-10-05", "ratio": 97.043, "isPartial": false },
    { "period": "2026-10-12", "ratio": 54.474, "isPartial": true }
  ],
  "deviceBreakdown": [
    { "code": "mo", "label": "모바일", "ratio": 100, "sharePct": 87.6 },
    { "code": "pc", "label": "PC", "ratio": 14.14, "sharePct": 12.4 }
  ],
  "genderBreakdown": [
    { "code": "f", "label": "여성", "ratio": 100, "sharePct": 80.5 },
    { "code": "m", "label": "남성", "ratio": 24.22, "sharePct": 19.5 }
  ],
  "ageBreakdown": [
    { "code": "40", "label": "40대", "ratio": 100, "sharePct": 32.4 },
    { "code": "50", "label": "50대", "ratio": 99.53, "sharePct": 32.3 }
  ]
}
```

### Pricing

This Actor uses pay-per-event pricing:

| Event | Price | When it is charged |
|---|---|---|
| `keyword-rank-row` | **$0.003 per keyword row** ($3 per 1,000) | Once for each keyword row in your dataset |
| `trend-series` | **$0.01 per trend series** | Once for each category trend row (the device, gender and age breakdown is included) |

Worked examples:

- The prefilled run (1 category, top 20 keywords) costs 20 × $0.003 = **$0.06**.
- 10 categories × top 100 keywords = 1,000 rows = **$3.00**.
- 5 categories × the full top 500, with a click trend for each = 2,500 × $0.003 + 5 × $0.01 = **$7.55**.
- A weekly schedule for 3 categories × top 100 with trends costs $0.93 per run, about **$4 per month**.

**Not charged:** error rows (unknown category names or IDs, failed requests), empty results, the category browser (`listCategories`), the previous-period comparison requests, the audience breakdown requests, and retries. You can set a maximum cost per run in the run options. The Actor stops cleanly when it reaches that limit.

### Integrations and scheduling

- **Schedules:** run the Actor daily or weekly to track rising keywords. Use `compareWithPreviousPeriod` to see movement without storing past runs.
- **Webhooks:** trigger your pipeline (Slack alert, Google Sheets import, data warehouse load) when a run finishes.
- **API and SDKs:** start runs and download datasets from any language with the Apify API, or the JavaScript and Python clients.
- **MCP and AI agents:** expose the Actor to AI agents through the Apify MCP server, so an assistant can answer questions like "what are women in their 30s searching for in 스킨케어 this month?"
- **Integrations:** connect to Make, Zapier, n8n, Google Sheets, Airbyte and more from the Integrations tab.

### FAQ and limitations

**Are the ratios search volumes?** No. As on DataLab, every `ratio` is a relative index. In each series the highest point for the chosen category, period and filters is 100, and the other points are scaled against it. Device, gender and age ratios are also relative to the largest group, and `sharePct` converts them into percentages of the total. You can compare shapes and shares, but you cannot convert them into absolute click or search counts. Two separately requested series are each scaled to their own peak.

**What date ranges are supported?** DataLab Shopping Insight has data from **2017-08-01** to **yesterday** (Korea time), with at most **1 year** per query. End dates after yesterday are moved back to yesterday. Ranges longer than one year are rejected with a clear message, so split them into several runs. Rankings always cover the whole period, and `timeUnit` only sets the trend granularity. With weekly or monthly trends, the first and last buckets can cover only part of a week or month. Those buckets are flagged with `isPartial: true` and usually look lower.

**How many keywords can I get?** Up to 500 per category, the same top 500 that DataLab offers. Narrow filter combinations or small categories can return fewer.

**How do category names resolve?** Top-level and second-level names work on their own (`패션의류`, `스킨케어`). Deeper categories need a path with `>` (`화장품/미용 > 스킨케어 > 크림`) or an ID. Matching ignores spaces and slashes. If a name is ambiguous or unknown, you get an error row with suggestions, and you are not charged.

**Is this the Naver Shopping product ranking?** No. Naver states that DataLab statistics are separate from the Naver Shopping product ranking. This Actor reports search keyword popularity, not product positions.

**Translation?** Keywords are returned in Korean exactly as DataLab shows them. No romanization or translation is added.

**Responsible use.** The Actor reads public, aggregated statistics that Naver DataLab publishes without login. It collects no personal data, accounts or user-level information. It uses a conservative default rate limit (2 requests per second, adjustable from 1 to 4). Use the data in line with Naver's terms of service and your local laws, and cite Naver DataLab as the source when you publish it.

### 한국어 안내

네이버 데이터랩 쇼핑인사이트(분야 통계)의 **분야별 인기 검색어 TOP 500**, **클릭량 추이**, **기기·성별·연령 비중**을 한 번에 수집합니다. 카테고리는 ID 외에 `패션의류`, `스킨케어`, `화장품/미용 > 스킨케어 > 크림`처럼 이름이나 경로로 입력해도 됩니다. 기기(PC/모바일), 성별, 연령(10대~60대 이상) 필터와 기간(2017-08-01부터 어제까지, 1회 최대 1년)도 웹과 동일하게 지정할 수 있습니다. `compareWithPreviousPeriod`를 켜면 직전 같은 길이의 기간과 비교한 순위 변동(상승/하락/유지/신규)도 함께 나옵니다.

- **셀러:** 내 카테고리에서 지금 뜨는 검색어를 매주 받아 상품명·태그·키워드 광고에 반영할 수 있습니다. 순위 변동으로 막 오르기 시작한 키워드를 먼저 잡고, 시즌 시작 시점은 클릭 추이로 확인합니다.
- **브랜드:** 우리 브랜드명이나 경쟁 브랜드명이 카테고리 TOP 500의 몇 위에 있는지 추적합니다. 20·30대 여성처럼 타깃 세그먼트별 순위를 비교해 신제품 기획과 포지셔닝에 활용할 수 있습니다.
- **마케터:** 카테고리 클릭 추이와 기기·성별·연령 비중으로 캠페인 시점과 타깃을 정합니다. 스케줄 실행 결과를 Google Sheets나 BI 대시보드에 자동으로 연결할 수 있습니다.

참고: 모든 수치는 데이터랩과 같은 **상대 지수**(기간 내 최댓값 = 100)이며 절대 검색량이 아닙니다. 공개된 집계 통계만 수집하며 개인정보는 다루지 않습니다. 가격은 키워드 행당 $0.003, 추이 시리즈당 $0.01이며, 오류 행·빈 결과·카테고리 목록 조회는 과금되지 않습니다.

# Actor input Schema

## `categories` (type: `array`):

One category per line. Use a category ID (e.g. 50000000), a top-level or second-level name (e.g. 패션의류, 스킨케어), or a path separated by > (e.g. 화장품/미용 > 스킨케어 > 크림). Unknown names return an error row with suggestions and are not charged. Leave empty with 'List categories' on to browse the top level.

## `period` (type: `string`):

Preset date range ending yesterday (Korea time). Ignored when you set Start date and End date.

## `startDate` (type: `string`):

Custom range start (YYYY-MM-DD). Overrides Period when set together with End date. DataLab has data from 2017-08-01 and allows at most 1 year per query.

## `endDate` (type: `string`):

Custom range end (YYYY-MM-DD). Dates after yesterday are moved back to yesterday, because DataLab publishes data with a one-day delay.

## `timeUnit` (type: `string`):

Granularity of the click trend series (daily, weekly or monthly). Keyword rankings always cover the whole period.

## `device` (type: `string`):

Only count searches from this device type.

## `gender` (type: `string`):

Only count searches from this gender.

## `ages` (type: `array`):

Only count searches from these age groups. Leave empty for all ages.

## `maxRank` (type: `integer`):

How many top keywords to return per category (DataLab shows up to 500). Each keyword row is one charged event, so this sets the cost. Set 0 to skip rankings and collect trends only.

## `compareWithPreviousPeriod` (type: `boolean`):

Also fetch the rankings for the equally long period just before your range and add previousRank, rankChange and rankTrend (up, down, same, new) to every keyword row. Doubles the number of requests but not the price.

## `includeTrend` (type: `boolean`):

Add one row per category with the DataLab click trend series \[{period, ratio}] for the period and filters. Charged as one trend-series event per category.

## `includeAudienceBreakdown` (type: `boolean`):

When the click trend is on, also add device, gender and age shares for the category (3 extra requests per category, no extra charge).

## `listCategories` (type: `boolean`):

Instead of rankings, output the subcategories of each entry in Shopping categories (or the top level if empty) with their IDs and paths. Free of charge.

## `listDepth` (type: `integer`):

How many levels below each parent to list in category browser mode (1 or 2).

## `maxConcurrency` (type: `integer`):

How many categories are processed at the same time. All requests still share the rate limit below.

## `maxRequestsPerSecond` (type: `integer`):

Polite rate limit for DataLab requests across the whole run. A full 500-keyword ranking needs 25 requests per category. Failed requests (429 or 5xx) are retried with exponential backoff.

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

Optional. DataLab works without a proxy; enable one if your runs get rate limited.

## Actor input object example

```json
{
  "categories": [
    "패션의류"
  ],
  "period": "last30days",
  "timeUnit": "date",
  "device": "all",
  "gender": "all",
  "ages": [],
  "maxRank": 20,
  "compareWithPreviousPeriod": false,
  "includeTrend": false,
  "includeAudienceBreakdown": true,
  "listCategories": false,
  "listDepth": 1,
  "maxConcurrency": 2,
  "maxRequestsPerSecond": 2,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `trends` (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 = {
    "categories": [
        "패션의류"
    ],
    "period": "last30days",
    "maxRank": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("frank_conifer_af4/naver-shopping-insight").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 = {
    "categories": ["패션의류"],
    "period": "last30days",
    "maxRank": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("frank_conifer_af4/naver-shopping-insight").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 '{
  "categories": [
    "패션의류"
  ],
  "period": "last30days",
  "maxRank": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call frank_conifer_af4/naver-shopping-insight --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,frank_conifer_af4/naver-shopping-insight"
        }
    }
}
```

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/6WMaK26KfZkHybEC3/builds/VPGqtJPqpM3HbIc5D/openapi.json
