# Sephora $1💰URL | Search | Product Data and Reviews (`abotapi/sephora-product-scraper`) Actor

From $1/1K. Scrape Sephora products across 21+ storefronts (US, AU, NZ, SG, MY, ID, TH, PH, MX, DE, RO, SE, GR, DK) with a unified schema. Extract brand, title, ingredients, claims, full SKU and shade variants, ratings histogram, top reviews, Q\&A, and rich media.

- **URL**: https://apify.com/abotapi/sephora-product-scraper.md
- **Developed by:** [AbotAPI](https://apify.com/abotapi) (community)
- **Categories:** E-commerce, Automation, Developer tools
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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/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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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

Scrape the full Sephora product catalog across 14 storefronts (US, AU, NZ, SG, MY, ID, TH, PH, MX, DE, RO, SE, GR, DK) with one unified output schema. Pull brand, title, ingredients, claims, full variant matrix with shades and SKUs, ratings histogram, top reviews, top Q&A, and rich media in a single dataset that drops cleanly into BI, ETL, or comparison tooling.

### Why this scraper

- 14 regional storefronts under one input form, no per-region forking
- 80+ fields per product: variants (every shade, size, SKU, UPC), options, ingredients, claims, awards, ratings histogram, secondary ratings, sentiment tags, top reviews, top Q&A
- Search by keyword, by category slug, or paste any Sephora URL (product, category, brand, search) and the scraper auto-detects the storefront
- Cross-region market field (sea-au, sea-nz, americas-us, europe-de, ...) so multi-market analytics work out of the box
- Forward-paginated walks with checkpoint resume; pulls 24-60 fully-attributed products per search request

### Storefronts

| Region | Storefronts |
|---|---|
| Americas | `us` (sephora.com), `mx` (sephora.com.mx) |
| APAC | `com.au` (sephora.com.au), `nz` (sephora.nz), `sg` (sephora.sg), `my` (sephora.my), `id` (sephora.co.id), `th` (sephora.co.th), `ph` (sephora.ph) |
| Europe | `de` (sephora.de), `ro` (sephora.ro), `se` (sephora.se), `gr` (sephora.gr), `dk` (sephora.dk) |

### Data you get

> Sample shape, values are illustrative placeholders, not from a live listing.

| Field | Example |
|---|---|
| market | sea-nz |
| source.id | 00000001 |
| source.canonicalUrl | https://www.sephora.nz/products/sample-foundation |
| source.retailer | SEPHORA |
| source.currency | NZD |
| source.locale | en-NZ |
| brand | Sample Brand |
| title | Sample Foundation |
| subtitle | 30ml |
| description | "<p>A self-priming foundation, primes, covers and sets...</p>" |
| ingredients | "Aqua, Cyclopentasiloxane, Glycerin, ..." |
| howToUse | "Shake well. Apply a small amount onto the back of your hand and use a brush..." |
| claims | ["Cruelty free", "Paraben free", "Vegan"] |
| currentSku | 0000000 |
| categories | ["Makeup", "Face", "Foundation"] |
| options[].name | shade |
| options[].values[].value | 1 Fair Neutral |
| variants[].sku | 0000000 |
| variants[].shade | 1 Fair Neutral |
| variants[].price.current | 77.0 |
| variants[].price.original | 77.0 |
| variants[].price.stockStatus | IN_STOCK |
| variants[].swatchUrl | https://image-optimizer.example.com/swatches/icon_swatch_0000.png |
| variants[].imageUrl | https://image-optimizer.example.com/products/sample.jpg |
| variants[].inventory | 13 |
| medias[].url | https://image-optimizer.example.com/products/sample-zoom.jpg |
| medias[].type | image |
| medias[].role | hero |
| stats.rating | 4.8 |
| stats.reviewCount | 971 |
| stats.recommendedCount | 800 |
| ratingHistogram | [{"RatingValue": 5, "Count": 700}, ...] |
| secondaryRatings | {"Quality": {"AverageRating": 4.8}} |
| sentiments | {"Pros": [{"Value": "Long-lasting", "Count": 300}]} |
| topReviews[].rating | 5 |
| topReviews[].title | "Best foundation I have ever tried" |
| topReviews[].body | "Sample review text appears here..." |
| topReviews[].skinType | combination |
| topReviews[].skinTone | fair |
| topReviews[].publishedAt | 2026-01-01T00:00:00.000Z |
| topQuestions[].question | Is this product fragrance free? |
| isNewArrival | false |
| underSale | false |
| highlights | ["NEW", "Only at Sephora"] |
| articles[].type | how-to |
| frontend | sea |
| scrapedAt | 2026-01-01T00:00:00.000Z |

### How to use

#### Search by keyword

```json
{
  "mode": "search",
  "storefront": "nz",
  "queries": ["foundation", "mascara"],
  "maxPages": 5,
  "maxProducts": 100,
  "fetchDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "NZ"
  }
}
````

#### Search by category

```json
{
  "mode": "search",
  "storefront": "us",
  "categories": ["shop/makeup-cosmetics", "shop/skincare"],
  "ratingMin": 4,
  "maxPages": 3,
  "maxProducts": 60,
  "fetchDetails": true,
  "fetchReviews": true,
  "maxReviewsPerProduct": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

#### URL mode (single product)

```json
{
  "mode": "url",
  "urls": [
    "https://www.sephora.nz/products/rare-beauty-true-to-myself-natural-matte-longwear-foundation"
  ],
  "fetchDetails": true,
  "fetchReviews": true,
  "fetchQna": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "NZ"
  }
}
```

#### URL mode (multiple regions in one run)

```json
{
  "mode": "url",
  "urls": [
    "https://www.sephora.nz/search?keyword=mascara",
    "https://www.sephora.com.au/search?keyword=mascara",
    "https://www.sephora.fr/recherche?q=mascara"
  ],
  "maxPages": 2,
  "maxProducts": 30,
  "fetchDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| mode | enum | search | "search" or "url" |
| storefront | enum | us | One of 21+ regional sites; only used in search mode |
| queries | string\[] | \["foundation"] | Keywords to search; one search per query |
| categories | string\[] | \[] | Category slugs from the storefront's nav |
| brands | string\[] | \[] | Brand slugs to filter results client-side |
| priceMin | int | unset | Minimum product price in storefront currency |
| priceMax | int | unset | Maximum product price in storefront currency |
| ratingMin | enum | 0 | Minimum average rating (0/3/4/5) |
| sortBy | enum | relevance | relevance, popular, rating, price-asc, price-desc, newest |
| newOnly | bool | false | Only products marked new arrival |
| exclusiveOnly | bool | false | Only "Only at Sephora" products |
| urls | string\[] | one example | URLs to crawl in URL mode |
| fetchDetails | bool | false | Pull the full product detail (ingredients, claims, full variant matrix, awards) |
| fetchReviews | bool | false | Pull top reviews and Bazaarvoice rating histogram |
| maxReviewsPerProduct | int | 10 | Cap reviews per product (1-100) |
| fetchQna | bool | false | Pull top questions and answers |
| maxQnaPerProduct | int | 5 | Cap Q\&A per product (1-50) |
| maxPages | int | 5 | Pages per query / category / URL (1-100) |
| maxProducts | int | 0 | Total cap, 0 means unlimited |
| proxyConfiguration | object | residential US | Proxy block; residential is recommended |
| resumeFromCheckpoint | bool | true | Resume previous run from KV store checkpoint |

### Output example

> Sample shape, values are illustrative placeholders, not from a live listing.

```json
{
  "market": "sea-nz",
  "source": {
    "id": 0,
    "crawlUrl": "https://www.sephora.nz/products/sample-foundation",
    "canonicalUrl": "https://www.sephora.nz/products/sample-foundation",
    "retailer": "SEPHORA",
    "currency": "NZD",
    "locale": "en-NZ"
  },
  "brand": "Sample Brand",
  "title": "Sample Foundation",
  "subtitle": "30ml",
  "description": "<p>A self-priming foundation, primes, covers and sets...</p>",
  "shortDescription": "<p>3-in-1 foundation primes, covers and sets...</p>",
  "ingredients": "Aqua, Cyclopentasiloxane, Glycerin, ...",
  "howToUse": "Shake well. Apply a small amount onto the back of your hand and use a brush or fingertips to blend onto skin.",
  "claims": ["Cruelty free", "Paraben free", "Vegan"],
  "currentSku": "0000000",
  "categories": ["Makeup", "Face", "Foundation"],
  "options": [
    {
      "name": "shade",
      "id": "0",
      "values": [{ "value": "1 Fair Neutral", "label": "1 Fair Neutral", "id": "0" }]
    }
  ],
  "variants": [
    {
      "id": "0",
      "sku": "0000000",
      "gtin": "000000000000",
      "name": "1 Fair Neutral",
      "shade": "1 Fair Neutral",
      "size": "30ml",
      "price": {
        "current": 77.0,
        "original": 77.0,
        "currency": "NZD",
        "stockStatus": "IN_STOCK",
        "available": true,
        "inventory": 13
      },
      "highlights": ["NEW", "Only at Sephora"],
      "swatchUrl": "https://image-optimizer.example.com/swatches/icon_swatch_0000.png",
      "imageUrl": "https://image-optimizer.example.com/products/sample.jpg"
    }
  ],
  "medias": [
    { "url": "https://image-optimizer.example.com/products/sample-zoom.jpg", "type": "image", "role": "hero" }
  ],
  "stats": {
    "reviewCount": 971,
    "rating": 4.8,
    "recommendedCount": 800,
    "totalPhotoCount": 100
  },
  "ratingHistogram": [
    { "RatingValue": 5, "Count": 700 },
    { "RatingValue": 4, "Count": 200 },
    { "RatingValue": 3, "Count": 50 },
    { "RatingValue": 2, "Count": 15 },
    { "RatingValue": 1, "Count": 6 }
  ],
  "topReviews": [
    {
      "id": "0",
      "rating": 5,
      "title": "Best foundation I have ever tried",
      "body": "Sample review text appears here...",
      "publishedAt": "2026-01-01T00:00:00.000Z",
      "skinType": "combination",
      "skinTone": "fair"
    }
  ],
  "highlights": ["NEW", "Only at Sephora"],
  "frontend": "sea",
  "scrapedAt": "2026-01-01T00:00:00.000Z"
}
```

### Plan requirement

- Free plan: works for AU/NZ/EU storefronts on the default proxy in many cases, may return zero results on the US storefront where residential exits are needed.
- Starter or higher: required for full reliability across all 21+ storefronts. Residential proxy access is included from Starter; pin the country to the storefront's home country (US for sephora.com, NZ for sephora.nz, FR for sephora.fr, etc.) for the most stable runs.
- Choose the matching storefront in the input form (or paste URLs from that storefront in URL mode); the actor follows your input and does not auto-redirect across regions.

# Actor input Schema

## `mode` (type: `string`):

Search mode = pick storefront + queries + filters. URL mode = paste Sephora product, category, brand, or search URLs.

## `storefront` (type: `string`):

Which Sephora regional site to scrape.

## `queries` (type: `array`):

Keywords to search the storefront (e.g. 'foundation', 'rare beauty', 'lipstick'). Each query runs as a separate search.

## `categories` (type: `array`):

Category slugs from the navigation tree (e.g. 'shop/foundation-makeup', 'shop/skincare', 'shop/fragrance'). Optional, leave empty if you only want keyword search.

## `brands` (type: `array`):

Brand slugs to filter results (e.g. 'rare-beauty', 'fenty-beauty', 'charlotte-tilbury'). Multiple allowed.

## `priceMin` (type: `integer`):

Minimum product price in the storefront's currency.

## `priceMax` (type: `integer`):

Maximum product price in the storefront's currency.

## `ratingMin` (type: `integer`):

Only return products with average rating at or above this value. Use 0 (no filter), 3, 4, or 5.

## `sortBy` (type: `string`):

How to order the search results.

## `newOnly` (type: `boolean`):

Return only products marked as new arrivals on the storefront.

## `exclusiveOnly` (type: `boolean`):

Return only products marked 'Only at Sephora'.

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

One or more full Sephora URLs (product, category, brand, or search). The scraper auto-detects the storefront from the host.

## `fetchDetails` (type: `boolean`):

Fetch the product detail page for full content. Required for ingredients, howToUse, full variant list, claims, awards, ratings histogram. SERP-only mode is faster and cheaper.

## `fetchReviews` (type: `boolean`):

Pull the top N reviews per product (sorted by helpfulness). Adds one extra fetch per product.

## `maxReviewsPerProduct` (type: `integer`):

Cap the number of reviews per product (1-100). Ignored unless 'Fetch top reviews' is on.

## `fetchQna` (type: `boolean`):

Pull questions and answers per product (sorted by recency). Adds one extra fetch per product.

## `maxQnaPerProduct` (type: `integer`):

Cap the number of Q\&A entries per product (1-50). Ignored unless 'Fetch top Q\&A' is on.

## `maxPages` (type: `integer`):

Maximum result pages per query/category/URL (1-2000). The walk stops early when the storefront returns no next page or when 'Max products total' is hit. Most queries have well under 300 pages of results.

## `maxProducts` (type: `integer`):

Total cap across all queries/URLs (0 = unlimited).

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

Residential proxy is required for the US storefront. AU/NZ/EU storefronts also work better with a residential proxy in the matching country. Default uses Apify's built-in proxy. Free plan: does not include residential, default proxy may return zero results on the US storefront.

## `resumeFromCheckpoint` (type: `boolean`):

Resume a previous run from the last saved checkpoint.

## Actor input object example

```json
{
  "mode": "search",
  "storefront": "us",
  "queries": [
    "foundation"
  ],
  "categories": [],
  "brands": [],
  "ratingMin": 0,
  "sortBy": "relevance",
  "newOnly": false,
  "exclusiveOnly": false,
  "urls": [
    "https://www.sephora.nz/products/rare-beauty-true-to-myself-natural-matte-longwear-foundation"
  ],
  "fetchDetails": false,
  "fetchReviews": false,
  "maxReviewsPerProduct": 10,
  "fetchQna": false,
  "maxQnaPerProduct": 5,
  "maxPages": 1,
  "maxProducts": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "resumeFromCheckpoint": true
}
```

# Actor output Schema

## `products` (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 = {
    "queries": [
        "foundation"
    ],
    "categories": [],
    "brands": [],
    "urls": [
        "https://www.sephora.nz/products/rare-beauty-true-to-myself-natural-matte-longwear-foundation"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/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 = {
    "queries": ["foundation"],
    "categories": [],
    "brands": [],
    "urls": ["https://www.sephora.nz/products/rare-beauty-true-to-myself-natural-matte-longwear-foundation"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/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 '{
  "queries": [
    "foundation"
  ],
  "categories": [],
  "brands": [],
  "urls": [
    "https://www.sephora.nz/products/rare-beauty-true-to-myself-natural-matte-longwear-foundation"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call abotapi/sephora-product-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Sephora $1💰URL | Search | Product Data and Reviews",
        "description": "From $1/1K. Scrape Sephora products across 21+ storefronts (US, AU, NZ, SG, MY, ID, TH, PH, MX, DE, RO, SE, GR, DK) with a unified schema. Extract brand, title, ingredients, claims, full SKU and shade variants, ratings histogram, top reviews, Q&A, and rich media.",
        "version": "1.0",
        "x-build-id": "XhPY3Gj3WYic1nj0W"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/abotapi~sephora-product-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-abotapi-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/abotapi~sephora-product-scraper/runs": {
            "post": {
                "operationId": "runs-sync-abotapi-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/abotapi~sephora-product-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-abotapi-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",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Input mode",
                        "enum": [
                            "search",
                            "url"
                        ],
                        "type": "string",
                        "description": "Search mode = pick storefront + queries + filters. URL mode = paste Sephora product, category, brand, or search URLs.",
                        "default": "search"
                    },
                    "storefront": {
                        "title": "Storefront",
                        "enum": [
                            "us",
                            "com.au",
                            "nz",
                            "sg",
                            "my",
                            "id",
                            "th",
                            "ph",
                            "mx",
                            "de",
                            "ro",
                            "se",
                            "gr",
                            "dk"
                        ],
                        "type": "string",
                        "description": "Which Sephora regional site to scrape.",
                        "default": "us"
                    },
                    "queries": {
                        "title": "Search queries",
                        "type": "array",
                        "description": "Keywords to search the storefront (e.g. 'foundation', 'rare beauty', 'lipstick'). Each query runs as a separate search.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "categories": {
                        "title": "Category slugs",
                        "type": "array",
                        "description": "Category slugs from the navigation tree (e.g. 'shop/foundation-makeup', 'shop/skincare', 'shop/fragrance'). Optional, leave empty if you only want keyword search.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "brands": {
                        "title": "Filter by brand (optional)",
                        "type": "array",
                        "description": "Brand slugs to filter results (e.g. 'rare-beauty', 'fenty-beauty', 'charlotte-tilbury'). Multiple allowed.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "priceMin": {
                        "title": "Minimum price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum product price in the storefront's currency."
                    },
                    "priceMax": {
                        "title": "Maximum price",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Maximum product price in the storefront's currency."
                    },
                    "ratingMin": {
                        "title": "Minimum rating",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "integer",
                        "description": "Only return products with average rating at or above this value. Use 0 (no filter), 3, 4, or 5.",
                        "default": 0
                    },
                    "sortBy": {
                        "title": "Sort order",
                        "enum": [
                            "relevance",
                            "popular",
                            "rating",
                            "price-asc",
                            "price-desc",
                            "newest"
                        ],
                        "type": "string",
                        "description": "How to order the search results.",
                        "default": "relevance"
                    },
                    "newOnly": {
                        "title": "New arrivals only",
                        "type": "boolean",
                        "description": "Return only products marked as new arrivals on the storefront.",
                        "default": false
                    },
                    "exclusiveOnly": {
                        "title": "Sephora exclusives only",
                        "type": "boolean",
                        "description": "Return only products marked 'Only at Sephora'.",
                        "default": false
                    },
                    "urls": {
                        "title": "Sephora URLs",
                        "type": "array",
                        "description": "One or more full Sephora URLs (product, category, brand, or search). The scraper auto-detects the storefront from the host.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "fetchDetails": {
                        "title": "Fetch product details",
                        "type": "boolean",
                        "description": "Fetch the product detail page for full content. Required for ingredients, howToUse, full variant list, claims, awards, ratings histogram. SERP-only mode is faster and cheaper.",
                        "default": false
                    },
                    "fetchReviews": {
                        "title": "Fetch top reviews",
                        "type": "boolean",
                        "description": "Pull the top N reviews per product (sorted by helpfulness). Adds one extra fetch per product.",
                        "default": false
                    },
                    "maxReviewsPerProduct": {
                        "title": "Max reviews per product",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Cap the number of reviews per product (1-100). Ignored unless 'Fetch top reviews' is on.",
                        "default": 10
                    },
                    "fetchQna": {
                        "title": "Fetch top Q&A",
                        "type": "boolean",
                        "description": "Pull questions and answers per product (sorted by recency). Adds one extra fetch per product.",
                        "default": false
                    },
                    "maxQnaPerProduct": {
                        "title": "Max Q&A per product",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Cap the number of Q&A entries per product (1-50). Ignored unless 'Fetch top Q&A' is on.",
                        "default": 5
                    },
                    "maxPages": {
                        "title": "Max pages per query",
                        "minimum": 1,
                        "maximum": 2000,
                        "type": "integer",
                        "description": "Maximum result pages per query/category/URL (1-2000). The walk stops early when the storefront returns no next page or when 'Max products total' is hit. Most queries have well under 300 pages of results.",
                        "default": 1
                    },
                    "maxProducts": {
                        "title": "Max products total",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Total cap across all queries/URLs (0 = unlimited).",
                        "default": 0
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Residential proxy is required for the US storefront. AU/NZ/EU storefronts also work better with a residential proxy in the matching country. Default uses Apify's built-in proxy. Free plan: does not include residential, default proxy may return zero results on the US storefront.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ],
                            "apifyProxyCountry": "US"
                        }
                    },
                    "resumeFromCheckpoint": {
                        "title": "Resume from checkpoint",
                        "type": "boolean",
                        "description": "Resume a previous run from the last saved checkpoint.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
