# Gangnam Unni Scraper — Korean Clinic Deals & Prices (강남언니) (`cocomoon/gangnamunni-scraper`) Actor

Scrape Gangnam Unni (unni.app), Korea's #1 plastic surgery & dermatology platform: 10,000+ live procedure deals with VAT-inclusive prices, discounts, ratings, review counts and clinic location, in Korean, English, Japanese, Thai and Chinese. Optional full details: options, extra charges, steps.

- **URL**: https://apify.com/cocomoon/gangnamunni-scraper.md
- **Developed by:** [PARK MOONNAM](https://apify.com/cocomoon) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.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?

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

## Gangnam Unni Scraper — Korean Clinic Deals & Prices (강남언니)

Scrape **Gangnam Unni (unni.app)** — Korea's #1 plastic surgery and dermatology platform, with 1.3M+ patient reviews and 1,800+ clinics. Get **10,000+ live procedure deals** with **VAT-inclusive prices, discounts, ratings, review counts, before/after case counts and clinic location**, in **Korean, English, Japanese, Thai and Chinese**. Optional full details: every option with its own price, extra charges, procedure steps, side effects.

South Korea is the world's reference for aesthetic medicine: among the highest per-capita rates of cosmetic procedures anywhere, more than a million foreign patients a year, and the place where new lasers, lifting devices and skin treatments are adopted first. Gangnam Unni is where Korean patients compare those clinics — receipt-verified reviews, real deal prices, booking through the app. This Actor turns that marketplace into clean JSON.

### ⚡ Try it in 30 seconds (free)

1. Click **Try for free** — the input is pre-set to search `코성형` (rhinoplasty) deals.
2. Click **Start**. The first 100 deals arrive in a few seconds.
3. Open **Output** → **Export** as JSON, CSV or Excel, or send it to Google Sheets.

Apify's free plan includes $5 of credit every month — about 800 deals with this Actor, no card required. Pricing is **$6 per 1,000 deals** + $0.005 per run, platform usage included, and full details (options, extra charges, steps) cost the same as a plain listing.

### What you can do with it

- 💵 **Benchmark procedure prices** — what Korean clinics actually charge for rhinoplasty, double eyelid, Ultherapy, Thermage, botox, fillers, lifting, hair removal… original vs. deal price, discount rate, VAT included or not
- 🌏 **Serve foreign patients** — the English, Japanese, Thai and Chinese catalogs are what overseas patients see: localized titles and option names, plus prices converted to **USD / JPY / THB / CNY / TWD**
- 🏥 **Map the market by clinic** — every deal carries the clinic's id, name, district, coordinates and certifications; feed it to the [Gangnam Unni Clinics Scraper](https://apify.com/cocomoon/gangnamunni-clinics-scraper) for the full profile
- 📈 **Track trends** — run on a schedule and watch new deals, price moves and review counts per category or district
- 🇯🇵 **Compare Korea and Japan** — the Japanese catalog also lists clinics in Tokyo and Osaka; filter by clinic country
- 🤖 **Feed AI agents & dashboards** — clean JSON for Sheets, BI tools, RAG or MCP agents

### Modes

#### 1. Deals (`mode: "deals"`)

Deal listings for keywords, categories and districts, in the site's own order (or sorted by price, discount, reviews, rating, newest, ending soon). Leave keywords and categories empty for the site's recommended feed (the site caps it at 200 deals); with a larger `maxItems` the Actor walks every category instead, which is how you get the whole catalog.

```json
{ "mode": "deals", "language": "ko-KR", "keywords": ["코성형", "울쎄라"], "maxItems": 200 }
```

```json
{ "mode": "deals", "language": "en-US", "categories": ["eyes", "nose"], "sortBy": "LOWEST_DISCOUNTED_COST", "maxItems": 500 }
```

Add `"includeDetails": true` to fetch every deal's detail page as well (one extra request per deal, billed the same).

#### 2. Deal details (`mode: "details"`)

Full details for specific deals, by id or URL.

```json
{ "mode": "details", "language": "ko-KR", "deals": ["6554", "https://unni.app/events/3853"] }
```

#### 3. Filters (`mode: "filters"`)

The site's own treatment category tree (category → group → treatment, with deal counts) and every district code you can filter by. Run it once, then use the codes in the other modes.

```json
{ "mode": "filters", "language": "en-US" }
```

### Input

| Field | Description |
| --- | --- |
| `mode` | `deals` (default), `details` or `filters` |
| `language` | `ko-KR` (default, full catalog), `en-US`, `ja-JP`, `th-TH`, `zh-Hans-CN`, `zh-Hant-TW` |
| `keywords` | Search terms in the chosen language: procedure, brand, clinic name or area |
| `categories` | `eyes`, `nose`, `skin`, `lifting`, `botox`, `filler`, `facialContour`, `breast`, `fatDiet`, `hairRemoval`, `hairTransplant`, `dental`, `orientalMedicine`, `other` — one listing each |
| `districts` | District codes such as `N1102` (Cheongdam / Apgujeong / Sinsa); get the list from `filters` mode |
| `sortBy` | `RECOMMENDATION` (default), `HIGHEST_POPULARITY`, `LATEST_STARTS_AT`, `LOWEST_DISCOUNTED_COST`, `HIGHEST_DISCOUNTED_COST`, `HIGHEST_DISCOUNT_RATE`, `HIGHEST_RATING_COUNT`, `HIGHEST_RATING_AMOUNT`, `EARLIEST_ENDS_AT` |
| `clinicCountry` | `all` (default), `KR` or `JP` — the Japanese catalog mixes Korean and Japanese clinics |
| `includeDetails` | Deals mode: also fetch each deal's details |
| `deals` | Details mode: deal ids or URLs |
| `maxItems` | Total number of rows (default 100) |
| `proxyConfiguration` | Off by default for Gangnam Unni, Apify proxy for Babitalk. The Actor does not rotate IPs or bypass blocks |

### Output

One row per deal. Listing fields:

```json
{
    "dealId": 3853,
    "title": "디에이 자려한 코성형_비순각코수술 콧대 복코교정 보형물 코재수술 성형외과 전문의",
    "url": "https://unni.app/events/3853",
    "originalPrice": 2139000,
    "salePrice": 1089000,
    "discountRate": 49,
    "currency": "KRW",
    "localSalePrice": null,
    "localCurrency": null,
    "includesVat": true,
    "operationType": "SURGICAL",
    "rating": 9.7,
    "reviewCount": 11839,
    "beforeAfterCaseCount": 9,
    "representativeOption": "낮은코성형",
    "hospitalId": 250,
    "hospitalName": "디에이성형외과의원",
    "hospitalDistrict": "서울 역삼역",
    "hospitalCountry": "KR",
    "hospitalLatitude": 37.499603,
    "hospitalLongitude": 127.03168,
    "hospitalUrl": "https://unni.app/hospitals/250",
    "badges": ["WAITING_RESERVATION"],
    "isPurchasableInApp": false,
    "reservationType": "WAITING",
    "keyword": "코성형",
    "position": 1,
    "totalResults": 774
}
```

In the non-Korean catalogs `localSalePrice` / `localCurrency` carry the site's converted price (e.g. `662.16` `USD`). Ratings are on the site's 10-point scale.

With details (`includeDetails` or `details` mode) each row adds: `description`, `startsAt`, `endsAt`, `isAvailable`, `options` (every option with `name`, `originalPrice`, `salePrice`, `discountRate`, converted price and `treatments`), `optionCount`, `minOptionPrice`, `maxOptionPrice`, `extraPrices` (anesthesia, aftercare — included or charged), `recommendedFor`, `procedureSteps`, `procedureMinutes`, `sideEffects`, `downtime`, `hospitalAddress`, `hospitalAddressEn`, `hospitalCctvInstalled`, `descriptionImages`.

Filters mode returns `type: "category"` rows (category → groups → treatments with deal counts) and `type: "district"` rows (city → districts with codes).

### Pricing

Pay per result: **$0.006 per deal** (listing or full details, same price) + $0.005 per run. Filters mode rows are billed the same. No charge for failed requests. Set `maxItems` to cap a run; the Korean catalog is about 10,000 deals, so a full snapshot is about $60.

### Notes & FAQ

**Which languages have what?** Korean is the full catalog (10,000+ deals). English, Thai and Chinese list the deals clinics publish for foreign patients (roughly 1,300 / 860 / 1,400) with converted prices. Japanese lists both Korean clinics (KRW) and clinics in Japan (JPY) — use `clinicCountry` to keep one.

**Can I get the reviews?** No. Review texts on Gangnam Unni are shown only to logged-in users, and this Actor never logs in. You get the public rating, review count and before/after case count for every deal, clinic and doctor.

**Is it fast?** JSON only, no browser, but deliberately gentle: two requests at a time with a pause, about 20 deals per request. A 1,000-deal run takes a couple of minutes.

**Does it collect personal data?** No. It collects public deal, price and clinic information only. Clinic staff names are not included in this Actor; doctor profiles (public professional information) are in the clinics Actor.

**Related Actors by the same author:** [Gangnam Unni Clinics Scraper](https://apify.com/cocomoon/gangnamunni-clinics-scraper) (clinic profiles, doctors, hours), [Olive Young Scraper](https://apify.com/cocomoon/oliveyoung-scraper) (K-beauty rankings), [Naver Map Scraper](https://apify.com/cocomoon/naver-place-rank-tracker) (Korean local businesses).

### Responsible use and takedown

This Actor reads only pages and listings that the site serves to any visitor without logging in. It sends requests one or two at a time with a pause between them, never collects review texts or personal data, and does not rotate IP addresses or bypass any access controls. Please use the data the same way: for research, comparison and analysis, at a modest rate, and in line with the site's terms and the laws that apply to you.

**If you represent the site or a clinic listed on it** and want data removed or the Actor changed, write to the author through the Issues tab on this page or the contact on the [author profile](https://apify.com/cocomoon). Requests are acted on within 48 hours.

### Legal

This Actor collects publicly available information from unni.app for research, price comparison and market analysis. You are responsible for using the data in line with the site's terms and the laws that apply to you. Gangnam Unni / 강남언니 is a trademark of Healing Paper Co., Ltd.; this Actor is not affiliated with or endorsed by them.

# Actor input Schema

## `mode` (type: `string`):

What to scrape: <b>deals</b> — the procedure deal listings (price, discount, rating, review count, clinic) for your keywords, categories and districts; <b>details</b> — full details for specific deals: every option with its price, extra charges, procedure steps, duration, side effects, description; <b>filters</b> — the site's treatment category tree (with deal counts) and the district codes you can filter by.

## `language` (type: `string`):

Site language. Each language is its own catalog with localized titles and option names: Korean has 10,000+ deals; the others have the deals clinics publish for foreign patients (English about 1,300) and add prices converted to USD / JPY / THB / CNY / TWD.

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

Deals mode: search terms in the chosen language — a procedure (<code>코성형</code>, <code>rhinoplasty</code>, <code>ウルセラ</code>), a brand (<code>써마지</code>, <code>Thermage</code>), a clinic name or an area. Leave empty (and no categories) to list the site's recommended feed; that feed stops at 200 deals, so with a larger <b>Max items</b> the Actor walks every category instead.

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

Deals mode: one listing per selected category, searched by the category's own name in the chosen language (the same thing the site's category tabs do).

## `districts` (type: `array`):

Deals mode: limit to clinics in these districts, by the site's district code — e.g. <code>N1102</code> (Cheongdam / Apgujeong / Sinsa), <code>N1101</code> (Gangnam stn. / Sinnonhyeon / Yangjae), <code>N1404</code> (Busan Centum / Haeundae). Run the <b>filters</b> mode once to get the full list of codes.

## `sortBy` (type: `string`):

Deals mode: order of the results (same options as the site).

## `clinicCountry` (type: `string`):

Deals mode: the Japanese catalog mixes Korean clinics (KRW prices) with clinics in Japan (JPY prices). Keep only one country, or all.

## `includeDetails` (type: `boolean`):

Deals mode: also fetch each deal's detail page — every option with its own price, extra charges (anesthesia, follow-up), procedure steps and duration, who it is recommended for, side effects, clinic address in English. One extra request per deal; billed the same per deal.

## `deals` (type: `array`):

Details mode: deal IDs (<code>6554</code>) or deal URLs (<code>https://unni.app/events/6554</code>). Tip: take them from the <code>dealId</code> field of a deals run.

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

Maximum number of rows in total (across all keywords and categories). The Korean catalog has 10,000+ deals; set this higher to get all of them.

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

Proxies to use. Leave proxies OFF (the default): the Actor reads public pages directly from the Apify platform at a modest rate. It does not rotate IP addresses or work around blocks; if the site ever refuses requests, the run stops and reports it.

## Actor input object example

```json
{
  "mode": "deals",
  "language": "ko-KR",
  "keywords": [
    "코성형"
  ],
  "categories": [],
  "sortBy": "RECOMMENDATION",
  "clinicCountry": "all",
  "includeDetails": false,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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 = {
    "keywords": [
        "코성형"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("cocomoon/gangnamunni-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 = {
    "keywords": ["코성형"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("cocomoon/gangnamunni-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 '{
  "keywords": [
    "코성형"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call cocomoon/gangnamunni-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cocomoon/gangnamunni-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/begMIt458ip9chyBA/builds/EKq4OnOdNx5yl5Zpw/openapi.json
