# Sephora Product Scraper (`khadinakbar/sephora-product-scraper`) Actor

Extract public Sephora US products from keyword searches or product pages. Returns normalized product identity, price, availability, rating aggregates, ingredients, images, variants, source URLs, and collection time for beauty catalog research.

- **URL**: https://apify.com/khadinakbar/sephora-product-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** E-commerce, Automation, MCP servers
- **Stats:** 1 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 product scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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 for US Catalog Research

Extract structured product records from public Sephora US product pages or keyword searches for beauty catalog research, price observation, ingredient analysis, and variant comparison. Each dataset row represents one normalized product with canonical identity, public price and availability, rating aggregates, images, ingredients, variants, source URL, and collection time.

### Best fit for this Actor

Choose this Actor when your workflow starts with Sephora US search terms or public product URLs and needs product-level catalog data. It supports broad keyword discovery and detail-first extraction through the same normalized product contract.

### Focused standalone workflow

This Actor is designed as a focused standalone workflow for public Sephora US product discovery and product-detail research.

### A practical assortment scenario

A beauty category analyst starts with selected search terms and collects a product dataset with brand, price, availability, rating, ingredients, images, and variants. The analyst then filters the rows by brand or ingredient, compares variant breadth, and exports source-linked products into an assortment research sheet.

### Quick start input

Search Sephora US products:

```json
{
  "searchQueries": ["rare beauty blush", "vitamin c serum"],
  "maxResults": 20,
  "includeIngredients": true,
  "includeVariants": true
}
````

For a selected product set, place canonical Sephora US product pages in `productUrls`.

### What data you receive

| Field | Meaning |
| --- | --- |
| `productId`, `skuId`, `title`, `brand` | Product and selected SKU identity |
| `productUrl`, `sourceType`, `sourceUrl`, `scrapedAt` | Canonical URL, discovery route, provenance, and collection time |
| `price`, `listPrice`, `currency`, `availability` | Public price and availability fields |
| `rating`, `reviewCount` | Public product-level review aggregate |
| `description`, `ingredients`, `categories` | Product presentation and composition fields |
| `imageUrls`, `variants` | Public media and shade, size, or SKU options |

```json
{
  "productId": "P97989778",
  "skuId": "2362168",
  "title": "Soft Pinch Liquid Blush",
  "brand": "Rare Beauty",
  "productUrl": "https://www.sephora.com/product/example-P97989778",
  "price": 25,
  "currency": "USD",
  "availability": true,
  "rating": 4.7,
  "ingredients": "Water, Dimethicone, Iron Oxides",
  "imageUrls": ["https://www.sephora.com/productimages/example.jpg"],
  "sourceType": "search",
  "sourceUrl": "https://www.sephora.com/search?keyword=blush",
  "scrapedAt": "<ISO-8601 collection time>"
}
```

### Run through the Apify API

```bash
curl -X POST "https://api.apify.com/v2/acts/khadinakbar~sephora-product-scraper/runs" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchQueries":["rare beauty blush"],"maxResults":20,"includeIngredients":true,"includeVariants":true}'
```

Read the default dataset for product records and the default key-value store for `OUTPUT` and `RUN_SUMMARY`.

### Use with AI agents through Apify MCP

Example prompt:

> Research public Sephora US products for these search terms. Return product ID, brand, title, current public price, availability, rating, ingredients, variants, canonical product URL, source URL, and collection time. Read the dataset and summarize the assortment with source provenance.

Give the agent search terms or canonical product URLs, a focused `maxResults` scope, and the detail fields needed for the decision. Ask it to read the dataset, retain source URLs, and report the outcome and Apify cost.

### Pricing

This Actor uses Pay per event plus Apify platform usage. A product event is associated with a validated normalized product record saved to the dataset. Open the live Pricing tab for current billing details and use `maxResults` or Apify run cost controls to manage the research scope.

### Best results

Provide specific beauty product phrases for discovery or canonical Sephora US product URLs for detail-first research. Enable ingredients and variants when composition or shade analysis supports the project, and retain `sourceUrl` with `scrapedAt` when comparing observations over time.

### Builder's note

I built the extractor to score the product-shaped data embedded in each page because a retail page can contain several structured objects. Selecting the strongest product candidate before normalization keeps identity, price, ingredients, and variants attached to the same source-linked record.

### Responsible use

Collect public product data you are authorized to access and follow applicable laws, Sephora terms, and your organization's catalog and market-research policies.

# Actor input Schema

## `searchQueries` (type: `array`):

Use this when you want Sephora products matching free-text keywords, such as 'rare beauty blush'. Enter up to 10 English search phrases. The actor opens Sephora US public search pages and then fetches each discovered product page. This is not a category URL or a product ID; use Product URLs for known products.

## `productUrls` (type: `array`):

Use this when you already know the public Sephora US product pages to scrape. Enter full URLs like 'https://www.sephora.com/product/...-P123456?skuId=1234567'. The actor preserves an optional selected SKU and removes tracking parameters. This is not for search, category, brand, cart, or account URLs; use Search queries to discover products.

## `maxResults` (type: `integer`):

Use this to set a hard run-wide limit on returned product records and billable product events. Enter an integer from 1 to 100; the default is 20. At $0.006 per product, the maximum product-event charge is shown before the actor starts. This counts products, not variants, images, searches, or page requests.

## `includeIngredients` (type: `boolean`):

Use this when you need the product ingredient list for comparison or formulation research. Set true to include ingredients exposed on the public product page; true is the default. Set false to keep each record smaller when ingredients are not needed. This does not scrape review text or customer-submitted content.

## `includeVariants` (type: `boolean`):

Use this when you need publicly displayed shade, size, or SKU choices with price and availability. Set true to include the variants array; true is the default. Set false for a compact product-level record. This does not select a local pickup store or guarantee inventory at a specific location.

## Actor input object example

```json
{
  "searchQueries": [
    "rare beauty blush",
    "vitamin c serum"
  ],
  "productUrls": [
    "https://www.sephora.com/product/vanilla-nectar-body-hair-fragrance-mist-P517676"
  ],
  "maxResults": 20,
  "includeIngredients": true,
  "includeVariants": true
}
```

# Actor output Schema

## `products` (type: `string`):

One normalized public Sephora US product record per dataset item.

## `output` (type: `string`):

Compact terminal outcome and billing summary.

## `runSummary` (type: `string`):

Detailed terminal diagnostics for this run.

# 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 = {
    "maxResults": 20,
    "includeIngredients": true,
    "includeVariants": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/sephora-product-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 = {
    "maxResults": 20,
    "includeIngredients": True,
    "includeVariants": True,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/sephora-product-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 '{
  "maxResults": 20,
  "includeIngredients": true,
  "includeVariants": true
}' |
apify call khadinakbar/sephora-product-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Sephora Product Scraper",
        "description": "Extract public Sephora US products from keyword searches or product pages. Returns normalized product identity, price, availability, rating aggregates, ingredients, images, variants, source URLs, and collection time for beauty catalog research.",
        "version": "0.1",
        "x-build-id": "woXsbM82yLV4mlqmT"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/khadinakbar~sephora-product-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-khadinakbar-sephora-product-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/khadinakbar~sephora-product-scraper/runs": {
            "post": {
                "operationId": "runs-sync-khadinakbar-sephora-product-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/khadinakbar~sephora-product-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-khadinakbar-sephora-product-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQueries": {
                        "title": "Sephora search queries",
                        "maxItems": 10,
                        "type": "array",
                        "description": "Use this when you want Sephora products matching free-text keywords, such as 'rare beauty blush'. Enter up to 10 English search phrases. The actor opens Sephora US public search pages and then fetches each discovered product page. This is not a category URL or a product ID; use Product URLs for known products.",
                        "items": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 200
                        }
                    },
                    "productUrls": {
                        "title": "Sephora product URLs",
                        "maxItems": 100,
                        "type": "array",
                        "description": "Use this when you already know the public Sephora US product pages to scrape. Enter full URLs like 'https://www.sephora.com/product/...-P123456?skuId=1234567'. The actor preserves an optional selected SKU and removes tracking parameters. This is not for search, category, brand, cart, or account URLs; use Search queries to discover products.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "maxResults": {
                        "title": "Max products",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Use this to set a hard run-wide limit on returned product records and billable product events. Enter an integer from 1 to 100; the default is 20. At $0.006 per product, the maximum product-event charge is shown before the actor starts. This counts products, not variants, images, searches, or page requests.",
                        "default": 20
                    },
                    "includeIngredients": {
                        "title": "Include ingredients",
                        "type": "boolean",
                        "description": "Use this when you need the product ingredient list for comparison or formulation research. Set true to include ingredients exposed on the public product page; true is the default. Set false to keep each record smaller when ingredients are not needed. This does not scrape review text or customer-submitted content.",
                        "default": true
                    },
                    "includeVariants": {
                        "title": "Include variants",
                        "type": "boolean",
                        "description": "Use this when you need publicly displayed shade, size, or SKU choices with price and availability. Set true to include the variants array; true is the default. Set false for a compact product-level record. This does not select a local pickup store or guarantee inventory at a specific location.",
                        "default": true
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
