# Nykaa Product Search Scraper (`stealth_mode/nykaa-product-search-scraper`) Actor

Scrape Nykaa.com product search listings effortlessly. Collect prices, ratings, discounts, stock status, brand info, and 45+ fields per product — perfect for price monitoring, market research, and competitive analysis in India's beauty industry.

- **URL**: https://apify.com/stealth_mode/nykaa-product-search-scraper.md
- **Developed by:** [Stealth mode](https://apify.com/stealth_mode) (community)
- **Categories:** Automation, Developer tools, E-commerce
- **Stats:** 31 total users, 6 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Nykaa Products Search Scraper: Extract Beauty & Skincare Data at Scale

***

### What Is Nykaa.com?

Nykaa is one of India's largest beauty and personal care e-commerce platforms, hosting hundreds of thousands of products across skincare, haircare, makeup, and wellness. With constantly shifting prices, flash sales, and new launches, tracking product data manually is impractical. The **Nykaa Products Search Scraper** automates this, turning category and search pages into structured, analysis-ready datasets.

***

### Overview

The **Nykaa Products Search Scraper** collects product cards from Nykaa's category and search result pages — everything visible in a product grid. It is suited for:

- **Price comparison platforms** aggregating beauty product pricing
- **Brand managers** monitoring their listings and competitor positioning
- **Market researchers** analyzing product availability, ratings, and discount trends
- **Data engineers** building beauty retail datasets

***

### Input Format

The Actor supports **two scraping modes** — use only **one at a time**:

1. **Scrape by URLs** — scrape data directly from a list of Nykaa category or search result page URLs.

```json
{
  "ignore_url_failures": true,
  "max_items_per_url": 200,
  "urls": [
    "https://www.nykaa.com/skin/moisturizers/night-cream/c/8395?page_no=2&sort=popularity"
  ]
}
```

2. **Scrape by search filters** — scrape data using a keyword and additional filters (sort order, price, discount, rating, gender, color) instead of providing URLs.

```json
{

  "keyword": "ab",
  "sort_by": "discount",
  "price_range": "500-1000",
  "discount": "",
  "rating": "",
  "gender": "",
  "color": "",
  "page": 1,
  "max_items_per_url": 200,
}

```

There is also a **General settings** group that applies to both modes.

#### 1. Scrape by URLs

Use this mode when you already have specific category or search result URLs. When this mode is used, all options in the "Scrape by search filters" section will be disabled.

| Field | Type | Default | Description |
|---|---|---|---|
| `urls` | `array` of strings | *(required)* | One or more Nykaa category or search result page URLs to scrape. Add URLs one by one, or use the Bulk edit section to paste a prepared list. Example: `https://www.nykaa.com/skin/moisturizers/night-cream/c/8395?page_no=2&sort=popularity` |
| `ignore_url_failures` | `boolean` | `true` | If `true`, the scraper skips failed URLs and continues running rather than stopping the entire job. Recommended for bulk runs. |

#### 2. Scrape by search filters

Use this mode when you want to search using a keyword and additional filter attributes instead of scraping by URLs. If you use this mode, leave the `urls` field above empty.

| Field | Type | Default | Description |
|---|---|---|---|
| `keyword` | `string` | — | The keyword to search for. |
| `sort_by` | `string` (`relevance_new`, `discount`, `name`, `customer_top_rated`, `new_arrival`, `price_desc`, `price_asc`) | — | Sort results by Relevance, Discount, Name, Customer Top Rated, New Arrival, Price: High to Low, or Price: Low to High. |
| `price_range` | `string` (`""`, `0-499`, `500-999`, `1000-1999`, `2000-3999`, `4000-*`) | — | Filter by price range in Rs.: All, 0–499, 500–999, 1000–1999, 2000–3999, or 4000 & Above. |
| `discount` | `string` (`""`, `70-*`, `60-*`, `50-*`, `40-*`, `30-*`, `20-*`, `10-*`, `0-*`) | — | Filter by minimum discount: All, 70% and above, down to 10% and above, or all discounted products. |
| `rating` | `string` (`''`, `4`, `3`, `2`, `1`) | — | Filter by minimum customer rating: All, 4 stars & above, down to 1 star & above. |
| `gender` | `string` (`""`, `10711`, `10710`, `10712`) | — | Filter by target gender: All, Female, Male, Unisex. |
| `color` | `string` | — | Filter by product color. Select from the available Nykaa color options (e.g., Black, Blue, Grey, Pink, Multi-Color, White, Red, Brown, and many more — see the dropdown for the full list). |
| `page` | `integer` | — | The page number to start scraping from. |

#### 3. General settings

Applies to both scraping modes above.

| Field | Type | Default | Description |
|---|---|---|---|
| `max_items_per_url` | `integer` | `20` | The maximum number of products to collect per URL/search. Set higher (e.g., `200`) for full category sweeps. |

> **Tip:** To scrape multiple pages of a category, add each paginated URL separately (e.g., `?page_no=1`, `?page_no=2`). You can also vary the `sort=` parameter (`popularity`, `price_asc`, `new_arrivals`) for different slices of the same category.

***

### Output Format

**Sample output**

```json
{
  "brand_ids": "8242",
  "brand_name": "LANEIGE",
  "button_text": "ADD TO BAG",
  "new_button_text": "Add to Bag",
  "category_ids": "8400,3841,194,8399,8242,7287,7303,7309,77,1300,1303,60090,60092,53665,61470,61852,61964,61979,8394,62177,25750,62217,62880,58039,63379,63452,64323,64365,64577,64493,64478,64619,64627,64645,64655,64897,64654,64657,64658,66312,66370,60264,30725,67383,67456,67914,68236,68433,69261,69524,69616,69645,9320,69736,69429,69431,70103,61882,70260,69741,69742,70627,69743,70257,69745,69740,70998,70997,69744,71537,71536,714,2871,3958,3965,11723,11765,11766,11774,71570,71656,71660,67408,72132,67994,72212,26530,72289,72644,72721,72789,71413,73426,8377,68595,66097,73657,73656,72853,73947,73999,74120,74171,74284,74288,72858,74307,63864,74860,74962,15752,75599,75844,75897,76240,76409,76419,76560,76637,76784,73339,61151,67379,78179,78180,78388,78438,78562,73917,78717,78718,78721,78722,79049,79105,79122,79123,79248,79256,79255,78731,79215,79275,79379,6184,79587,79588,79608,79605,75621,80092,80390,80399,80796,30710,81694,81842,81847,82156,82153,82196,82197,81856,81942,81943,81945,82394,80932,64653,82493,82499,81952,82518,81949,82533,82534,82520,82541,82543,82567,81953,81940,78951,82503,82590,82942,83608,84175,8395,79991,66753,84146,84762,84827,84828,84829,84830,84831,84856,84893,84927,84928,85117,66302,85181,85298,85516,85517,85518,85519,85520,85688,85700,85927,86179,86262,86429,86581,86727,86728,86729,86730,86777,86799,86801,86800,86798,86857,86866,88286,88387,21447,87210,88518,87199,87207,88535,88551,88563,88575,88576,88214,88697,88894,89123,89242,89262,88728,88727,89779,90503,90426,88982,88737,90622,90868,88724,90669,91238,6961,91993,94495,95259,94247,94245,94241,95427,94890,95491,94252,95438,95577,95994,96233,95178,95179,95180,95183,96791,97035,97221,97373,100332,100376,100377,100938,100914,7415,7510,100800,102189,101760,102537,102437,102786,102529,102751,102990,103026,102864,103005,101423,102866,101424,103594,101427,103674,101426,103939,104789,64795,68788,79137,67640,73106,69507,65682,100273,64794,64682,64991,63751,64651,101019,64843,86257,68789,64797,64629,65462,67202,101119,64746,63759,74279,64727,64744,90728,64678,2,64795,68788,79137,67640,73106,69507,65682,100273,64794,64682,64991,63751,64651,101019,64843,86257,68789,64797,64629,65462,67202,101119,64746,63759,74279,64727,64744,90728,64678",
  "child_id": "14231925",
  "dynamic_tags": [],
  "new_tags": [
    {
      "border_color": "",
      "title": "BEST IN BEAUTY",
      "transparency_web": 1,
      "image_url": "",
      "bg_color": "#ffffff",
      "transparency": "FF",
      "title_color": "#006DFF",
      "fontweight": "600",
      "fontsize": "12"
    }
  ],
  "id": "14231925",
  "image_url": "https://images-static.nykaa.com/media/catalog/product/tr:h-200,w-200,cm-pad_resize/9/e/9e7a019LANEI00000293_aa1.jpg",
  "in_stock": true,
  "mrp": 1300,
  "name": "LANEIGE Bouncy And Firm Sleeping Mask",
  "offers_count": 3,
  "only_wishlist_button": false,
  "parent_id": "14231925",
  "price": 1105,
  "primary_categories": {
    "l1": {
      "id": "8377",
      "name": "Skin"
    },
    "l2": {
      "id": "8393",
      "name": null
    },
    "l3": {
      "id": "8395",
      "name": "Night Cream"
    }
  },
  "product_id": "14231925",
  "pro_flag": 0,
  "quantity": 120,
  "rating": 4.5,
  "rating_count": 1168,
  "slug": "laneige-bouncy-and-firm-sleeping-mask/p/14231925",
  "title": "LANEIGE Bouncy And Firm Sleeping Mask",
  "product_title": "Bouncy And Firm Sleeping Mask",
  "type": "configurable",
  "variant_count": 2,
  "discount": 15,
  "variant_type": "size",
  "is_backorder": false,
  "is_lux": 1,
  "is_free_sample": false,
  "offer": "Get Complimentary Product",
  "offer_color": "",
  "offer_id": 1138846,
  "show_offer": true,
  "is_mini": false,
  "sku": "LANEI00000294",
  "tracking_metadata": {
    "es_score": 45.766186,
    "popularity": 45.76618405891639
  },
  "pr_data": null,
  "is_pr_enabled": false,
  "is_early_access": false,
  "is_flash_sale": false,
  "call_outs_template": null,
  "cohort_sale_template": null,
  "disable_prive_product": false,
  "secondary_tag": "https://images-static.nykaa.com/media/Editor_Pickv2.png",
  "secondary_tag_v2": "https://images-static.nykaa.com/media/Editor_Pickv2.png",
  "from_url": "https://www.nykaa.com/skin/moisturizers/night-cream/c/8395?page_no=2&sort=popularity"
}
```

Each product record contains up to 49 fields:

#### Core Product Identity

| Field | Meaning |
|---|---|
| `ID` | Internal Nykaa record identifier |
| `Product ID` | Nykaa's canonical product identifier |
| `Child ID` | Variant-level ID (e.g., specific shade or size) |
| `Parent ID` | ID of the parent product grouping all variants |
| `SKU` | Stock Keeping Unit code for the specific variant |
| `Slug` | URL-friendly identifier used in the product page path |
| `Name` | Base product name |
| `Title` | Full display title shown in search results |
| `Product Title` | Alternate title field used in some listing contexts |
| `Type` | Product type classification (e.g., `simple`, `configurable`) |

#### Brand & Category

| Field | Meaning |
|---|---|
| `Brand Name` | Name of the brand selling the product |
| `Brand IDs` | Internal IDs associated with the brand |
| `Category IDs` | IDs of all categories the product belongs to |
| `Primary Categories` | Main category path (e.g., Skincare > Moisturizers) |

#### Pricing & Discounts

| Field | Meaning |
|---|---|
| `MRP` | Maximum Retail Price (original listed price) |
| `Price` | Current selling price after any discount |
| `Discount` | Discount amount or percentage off MRP |
| `Offers Count` | Number of active offers on the product |
| `Offer` | Description of the primary active offer |
| `Offer Color` | UI color code associated with the offer badge |
| `Offer ID` | Identifier for the active offer |
| `Show Offer` | Flag indicating whether the offer badge is displayed |

#### Availability & Stock

| Field | Meaning |
|---|---|
| `In Stock` | Boolean — whether the product is currently available |
| `Quantity` | Available stock quantity |
| `Is Backorder` | Whether the product can be ordered when out of stock |
| `Variant Count` | Total number of variants available (sizes, shades, etc.) |
| `Variant Type` | Type of variant (e.g., size, shade, pack) |

#### Ratings & Reviews

| Field | Meaning |
|---|---|
| `Rating` | Average customer rating (typically out of 5) |
| `Rating Count` | Total number of ratings submitted |

#### Media

| Field | Meaning |
|---|---|
| `Image URL` | URL of the product's primary thumbnail image |

#### Tags & Merchandising

| Field | Meaning |
|---|---|
| `Dynamic Tags` | System-generated tags (e.g., "Bestseller", "New") |
| `New Tags` | Updated or A/B-tested tag variants |
| `Secondary Tag` | Secondary badge or label on the listing |
| `Secondary Tag V2` | Updated version of the secondary tag |
| `Call Outs Template` | Template identifier for promotional callout banners |
| `Cohort Sale Template` | Sale template used for targeted user cohorts |

#### Buttons & UI State

| Field | Meaning |
|---|---|
| `Button Text` | Primary CTA button label (e.g., "Add to Bag") |
| `New Button Text` | Updated CTA button label variant |
| `Only Wishlist Button` | If `true`, only a wishlist button is shown (not add-to-cart) |

#### Special Listing Flags

| Field | Meaning |
|---|---|
| `Pro Flag` | Whether the product is a Nykaa PRO exclusive |
| `Is Lux` | Whether the product is in the Nykaa Luxe segment |
| `Is Free Sample` | Whether the item is a free sample offer |
| `Is Mini` | Whether the product is a travel/mini-size variant |
| `Is Early Access` | Whether the listing is part of an early access launch |
| `Is Flash Sale` | Whether the product is currently in a flash sale |
| `Disable Prive Product` | Whether the product is hidden from Prive loyalty members |

#### Analytics & Tracking

| Field | Meaning |
|---|---|
| `Tracking Metadata` | Event-tracking data for analytics integrations |
| `PR Data` | Promotional/PR metadata associated with the listing |
| `Is PR Enabled` | Whether PR promotional rules are active for this product |

***

### How to Use

1. **Find your target URL** — Navigate to any Nykaa category, brand, or search results page and copy the URL.
2. **Adjust pagination** — Modify `?page_no=` in the URL to target specific pages.
3. **Configure input** — Paste URLs into the `urls` array; set `max_items_per_url` based on how many products you need.
4. **Run the scraper** — Start the actor and wait for completion.
5. **Export** — Download results as JSON, CSV, or Excel.

**Best practices:**

- For full category coverage, generate paginated URLs for all available pages.
- Use `sort=price_asc` or `sort=new_arrivals` to capture different product orderings.
- Set `ignore_url_failures: true` whenever running more than a few URLs.

***

### Use Cases & Business Value

- **Price monitoring:** Track MRP vs. selling price fluctuations and discount patterns across categories
- **Competitor benchmarking:** Compare brand positioning, ratings, and offer strategies
- **Inventory intelligence:** Monitor stock availability and backorder trends
- **New launch tracking:** Use `Is Early Access` and `Dynamic Tags` to surface new product introductions
- **Retail analytics:** Feed structured data into BI dashboards for beauty market reporting

***

### Conclusion

The **Nykaa Products Search Scraper** delivers a deep, structured view of India's largest beauty platform — far beyond what manual browsing can provide. With 49 output fields covering pricing, availability, ratings, tags, and merchandising signals, it is a robust foundation for any beauty retail data project. Configure your URLs, run the scraper, and get market-ready data in minutes.

# Actor input Schema

## `urls` (type: `array`):

Add the URLs of the product search list urls you want to scrape. You can paste URLs one by one, or use the Bulk edit section to add a prepared list.

## `ignore_url_failures` (type: `boolean`):

If true, the scraper will continue running even if some URLs fail to be scraped.

## `keyword` (type: `string`):

Enter the keyword to search for items

## `sort_by` (type: `string`):

Sort items by options

## `price_range` (type: `string`):

Enter the price range to search for items

## `discount` (type: `string`):

Enter the discount to search for items

## `rating` (type: `string`):

Enter the rating to search for items

## `gender` (type: `string`):

Enter the gender to search for items

## `color` (type: `string`):

Enter the color to search for items

## `page` (type: `integer`):

Specify the page number to start scraping from

## `max_items_per_url` (type: `integer`):

The maximum number of items to scrape per URL.

## Actor input object example

```json
{
  "urls": [
    "https://www.nykaa.com/skin/moisturizers/night-cream/c/8395?page_no=2&sort=popularity"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://www.nykaa.com/skin/moisturizers/night-cream/c/8395?page_no=2&sort=popularity"
    ],
    "ignore_url_failures": true,
    "max_items_per_url": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("stealth_mode/nykaa-product-search-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "urls": ["https://www.nykaa.com/skin/moisturizers/night-cream/c/8395?page_no=2&sort=popularity"],
    "ignore_url_failures": True,
    "max_items_per_url": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("stealth_mode/nykaa-product-search-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.nykaa.com/skin/moisturizers/night-cream/c/8395?page_no=2&sort=popularity"
  ],
  "ignore_url_failures": true,
  "max_items_per_url": 20
}' |
apify call stealth_mode/nykaa-product-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,stealth_mode/nykaa-product-search-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/iyzVWb0mqnOdOdfxH/builds/mP0EkykRT4RrF6ItZ/openapi.json
