Olive Young Ranking Scraper (K-Beauty Best Sellers) avatar

Olive Young Ranking Scraper (K-Beauty Best Sellers)

Pricing

from $3.00 / 1,000 products

Go to Apify Store
Olive Young Ranking Scraper (K-Beauty Best Sellers)

Olive Young Ranking Scraper (K-Beauty Best Sellers)

Get the Olive Young Top 100 best-seller ranking for Korea and/or the global store by category: K-beauty skincare, makeup, suncare, hair and body products with prices, discounts, promo flags and rank change since your last run.

Pricing

from $3.00 / 1,000 products

Rating

0.0

(0)

Developer

SUNGHWAN CHO

SUNGHWAN CHO

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 hours ago

Last modified

Categories

Share

Olive Young Ranking Scraper

Pick a market (Korea, global or both) and categories, and get Olive Young's Top 100 best-seller ranking as flat JSON: rank, brand, product, price, discount, review count, rating, promo flags and the rank change since your previous run.

Olive Young is South Korea's largest health and beauty retailer and the place where K-beauty trends show up first. The Korean ranking (oliveyoung.co.kr) shows what Korean shoppers buy right now; the global ranking (global.oliveyoung.com) shows what international shoppers buy.

What you get

One dataset item per ranked product:

  • Rank, category, and the ranking page URL
  • Brand and product name (Korean for the Korean site; English and Korean for the global site)
  • Original price, sale price, discount rate, currency (KRW or USD)
  • Promo flags: on sale, coupon, free gift, sold out, new product
  • Korean site only: review count and rating, Olive Young masterGoodsNumber (and gtin when it passes a barcode check digit), 3-level product category, same-day delivery, Olive Young exclusive flag, ranking timestamp
  • Global site only: stock quantity, global review count and rating, and the raw sellTotalAmt value of the list (globalSellTotalAmount - meaning and period not verified, see Notes)
  • Rank tracking: previousRank, rankChange (positive = moved up) and isNewEntry, compared with the last complete run, which is named in previousRunId / previousScrapedAt
  • Run summary (SUMMARY record, not charged): status and stop reason for every market and category

No login and no API key needed.

Use cases

  • K-beauty trend tracking — schedule a daily run and see which products and brands climb or enter the Top 100
  • Brand and competitor monitoring — track your products' rank, price and promotions against competitors
  • Product sourcing for resellers — find what sells in Korea before it reaches other markets; compare Korean and global rankings
  • Demographic insight — rank the Korean site by shopper gender and age group (teens, 20s, 30s, 40s+)
  • AI agents — one call returns a current, structured best-seller list

Input

All fields are optional. With no input you get the overall Top 100 of both markets.

FieldDescription
marketkorea, global or both (default).
categoriesRanking categories such as skincare, maskPacks, suncare, makeup, hairCare, bodyCare. Empty or all = overall Top 100. Categories that do not exist in a market are skipped.
maxItemsProducts per market and category, 1–100. Default 100.
koreaPeriodKorean ranking window: realtime (default), day, week, month.
koreaGenderKorean ranking by shopper gender: all, female, male.
koreaAgeKorean ranking by shopper age: all, teens, twenties, thirties, fortiesPlus.
historyStoreNameName of the key-value store that remembers the previous ranking. Use different names for separate watchlists.
koreaProxyConfigurationProxy for the Korean site. Keep the default (Korean residential proxy).
globalProxyConfigurationProxy for the global site. The default datacenter proxy works.
{
"market": "both",
"categories": ["skincare", "suncare"],
"maxItems": 100,
"koreaPeriod": "realtime"
}

Output

A row from the Korean suncare ranking (second run on the same history store):

{
"schemaVersion": 2,
"source": "korea",
"category": "suncare",
"categoryId": "10000010011",
"rank": 1,
"productId": "A000000209913",
"brand": null,
"brandKo": "제로이드",
"name": null,
"nameKo": "[세정이 쉬운 무기자차] 제로이드 이지워시 마일드 선크림 50ml",
"originalPrice": 32000,
"salePrice": 22900,
"maxSalePrice": 22900,
"currency": "KRW",
"discountRate": 28,
"hasOptions": false,
"isOnSale": false,
"hasCoupon": true,
"hasGift": true,
"todayDelivery": true,
"freeDelivery": false,
"isExclusive": false,
"isSoldOut": false,
"isNewProduct": false,
"reviewCount": 1725,
"rating": 4.8,
"globalStockQty": null,
"globalReviewCount": null,
"globalRating": null,
"globalSellTotalAmount": null,
"productCategory": "더모 코스메틱 > 선케어 > 선크림/선로션",
"masterGoodsNumber": "8809911694320",
"gtin": "8809911694320",
"barcode": "8809911694320",
"globalSalesAmountUsd": null,
"url": "https://www.oliveyoung.co.kr/store/goods/getGoodsDetail.do?goodsNo=A000000209913",
"imageUrl": "https://image.oliveyoung.co.kr/cfimages/cf-goods/uploads/images/thumbnails/400/10/0000/0020/A00000020991318ko.jpg?l=ko",
"rankingUrl": "https://www.oliveyoung.co.kr/store/main/getBestList.do?dispCatNo=900000100100001&fltDispCatNo=10000010011",
"rankingPeriod": "realtime",
"rankingGender": "all",
"rankingAge": "all",
"rankingUpdatedAt": "2026-10-01T13:06:09.000Z",
"rankingDateText": "2026/10/01 22:06:09",
"previousRank": 1,
"rankChange": 0,
"isNewEntry": false,
"comparisonStatus": "compared",
"qualityStatus": "ok",
"previousRunId": "6cowfXIi0Wtoqz7b5",
"previousScrapedAt": "2026-10-01T13:35:47.703Z",
"runId": "UFl5EsO3HpAx8pwf0",
"scrapedAt": "2026-10-01T13:38:37.990Z"
}

Rows from the global site use the same fields. There brand and name are in English (for example "Dr. Althea", "Dr. Althea 345 Relief Cream 50ml Set (+10ml*2ea+Tube Wringer)"), currency is USD, and globalStockQty, globalReviewCount, globalRating and globalSellTotalAmount are filled, while the Korea-only fields are null.

Every row has the same fields, including schemaVersion (currently 2) and source (korea or global). A value the site did not provide is null rather than left out. A few global flags are derived from other values (isOnSale from the discount rate, hasOptions from the min/max price).

Deprecated fields (kept so existing integrations keep working, same values as before): barcode = masterGoodsNumber, globalSalesAmountUsd = globalSellTotalAmount. Please switch to the new names.

Rank tracking

Each run saves its ranking as its own snapshot (named after the run ID) in a key-value store in your account (historyStoreName). A baseline pointer says which snapshot the next run compares against. The next run with the same market, category and Korean filters fills:

  • previousRank — rank in the baseline snapshot
  • rankChange — positive means the product moved up, negative means down
  • isNewEntry — true if the product was not in the baseline ranking
  • previousRunId, previousScrapedAt — which run and time the comparison used
  • comparisonStatus — compared, noBaseline (first run), skippedIncomplete (this ranking looked incomplete; isNewEntry and rankChange are null) or baselineSmaller (the baseline had clearly fewer products; isNewEntry is null)
  • qualityStatus — ok, warning (for example duplicates removed) or incomplete

The baseline only moves to a new run when all of that ranking's rows were saved to the dataset and the ranking looked complete. A ranking counts as incomplete when it has clearly fewer products than the baseline (under 80% and at least 5 fewer), more than 5% duplicates or items without an ID, or many more missing prices than before. Rankings are not assumed to have exactly 100 products; if the smaller size shows up again in a later run it is accepted as a real change. A failed save, a run stopped by your maximum charge, or an incomplete ranking leaves the previous baseline in place.

If two runs use the same history store at the same time, each compares with the baseline it read at the start (never a mix of two runs). When both try to become the baseline, the run with the newer ranking wins: after writing, a run waits about a second, re-checks, and steps back if a newer run took over. This is a simple check, not a lock; baselineUpdate in the SUMMARY record shows what happened (promoted, promotedAfterConcurrentUpdate, keptNewerBaseline, or lostRace if it could not settle).

On the first run the tracking fields are null. Schedule the Actor (hourly, daily or weekly) to build a rank history.

Run summary

The default key-value store record SUMMARY (not charged) lists every market and category with status (succeeded, partial, failed, skipped, notStarted), stopReason (completed, chargeLimitReached, blocked, emptyRanking, datasetWriteFailed, categoryNotInMarket, error), product counts, quality issues, the comparison baseline and whether this run became the new baseline (baselineUpdate). The run fails only when every ranking failed.

Tips

  • Korean and global review numbers are separate fields: reviewCount / rating (Korean site) and globalReviewCount / globalRating (global site). They count different reviews.
  • Product IDs differ between the Korean and global sites, so the same product is not matched across markets automatically. Match by brandKo and nameKo.
  • Use source to split Korean and global rows.

Notes

  • Rows from the Korean site have Korean names only (brand and name are null; use brandKo and nameKo).
  • rankingUpdatedAt and rankingDateText are provided only for the Korean real-time ranking.
  • masterGoodsNumber is Olive Young's own field. Most values look like EAN/UPC barcodes, and gtin is filled only when the check digit is valid, but Olive Young does not document it as a barcode.
  • globalSellTotalAmount is the raw sellTotalAmt value of the global best-seller list. Its unit, period and exact meaning are not documented or verified, so do not read it as revenue or monthly sales.
  • The Korean site blocks most datacenter IPs. Keep the default Korean residential proxy for koreaProxyConfiguration.
  • This Actor collects publicly visible ranking data only. It does not log in and collects no personal data.