Monitor Nykaa Bestsellers and New India Beauty Brand Drops
Track Nykaa bestseller movement, newest-arrivals feeds, and new brand indexing — find rising SKUs and emerging Indian beauty brands before they hit press.

Thirdwatch's Nykaa Scraper returns Nykaa category listings sorted by popularity, newest, top-rated, or discount — with brand, price, rating, rating_count, and stable SKU IDs. Built for ops and founders tracking bestseller movement, new SKU launches, and emerging Indian beauty brands entering Nykaa.
Why monitor Nykaa bestsellers and launches
Nykaa is the discovery surface for new beauty brands in India. Per the Nykaa FY24 annual report, ~6,800 brands sell on the platform and the company adds 30-50 new brands per quarter to the BPC vertical — a meaningful share of which are Indian D2C indies (Plum, Sugar, Minimalist, MyGlamm, Earth Rhythm, Pilgrim, MCaffeine) that will go on to capture meaningful share. India's BPC market is forecast at $30B by 2027 per RedSeer, growing 10-12 percent annually, with online taking share. The brands that ranked on Nykaa today are the brands that will define the category in three years.
The job-to-be-done is well-defined. An indie founder watches the niche serum category weekly to find which positioning gets traction. A category buyer at a multi-brand retailer (Tira, Shoppers Stop, Sephora India) needs an early-warning system for indie brands worth onboarding before competitors do. A VC associate scanning the Indian D2C beauty space wants a weekly diff of new brands indexed on Nykaa. A trend forecaster at a CPG major maps ingredient adoption (niacinamide, retinol, peptides, mandelic acid) across the bestseller cohort. All reduce to repeated category pulls plus history diff.
How does this compare to alternatives?
Three approaches:
| Approach | Reliability | Setup time | Maintenance |
|---|---|---|---|
| Manual category browsing weekly | Low; analyst dependent | Continuous | Human error |
| Trend SaaS (Trendalytics, Edited, Heuritech) | High; pricey enterprise contracts | 4-8 weeks | Vendor-managed |
| Thirdwatch Nykaa Scraper | Production-tested with production-grade anti-bot tooling | 5 minutes | Thirdwatch tracks Nykaa changes |
Trend SaaS tools are valuable but priced for enterprise. The Nykaa Scraper actor page gives a programmable feed at transparent per-result pricing — the underlying data structure trend SaaS builds on.
How to monitor Nykaa bestsellers and launches in 4 steps
Step 1: How do I authenticate against Apify?
export APIFY_TOKEN="apify_api_xxxxxxxxxxxxxxxx"Step 2: How do I pull a weekly bestseller snapshot per category?
Run with sortBy: "popularity" per leaf category. The top 50 results approximate Nykaa's bestseller widget.
import os, requests, json, datetime, pathlib
ACTOR = "thirdwatch~nykaa-scraper"
TOKEN = os.environ["APIFY_TOKEN"]
CATEGORIES = ["lipstick", "foundation", "eye-makeup", "nail",
"face-wash", "moisturizer", "serum", "shampoo",
"conditioner", "fragrance"]
today = datetime.date.today().isoformat()
pathlib.Path("snapshots").mkdir(exist_ok=True)
all_records = []
for cat in CATEGORIES:
resp = requests.post(
f"https://api.apify.com/v2/acts/{ACTOR}/run-sync-get-dataset-items",
params={"token": TOKEN},
json={"queries": [], "category": cat,
"sortBy": "popularity", "maxResults": 50},
timeout=600,
)
rows = resp.json()
for r in rows:
r["snapshot_date"] = today
r["snapshot_category"] = cat
all_records.extend(rows)
print(f"{cat}: {len(rows)} SKUs")
pathlib.Path(f"snapshots/nykaa-bestsellers-{today}.json").write_text(json.dumps(all_records))10 leaf categories × 50 bestsellers = 500 rows per weekly snapshot. The snapshot_category field is your group-by key for category-specific trend analysis.
Step 3: How do I detect new SKUs week-over-week?
Persist snapshots; diff SKU sets.
import pandas as pd, glob
frames = []
for f in sorted(glob.glob("snapshots/nykaa-bestsellers-*.json")):
for j in json.loads(pathlib.Path(f).read_text()):
frames.append(j)
df = pd.DataFrame(frames).dropna(subset=["sku"])
df["snapshot_date"] = pd.to_datetime(df["snapshot_date"])
# First-seen date per SKU
first_seen = (df.groupby("sku")
.snapshot_date.min().reset_index()
.rename(columns={"snapshot_date": "first_seen"}))
# This week's new SKUs
cutoff = pd.Timestamp.today().normalize() - pd.Timedelta(days=7)
new = first_seen[first_seen.first_seen >= cutoff]
new_skus = (df.merge(new, on="sku")
.drop_duplicates("sku")
.sort_values("rating_count", ascending=False))
print(new_skus[["brand", "product_name", "snapshot_category",
"price", "rating", "rating_count"]].head(30))A SKU appearing in a popularity-sorted bestseller list within its first week on Nykaa is a strong signal. Brand-team campaigns drive most of these; organic traction is rarer but the more interesting signal.
Step 4: How do I detect new brand entries on Nykaa?
Sweep sortBy: "newest" on top-level categories so you see arrivals across the catalog, not just bestsellers.
TOP_CATEGORIES = ["makeup", "skin", "hair", "bath-body", "fragrance",
"personal-care", "men"]
new_arrivals = []
for cat in TOP_CATEGORIES:
resp = requests.post(
f"https://api.apify.com/v2/acts/{ACTOR}/run-sync-get-dataset-items",
params={"token": TOKEN},
json={"queries": [], "category": cat,
"sortBy": "newest", "maxResults": 100},
timeout=600,
)
new_arrivals.extend(resp.json())
arrivals_df = pd.DataFrame(new_arrivals).dropna(subset=["brand"])
# Brand history
known_brands_path = pathlib.Path("known_brands.json")
known = set(json.loads(known_brands_path.read_text())) if known_brands_path.exists() else set()
current = set(arrivals_df.brand.str.lower().str.strip().unique())
new_brands = current - known
print(f"{len(new_brands)} brands new on Nykaa this week:")
for b in sorted(new_brands):
sample = arrivals_df[arrivals_df.brand.str.lower().str.strip() == b].head(3)
print(f" {b}: {sample.product_name.tolist()}")
# Update history
known_brands_path.write_text(json.dumps(sorted(known | current)))The first 5-10 SKUs of a brand's Nykaa debut tell you the brand's positioning — hero SKU, price ladder, ingredient story. This is the cheapest competitive intelligence source for the Indian beauty market.
Step 5: How do I detect rising SKUs (rank velocity)?
Rank position itself isn't returned, but rating_count growth week-over-week is a clean proxy for sales velocity.
weekly = (df.groupby(["sku", "product_name", "brand",
pd.Grouper(key="snapshot_date", freq="W")])
.rating_count.last().reset_index())
weekly["wow_growth"] = weekly.groupby("sku").rating_count.diff()
rising = (weekly.dropna(subset=["wow_growth"])
.sort_values("wow_growth", ascending=False)
.head(20))
print(rising[["product_name", "brand", "rating_count", "wow_growth"]])A 500+ review gain in a single week, especially on a SKU under 30 days old, is the canonical "rising star" signal.
Sample output
A single bestseller row looks like this. Five hundred bestseller rows across ten categories weigh ~250 KB.
[
{
"sku": "8901030898231",
"product_name": "Sugar Cosmetics Smudge Me Not Liquid Lipstick - Tan Fan",
"brand": "Sugar Cosmetics",
"price": 449,
"original_price": 599,
"discount_percent": 25.04,
"currency": "INR",
"rating": 4.5,
"rating_count": 78421,
"category": "Lipstick",
"in_stock": true,
"url": "https://www.nykaa.com/sugar-cosmetics-smudge-me-not/p/3344556",
"snapshot_category": "lipstick",
"snapshot_date": "2026-05-12"
},
{
"sku": "8904333700045",
"product_name": "Pilgrim Patuá and Tucuma Hair Mask",
"brand": "Pilgrim",
"price": 645,
"original_price": 745,
"discount_percent": 13.42,
"currency": "INR",
"rating": 4.4,
"rating_count": 2841,
"category": "Hair Mask",
"in_stock": true,
"url": "https://www.nykaa.com/pilgrim-patua-tucuma/p/8877665",
"snapshot_category": "hair",
"snapshot_date": "2026-05-12"
}
]sku stays stable across snapshots; that's your join key. rating_count is the proxy for sales velocity. snapshot_category and snapshot_date are appended by the caller, not the actor.
Common pitfalls
Three things go wrong in production trend pipelines. Bestseller curation lag — Nykaa updates its popularity ordering on a 24-48 hour rolling window, not real-time; a SKU appearing today reflects last week's signal. Brand-name disambiguation — "Sugar" and "Sugar Cosmetics" are the same brand; build a normalization map covering the top 200 brands before computing brand-set diff or you'll see false-positive "new brands". Limited-edition SKU noise — Nykaa indexes seasonal LE SKUs (festive packaging, brand collabs) as new SKUs even when the underlying formulation is unchanged; filter by product_name regex for "Limited Edition", "LE", "Festive", "Collab" before treating as a launch signal.
A fourth subtle issue: Nykaa's category field on the SKU itself sometimes differs from the category you queried (e.g., a query under lipstick may return a SKU with category: Lip Care Combo); use snapshot_category (your input) as the source of truth for category-grouped analytics.
Thirdwatch's actor handles Nykaa's production-grade anti-bot tooling by capturing the page's embedded JSON payload, with a DOM fallback when the JSON shape shifts. A weekly 10-category sweep at 50 results each completes in under five minutes. Pair Nykaa trend data with our Myntra Scraper (Tira beauty crossover) and Amazon Scraper for the full multi-channel India beauty trend picture.
Related use cases
Frequently asked questions
How do I find Nykaa's bestsellers per category?
Run the actor with category set to a leaf (lipstick, serum, shampoo) and sortBy set to popularity. Nykaa orders this view by sales volume internally. The top 30-50 results approximate the bestseller list. Combine with newest sortBy to detect newly arrived SKUs already ranking high — a strong rising-product signal.
How fresh is the newest-arrivals signal?
Nykaa indexes new SKUs continuously, and the newest sortBy reorders within hours of a new SKU going live. Weekly snapshots capture all material new launches; daily snapshots catch named drops (limited editions, brand expansions). Indie-brand additions tend to land in batches on Mondays and Thursdays.
Can I detect new brand entries (not just new SKUs from existing brands)?
Yes. Persist a brand history table. Each snapshot's distinct brand set, diffed against the prior week, surfaces brands that were not previously indexed. Indie clean-beauty and K-beauty brands typically enter Nykaa 3-6 months before mainstream press notices.
What's the right cadence for trend monitoring?
Weekly snapshots are sufficient for brand-level launch tracking. Daily snapshots are needed for bestseller-rank movement (positions shift on a daily cadence as marketing campaigns land). For named sale windows, switch to 4-hour cadence to catch within-day rank reshuffles.
Are bestseller ranks the same for logged-in users?
No. Nykaa personalizes the homepage and category bestseller widgets when logged in. The actor pulls the anonymous public view, which is the canonical Nykaa-curated ranking and the right baseline for trend monitoring. The personalized view is for shopper UX, not for analyst trend signal.
Related
100 free credits, no credit card.
About 30 real searches. Add the MCP to Claude or Cursor in two minutes.