Olive Young is where Korea buys its skincare — 1,300+ stores and the dominant online mall. Its search results are ranked by the site's own popularity order, so the first 100 results for 세럼 (serum) are, in practice, the serums Koreans are buying right now.
Every product page also carries the legally required full ingredient list (전성분). So I pulled the top 100 serum listings with their complete ingredient lists and counted what's actually inside them.
The sample: 100 listings from 52 brands, collected on 2026-09-30. Average rating 4.8, a little over one million reviews between them. Median price ₩28,900 (about US$21); 70 of the 100 were on discount that day.
What's in a best-selling Korean serum
How many of the 100 listings contain each ingredient family:
| Ingredient | Listings | What it's there for |
|---|---|---|
| Niacinamide | 71 | Brightening |
| Hyaluronic acid (any form) | 68 | Hydration |
| Adenosine | 54 | Anti-wrinkle |
| Panthenol | 53 | Barrier, soothing |
| Allantoin | 43 | Soothing |
| Centella (extract, madecassoside, asiaticoside…) | 42 | Soothing, "cica" |
| Ceramides | 30 | Barrier |
| Vitamin C (ascorbic acid and derivatives) | 25 | Brightening |
| Peptides | 24 | Firming |
| Beta-glucan | 24 | Hydration, soothing |
| PDRN (sodium DNA) | 14 | The current hype |
| Salicylic acid / BHA | 14 | Pores, breakouts |
| Retinoids (retinol, retinal) | 7 | Anti-aging |
| Tranexamic acid | 4 | Dark spots |
Five things that stood out
1. Niacinamide and adenosine are nearly default. 71 and 54 listings. That's not only formulator taste: both are on Korea's list of notified "functional cosmetic" ingredients, so including them at the specified level lets a brand legally label the product as brightening or anti-wrinkle. The ingredient list is partly a regulatory artifact.
2. One hyaluronic acid is not enough anymore. 68 listings contain some form of it, 20 contain three or more different forms, and 14 contain five or more (sodium hyaluronate, hydrolyzed hyaluronic acid, sodium acetylated hyaluronate, crosspolymers…). One product lists ten. "Multi-weight hyaluronic" has gone from a selling point to table stakes.
3. PDRN has arrived, including at #1. 14 of the 100 list sodium DNA — the label name for PDRN, the salmon-DNA ingredient popularized by Korean skin-booster treatments. The #1 result, Anua's PDRN Hyaluronic Acid Capsule serum, has 25,242 reviews. Medicube's PDRN Pink Peptide ampoule shows up three times in different bundles. Retinoids, for comparison, appear in 7.
4. Korea has quietly replaced its preservatives. 79 listings use 1,2-hexanediol and 73 use ethylhexylglycerin; only 10 use phenoxyethanol. Only 15 list fragrance (향료) and 7 list ethanol. If you formulate for the Korean market, that's the expected profile.
5. Formula length tells you nothing about sales. The median serum has 38 ingredients, the longest has 88 — and the shortest has 3: a ₩5,700 (about $4) niacinamide 20% serum that's just rose water, niacinamide and glycerin. It sits at #13 with 20,328 reviews, ahead of products that cost five times as much.
One more for anyone sourcing: 84 of the 100 are made in Korea, and a third of all listings come from just three contract manufacturers — Cosmax (15), Kolmar Korea (9) and Cosvision (9). The brand on the box is often not who made it; the ingredient-and-manufacturer field tells you who did.
How I got the data
Olive Young has no public API, so I used a scraper I built and published on Apify: Olive Young Scraper. Its search mode returns products in popularity order, and a new option adds each product's detail page — full ingredient list, volume, shelf life, manufacturer, country of origin, barcodes and current promotion. The whole run was this input:
{
"mode": "search",
"keywords": ["세럼"],
"includeDetails": true,
"maxItems": 100
}
It took about two and a half minutes. Each product comes back with ingredients (the raw text) and ingredientList (parsed into an array), so the counting is a few lines:
from collections import Counter
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cocomoon/oliveyoung-scraper").call(run_input={
"mode": "search", "keywords": ["세럼"], "includeDetails": True, "maxItems": 100,
})
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
counts = Counter()
for item in items:
counts.update(set(item["ingredientList"]))
for name, n in counts.most_common(30):
print(n, name)
Swap the keyword for 토너 (toner), 선크림 (sunscreen) or a brand name and you get the same breakdown for that category.
Caveats
- These are 100 listings, not 100 unique formulas — Olive Young sells the same serum in several bundles, and popular products appear more than once. I left them in, because that's what the shelf looks like.
- The keyword search returns a few non-serums that match the word (one is a finishing powder).
- Ingredient names come back in Korean, as printed on the label. I matched families by name (for example every ingredient containing 하이알루로 counts as hyaluronic acid), so treat the counts as close, not exact. The English names and the "what it's for" column are mine.
- Popularity order is Olive Young's own ranking on one day; it moves with promotions.
If there's a category you'd like to see broken down the same way, tell me in the comments.
Top comments (0)