Nykaa Scraper: Beauty Products, Prices, Reviews
Pricing
from $1.90 / 1,000 products
Nykaa Scraper: Beauty Products, Prices, Reviews
Scrape Nykaa categories, brand pages, searches or product links with no login. Get price, MRP, discount, rating, stock, offers, every shade with its own price and stock, ingredients and verified reviews. Export JSON, CSV or Excel, schedule a price watch, pay per product.
Pricing
from $1.90 / 1,000 products
Rating
0.0
(0)
Developer
Automation Craft
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Nykaa Scraper: Beauty Products, Prices, Reviews
Nykaa scraper for India's largest beauty store: get every product of a Nykaa category, brand page or search as clean rows with price, MRP, discount, rating, stock and shade count, and on request the full product page with every shade or size at its own price and stock, the ingredients, how to use, expiry and offers, plus the verified buyer reviews. No login, no cookies, no API key. You pay per product delivered; misses, repeats and filtered products are free.
Use it to watch your own and competing brands' prices and discounts on Nykaa, to build a beauty catalogue with shades and ingredients, to study reviews at scale, or to run a price and stock watch that reports what changed since the last run.
Quick start
- Open the Actor's Input tab.
- Pick one or more Categories (lipstick, face moisturizer, shampoo ...), type Search words (vitamin c serum, maybelline), or paste Nykaa links: a category, brand or search page, or a product page.
- Optionally set Nykaa's own filters: brands, price range, minimum discount, minimum rating, and any other filter of Nykaa's panel such as "Skin type: Oily".
- Set Max products per search (the form starts at 10; an API call that leaves it out gets 100) and turn on Product details or Reviews if you want them.
- Click Start. Download the results as JSON, CSV or Excel, or read them through the Apify API.
What you get
Product rows (the Product event)
One row per Nykaa product. Example values are from a real run on 2026-10-16.
| Field | Example | Notes |
|---|---|---|
productId | 683166 | Nykaa's product id, the number after /p/ in its link |
name | Nykaa Cosmetics So Creme! Creamy Matte Lipstick | |
brand, brandId, brandIds | Nykaa Cosmetics, 1937 | |
url | https://www.nykaa.com/nykaa-so-creme-creamy-matte-lipstick/p/683166 | |
sku, parentSku | NYK_SCCMLT | |
price, mrp, discount, discountPercent, currency | 197, 329, 132, 40, INR | price is the selling price |
rating, ratingCount | 4.3, 4347942 | |
inStock, quantity, isBackorder | true, 9634, false | quantity is the stock count Nykaa reports |
productType, shadeType, shadeCount, packSize | configurable, shade, 35 | |
offers, offerCount, offerMessage, offerId, priceDropText | "Extra 5% off ..." | Nykaa's offers on the product |
image, images | image links | |
category, categoryIds | { "l1": { "id": "12", "name": "Makeup" }, "l2": { "id": "15", "name": "Lips" }, "l3": ... }, and every category id Nykaa files the product under | |
tags, secondaryTags, attributeNudges | bestseller, featured; finish: Matte | Nykaa's own labels |
isLuxe, isFlashSale, isEarlyAccess, isMini, isFreeSample, proFlag, prEnabled, buttonText, popularityScore, searchScore, badge | Nykaa's own flags and scores; badge is the stock note Nykaa shows on the card ("Only a few left") | |
isSponsored, isFeatured, position, page | false, false, 41, 3 | a paid placement, a pinned product, its place on the page (a product shown both as a paid placement and as an ordinary row in one walk is delivered once, as the first of the two) |
matchedShadeId | the shade a search matched | |
shadeId | 683149 | on a row read for one shade (a shade id, or a product link with skuId) |
source | { "kind": "listing", "input": "categories 1", "categoryId": "249" } | which input found it |
scrapedAt | 2026-10-16T00:16:10.214Z |
Fill measured on 1,000 rows of the Skin category (2026-10-22): name, price, MRP, discount, rating count, stock flag, image, link,
category and SKU on 1,000 of 1,000 rows, brand and rating on 999, quantity on 960.
Product details (the Product detail event, optional)
With Product details on, each product row carries details, Nykaa's full product page:
| Field | What it holds | Fill on 20 products of different kinds |
|---|---|---|
shades | every shade or size: shadeId, name, sku, gtin, price, mrp, discountPercent, inStock, quantity, expiry, isBestseller, image, url | 9 of 20 products have shades; 127 of 127 shades carry price, MRP and stock; 7 of the 9 price their shades differently |
description | the description as text | 20 of 20 |
ingredients | the ingredient list | 9 of 20 |
howToUse | Nykaa's how to use text | 12 of 20 |
highlights | Nykaa's attribute table (concern, finish, formulation, preference ...) | |
countryOfOrigin, manufacturer, manufacturerAddress, packer, importer, seller | origin and the legal names | on 200 lipsticks (2026-10-22): origin and seller 200 of 200, manufacturer 140 (Nykaa leaves it empty on the rest), importer 74, packer 60 |
expiry | the expiry date shown | 18 of 20 |
gtin | the barcode | 15 of 20 on the product, 19 of 20 counting the shades' own gtin; on 200 lipsticks (2026-10-22) 72 on the product, 190 counting shades |
ratingHistogram | ratings per star, 1 to 5 | 19 of 20 |
reviewCount, reviewSummary, reviewTopics | Nykaa's review count, its "Customers Say" summary and its review topics with sentiment | review count above 0 on 18 of 20, summary on 15 of 20 |
returnPeriodDays, returnable, returnPolicy, cashOnDelivery, deliveryNote, bestsellerRank, questionCount | policy and rank texts | |
offers, images, videos, metaKeywords | offers on 10 of 20 | |
pincodeDelivery | with a Delivery pincode: whether Nykaa ships there, city, state, cash on delivery and Nykaa's delivery messages |
With details on, the row's price, MRP, discount, stock and rating are read from the product page (newer than the listing) and
every filter is checked on them again; a value the product page does not carry fails a filter that needs it. A product page whose
pincode check could not be read is delivered with detailsStatus: "partial" and detailsMissing, without the Product detail
event.
Review rows (the Review event, optional)
With Reviews on, each product's verified reviews arrive as rows of their own: reviewId, productId, shadeId,
productUrl, productName, rating, title, text, reviewerName, isVerifiedBuyer, label, likeCount, images,
reviewerAttributes (the reviewer's skin or hair profile, as Nykaa shows it), aspects, reviewerReviewCount,
reviewerImageCount, isProReviewer, reviewedAt, reviewDateText. Five orders (most useful, most helpful, newest, positive
first, negative first), a star filter, photos only, a start page, up to 1,200 per product (one count per product: a product read
as its own row and as a shade row shares it). With Include personal data on, the
reviewer's profile picture link and Nykaa's pseudonymous reviewer id are added (reviewerProfileImage, reviewerId; null when
off).
The product row says how its review read ended: reviewsStatus is read when the number you asked for arrived or every review
Nykaa counts was seen, and partial when the read was cut, with reviewsEnd naming why (source_page_cap: Nykaa shows no review
page past 40; empty_page_before_count: Nykaa answered an empty page before its count was reached; invalid_page). Nykaa's review
pages thin out in the middle of a walk, so a long read can end at page 40 before the count.
Product check rows (the Product check event, monitor in changes mode)
One row per watched product link or id each run: productId, shadeId, name, brand, sku, price, mrp,
discountPercent, inStock, quantity, rating, ratingCount, changeType (baseline, unchanged or changed),
changes (each field with its old and new value), previousPrice, previousMrp, previousInStock.
Free rows
- One
coveragerow per search, category or brand page: Nykaa's total with and without your filters, pages read, products delivered, already delivered, known to the monitor, filtered out, paid placements read and left out, the page a search was sent to, and why the walk stopped (completetrue or false). statusrows for every miss and stop: an id or category Nykaa does not have, a filter value Nykaa does not list for a page, a filter Nykaa did not apply, a page that could not be read, inputs not started.- Past 600 status rows in one run, further misses of one kind are named together in one row per kind (
items, up to 1,000 a row); inputs or ids a stopped run did not read are always named in full. - One
summaryrow, always last: counts, requests, the work allowance and what was charged.
How much does it cost to scrape Nykaa?
Pay per event. Prices per 1,000 events:
| Event | FREE | BRONZE | SILVER | GOLD |
|---|---|---|---|---|
Product (product) | $2.66 | $2.43 | $2.20 | $1.90 |
Product detail (product-details) | $1.10 | $1.00 | $0.90 | $0.80 |
Review (review) | $2.66 | $2.43 | $2.20 | $1.90 |
Product check (product-check) | $0.40 | $0.37 | $0.34 | $0.30 |
Platinum and Diamond plans pay the Gold price. Each run also pays one Actor start event of $0.006 (per GB of memory; the default 256 MB run pays one), with no discount by tier. The Store pricing card shows these same prices per 1,000 events: "$1.90 / 1,000" on the Product row means one product costs 0.19 cents at the Gold tier.
Free: products Nykaa does not have, products left out by your filters, products already delivered in the run (or by your monitor before), paid placements left out, product pages or reviews that could not be read, a product page whose pincode check could not be read (the Product detail event), and every status, coverage and summary row.
Worked examples (Actor start included):
| Run | GOLD | FREE |
|---|---|---|
| 10 products | $0.025 | $0.0326 |
| 1,000 products | $1.906 | $2.666 |
| 1,000 products with Product details | $2.706 | $3.766 |
| 100 products with 20 reviews each | $3.996 | $5.592 |
| a monitor run watching 100 products | $0.036 | $0.046 |
Input
| Setting | What it does |
|---|---|
categories | category pages to read: pick from the list (57 common pages) or type a Nykaa category id (249 for lipstick) |
searchTerms | words to search; Nykaa sends brand names and broad words to its own brand or category page, which is then read with the filters that page's link names |
startUrls | nykaa.com links: category, brand and search pages (their filters, sort and page number kept), product pages (with skuId for one shade) and review pages; through the API as [{"url": "..."}] |
productIds | product or shade ids, read 20 at a time |
brands, filters, minPrice, maxPrice, minDiscount, minRating | Nykaa's own filters (see below) |
sort | default (popularity on category and brand pages, relevance on searches), customer_top_rated, new_arrival, discount, price_low_to_high, price_high_to_low, name |
excludeSponsored | leave out Nykaa's paid placements |
expandSubcategories | when a category or brand page (or a search Nykaa sends to one) stops at its cap (maxItemsPerSearch) or at Nykaa's 10,000 product limit, also read each direct subcategory with the same filters and start page |
maxItemsPerSearch, maxItems, startPage, maxPagesPerSearch | caps; Nykaa serves at most 10,000 products per search, page, filter set and order |
includeDetails, pincode | the Product detail add-on and the delivery check of a pincode |
includeReviews, maxReviewsPerProduct, reviewsSort, reviewsRating, reviewsWithPhotosOnly, reviewsStartPage | the Review add-on |
monitorName, monitorMode, resetMonitor | the monitor (below) |
includePersonalData | adds the reviewer's profile picture and pseudonymous id to review rows (off by default) |
maxRequestRetries, requestTimeoutSecs, proxyConfiguration | how calls are made; with the Apify proxy (the default) the run reads from its own address first, then Apify datacenter sessions on networks Nykaa lets in; with the Apify proxy off and your own proxy links, through your links |
Example input through the API:
{"categories": ["lipstick", "face_moisturizer_day_cream"],"startUrls": [{ "url": "https://www.nykaa.com/brands/lakme/c/604?sort=discount" }],"brands": ["Lakme", "Maybelline New York"],"minPrice": 200,"maxPrice": 1000,"maxItemsPerSearch": 200,"includeDetails": true,"pincode": "400001"}
Filters: Nykaa's own names
Filters are Nykaa's own. Brands are written as Nykaa's brand filter lists them (Lakme, Maybelline New York, Nykaa Cosmetics).
Any other filter of Nykaa's panel goes into filters as "name: value": Skin type: Oily, Concern: Acne & Blemishes,
Gender: Female, Color: Red, Finish: Matte, Ingredient: Niacinamide, Country Of Origin: India. The same name twice
matches either value. Each page's own filter panel is read first and only names and values it lists are sent; a value it does not
list is noted on the coverage row, and a filter none of whose values it lists makes that page deliver nothing, free, rather than a
wider search. Brand, price, discount and rating are checked again on every row, paid placements included; when another filter is
set, paid placements are left out, since a row cannot be checked against it.
The monitor
Give a monitorName and schedule the run:
new_only(default): each run delivers and charges only products and reviews it has not delivered before under that name.changes: each product link or id is read every run and delivered as one Product check row with what changed since the last run (price, MRP, stock; with Product details on, every shade's price and stock too). The first run sets the baseline.
The memory is a named store this Actor creates in your account, one per name.
What this Actor does NOT do
- It does not read Nykaa Fashion (nykaafashion.com) or any other site: nykaa.com only.
- It does not deliver unverified reviews: Nykaa shows verified buyers' reviews only, and no option returns others.
- It does not deliver a delivery date: Nykaa's pincode check gives shipping, city, state and cash on delivery, no date.
- It reads at most 10,000 products per search, page, filter set and order (Nykaa's own limit;
expandSubcategoriesand filters split larger pages) and at most 40 review pages of 50 per product and order (Nykaa shows no page past 40; its pages thin out, so one product gave 1,166 of the 1,849 reviews Nykaa counts on one order, another 1,200 of 1,200 asked for). - It does not deliver whether the signed in reader liked a review, nor Nykaa's "2 years ago" age text: logged out the first is
false on every review, and the second depends on the day of the read (
reviewedAtandreviewDateTextare delivered). - It has no settings for its pace: it paces itself under the limits measured on Nykaa (reviews one call every 2 seconds) and keeps a door Nykaa answers.
- It does not switch to residential proxies before it has delivered a product: when Nykaa refuses the run's own address and the
Apify datacenter sessions it draws, the run stops with a free status row (
residentialUnfunded) instead of paying residential traffic for a run that has earned nothing. Run it again later, or give your own proxy links. - It does not guess a misspelt setting: a setting name the input does not have (
maxitemsformaxItemsPerSearch, or another tool's names) refuses the run with a free status row, and only the run's start fee is charged. - It does not confirm an endless list of ids Nykaa does not have: each unknown id costs a confirming call, so a list made only of unknown ids stops on its work allowance after about 28 of them, with the ids it did not reach named in a free "not read" row (60 unknown ids: 28 confirmed, 32 named). Real ids in the same list earn room for more (35 unknown ids and 5 real ones delivered all 5).
API examples
curl -X POST "https://api.apify.com/v2/acts/automation_craft~nykaa-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"searchTerms": ["vitamin c serum"], "maxItemsPerSearch": 50}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation_craft/nykaa-scraper').call({ categories: ['lipstick'], maxItemsPerSearch: 100, includeDetails: true });const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("automation_craft/nykaa-scraper").call(run_input={"productIds": ["683166"], "includeReviews": True, "maxReviewsPerProduct": 100})items = client.dataset(run["defaultDatasetId"]).list_items().items
FAQ
Is there an API for Nykaa?
Nykaa offers no public product API. This Actor gives you one: call it through the Apify API with categories, search words, links or product ids and get Nykaa's products as JSON, CSV or Excel.
How do I check the price history of a Nykaa product?
Run the Actor on a schedule with a monitorName and monitorMode changes: every run delivers each watched product's price, MRP
and stock with the previous values and what changed, so the dataset of the runs is the product's price history.
Can I compare Nykaa's selling price with the MRP?
Yes. Every product row carries price (the selling price), mrp, discount in rupees and discountPercent; with Product
details on, every shade carries its own price and MRP.
How do I scrape Nykaa reviews?
Turn on Reviews: each product's verified reviews arrive as rows of their own, up to 1,200 per product, in the order and with the star filter you pick, for as many products as the run reads.
Why does this Actor run with limited permissions?
It needs nothing more: it reads Nykaa and writes only to its own run's storage and, for the monitor, to a named store it creates itself. Limited permissions keep it from touching anything else in your account.
Changelog
- 0.1 (2026-10): first release.
More data tools by Automation Craft
- Myntra Scraper: Fashion Products, Prices, Sizes
- Flipkart Scraper: Products, Prices, Sellers
- IndiaMART Scraper: B2B Products, Prices, Suppliers
- Amazon Product Scraper - Search, Best Sellers
- Amazon Sponsored Products Scraper - Ads by Keyword
- Mercari US Scraper: Listings, Sold Prices
- ShopBack Scraper: Cashback, Gift Cards, Affiliates
- Facebook Marketplace Scraper with Sold Tracker
- Zalando Ads Library Scraper - Sponsored Products