# Sephora Scraper (`shahidirfan/sephora-scraper`) Actor

Extract product details, prices, and reviews directly from Sephora's vast catalog. Unlock valuable beauty market insights, track cosmetics trends, and power your competitor analysis with ease. For the most reliable and seamless data extraction, residential proxies are recommended.

- **URL**: https://apify.com/shahidirfan/sephora-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** E-commerce, Developer tools, Automation
- **Stats:** 18 total users, 0 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Sephora Product Scraper

Extract complete product listings from Sephora category pages with pricing, ratings, reviews, stock status, and direct product links. Build reliable datasets for beauty market research, pricing visibility, and merchandising intelligence across any Sephora category.

### Features

- **Complete product data** - Collect brand, title, prices, ratings, review counts, shade information, stock status, and product type from every listing
- **Duplicate-safe output** - Built-in product-level deduplication prevents repeated records across paginated pages
- **Stock awareness signals** - Capture in-stock and low-stock flags to track product availability
- **Clean dataset structure** - Empty fields are automatically omitted to keep output analysis-ready
- **Automatic pagination** - Continues through listing pages until your target count is reached

### Use Cases

#### Pricing Intelligence

Track current and original prices across categories to monitor discount patterns and promotional behavior. Identify price changes between scheduled runs.

#### Merchandising Analysis

Analyze new and exclusive product flags to understand launch timing and campaign focus. Track product nature classifications and brand positioning.

#### Inventory Monitoring

Monitor stock status changes across product ranges. Identify low-stock items and track availability patterns over time.

#### Category Research

Compare product mix, shade depth, pricing structure, and brand distribution across different Sephora categories for competitive benchmarking.

***

### Input Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrl` | String | No | Sephora new makeup URL | Sephora category page to start scraping from |
| `results_wanted` | Integer | No | `20` | Maximum number of products to collect |
| `max_pages` | Integer | No | `10` | Safety cap on listing pages to visit |
| `proxyConfiguration` | Object | No | Apify default | Proxy settings for reliable collection |

***

### Output Data

Each dataset item can include:

| Field | Type | Description |
|-------|------|-------------|
| `product_id` | String | Stable Sephora product identifier |
| `brand` | String | Brand name |
| `title` | String | Product title |
| `image_url` | String | Product image URL |
| `product_url` | String | Product detail page URL |
| `current_price` | Number | Current listed price |
| `original_price` | Number | Original price when on sale |
| `currency` | String | Currency code (typically AED) |
| `rating` | Number | Average customer rating |
| `review_count` | Integer | Number of customer reviews |
| `shades` | String | Shade or variant count label |
| `is_new` | Boolean | New arrival badge indicator |
| `is_exclusive` | Boolean | Sephora exclusive badge indicator |
| `in_stock` | Boolean | Product availability status |
| `is_low_stock` | Boolean | Low stock warning indicator |
| `product_type` | String | Product type classification |
| `product_nature` | String | Product nature or formulation category |
| `scraped_at` | String | ISO timestamp of extraction |

***

### Usage Examples

#### Quick Validation Run

Collect a small sample to verify settings:

```json
{
  "results_wanted": 20,
  "max_pages": 3
}
```

#### Full Category Extraction

Scrape an entire category with all available products:

```json
{
  "startUrl": "https://www.sephora.me/ae-en/shop/skincare/view-all/skincare",
  "results_wanted": 500,
  "max_pages": 20
}
```

#### Proxy-Enabled Collection

Use residential proxies for larger or recurring runs:

```json
{
  "startUrl": "https://www.sephora.me/ae-en/shop/makeup/face",
  "results_wanted": 100,
  "max_pages": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

***

### Sample Output

```json
{
  "product_id": "P10064328",
  "brand": "HUDA BEAUTY",
  "title": "Liquid Matte Mousse",
  "image_url": "https://img-product.sephora.me/dw/image/v2/BKWK_PRD/on/demandware.static/-/Sites-masterCatalog_Sephora/default/dwce76b30f/images/hi-res/SKU/SKU_7634/818919_swatch.jpg",
  "product_url": "https://www.sephora.me/ae-en/p/liquid-matte-mousse/P10064328",
  "current_price": 125,
  "currency": "AED",
  "rating": 4.59,
  "review_count": 41,
  "shades": "8 shades",
  "is_new": true,
  "is_exclusive": true,
  "in_stock": true,
  "is_low_stock": false,
  "product_type": "master",
  "scraped_at": "2026-07-19T09:18:27.133Z"
}
```

***

### Tips for Best Results

#### Start With Small Batches

Use `results_wanted` between 20 and 50 for initial validation. Gradually increase for production snapshots.

#### Use Stable Category URLs

Prefer permanent Sephora category URLs over short-lived campaign links for consistent, repeatable runs.

#### Enable Proxies for Scale

Residential proxy groups help maintain reliability when collecting large datasets or running frequent schedules.

***

### Integrations

Connect your collected data with:

- **Google Sheets** - Build tracking dashboards from exported product data
- **Airtable** - Create searchable product intelligence bases
- **Zapier** - Trigger downstream automations when new runs finish
- **Make** - Route scraped data into CRM, BI, or reporting workflows
- **Webhooks** - Push dataset events to custom services

#### Export Formats

- **JSON** - Great for APIs and pipelines
- **CSV** - Spreadsheet-friendly format
- **Excel** - Business reporting and sharing
- **XML** - System interoperability

***

### Frequently Asked Questions

#### Can I scrape categories other than new makeup?

Yes. Set `startUrl` to any Sephora category listing URL. The actor automatically detects the category from the URL path.

#### What stock information is available?

The output includes `in_stock` and `is_low_stock` boolean fields that reflect real-time product availability from the listing data.

#### Why are some fields missing in certain rows?

If the source does not provide a value, that field is omitted from the record to keep the output clean and analysis-ready.

#### Does the actor handle duplicate products?

Yes. Product-level deduplication by product ID and URL is applied before saving any records.

#### How many products can I collect per run?

You can scale via `results_wanted` and `max_pages` based on category size. Most categories return results within seconds.

#### Can I schedule recurring runs?

Yes. You can schedule regular runs directly from the Apify platform for ongoing market monitoring.

***

### Support

For bug reports or feature requests, use the Apify Console issue and contact options for this actor.

***

### Legal Notice

This actor is intended for legitimate data collection and analysis. You are responsible for complying with applicable laws and website terms when using scraped data.

# Actor input Schema

## `startUrl` (type: `string`):

Start scraping from a specific Sephora category URL. Defaults to new makeup products.

## `results_wanted` (type: `integer`):

The maximum number of products to collect. Leave empty to collect all available products.

## `max_pages` (type: `integer`):

A safety cap on the number of pages to visit.

## `proxyConfiguration` (type: `object`):

Use Apify Proxy for reliable scraping. Residential proxies recommended for Sephora.

## Actor input object example

```json
{
  "startUrl": "https://www.sephora.me/ae-en/shop/new/view-all/new-in-makeup/new-makeup",
  "results_wanted": 20,
  "max_pages": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrl": "https://www.sephora.me/ae-en/shop/new/view-all/new-in-makeup/new-makeup",
    "results_wanted": 20,
    "max_pages": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/sephora-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 = {
    "startUrl": "https://www.sephora.me/ae-en/shop/new/view-all/new-in-makeup/new-makeup",
    "results_wanted": 20,
    "max_pages": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/sephora-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "startUrl": "https://www.sephora.me/ae-en/shop/new/view-all/new-in-makeup/new-makeup",
  "results_wanted": 20,
  "max_pages": 10
}' |
apify call shahidirfan/sephora-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=shahidirfan/sephora-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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