# Sephora Reviews + Stats Scraper (`wibuild.in/sephora-reviews-stats-scraper`) Actor

Low-cost Sephora Review Actor that turns any Sephora product URL and max\_reviews into clean JSON review data. Perfect for ecommerce analytics, sentiment analysis, rating trends, product performance tracking, customer feedback mining and deep beauty brand insights.

- **URL**: https://apify.com/wibuild.in/sephora-reviews-stats-scraper.md
- **Developed by:** [Wibuild](https://apify.com/wibuild.in) (community)
- **Categories:** AI, Agents, Automation
- **Stats:** 37 total users, 5 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

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

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

## 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 Reviews + Stats Actor

The **Sephora Reviews + Stats Actor** is a small, low-cost tool that automatically collects and organizes review data from a Sephora product page into clean, analysis-ready JSON.

You don’t have to worry about how the data is fetched or handled behind the scenes.\
You just provide a product URL and how many reviews you want, and the actor gives you a structured JSON output you can plug straight into your analysis, dashboards, or models.

***

### What this actor does

Given a Sephora product link, the actor:

1. **Collects customer reviews** for that product (up to the maximum you specify).
2. **Standardizes each review** into a consistent format so you can easily filter, group, and analyze.
3. **Attaches product-level statistics** (like total reviews and rating distribution) to every review object, making it easy to work at either:
   - individual review level, or
   - aggregate product level.

The goal is to save you time and effort so you don’t have to manually copy-paste or clean messy review data.

And yes, this actor is designed to run at **very low cost** per 1000 results, so it’s safe to use for larger pulls and experiments.

***

### Why this data is useful for analysis

Because the actor outputs clean, structured JSON, it becomes very easy to run:

#### 1. Rating & Recommendation Analysis

- Track **average rating** over time.
- Compare **recommended vs not recommended** counts.
- Slice ratings by specific date ranges, campaigns, or product variants (via `ProductId` / `skuId` you store separately).

#### 2. Sentiment & Text Analysis

- Run sentiment analysis on `ReviewText`.
- Detect common themes, complaints, or praises by keyword or topic modeling.
- Identify words/phrases correlated with 1–2 star reviews vs 4–5 star reviews.

#### 3. Product & Variant Comparison

- Compare multiple Sephora products using:
  - average rating,
  - total review volume,
  - helpful vote patterns,
  - recommendation ratios.
- See which shade/variant (by `ProductId` / `sku` you track) performs best in terms of ratings and sentiment.

#### 4. Marketing & Campaign Measurement

- Measure review volume spikes around launches or promotions.
- Monitor changes in rating distribution after:
  - packaging change,
  - formula change,
  - influencer marketing.

#### 5. QA & Trust Monitoring

- Track how many reviews are marked as **helpful** or **not helpful**.
- Use `ModerationStatus` and context flags (incentivized, staff) to filter reviews for specific compliance checks.

***

### Inputs

The actor expects two simple inputs:

#### 1. `url` (required)

A Sephora product page URL, for example:

- `https://www.sephora.com/product/lip-sleeping-mask-P420652?skuId=2895316`
- `https://www.sephora.com/product/lip-sleeping-mask-P420652`
- `https://www.sephora.com/product/summer-fridays-lip-butter-balm-P455936?skuId=2862480`

Any valid product URL in this format will work.

#### 2. `max_reviews` (optional)

How many reviews you want to collect:

- If you set a number (e.g. `1000`), the actor will **stop** once that many reviews are collected (or it runs out of reviews).
- If you set `0` or leave it empty, the actor will collect **all available reviews** for that product (within reasonable limits).

***

### Output

The actor returns a **JSON array** of review objects.

Each review object includes:

#### A. Review-level fields (one row per review)

- `SourceClient` – where the review comes from (e.g. `"sephora"`).
- `BadgesOrder` – badges like verified purchaser, etc.
- `ProductId` – Sephora’s internal product ID.
- `OriginalProductName` – full product name as shown on Sephora.
- `ImageUrl` – main product image URL.
- `Rating` – star rating the customer gave (1–5).
- `Helpfulness` – helpfulness score based on other users’ votes.
- `TotalNegativeFeedbackCount` – number of “not helpful” votes.
- `TotalPositiveFeedbackCount` – number of “helpful” votes.
- `ModerationStatus` – e.g. `APPROVED`.
- `SubmissionDate` – date when the review was submitted (YYYY-MM-DD).
- `ReviewText` – full review content.
- `Title` – review title (when present).
- `UserNickname` – reviewer’s nickname.
- `UserLocation` – reviewer’s location (if provided).

#### B. Context about the reviewer

- `IncentivizedReview_Id`, `IncentivizedReview_ValueLabel`, `IncentivizedReview_DimensionLabel`
  - lets you see if the review was a free sample or paid incentive.
- `StaffContext_Id`, `StaffContext_ValueLabel`, `StaffContext_DimensionLabel`
  - lets you identify Sephora employee reviews.

#### C. Product-level review statistics (repeated on each review row)

These fields make it easy to do **product-level analysis** without a separate join:

- `Product_TotalReviewCount` – how many total reviews exist for the product.
- `Product_AverageOverallRating` – average star rating for the product.
- `Product_RecommendedCount` – number of reviews that recommend the product.
- `Product_NotRecommendedCount` – number of reviews that do **not** recommend it.
- `Product_HelpfulVoteCount` – total “helpful” votes across all reviews.
- `Product_NotHelpfulVoteCount` – total “not helpful” votes.

##### Rating distribution

These show how many reviews fall into each star bucket:

- `Product_5_Star_Count`
- `Product_4_Star_Count`
- `Product_3_Star_Count`
- `Product_2_Star_Count`
- `Product_1_Star_Count`

You also get:

- `Product_RatingsOnlyReviewCount` – number of rating-only entries (no text).
- `Product_FirstSubmissionTime` – timestamp of the first review for this product.

Overall, the JSON looks like:

```json
[
  { /* review 1 + product stats */ },
  { /* review 2 + product stats */ },
  ...
]
```

You can directly export this to:

- CSV / Excel
- a database
- a data warehouse
- a notebook for analysis

***

### Designed to be low cost

This actor is intended to be:

- **Cheap to run per product** – so you can run it across many products without worrying too much about cost.
- **Simple to integrate** – only two inputs (`url`, `max_reviews`) and one JSON output format.
- **Reusable** – once you plug the JSON into your analysis pipeline, you can reuse the same actor for:
  - multiple products,
  - regular monitoring,
  - competitive tracking.

***

### Quick mental model

Think of the **Sephora Reviews + Stats Actor** as:

> “Give me a Sephora product link and how many reviews you want.\
> I’ll hand you back one clean JSON file full of structured, analysis-ready review data plus product-level stats — for a very low price.”

# Actor input Schema

## `URL` (type: `string`):

URL to scrape

## `maxreviews` (type: `integer`):

Maximum number of reviews to scrape.

## Actor input object example

```json
{
  "URL": "https://www.sephora.com/product/on-til-dawn-waterproof-glitter-setting-spray-brown-sugar-P519904?skuId=2915940&icid2=homepage_productlist_sellingfast_us_ufe_092022",
  "maxreviews": 50
}
```

# Actor output Schema

## `reviews` (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 = {
    "URL": "https://www.sephora.com/product/on-til-dawn-waterproof-glitter-setting-spray-brown-sugar-P519904?skuId=2915940&icid2=homepage_productlist_sellingfast_us_ufe_092022",
    "maxreviews": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("wibuild.in/sephora-reviews-stats-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 = {
    "URL": "https://www.sephora.com/product/on-til-dawn-waterproof-glitter-setting-spray-brown-sugar-P519904?skuId=2915940&icid2=homepage_productlist_sellingfast_us_ufe_092022",
    "maxreviews": 50,
}

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

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

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

```

## CLI example

```bash
echo '{
  "URL": "https://www.sephora.com/product/on-til-dawn-waterproof-glitter-setting-spray-brown-sugar-P519904?skuId=2915940&icid2=homepage_productlist_sellingfast_us_ufe_092022",
  "maxreviews": 50
}' |
apify call wibuild.in/sephora-reviews-stats-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,wibuild.in/sephora-reviews-stats-scraper"
        }
    }
}

```

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

## OpenAPI specification

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