# Sephora Brand & Competitor Radar (`nexascout/sephora-brand-competitor-radar`) Actor

Track beauty brands in Sephora Best Selling categories. Compare listing positions, prices, ratings, review growth and sale flags across runs; get a source-linked report.

- **URL**: https://apify.com/nexascout/sephora-brand-competitor-radar.md
- **Developed by:** [NexaScout](https://apify.com/nexascout) (community)
- **Stats:** 2 total users, 0 monthly users, 100.0% runs succeeded, 3 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.00 / 1,000 sephora product records

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/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

## Sephora Brand & Competitor Radar

See where your brand and competitors appear in Sephora US category listings sorted by Best Selling. A first run saves a baseline; repeat the **same inputs** to detect changed positions, customer review counts, ratings, and sale prices. Each product links to Sephora.

### Who uses it

Beauty brand teams and agencies monitoring skincare, makeup, hair, fragrance and body care without manually checking dozens of product cards. Spot a rival gaining visibility, a new sale, or a growing review count, then investigate the source product page.

### Output

- **Dataset:** up to 300 products from up to five category pages, including brand, product, sampled position, displayed price/range, sale price, rating, review count, badges and link.
- **Signals:** changes affecting `yourBrand` and `competitorBrands`: at least five positions moved, at least ten added reviews, a price change, a new sale or bestseller badge, or a rating fall of at least 0.2 stars.
- **Report and summary:** source links, monitored brand counts, coverage and comparison status, saved in the run's key-value store.

The `categoryRank` is the item's position in Sephora's sampled **Best Selling** catalog sort, not a sales figure. Results can include promoted placements. Review growth does not establish sales. For prices shown as a range across variants, `effectivePriceUsd` is `null`, and only display changes are flagged. No full review text or seller account access is collected. Products outside the configured sample are not counted.

### Input

Choose one of the supported Sephora US `/shop/` category URLs: `face-serum`, `makeup-cosmetics`, `shampoo-conditioner`, `fragrance`, or `body-lotion-body-oil`. Supply the brand exactly as displayed on Sephora; add up to 15 competitors. Use `maxPages` 1–5 and `maxProducts` 1–300. A broad category may contain no visible product from a particular brand in the first 60 results, so increase the page limit. The Actor requests Sephora's Best Selling sort from its public Constructor catalog service.

```json
{
  "listingUrl": "https://www.sephora.com/shop/face-serum",
  "yourBrand": "The Ordinary",
  "competitorBrands": ["rhode", "Paula's Choice"],
  "maxPages": 1,
  "maxProducts": 60,
  "trackerName": "demo-serums"
}
```

The first run establishes a baseline and does not invent changes. Run the same input again, or set an [Apify schedule](https://docs.apify.com/platform/schedules). Snapshot history is stored in the running account under a name derived from the exact category, brand list and `trackerName`. Avoid simultaneous runs of the same tracker. If storage fails, `historyStatus` identifies the issue.

### Example signal

```json
{
  "brand": "Example Beauty",
  "productName": "Example Serum",
  "categoryRank": 12,
  "previousRank": 20,
  "rankChange": 8,
  "newReviews": 14,
  "signalTypes": ["RANK_UP", "REVIEW_GROWTH"],
  "productUrl": "https://www.sephora.com/product/example-serum-P123456"
}
```

The numbers above illustrate the output format; they are not observations.

### Cost and limits

The Actor fetches at most five pages of public catalog results, 60 items each, and does not visit individual product pages or use proxy bandwidth. The supported category IDs and public index identifier come from Sephora's publicly served page configuration; if Sephora changes them, the Actor needs an update. Inspect measured `usageTotalUsd` in a successful run before scheduling large numbers of jobs.

To run locally: `python3 src/main.py --input examples/demo.json --output-dir output --state output/state.json`. Python 3.12, no package install.

# Actor input Schema

## `listingUrl` (type: `string`):

Choose a supported Sephora US category URL: face-serum, makeup-cosmetics, shampoo-conditioner, fragrance or body-lotion-body-oil. Always sorted by Best Selling.

## `yourBrand` (type: `string`):

Exact brand label shown on Ulta. The report highlights this brand's visible products.

## `competitorBrands` (type: `array`):

Exact brand labels on Ulta, up to 15. Other brands still appear in the category sample.

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

Bound the number of sorted category pages fetched per run.

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

Stop after this many unique product cards; products beyond the cap are outside the sample.

## `trackerName` (type: `string`):

Use the same name and other inputs on future runs to compare with the previous successful snapshot. Avoid simultaneous runs of the same tracker.

## Actor input object example

```json
{
  "listingUrl": "https://www.sephora.com/shop/face-serum",
  "yourBrand": "The Ordinary",
  "competitorBrands": [
    "rhode",
    "Paula's Choice"
  ],
  "maxPages": 1,
  "maxProducts": 100,
  "trackerName": "default"
}
```

# Actor output Schema

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

No description

## `signals` (type: `string`):

No description

## `report` (type: `string`):

No description

## `summary` (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 = {
    "listingUrl": "https://www.sephora.com/shop/face-serum",
    "yourBrand": "The Ordinary",
    "competitorBrands": [
        "rhode",
        "Paula's Choice"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexascout/sephora-brand-competitor-radar").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 = {
    "listingUrl": "https://www.sephora.com/shop/face-serum",
    "yourBrand": "The Ordinary",
    "competitorBrands": [
        "rhode",
        "Paula's Choice",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("nexascout/sephora-brand-competitor-radar").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 '{
  "listingUrl": "https://www.sephora.com/shop/face-serum",
  "yourBrand": "The Ordinary",
  "competitorBrands": [
    "rhode",
    "Paula'\''s Choice"
  ]
}' |
apify call nexascout/sephora-brand-competitor-radar --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexascout/sephora-brand-competitor-radar"
        }
    }
}
```

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/Wcvn2vOcKjTRHr0rN/builds/UwSifazF91cxGeZ0h/openapi.json
