# Ulta Beauty Scraper 🛍️ $0.9/1k (`123webdata/ulta-beauty-scraper`) Actor

$0.9/1k 💰 | Fast ⚡️ | Quick Support 🚀 | Scrape Ulta Beauty category and brand pages; get prices, availability, sizes and shades, and ratings. Export JSON or CSV for price monitoring and product research.

- **URL**: https://apify.com/123webdata/ulta-beauty-scraper.md
- **Developed by:** [123 Webdata](https://apify.com/123webdata) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 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?

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

## Ulta Beauty Scraper

Collect structured beauty-product data from Ulta Beauty product, category, brand, and filtered-list URLs.

### Issues and feature requests

If you encounter an issue or need a field added, open an issue on the Actor page or write to hello@123webdata.com.

### Output Example (simplified)

The overview shows the most useful fields in a table. Product images are displayed as thumbnails when the website provides them.

| Image | Product URL | Product ID | Product name | Current price | Maximum price | Currency | In stock | Brand | Scraped at |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| <img src="https://media.ulta.com/i/ulta/2647801?fmt=auto" style="max-width: 100px; max-height: 100px; object-fit: contain;"> | https://www.ulta.com/p/brow-harmony-flexible-lifting-eyebrow-gel-pimprod2055886 | pimprod2055886 | Brow Harmony Flexible Lifting Eyebrow Gel | 21 |  | USD | true | Rare Beauty | 2026-08-26T08:29:27.668Z |

### How to scrape supported list pages

This Actor accepts individual product links in `productUrls`. It accepts category pages, brand pages, and filtered result pages in `categoryUrls`.

1. Open a supported list page in your browser.
2. Choose a category, open a brand page, and apply the filters you need.
3. Copy the final URL from the address bar and paste it into `categoryUrls`.

The Actor follows the products shown on that page.

### Features

- Scrapes detailed beauty product information from Ulta Beauty product pages
- Accepts individual product URLs and category pages, brand pages, and filtered result pages
- Lets you limit the number of saved products and choose whether to continue through additional result pages
- Returns structured prices, availability, sizes and shades, ratings, product details, and images for viewing, export, and analysis

### Pricing

This Actor uses pay-per-event pricing. Its running costs are included.

- **Actor start:** $0.02 once per run — One fixed charge for starting a run.
- **Result:** $0.00089 each ($0.89 per 1,000) — A product record collected directly from a supported list page.
- **Product detail:** $0.00199 each ($1.99 per 1,000) — A full product record collected from its product page.

The start charge applies once per run. Each saved product is charged either as a Result or a Product detail, never both.

| Results in one run | Result | Product detail |
| ---: | ---: | ---: |
| 100 | $0.11 | $0.22 |
| 1,000 | $0.91 | $2.01 |

[Apify's Free plan](https://apify.com/pricing) currently includes $5 in monthly usage credits. If the full $5 is available for this Actor, one run covers about 5,595 Results or 2,502 Product details. Other Apify usage reduces the available credit.

### Input

The Actor accepts the following input parameters:

| Field | Type | Description |
| --- | --- | --- |
| `productUrls` | array | Product URLs to scrape |
| `categoryUrls` | array | Supported list pages: category pages, brand pages, and filtered result pages |
| `maxResultsPerScrape` | integer | Maximum number of product records to save |
| `usePagination` | boolean | Whether to continue through additional result pages |
| `scrapeProductDetails` | boolean | Enabled returns Product detail records with the product-page fields listed below. Disabled returns Result records with the list-level fields. |

### What data you get in each mode

Every saved product is stored as one record. `scrapeProductDetails` decides which mode you receive; the lists below name every field each mode can return. A field is empty when the website does not show that information.

#### Result

A list-level product record with 21 declared fields:

`url`, `product_id`, `sku`, `name`, `brand`, `price`, `max_price`, `list_price`, `list_price_max`, `currency`, `rating_value`, `review_count`, `main_image`, `images`, `badges`, `promotion_text`, `additional_offers_text`, `variant_label`, `kit_value_text`, `canonical_url`, `scraped_at`

#### Product detail

A full product record with 31 declared fields:

`url`, `product_id`, `name`, `price`, `currency`, `in_stock`, `sku`, `brand`, `category`, `breadcrumbs`, `breadcrumb_urls`, `main_image`, `images`, `description`, `description_html`, `color`, `size`, `features`, `attributes`, `rating_value`, `review_count`, `variants`, `canonical_url`, `scraped_at`, `list_price`, `list_price_max`, `badges`, `promotion_text`, `additional_offers_text`, `variant_label`, `kit_value_text`

### Output Example (full)

The Actor stores one structured record per product. Card-only records contain only fields available on the list; detail-only fields are omitted.

```json
{
  "attributes": {
    "Ingredients": "Water (Aqua/Eau), Beheneth-30, VP/VA Copolymer, Alcohol, Pentylene Glycol, Butylene Glycol, Dipropylene Glycol, Glycerin, Phenoxyethanol, Caprylyl Glycol, Xanthan Gum.",
    "Restrictions": "This brand is excluded from most Ulta Beauty coupons.\n\n[See brand eligibility details](https://www.ulta.com/promotion/coupon/exclusions)"
  },
  "brand": "Rare Beauty",
  "breadcrumbs": [
    "Home",
    "Makeup",
    "Eyes",
    "Eyebrows"
  ],
  "breadcrumb_urls": [
    "https://www.ulta.com/",
    "https://www.ulta.com/shop/makeup",
    "https://www.ulta.com/shop/makeup/eyes",
    "https://www.ulta.com/shop/makeup/eyes/eyebrows"
  ],
  "canonical_url": "https://www.ulta.com/p/brow-harmony-flexible-lifting-eyebrow-gel-pimprod2055886",
  "category": "Makeup:Eyes:Eyebrows",
  "color": "Clear",
  "description": "Summary\nRare Beauty’s bestselling clear brow gel—now also in natural brow shades. Rare Beauty Brow Harmony Flexible Lifting Gel lifts, tints, and sets in one step, with up to 12-hour waterproof, sweat-resistant hold that’s never sticky or crunchy.\n\nDetails\nBenefits\n\nBuilds easily to sculpt and smooth brows for a brushed-up, laminated look that sticks around all day\nWeightless, water-based gel formula ensures a strong yet flexible hold—never stiff, sticky, or crunchy\nPerfect for all brow colors, the clear gel dries to a natural flake- and cake-resistant finish without leaving a trace\nWaterproof formula stands up to sweat and natural oils\nTapered brush made with soft yet firm bristles evenly combs and coats even the thickest brow hairs from root to tip\nDermatologist tested and suitable for sensitive skin\nOphthalmologist tested, suitable for sensitive eyes and for contact lens wearers\n\nFormulated Without\n\nParabens\nSulfates\nFormaldehydes\nPthalates\nMineral Oil\n\nResearch Results\n\n100% said it makes brows look sculpted and defined\n100% said it gives brows a sleek and polished look\n100% said it makes it easy to achieve a natural brow look\n98% said it instantly sets brows and is budgeproof\n98% said the applicator easily grooms/styles brows into your desired look\n*In an independent consumer study on 63 people\n\nItem 2647801\n\nHow To Use\nApply gel in short upward strokes in the direction of hair growth to create your desired brow shape. Wear it alone, or use it to set other brow products.\n\nIngredients\nWater (Aqua/Eau), Beheneth-30, VP/VA Copolymer, Alcohol, Pentylene Glycol, Butylene Glycol, Dipropylene Glycol, Glycerin, Phenoxyethanol, Caprylyl Glycol, Xanthan Gum.",
  "description_html": "<h2>Summary</h2><p>Rare Beauty’s bestselling clear brow gel—now also in natural brow shades. Rare Beauty Brow Harmony Flexible Lifting Gel lifts, tints, and sets in one step, with up to 12-hour waterproof, sweat-resistant hold that’s never sticky or crunchy.</p><h2>Details</h2><h3>Benefits</h3><ul><li>Builds easily to sculpt and smooth brows for a brushed-up, laminated look that sticks around all day</li><li>Weightless, water-based gel formula ensures a strong yet flexible hold—never stiff, sticky, or crunchy</li><li>Perfect for all brow colors, the clear gel dries to a natural flake- and cake-resistant finish without leaving a trace</li><li>Waterproof formula stands up to sweat and natural oils</li><li>Tapered brush made with soft yet firm bristles evenly combs and coats even the thickest brow hairs from root to tip</li><li>Dermatologist tested and suitable for sensitive skin</li><li>Ophthalmologist tested, suitable for sensitive eyes and for contact lens wearers</li></ul><h3>Formulated Without</h3><ul><li>Parabens</li><li>Sulfates</li><li>Formaldehydes</li><li>Pthalates</li><li>Mineral Oil</li></ul><h3>Research Results</h3><ul><li>100% said it makes brows look sculpted and defined</li><li>100% said it gives brows a sleek and polished look</li><li>100% said it makes it easy to achieve a natural brow look</li><li>98% said it instantly sets brows and is budgeproof</li><li>98% said the applicator easily grooms/styles brows into your desired look</li><li>*In an independent consumer study on 63 people</li></ul><p>Item 2647801</p><h2>How To Use</h2><p>Apply gel in short upward strokes in the direction of hair growth to create your desired brow shape. Wear it alone, or use it to set other brow products.</p><h2>Ingredients</h2><p>Water (Aqua/Eau), Beheneth-30, VP/VA Copolymer, Alcohol, Pentylene Glycol, Butylene Glycol, Dipropylene Glycol, Glycerin, Phenoxyethanol, Caprylyl Glycol, Xanthan Gum.</p>",
  "features": [
    "Cruelty Free",
    "Vegan",
    "Give Back"
  ],
  "images": [
    "https://media.ulta.com/i/ulta/2647801?fmt=auto",
    "https://media.ulta.com/i/ulta/2647801_sm?fmt=auto",
    "https://media.ulta.com/i/ulta/2647801_alt01?fmt=auto",
    "https://media.ulta.com/i/ulta/2657914cm_alt01?fmt=auto",
    "https://media.ulta.com/i/ulta/2657914cm_alt02?fmt=auto",
    "https://media.ulta.com/i/ulta/2657914cm_alt03?fmt=auto",
    "https://media.ulta.com/i/ulta/2657914cm_alt04?fmt=auto",
    "https://media.ulta.com/i/ulta/2657914cm_alt05?fmt=auto"
  ],
  "main_image": "https://media.ulta.com/i/ulta/2647801?fmt=auto",
  "in_stock": true,
  "name": "Brow Harmony Flexible Lifting Eyebrow Gel",
  "price": 21,
  "product_id": "pimprod2055886",
  "rating_value": 4.8,
  "review_count": 1180,
  "scraped_at": "2026-08-26T08:29:27.668Z",
  "size": null,
  "sku": "2647801",
  "currency": "USD",
  "url": "https://www.ulta.com/p/brow-harmony-flexible-lifting-eyebrow-gel-pimprod2055886",
  "variants": [
    {
      "attributes": {
        "color": "Clear"
      },
      "sku": "2647801",
      "url": "https://www.ulta.com/p/brow-harmony-flexible-lifting-eyebrow-gel-pimprod2055886?sku=2647801"
    },
    {
      "attributes": {
        "color": "for platinum to light blonde hair "
      },
      "sku": "2657917",
      "url": "https://www.ulta.com/p/brow-harmony-flexible-lifting-eyebrow-gel-pimprod2055886?sku=2657917"
    },
    {
      "attributes": {
        "color": "for medium to dark blonde hair"
      },
      "sku": "2657916",
      "url": "https://www.ulta.com/p/brow-harmony-flexible-lifting-eyebrow-gel-pimprod2055886?sku=2657916"
    },
    {
      "attributes": {
        "color": "for auburn & light brown hair "
      },
      "sku": "2657919",
      "url": "https://www.ulta.com/p/brow-harmony-flexible-lifting-eyebrow-gel-pimprod2055886?sku=2657919"
    },
    {
      "attributes": {
        "color": "for cool & medium brown hair "
      },
      "sku": "2657914",
      "url": "https://www.ulta.com/p/brow-harmony-flexible-lifting-eyebrow-gel-pimprod2055886?sku=2657914"
    },
    {
      "attributes": {
        "color": "for dark brown hair"
      },
      "sku": "2657915",
      "url": "https://www.ulta.com/p/brow-harmony-flexible-lifting-eyebrow-gel-pimprod2055886?sku=2657915"
    },
    {
      "attributes": {
        "color": "for black hair  "
      },
      "sku": "2657918",
      "url": "https://www.ulta.com/p/brow-harmony-flexible-lifting-eyebrow-gel-pimprod2055886?sku=2657918"
    }
  ]
}
```

### Use Cases

- Monitor beauty-product prices and availability
- Compare sizes, shades, ratings, and ingredients
- Build cosmetics and personal-care catalog datasets

### Integrate with AI and automation

#### Use with AI through MCP

Connect your AI assistant to the [Apify MCP server](https://docs.apify.com/integrations/mcp). It can discover and run Actors, then access the results in the same conversation. For example, ask your assistant to scrape a list of products from Ulta Beauty, compare prices, or summarize the collected data.

#### Run on a schedule

After one successful run, use [Apify Schedules](https://docs.apify.com/actors/running/schedules) to repeat the same task hourly, daily, weekly, or with a custom cron schedule. Saved tasks are useful when you want to keep the same URLs and settings for every run.

#### Connect with n8n

[Create an n8n account](https://n8n.partnerlinks.io/ezvl1qy3f990) and add the verified Apify node to a workflow. Choose **Run an Actor and Get Dataset** when the workflow should start this Actor, wait for completion, and receive the product rows for the next node. See the [Apify integration for n8n](https://n8n.io/integrations/apify/).

#### Connect with Make

[Create a Make account](https://www.make.com/en/register?pc=vasarmilan) and add the Apify **Run an Actor** module. Follow it with **Get Dataset Items** to pass the product rows to Google Sheets, a database, email, or another Make module. For longer runs, use **Watch Actor Runs** followed by **Get Dataset Items**.

[Read the Make integration guide](https://docs.apify.com/integrations/make).

# Actor input Schema

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

Product URLs on Ulta Beauty.

## `categoryUrls` (type: `array`):

Category URLs on Ulta Beauty.

## `maxResultsPerScrape` (type: `integer`):

Maximum number of product records to save.

## `usePagination` (type: `boolean`):

Enqueue the bounded pagination lookahead exposed by this actor.

## `scrapeProductDetails` (type: `boolean`):

Enabled returns Product detail records with the product-page fields listed in the README. Disabled returns Result records with the list-level fields.

## Actor input object example

```json
{
  "productUrls": [
    "https://www.ulta.com/p/all-nighter-waterproof-matte-setting-spray-pimprod2053042"
  ],
  "categoryUrls": [
    "https://www.ulta.com/shop/makeup/all"
  ],
  "maxResultsPerScrape": 20,
  "usePagination": true,
  "scrapeProductDetails": true
}
```

# Actor output Schema

## `dataset` (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 = {
    "productUrls": [
        "https://www.ulta.com/p/all-nighter-waterproof-matte-setting-spray-pimprod2053042"
    ],
    "categoryUrls": [
        "https://www.ulta.com/shop/makeup/all"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("123webdata/ulta-beauty-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 = {
    "productUrls": ["https://www.ulta.com/p/all-nighter-waterproof-matte-setting-spray-pimprod2053042"],
    "categoryUrls": ["https://www.ulta.com/shop/makeup/all"],
}

# Run the Actor and wait for it to finish
run = client.actor("123webdata/ulta-beauty-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 '{
  "productUrls": [
    "https://www.ulta.com/p/all-nighter-waterproof-matte-setting-spray-pimprod2053042"
  ],
  "categoryUrls": [
    "https://www.ulta.com/shop/makeup/all"
  ]
}' |
apify call 123webdata/ulta-beauty-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,123webdata/ulta-beauty-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/zTu3CMNXHtehMvyVM/builds/9b0HWSHpbZZ3mZ6Tq/openapi.json
