Olive Young Ranking Scraper (K-Beauty Best Sellers)
Pricing
from $3.00 / 1,000 products
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
Maintained by CommunityActor 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(andgtinwhen 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
sellTotalAmtvalue of the list (globalSellTotalAmount- meaning and period not verified, see Notes) - Rank tracking:
previousRank,rankChange(positive = moved up) andisNewEntry, compared with the last complete run, which is named inpreviousRunId/previousScrapedAt - Run summary (
SUMMARYrecord, 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.
| Field | Description |
|---|---|
market | korea, global or both (default). |
categories | Ranking 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. |
maxItems | Products per market and category, 1–100. Default 100. |
koreaPeriod | Korean ranking window: realtime (default), day, week, month. |
koreaGender | Korean ranking by shopper gender: all, female, male. |
koreaAge | Korean ranking by shopper age: all, teens, twenties, thirties, fortiesPlus. |
historyStoreName | Name of the key-value store that remembers the previous ranking. Use different names for separate watchlists. |
koreaProxyConfiguration | Proxy for the Korean site. Keep the default (Korean residential proxy). |
globalProxyConfiguration | Proxy 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 snapshotrankChange— positive means the product moved up, negative means downisNewEntry—trueif the product was not in the baseline rankingpreviousRunId,previousScrapedAt— which run and time the comparison usedcomparisonStatus—compared,noBaseline(first run),skippedIncomplete(this ranking looked incomplete;isNewEntryandrankChangearenull) orbaselineSmaller(the baseline had clearly fewer products;isNewEntryisnull)qualityStatus—ok,warning(for example duplicates removed) orincomplete
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) andglobalReviewCount/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
brandKoandnameKo. - Use
sourceto split Korean and global rows.
Notes
- Rows from the Korean site have Korean names only (
brandandnamearenull; usebrandKoandnameKo). rankingUpdatedAtandrankingDateTextare provided only for the Korean real-time ranking.masterGoodsNumberis Olive Young's own field. Most values look like EAN/UPC barcodes, andgtinis filled only when the check digit is valid, but Olive Young does not document it as a barcode.globalSellTotalAmountis the rawsellTotalAmtvalue 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.