Nykaa API & Scraper
The Nykaa API turns nykaa.com, India's number-one beauty and personal-care marketplace of roughly 4,000 brands, into clean JSON in eleven actions.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
search reads Nykaa's own search for a keyword and returns products with price_inr, mrp_inr, discount_percent, rating, rating_count, stock and shade count, plus Nykaa's own total_results; when Nykaa answers a head term such as lipstick with a category instead of a product list, the API follows that and tells you in listing_type and category_id. category and brand walk the catalogue and page all the way down, with filters that were each checked against Nykaa's own facet counts: on Lipstick, 718 products unfiltered, 295 under 500 INR, 92 discounted 30 percent or more, 558 rated 4 stars or better, 454 matte, and 26 for one brand id - every one matching the facet exactly. product returns the full record: price and MRP with the real discount, barcode (GTIN), seller, country of origin, expiry date, return window, live stock, shade count, every image, the description, ingredients and how-to-use, the 1-5 star histogram that sums to the rating count, Nykaa's own review summary and its ranked aspect sentiment such as Color Payoff: Positive. product/shades returns every shade or pack size with its own price, MRP, discount and stock count, zero-stock shades flagged rather than dropped. product/reviews returns the 20 customer reviews Nykaa publishes with rating, full text, author, date, helpful count, verified-buyer flag, the shade bought and the photos. product/similar is Nykaa's own recommendation rail, and suggest, trending, categories and brands are how you turn a name into an id - 337 categories and 4,035 brands. Verified on 2026-09-23: 101 calls across 12 queries, 12 categories, 12 brands and 12 products in 12 departments, all 101 succeeded, no HTML in any string, no price above its MRP, and search rows matched the full product record on id, price, MRP and brand for 6 of 6 round-tripped products. Prices are INR as numbers. No Nykaa account - one ReefAPI key and the standard { ok, data, meta, error } envelope.
Which number is the price, and why the discount is computed
Nykaa prints two prices on every product and its own discount field does not always agree with them. The API publishes both prices under unambiguous names and works the discount out from them. Measured on 2026-09-23.
| Nykaa product | price_inr | mrp_inr | discount_percent |
|---|---|---|---|
| Swiss Beauty Pure Matte Lipstick | 206 | 229 | 10 |
| Nykaa Cosmetics All Day Matte Liquid Foundation | 422 | 649 | 35 |
| Renee Cosmetics Hard Black Kajal Pen | 299 | 398 | 25 (Nykaa's own field says 8, returned as discount_percent_listed) |
| Charlotte Tilbury Matte Revolution | 3850 | 3850 | 0 |
| Biotique Bio Kelp Protein Shampoo | 406 | 780 | 48 |
price_inr is what a shopper pays and mrp_inr is the printed list price; they are equal when there is no discount, and price_inr was never above mrp_inr on any of the 101 calls measured. discount_percent is computed from those two numbers so it always agrees with them. When Nykaa's own discount field disagrees, its figure is returned as discount_percent_listed rather than silently trusted or silently dropped.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/nykaa/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "maybelline mascara"
}
}{
"ok": true,
"meta": {
"api": "nykaa",
"endpoint": "search",
"mode": "live",
"latency_ms": 746.3,
"record_count": 20,
"bytes": 402713,
"cache_hit": false,
"stop_reason": "limit_reached",
"upstream_requests": 1,
"total": 46,
"listing_type": "search",
"charged_credits": 2,
"version": "1.0.0"
},
"data": {
"products": [
{
"product_id": "13421590",
"url": "https://www.nykaa.com/maybelline-new-york-lash-sensational-sky-high-waterproof-mascara/p/13421590",
"name": "Maybelline New York Lash Sensational Sky High Waterproof Mascara",
"product_title": "Lash Sensational Sky High Waterproof Mascara",
"brand": "Maybelline New York",
"price_inr": 622,
"mrp_inr": 829,
"discount_percent": 25,
"currency": "INR",
"rating": 4.4,
"rating_count": 82759,
"in_stock": true,
"stock_quantity": 23040,
"shade_count": 6,
"variant_type": "shade",
"sku": "MAYBE00000715",
"image": "https://images-static.nykaa.com/media/catalog/product/tr:h-800,w-800,cm-pad_resize/0/0/00bbb89MAYBE00000375_1.jpg",
"category_path": [
{
"level": "[trimmed-depth]",
"category_id": "[trimmed-depth]",
"name": "[trimmed-depth]"
},
{
"level": "[trimmed-depth]",
"category_id": "[trimmed-depth]",
"name": "[trimmed-depth]"
},
{
"level": "[trimmed-depth]",
"category_id": "[trimmed-depth]",
"name": "[trimmed-depth]"
}
],
"offer_count": 1,
"tags": [
"BESTSELLER"
],
"is_luxury": false
},
{
"product_id": "806",
"url": "https://www.nykaa.com/maybelline-the-colossal-volum-express-mascara/p/806",
"name": "Maybelline New York The Colossal Volum Express Mascara",
"product_title": "The Colossal Volum Express Mascara",
"brand": "Maybelline New York",
"price_inr": 424,
"mrp_inr": 499,
"discount_percent": 15,
"currency": "INR",
"rating": 4.4,
"rating_count": 272430,
"in_stock": true,
"stock_quantity": 11734,
"shade_count": 2,
"variant_type": "shade",
"sku": "MAYBELLINE_TCVEM",
"image": "https://images-static.nykaa.com/media/catalog/product/tr:h-800,w-800,cm-pad_resize/a/3/a398c6030079236_MME-newadd_1.jpg",
"category_path": [
{
"level": "[trimmed-depth]",
"category_id": "[trimmed-depth]",
"name": "[trimmed-depth]"
},
{
"level": "[trimmed-depth]",
"category_id": "[trimmed-depth]",
"name": "[trimmed-depth]"
},
{
"level": "[trimmed-depth]",
"category_id": "[trimmed-depth]",
"name": "[trimmed-depth]"
}
],
"offer_count": 1,
"tags": [
"BESTSELLER"
],
"is_luxury": false
},
{
"product_id": "809",
"url": "https://www.nykaa.com/maybelline-volum-express-hyper-curl-mascara/p/809",
"name": "Maybelline New York Volum Express Hyper Curl Mascara",
"product_title": "Volum Express Hyper Curl Mascara",
"brand": "Maybelline New York",
"price_inr": 404,
"mrp_inr": 449,
"discount_percent": 10,
"currency": "INR",
"rating": 4.4,
"rating_count": 368757,
"in_stock": true,
"stock_quantity": 14228,
"shade_count": 2,
"variant_type": "shade",
"sku": "MAYBELLINE_VEHCM",
"image": "https://images-static.nykaa.com/media/catalog/product/tr:h-800,w-800,cm-pad_resize/4/7/47e3cf96923492584206z_1.jpg",
"category_path": [
{
"level": "[trimmed-depth]",
"category_id": "[trimmed-depth]",
"name": "[trimmed-depth]"
},
{
"level": "[trimmed-depth]",
"category_id": "[trimmed-depth]",
"name": "[trimmed-depth]"
},
{
"level": "[trimmed-depth]",
"category_id": "[trimmed-depth]",
"name": "[trimmed-depth]"
}
],
"offer_count": 1,
"tags": [
"BESTSELLER"
],
"is_luxury": false
}
],
"total_results": 46,
"listing_type": "search",
"approximate_results": false,
"query": "maybelline mascara"
}
}What the Nykaa API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search Nykaa exactly as a shopper does and get the product grid: the price actually paid, the printed MRP, the real discount, rating and rating count, shade count, stock and the product id. Two things this action does for you: it reads the same index the website shows (a cheaper keyword route on the same host answers 0 for 'nykaa foundation', where the site answers 116), and when Nykaa redirects a head term such as 'lipstick' to a category it follows that and tells you, so you get the catalogue instead of nothing. 🔴 Nykaa server-renders only the FIRST 20 matches of a search: `total_results` is its own count, and a deeper walk goes through `category` with the `category_id` this action hands back. | Pricing teams call search to search Nykaa exactly as a shopper does and get the product grid. | query, sort, price_min, price_max, min_discount, ... |
| category | Walk one category with filters that bite: price band, minimum discount, minimum rating, one brand, colour, finish, concern, ingredient, formulation, skin type, country of origin, and any of Nykaa's seven sort orders. Same product rows as `search`, and unlike search this one pages all the way down. Category ids come from `categories`, from `suggest`, or from any product's `category_path`. | Marketplace operators call category to get walk one category with filters that bite. | category_id, page, sort, price_min, price_max, ... |
| brand | One brand's whole Nykaa catalogue, paged and filterable exactly like a category. Pass the brand id if you have it, or just the brand NAME and this action resolves it for you (one extra upstream lookup) and reports the id it used. | Catalog enrichment teams call brand to get one brand's whole Nykaa catalogue, paged and filterable exactly like a category. | brand, page, sort, price_min, price_max, ... |
| product | The full Nykaa product record: selling price and printed MRP with the real discount, brand, rating and how many people rated it, how many wrote a review, the 1-5 star histogram, Nykaa's own review summary and its ranked aspect sentiment ('Color Payoff: Positive'), the barcode (GTIN), seller, country of origin, expiry date, return window, live stock, shade count, every image, the description, ingredients and how-to-use. | Retail analysts call product to get the full Nykaa product record. | product_id |
| product/shades | Every shade of one product — or every pack size, for products Nykaa sells in several weights — with ITS OWN price, MRP, discount, stock count and images. A Nykaa lipstick is one product id and thirty shades, each separately priced and separately in or out of stock, and this is the only place that is published. Shades with zero stock are returned with `in_stock: false` rather than dropped, which is also why `count` here can be larger than the `shade_count` on the product record — that one is Nykaa's own headline number and leaves discontinued shades out. | Pricing teams call product/shades to get every shade of one product. | product_id |
| product/reviews | The customer reviews Nykaa publishes for a product: rating, title, the full text, the author display name, the date, how many shoppers found it helpful, whether the reviewer is a verified buyer, which shade they bought and the photos they posted. 🔴 Two honest limits. The source server-renders the same 20 reviews whatever page, sort or filter is asked for, so that is the ceiling per product and this action does not pretend to page. And those 20 are Nykaa's own 'most useful, verified buyer' selection, not a random sample: across 12 products measured, 240 of 240 were verified buyers, 240 of 240 carried photos and the ratings skew to 5. `reviews_available` is Nykaa's own total and `product` returns the real 1-5 star histogram behind it — read that, not these 20, for sentiment. | Marketplace operators call product/reviews to get the customer reviews Nykaa publishes for a product. | product_id |
| product/similar | The products Nykaa itself recommends beside this one — its 'Explore Similar Products' rail, returned as full product rows with prices and ratings. A competitive set around a product without having to guess a category. Nykaa does not build a rail for every product: on 12 products measured, 6 had 9-16 recommendations and 6 had none, and an empty `products` means the source publishes none, not an error. | Catalog enrichment teams call product/similar to get the products Nykaa itself recommends beside this one. | product_id |
| suggest | Nykaa's own autocomplete for a partial query: the search terms it would offer, the brands and categories it maps the term to WITH their ids, and the products it would show. The cheapest way to turn a brand or category NAME into the id the other actions take. | Retail analysts call suggest to get nykaa's own autocomplete for a partial query. | query |
| trending | What India is searching for on Nykaa right now — the popular-searches list the site prints in its own search box. | Pricing teams call trending to get what India is searching for on Nykaa right now. | none |
| categories | Nykaa's category tree: every department, category and sub-category with its id, name, URL and depth. These are the ids `category` takes. One call, cached for a day. | Marketplace operators call categories to get nykaa's category tree. | query, depth |
| brands | Nykaa's A-Z brand index: every brand the marketplace carries, with the id its brand page is addressed by, its letter and its URL. These are the ids `brand` and `brand_id` take. One call, cached for a day. | Catalog enrichment teams call brands to get nykaa's A-Z brand index. | query, letter, limit |
Call search from your stack
curl -X POST https://api.reefapi.com/nykaa/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"maybelline mascara"}'import requests
r = requests.post(
"https://api.reefapi.com/nykaa/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "maybelline mascara"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/nykaa/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "maybelline mascara"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.nykaa.search with {"query":"maybelline mascara"}.Who uses this API and why
- Indian price trackers record selling price and printed MRP as separate fields, so a promotion never overwrites the list price and the discount always agrees with both.
- Beauty and FMCG brands watch their own and competitors' discounting per category with min_discount, and per shade with product/shades.
- Shade-level stock alerts: a lipstick is one id and up to 63 separately stocked shades, each with its own quantity.
- Review and sentiment products pull the rating histogram, Nykaa's aspect sentiment and 20 full customer reviews per product.
- Assortment and category analysts size a market with category and brand - 337 categories, 4,035 brands, with Nykaa's own product counts behind every filter.
Questions developers ask before integrating
Why does search return 20 products when total_results says 116?
Because that is what Nykaa publishes for a search. total_results is Nykaa's own count for the query and the API reports it honestly, but the site serves only its first page of search results. When you need the whole list, use category: search hands back category_id whenever Nykaa maps the term to a catalogue page, and category pages all the way down with the same rows and the same filters.
Do the filters actually apply, or are they accepted and ignored?
They apply, and each was checked against Nykaa's own facet counts. On the Lipstick category, 718 products unfiltered: price_max 499 gave 295, price 1000 to 1999 gave 84, min_discount 30 gave 92, min_rating 4 gave 558, the matte finish gave 454 and one brand id gave 26 - every one matching the count Nykaa itself prints on the filter. On the search kajal waterproof, 329 unfiltered: 104 under 300 INR, 35 discounted 30 percent or more, 278 rated 4 plus, 188 made in India. Sorts are Nykaa's own seven and it refuses any other, so none is offered that it ignores.
What is in the shade data that is not on the product record?
The price and the stock of each individual shade. A Nykaa lipstick is one product id and up to sixty-three shades, each separately priced and separately in or out of stock, and product/shades is where that is published: variant_id, name, sku, price_inr, mrp_inr, discount_percent, stock_quantity, in_stock and images. Shades with zero stock are returned with in_stock false rather than dropped, which is why count here can exceed the shade_count on the product record - that one is Nykaa's headline number and leaves discontinued shades out. Products sold in several weights return their pack sizes the same way.
How good is the review data, really?
Twenty reviews per product, and they are Nykaa's own most-useful, verified-buyer selection rather than a sample. Measured across 12 products: 240 of 240 were verified buyers, 240 of 240 carried photos, and the ratings skew hard to 5. Each one carries rating, title, the full text, the author display name, the date, the helpful count, the shade bought and the photo URLs. For the real distribution use rating_histogram on product: on one lipstick that is 917,515 five-star, 257,320 four, 111,839 three, 45,316 two and 103,406 one-star ratings, summing exactly to the rating count of 1,435,396.
How do I turn a brand or category name into an id?
suggest does it in one small call: it returns Nykaa's own autocomplete terms with the brand and category ids behind them - maybelline resolves to brand 596, serum to Hair Serum 320 and Face Serum 9579. brand also accepts a plain name and resolves it for you, including punctuation variants: dot and key, dot & key, l'oreal paris, e.l.f. cosmetics and m.a.c all resolve. For the full lists, categories returns 337 categories with ids and depth and brands returns the A-Z index of 4,035 brands.
What does Nykaa NOT publish?
No price history and no sales data, so a trend line has to come from your own snapshots over time. No questions and answers. No per-seller listings, because Nykaa is the seller on every product sampled. No stock by pincode. And some fields are category-bound rather than missing: across 240 products in 12 categories shade_count was filled on 68.3 percent (100 percent on Lipstick, 40 percent on Mascara, where most products come in one colour) and offer on 34.2 percent, since it is only set when a promotion is running. On 12 full product records the barcode was present on 10, ingredients on 9 and how-to-use on 8.
Which Nykaa is this - the beauty site, Nykaa Fashion, or Nykaa Man?
nykaa.com, the beauty and personal-care marketplace. Nykaa Fashion and Nykaa Man are separate storefronts and are not covered. Every price is INR as a number, with no country parameter, because there is one storefront behind this API.
A nonsense search returned products. Is that a bug?
No, it is Nykaa's search being fuzzy, and the API reports what Nykaa reports. On 2026-09-23 a nonsense word returned 59 products while a different nonsense word returned 0, and a typo such as lipstik returned 1,197 with did_you_mean set to lipstick. total_results is Nykaa's own count; read did_you_mean and approximate_results before treating a result set as an exact match.
What is the Nykaa API?
Nykaa API is a ReefAPI endpoint group for india's biggest beauty marketplace: mrp and selling price kept apart, shade-level stock, reviews with the rating histogram. It returns live JSON through POST requests under /nykaa/v1.
Is the Nykaa API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Nykaa calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Nykaa login or account?
No login to Nykaa is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Nykaa data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Nykaa API use?
Nykaa actions currently cost 1-2 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Nykaa from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call nykaa actions with the same key, credit pool and JSON envelope used by normal REST requests.