# Shilla Duty Free Ranking Scraper — Korea Duty-Free Top 100 (`kdatafactory/shilladfs-scraper`) Actor

Scrape The Shilla Duty Free (신라면세점) Top-100 best-seller rankings across 11 categories: rank, brand, product, USD list price, discount rate, discounted price, the mileage-applied price and derived KRW. Built on Shilla's own ranking API. For daily duty-free price tracking.

- **URL**: https://apify.com/kdatafactory/shilladfs-scraper.md
- **Developed by:** [Seok June Park](https://apify.com/kdatafactory) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.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.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Shilla Duty Free Ranking Scraper — Korea Duty-Free Top 100

Scrape **The Shilla Duty Free (신라면세점)** — one of Korea's two dominant duty-free retailers — and get its **Top-100 best-seller ranking for 11 categories** as clean JSON/CSV: rank, brand, product, USD list price, discount rate, discounted price, **the mileage-applied price**, a derived KRW figure, rating and review count.

Built on the same ranking API the shilladfs.com storefront itself calls, so the numbers match what a shopper sees on the board.

> **Why duty-free data?** Duty-free boards are where Korean beauty, liquor and luxury demand from international shoppers shows first — and prices swing with promotions daily. Track the Top 100 every day and you see both the demand ranking and the real discounted price curve.

### What you get

One row per ranked product:

| Field | Meaning |
|---|---|
| `ranking_category`, `rank` | Which board, and the product's position (1–100) |
| `name`, `brand`, `brand_en` | Product and brand (Korean + English) |
| `price_usd` | List price before discounts |
| `sale_price_usd`, `discount_rate` | The discounted price shown on the card |
| `mileage_price_usd`, `mileage_discount_rate` | Price after Shilla's mileage (S.Point) discount — **the lowest figure the site quotes without a login** |
| `price_krw`, `sale_price_krw`, `mileage_price_krw`, `usd_krw_rate` | KRW figures derived from the exchange rate the storefront itself posts |
| `rating`, `review_count` | Review score (5-point scale) and count |
| `has_coupon`, `is_sold_out`, `is_ad` | Flags |
| `product_category`, `url`, `image_url`, `scraped_at` | Shilla's own category tag, product link, image, KST timestamp |

#### What is deliberately NOT here

The final amount on Shilla's checkout (주문서) page also applies the **shopper's own coupons and point balance**. Those are per-account values behind a login — no fixed "final price" exists on the site. This actor collects public data only: no login, no cart, no member or passport data.

### Categories

스킨케어(skincare) · 메이크업(makeup) · 향수/바디/헤어(fragrance) · 가방/신발/잡화(bags) · 시계/쥬얼리(watches) · 의류/아이웨어(fashion) · 디지털/리빙(digital) · 식품(food) · 스포츠/레저(sports) · 유아동(kids) · 남성관(men)

Leave `categories` empty to scrape all 11 boards (1,100 rows). The site's 전체 (overall) and 주류 (liquor) tabs are served differently and are not yet covered — they are excluded rather than approximated.

### Input example

```json
{
  "categories": ["스킨케어", "식품"],
  "rankingType": "topSelling",
  "maxItemsPerCategory": 100
}
```

`rankingType` also accepts `wish` (most wish-listed) and `review` (most reviewed).

### Output example (real row)

```json
{
  "source": "shilladfs",
  "ranking_category": "스킨케어",
  "rank": 1,
  "name": "Advanced Night Repair 어드밴스드 나이트 리페어 싱크로나이즈드 멀티-리커버리 콤플렉스 듀오 100ml",
  "brand": "에스티 로더",
  "brand_en": "ESTEE LAUDER",
  "price_usd": 358,
  "sale_price_usd": 193.32,
  "discount_rate": 46,
  "mileage_price_usd": 193.32,
  "price_krw": 505138,
  "usd_krw_rate": 1411,
  "rating": 4.82,
  "review_count": 279,
  "url": "https://www.shilladfs.com/estore/kr/ko/product/4721725"
}
```

### Honest notes

- If a requested board returns nothing, the run **warns loudly** and records it in an `EMPTY_CATEGORIES` key-value record instead of exiting quietly.
- KRW columns are derived from the USD price using the rate the storefront posts in its own header that day — the same arithmetic the site uses for its 원 figures.
- No proxy needed for normal use; the board is served to ordinary IPs.

# Actor input Schema

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

Which Top-100 boards to scrape. Leave empty to scrape ALL of them. Korean name or English alias: 스킨케어(skincare), 메이크업(makeup), 향수/바디/헤어(fragrance), 가방/신발/잡화(bags), 시계/쥬얼리(watches), 의류/아이웨어(fashion), 디지털/리빙(digital), 식품(food), 스포츠/레져(sports), 유아동(kids), 남성관(men), 주류(liquor), 선케어(suncare). A raw numeric board code also works.

## `rankingType` (type: `string`):

Which ranking to read. topSelling = the Top 100 best-seller board (default). wish = most wish-listed. review = most reviewed.

## `maxItemsPerCategory` (type: `integer`):

How many ranked products to keep per board. Shilla publishes a Top 100, so 100 is the maximum and the default.

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

Optional. Shilla's ranking API is served to ordinary IPs, so a proxy is not required. Enable it only for high-volume schedules.

## Actor input object example

```json
{
  "categories": [
    "스킨케어",
    "주류"
  ],
  "rankingType": "topSelling",
  "maxItemsPerCategory": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Every ranked product collected in this run.

# 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": [
        "스킨케어",
        "메이크업"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kdatafactory/shilladfs-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 = { "categories": [
        "스킨케어",
        "메이크업",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("kdatafactory/shilladfs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "categories": [
    "스킨케어",
    "메이크업"
  ]
}' |
apify call kdatafactory/shilladfs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kdatafactory/shilladfs-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/CP7ltGuep14xFWVJJ/builds/IZ1m8XVo3lEP4EZtq/openapi.json
