# Ulta Beauty Products Scraper (`parseforge/ulta-scraper`) Actor

Scrapes Ulta Beauty product listings from any category slug. Returns each product as a flat row with price, brand, rating, and options.

- **URL**: https://apify.com/parseforge/ulta-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** E-commerce, Automation
- **Stats:** 2 total users, 0 monthly users, 89.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $19.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/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

[![ParseForge](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner.jpg)](https://apify.com/parseforge?fpr=vmoqkp)

### Ulta Beauty Products Scraper

**Scrape Ulta Beauty product listings from any category, up to a million per run.** Every product row includes price, ratings, brand, and variant details. No API key required. Export to CSV, JSON, Excel, or XML.

Ulta Beauty's product catalog is massive, and manually copying prices, ratings, or shade names across hundreds of SKUs is slow and error-prone. This Actor reads the public category pages directly, so you can pull a structured list of products by category slug without writing any code. It is built for analysts, brand managers, and developers who need clean beauty product data on a schedule.

| Who uses it | What they scrape Ulta Beauty for |
|---|---|
| Market researchers | Track which brands and product types are trending in a category this month. |
| E-commerce managers | Monitor competitor pricing and assortment gaps across makeup or skincare. |
| Data analysts | Build a clean dataset of beauty product attributes for pricing models. |
| Brand managers | Audit how your own products appear in Ulta's category listings. |

### What it does

This Actor collects Ulta Beauty product listings by category slug and returns each product as a flat row with its price, brand, rating, and available options.

- 🏷️ **Category browsing:** supply a category slug like makeup, skincare, or hair and the Actor walks the listing pages.
- 🔢 **Volume control:** set a hard cap from 1 to 1,000,000 products so a single run stays within your budget.
- 📦 **Flat row output:** every product lands as one row, ready for pivot tables, databases, or BI tools.

Results export to CSV, JSON, Excel, or XML, or straight from the API.

### What you can do with Ulta Beauty data

**💄 Monitor makeup pricing.**

A beauty brand manager runs the Actor weekly on the makeup category to track how competitor lipstick prices shift during a promotion cycle.

**🧴 Build a skincare catalog.**

A data analyst scrapes the skincare category to populate a product database with brand, price, rating, and ingredient highlights for a market report.

**💇 Audit hair-care assortment.**

An e-commerce manager pulls the hair category to compare Ulta's assortment against their own store and identify missing high-rated products.

**📊 Feed a pricing model.**

A pricing analyst collects fragrance listings to train a model that recommends price points for a new private-label launch.

### Why choose this scraper

|  | What you get |
|---|---|
| **No API registration** | Ulta does not offer a public product API. This Actor reads the live site so you do not need a partner token or manual approval. |
| **Fixed schema** | Every run returns the same columns, even when a product is missing a field, so your downstream pipeline never breaks. |
| **Runs on schedule** | Set it on Apify Scheduler to pull fresh prices and ratings daily or weekly without touching a browser. |

### How it compares

Two other Apify actors also scrape Ulta Beauty. This one focuses on fast category listing extraction with a simple slug input, while the alternatives add detail-page enrichment.

| Feature | ParseForge | Ulta Scraper | Ulta Product Scraper |
|---|---|---|---|
| Category browsing by slug | Yes | Not listed | Yes |
| Product price and sale price | Yes | Yes | Yes |
| Product ratings and review count | Yes | Not listed | Yes |
| Brand name per product | Yes | Not listed | Yes |
| Ingredient list extraction | Not listed | Not listed | Yes |
| Shade and size variant details | Not listed | Not listed | Yes |

### Configure the run

Drive the Actor from a single Ulta category slug and set a maximum number of products to collect per run. The Input tab lists every parameter.

A first run with the defaults:

```json
{
  "maxItems": 10
}
```

A larger pull:

```json
{
  "maxItems": 200
}
```

### Pricing

Pay-per-result: **$0.021 per result** collected. You pay only for the results written to your dataset.

| Results collected | Approximate cost |
|---|---|
| 100 results | $2.10 |
| 1,000 results | $21.00 |
| 10,000 results | $210.00 |

New Apify accounts start with $5 in free credit.

### Free users

Free-plan runs return up to 10 results as a preview. [Upgrade your Apify plan](https://console.apify.com/sign-up?fpr=vmoqkp) to collect up to 1,000,000 results per run.

### Run it

1. [Create a free Apify account with $5 in credit](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open the [Ulta Beauty Products Scraper](https://apify.com/parseforge/ulta-scraper?fpr=vmoqkp).
3. Set your inputs and any filters, then click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the **Dataset** tab.

Run it programmatically through the [Apify API](https://docs.apify.com/api/v2) (`run-sync-get-dataset-items`) or the [ApifyClient](https://docs.apify.com/api/client/js) for JavaScript and Python.

### Use with AI agents (MCP)

Give an AI agent live access to Ulta Beauty through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

```bash
claude mcp add --transport http apify "https://mcp.apify.com/?tools=parseforge/ulta-scraper"
```

Then prompt it in plain language to run the scraper and read back the results.

### Troubleshooting

**Why am I getting no results?**

Check that the category slug is spelled exactly as it appears in the Ulta URL. A typo or a slug that does not exist on the site will return an empty dataset. Also confirm the category still has products listed.

**The run stopped before reaching my max items limit.**

The Actor stops when it runs out of pagination on the category. If the category has fewer products than your limit, the run ends early with whatever it found.

**Some products are missing a price or rating.**

Ulta sometimes shows a range or hides a rating until a variant is selected. The Actor captures what is visible on the listing card. Missing values appear as empty cells in your dataset.

**The run timed out or was blocked.**

Increase the run timeout in your Actor settings and consider using a higher-performance proxy group if you are scraping a very large category. Apify's automatic retries handle most transient blocks.

**I need data from a specific URL, not a category slug.**

This Actor is built for category browsing by slug. If you need to scrape a specific product URL or a search results page, you may need a different scraper configuration.

### FAQ

| Question | Answer |
|---|---|
| What is a category slug and where do I find it? | A category slug is the last part of the Ulta URL when you browse a category, for example 'makeup' in ulta.com/shop/makeup. Copy that word and paste it into the Category Slug input field. |
| Does this Actor scrape product detail pages? | It collects the listing data shown on category pages. If you need full detail-page enrichment like ingredients or shade variants, you may need a separate detail scraper. |
| Can I scrape multiple categories in one run? | One run handles one category slug. To scrape several categories, launch multiple runs in parallel or queue them one after another using the Apify API or scheduler. |
| How many products can I scrape? | You set the limit with the Maximum products field, anywhere from 1 to 1,000,000. The Actor stops when it hits your number or runs out of pages. |
| Does this Actor handle Ulta's anti-bot protections? | It runs on Apify's infrastructure with rotating proxies and browser fingerprints, which helps avoid blocks during normal use. |
| Can I export the data to Google Sheets? | Yes. After a run finishes, use Apify's built-in integration to send the dataset directly to Google Sheets, or download as CSV, JSON, Excel, or XML. |
| Is a login required? | No. The Actor reads publicly visible category pages, so you do not need an Ulta account or any credentials. |
| What fields does each product row contain? | Each row includes the product name, brand, price, sale price, rating, review count, and available options like shade or size, all in a consistent schema. |
| Can I filter by brand or price inside the Actor? | The Actor pulls the full category listing. To filter by brand or price, apply those filters to the output dataset in your spreadsheet, database, or code after the run. |
| How often can I run this Actor? | You can run it as often as you like. Many users set a daily or weekly schedule to track price and assortment changes over time. |

### Related actors

Browse the full [ParseForge collection](https://apify.com/parseforge?fpr=vmoqkp) for more scrapers.

🆘 **Need help?** Email parseforge@protonmail.com with your run ID, your input, and what you expected.

⚠️ **Disclaimer.** This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by Ulta Beauty, Inc. It collects only publicly available data. You are responsible for using the collected data in compliance with the source's terms of service and applicable data-protection laws, including GDPR, CCPA, and PIPL. Do not use it to collect personal data unlawfully.

# Actor input Schema

## `maxItems` (type: `integer`):

How many products to collect per run.

## `category` (type: `string`):

Ulta category slug (e.g. makeup, skincare, hair).

## Actor input object example

```json
{
  "maxItems": 10,
  "category": "makeup"
}
```

# Actor output Schema

## `results` (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 = {
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/ulta-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 = { "maxItems": 10 }

# Run the Actor and wait for it to finish
run = client.actor("parseforge/ulta-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 '{
  "maxItems": 10
}' |
apify call parseforge/ulta-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/ulta-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/3Or06CeVV3WiayMcA/builds/00oHCUeTMBbxFmLBK/openapi.json
