# Ulta Beauty Product & Review Scraper (`crawlerbros/ulta-beauty-product-review-scraper`) Actor

Scrape Ulta Beauty (ulta.com) products by search, category, or brand. Get prices, ratings, sale status, and images from listing pages, plus full product details and customer reviews from product pages.

- **URL**: https://apify.com/crawlerbros/ulta-beauty-product-review-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, E-commerce, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## Ulta Beauty Product & Review Scraper

Scrape **Ulta Beauty** (ulta.com) — the largest US beauty retailer's product catalog. Search products, browse by category or brand, and pull full product details plus customer reviews from any product page. No login, no cookies, no paid proxy required.

### What this actor does

- **Five modes:** `search`, `byCategory`, `byBrand`, `productDetails`, `productReviews`
- **253 built-in category paths** covering every Ulta department (makeup, skin care, hair, fragrance, body care, tools & brushes, wellness, gifts, and more)
- **57 curated brand slugs** plus a free-text override for any of Ulta's ~700 brands
- **Sort control:** Relevance, Best Sellers, Price (low to high / high to low), New Arrivals, Top Rated — the exact sort orders Ulta's own listing pages offer
- **Listing filters:** minimum rating, minimum review count, maximum price, on-sale-only, Ulta "Preferences" (Clean Ingredients, Cruelty Free, Vegan, and 20 more Conscious Beauty attributes), Shopping Preference (Only at Ulta, Dermatologist Recommended, K-Beauty, Online Only, Refill, Refillable), and Special Offers (Gift With Purchase, Buy More Save More)
- **Full product detail lookup:** description, ingredients, how-to-use instructions, clean-beauty badges, price, availability, color/variant, breadcrumb category, and a sample of the most recent customer reviews — all by pasting a product URL
- **Per-review export:** flatten a product's review sample into one row per review, with product context merged in
- Empty fields are omitted from every record

### Output: per product (modes `search`, `byCategory`, `byBrand`, `productDetails`)

- `sku` — Ulta's numeric product SKU
- `productUrl` — canonical product page URL
- `brand`, `productName`, `fullName`
- `description` — full product description (mode=`productDetails` only)
- `ingredients` — full ingredients list (mode=`productDetails` only, when Ulta publishes one for that product type)
- `howToUse` — usage instructions (mode=`productDetails` only, when published)
- `badges[]` — Conscious Beauty / Clean at Ulta badges shown on the product page, e.g. `Vegan`, `Cruelty Free`, `Clean Ingredients`, `Give Back` (mode=`productDetails` only)
- `imageUrl`
- `price`, `originalPrice` (when on sale), `priceMax` (when the card shows a price range across shades, e.g. `$37.00 - $39.00`), `currency`
- `onSale` — true if currently marked down
- `rating`, `reviewCount`
- `tags[]` — badges such as `Sale`, `New` (listing modes)
- `variantInfo` — e.g. `9 colors` (listing modes)
- `color` — selected variant/shade (mode=`productDetails` only)
- `productId`, `availability` (mode=`productDetails` only)
- `breadcrumbs[]`, `category` (mode=`productDetails` only)
- `reviews[]` — sample of recent reviews, each with `reviewTitle`, `reviewerName`, `rating`, `reviewText`, `reviewDate`, `reviewerLocation` (mode=`productDetails` only)
- `recordType: "product"`, `scrapedAt`

### Output: per review (mode `productReviews`)

- `productUrl`, `productName`, `brand`, `sku` — product context
- `reviewTitle`, `reviewerName`, `rating`, `reviewText`, `reviewDate`, `reviewerLocation`
- `recordType: "review"`, `scrapedAt`

Note: Ulta's product pages embed a **sample** of recent/featured reviews (typically up to 5), not the full review history — even when `reviewCount` on the product is much higher. This actor surfaces exactly that sample; it does not fabricate additional reviews.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `byCategory` / `byBrand` / `productDetails` / `productReviews` |
| `searchQuery` | string | `lipstick` | Free-text query (mode=search) |
| `categoryPath` | select | `makeup/lips/lipstick` | One of 253 Ulta category paths (mode=byCategory) |
| `brandSlug` | select | `rare-beauty` | One of 57 curated Ulta brand slugs (mode=byBrand) |
| `customBrandSlug` | string | – | Any Ulta brand slug; overrides `brandSlug` (mode=byBrand) |
| `productUrls` | array | – | Ulta product page URLs (mode=productDetails / productReviews) |
| `sortBy` | select | `relevance` | `relevance` / `best_sellers` / `price_asc` / `price_desc` / `new_arrivals` / `top_rated` (listing modes) |
| `preferences` | multi-select | – | Zero or more of Ulta's 23 "Clean at Ulta" preferences (Vegan, Cruelty Free, Clean Ingredients, ...) — matches ALL selected (listing modes) |
| `shoppingPreference` | select | – | `exclusive` (Only at Ulta) / `dermatologist_recommended` / `k_beauty` / `online_only` / `refill` / `refillable` (listing modes) |
| `specialOffer` | select | – | `gwp` (Gift With Purchase) / `bmsm` (Buy More, Save More) (listing modes) |
| `minRating` | number | – | Drop products rated below this (0-5) |
| `minReviewCount` | integer | – | Drop products with fewer reviews than this |
| `maxPrice` | number | – | Drop products priced above this (USD) |
| `onSaleOnly` | boolean | `false` | Only emit products currently on sale |
| `maxItems` | integer | `60` | Hard cap on emitted records (1-1000) |
| `proxyConfiguration` | object | AUTO | Optional; free AUTO proxy is used automatically as a fallback if direct access is blocked |

#### Example: search for a product with filters

```json
{
  "mode": "search",
  "searchQuery": "vitamin c serum",
  "minRating": 4,
  "maxPrice": 40,
  "onSaleOnly": false,
  "maxItems": 100
}
````

#### Example: browse a category, on-sale items only

```json
{
  "mode": "byCategory",
  "categoryPath": "skin-care/moisturizers/face-moisturizer",
  "onSaleOnly": true,
  "maxItems": 50
}
```

#### Example: browse a brand

```json
{
  "mode": "byBrand",
  "brandSlug": "rare-beauty",
  "maxItems": 60
}
```

#### Example: vegan + cruelty-free face moisturizers, cheapest first

```json
{
  "mode": "byCategory",
  "categoryPath": "skin-care/moisturizers/face-moisturizer",
  "sortBy": "price_asc",
  "preferences": ["vegan", "cruelty_free"],
  "maxItems": 60
}
```

#### Example: full product details + review sample

```json
{
  "mode": "productDetails",
  "productUrls": [
    "https://www.ulta.com/p/vice-hydrating-lipstick-pimprod2026577?sku=2584521"
  ]
}
```

#### Example: flattened per-review export

```json
{
  "mode": "productReviews",
  "productUrls": [
    "https://www.ulta.com/p/vice-hydrating-lipstick-pimprod2026577?sku=2584521",
    "https://www.ulta.com/p/almost-lipstick-xlsimpprod10792007?sku=2153395"
  ]
}
```

### Use cases

- **Price monitoring** — track sale status and price changes across a category or brand
- **Assortment research** — see every product Ulta carries in a category, with ratings and review counts
- **Voice-of-customer analysis** — pull review text and ratings for sentiment analysis on specific products
- **Competitive benchmarking** — compare pricing and catalog breadth of a brand at Ulta vs. other retailers
- **Merchandising audits** — spot which products are tagged `Sale` or `New` within a department

### FAQ

**Is this affiliated with Ulta Beauty?**
No. This is an independent, third-party actor that reads Ulta's publicly accessible web pages. It is not affiliated with, endorsed by, or connected to Ulta Beauty in any way.

**Do I need a login or cookies?**
No. All modes work without authentication.

**Why do some products have no `rating` or `price`?**
Ulta doesn't display a rating for products with zero reviews, and some cards briefly omit price during a promotional refresh. Those fields are simply left out of the record rather than filled with placeholder values.

**Why does `mode=productReviews` only return a handful of reviews per product, even for products with hundreds of reviews?**
Ulta's product pages embed a curated sample of recent/featured reviews (usually up to 5) rather than the full review history. This actor extracts exactly what Ulta publishes on the page — it does not paginate a separate reviews API.

**Can I get products from a brand that isn't in the dropdown?**
Yes — set `customBrandSlug` to the brand's slug from its Ulta URL (e.g. `https://www.ulta.com/brand/fenty-skin-body` → `fenty-skin-body`). This overrides the `brandSlug` dropdown.

**Can I combine sorting, preferences, and my own filters in one run?**
Yes. `sortBy`, `preferences`, `shoppingPreference`, and `specialOffer` are applied by Ulta itself when the listing page loads, and `minRating` / `minReviewCount` / `maxPrice` / `onSaleOnly` are then applied on top of the results this actor scrapes — all in the same run.

**Why do `ingredients`, `howToUse`, and `badges` only appear on some products?**
Ulta doesn't publish an ingredients list, usage instructions, or Conscious Beauty badges for every product type (e.g. hair tools and brushes typically have none of these). The actor includes whatever Ulta actually publishes for that specific product and omits the rest rather than filling in placeholders.

**What currency are prices in?**
USD — Ulta only operates in the United States.

**How fresh is the data?**
Every run scrapes live pages at request time; there is no caching.

**Does this use a residential or paid proxy?**
No. The actor works from Apify's free datacenter (AUTO) proxy group only, and even that is a fallback — most runs complete without any proxy at all.

# Actor input Schema

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

What to fetch.

## `searchQuery` (type: `string`):

Free-text product search query, e.g. `lipstick`, `hyaluronic acid serum`.

## `categoryPath` (type: `string`):

Ulta category taxonomy path to browse.

## `brandSlug` (type: `string`):

Curated list of ~57 Ulta brand slugs discoverable from the homepage brand rail. For any other brand, use the Custom brand slug field below to override this.

## `customBrandSlug` (type: `string`):

Any Ulta brand slug from the brand page URL, e.g. `fenty-skin-body` (from https://www.ulta.com/brand/fenty-skin-body). Overrides the Brand dropdown above if set. Use this for brands not in the curated list (Ulta carries ~700 brands total).

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

Full Ulta product page URLs, e.g. `https://www.ulta.com/p/vice-hydrating-lipstick-pimprod2026577?sku=2584521`. Get these from the `productUrl` field of a search/category/brand run.

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

Server-side sort order applied by Ulta's own "Sort by" control on search, category, and brand listing pages.

## `preferences` (type: `array`):

Only include products matching ALL selected ingredient/formulation preferences (Ulta's "Preferences" filter panel). Leave empty to skip this filter.

## `shoppingPreference` (type: `string`):

Only include products matching this Ulta "Shopping Preference" facet.

## `specialOffer` (type: `string`):

Only include products carrying this Ulta "Special Offers" badge. For markdown/sale pricing, use `onSaleOnly` below instead.

## `minRating` (type: `number`):

Drop products with an average rating below this value (0-5). Products with no rating pass through.

## `minReviewCount` (type: `integer`):

Drop products with fewer reviews than this. Products with no review count pass through.

## `maxPrice` (type: `number`):

Drop products priced above this amount (USD). Products with no price pass through.

## `onSaleOnly` (type: `boolean`):

Only emit products currently marked down from their original price.

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

Hard cap on emitted records (products, or reviews in mode=productReviews). The actor scrolls and paginates as far as Ulta's own listing pages allow to get as close to this number as possible. Note: Ulta's anti-bot layer can intermittently limit automated access beyond the first results page (roughly 50-90 products/one search or category page) regardless of this setting - the actor automatically retries blocked pages with a fresh session and proxy identity, but a very large maxItems value is not always fully reachable on every run.

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

Optional. Ulta listing pages usually load fine without a proxy; the actor automatically retries through the free Apify AUTO proxy group if it detects a block. Only the free datacenter (AUTO) group is used - no paid residential proxy.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "lipstick",
  "categoryPath": "makeup/lips/lipstick",
  "brandSlug": "rare-beauty",
  "productUrls": [
    "https://www.ulta.com/p/vice-hydrating-lipstick-pimprod2026577?sku=2584521"
  ],
  "sortBy": "relevance",
  "preferences": [],
  "shoppingPreference": "",
  "specialOffer": "",
  "onSaleOnly": false,
  "maxItems": 60,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Dataset containing all scraped Ulta Beauty products and/or reviews.

# 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 = {
    "mode": "search",
    "searchQuery": "lipstick",
    "categoryPath": "makeup/lips/lipstick",
    "brandSlug": "rare-beauty",
    "productUrls": [
        "https://www.ulta.com/p/vice-hydrating-lipstick-pimprod2026577?sku=2584521"
    ],
    "sortBy": "relevance",
    "preferences": [],
    "shoppingPreference": "",
    "specialOffer": "",
    "onSaleOnly": false,
    "maxItems": 60,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/ulta-beauty-product-review-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 = {
    "mode": "search",
    "searchQuery": "lipstick",
    "categoryPath": "makeup/lips/lipstick",
    "brandSlug": "rare-beauty",
    "productUrls": ["https://www.ulta.com/p/vice-hydrating-lipstick-pimprod2026577?sku=2584521"],
    "sortBy": "relevance",
    "preferences": [],
    "shoppingPreference": "",
    "specialOffer": "",
    "onSaleOnly": False,
    "maxItems": 60,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/ulta-beauty-product-review-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 '{
  "mode": "search",
  "searchQuery": "lipstick",
  "categoryPath": "makeup/lips/lipstick",
  "brandSlug": "rare-beauty",
  "productUrls": [
    "https://www.ulta.com/p/vice-hydrating-lipstick-pimprod2026577?sku=2584521"
  ],
  "sortBy": "relevance",
  "preferences": [],
  "shoppingPreference": "",
  "specialOffer": "",
  "onSaleOnly": false,
  "maxItems": 60,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call crawlerbros/ulta-beauty-product-review-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Ulta Beauty Product & Review Scraper",
        "description": "Scrape Ulta Beauty (ulta.com) products by search, category, or brand. Get prices, ratings, sale status, and images from listing pages, plus full product details and customer reviews from product pages.",
        "version": "1.0",
        "x-build-id": "YjKZ12FXY4Uz7fTxX"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~ulta-beauty-product-review-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-ulta-beauty-product-review-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/crawlerbros~ulta-beauty-product-review-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-ulta-beauty-product-review-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/crawlerbros~ulta-beauty-product-review-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-ulta-beauty-product-review-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": "Mode",
                        "enum": [
                            "search",
                            "byCategory",
                            "byBrand",
                            "productDetails",
                            "productReviews"
                        ],
                        "type": "string",
                        "description": "What to fetch.",
                        "default": "search"
                    },
                    "searchQuery": {
                        "title": "Search query (mode=search)",
                        "type": "string",
                        "description": "Free-text product search query, e.g. `lipstick`, `hyaluronic acid serum`.",
                        "default": "lipstick"
                    },
                    "categoryPath": {
                        "title": "Category (mode=byCategory)",
                        "enum": [
                            "all",
                            "body-care",
                            "body-care/all",
                            "body-care/bath-body-accessories",
                            "body-care/bath-body-accessories/bath-sponges-gloves-brushes",
                            "body-care/bath-body-accessories/hair-towels-shower-caps",
                            "body-care/bath-body-accessories/trend-fashion-accessories",
                            "body-care/bath-shower",
                            "body-care/bath-shower/bath-bombs-shower-steamers",
                            "body-care/bath-shower/body-scrubs-exfoliants",
                            "body-care/bath-shower/bubble-bath-soaks",
                            "body-care/bath-shower/shower-gel-body-wash",
                            "body-care/body-moisturizers",
                            "body-care/body-moisturizers/body-butters",
                            "body-care/body-moisturizers/body-lotion-creams",
                            "body-care/body-moisturizers/body-serums-oils",
                            "body-care/hand-foot-care",
                            "body-care/hand-foot-care/hand-cream-foot-cream",
                            "body-care/hand-foot-care/hand-foot-treatment",
                            "body-care/hand-foot-care/hand-soap-sanitizers",
                            "body-care/mother-baby",
                            "body-care/personal-care",
                            "body-care/personal-care/deodorant",
                            "body-care/personal-care/hair-removal",
                            "body-care/suncare",
                            "body-care/suncare/after-sun-care",
                            "body-care/suncare/self-tanning-bronzing",
                            "body-care/suncare/sunscreen",
                            "body-care/travel-size-body-care",
                            "fragrance",
                            "fragrance/all",
                            "fragrance/candles-home-fragrance",
                            "fragrance/fragrance-gift-sets",
                            "fragrance/fragrance-gift-sets/cologne-gift-sets",
                            "fragrance/fragrance-gift-sets/perfume-gift-sets",
                            "fragrance/mens-fragrance",
                            "fragrance/mens-fragrance/bath-shower",
                            "fragrance/travel-size-fragrance",
                            "fragrance/unisex-fragrance",
                            "fragrance/womens-fragrance",
                            "fragrance/womens-fragrance/bath-shower",
                            "fragrance/womens-fragrance/body-lotions",
                            "fragrance/womens-fragrance/body-mist-hair-mist",
                            "fragrance/womens-fragrance/perfume",
                            "gifts",
                            "gifts/by-category",
                            "gifts/by-category/body-care-gifts",
                            "gifts/by-category/fragrance-gifts",
                            "gifts/by-category/hair-gifts",
                            "gifts/by-category/makeup-nail-gifts",
                            "gifts/by-category/mens-gifts",
                            "gifts/by-category/skin-gifts",
                            "gifts/by-category/tool-brush-gifts",
                            "gifts/by-category/wellness-gifts",
                            "gifts/by-price",
                            "gifts/by-price/100-under",
                            "gifts/by-price/30-under",
                            "gifts/by-price/50-under",
                            "gifts/gifts-with-purchase",
                            "hair",
                            "hair/all",
                            "hair/hair-brushes-combs",
                            "hair/hair-color",
                            "hair/hair-color/hair-color-bleach",
                            "hair/hair-color/root-touch-up",
                            "hair/hair-color/trend-color",
                            "hair/kids-haircare",
                            "hair/shampoo-conditioner",
                            "hair/shampoo-conditioner/co-wash",
                            "hair/shampoo-conditioner/conditioner",
                            "hair/shampoo-conditioner/dry-shampoo",
                            "hair/shampoo-conditioner/leave-in-conditioner",
                            "hair/shampoo-conditioner/shampoo",
                            "hair/styling-products",
                            "hair/styling-products/curl-enhancing",
                            "hair/styling-products/gloss-shine",
                            "hair/styling-products/hairspray",
                            "hair/styling-products/heat-protectant",
                            "hair/styling-products/smoothing",
                            "hair/styling-products/volume-texture",
                            "hair/styling-products/wax-pomade",
                            "hair/travel-size-hair-care",
                            "hair/treatment",
                            "hair/treatment/hair-thinning-hair-loss",
                            "hair/treatment/leave-in-treatment",
                            "hair/treatment/masks",
                            "hair/treatment/oils-serums",
                            "hair/treatment/scalp-care",
                            "k-beauty",
                            "k-beauty/hair-care",
                            "k-beauty/hair-care/shampoo-conditioner",
                            "k-beauty/hair-care/treatment",
                            "k-beauty/makeup",
                            "k-beauty/makeup/eyes",
                            "k-beauty/makeup/face",
                            "k-beauty/makeup/lips",
                            "k-beauty/skin-care",
                            "k-beauty/skin-care/body-care",
                            "k-beauty/skin-care/cleansers",
                            "k-beauty/skin-care/eye-treatments",
                            "k-beauty/skin-care/moisturizers",
                            "k-beauty/skin-care/suncare",
                            "k-beauty/skin-care/treatment-serums",
                            "luxury-at-ulta-beauty/fragrance",
                            "luxury-at-ulta-beauty/makeup",
                            "luxury-at-ulta-beauty/skin-care",
                            "luxury-beauty",
                            "makeup",
                            "makeup/all",
                            "makeup/body-makeup",
                            "makeup/eyes",
                            "makeup/eyes/eye-primer-base",
                            "makeup/eyes/eyebrows",
                            "makeup/eyes/eyelashes",
                            "makeup/eyes/eyeliner",
                            "makeup/eyes/eyeshadow",
                            "makeup/eyes/eyeshadow-palettes",
                            "makeup/eyes/lash-primer-serums",
                            "makeup/eyes/mascara",
                            "makeup/face",
                            "makeup/face/bb-cc-creams",
                            "makeup/face/blush",
                            "makeup/face/bronzer",
                            "makeup/face/color-correcting",
                            "makeup/face/concealer",
                            "makeup/face/contouring",
                            "makeup/face/face-primer",
                            "makeup/face/foundation",
                            "makeup/face/highlighter",
                            "makeup/face/setting-spray-powder",
                            "makeup/lips",
                            "makeup/lips/lip-balms",
                            "makeup/lips/lip-gloss",
                            "makeup/lips/lip-liner",
                            "makeup/lips/lip-oil",
                            "makeup/lips/lip-plumpers",
                            "makeup/lips/lip-stain",
                            "makeup/lips/lip-treatments",
                            "makeup/lips/lipstick",
                            "makeup/makeup-bags-organizers",
                            "makeup/makeup-palettes",
                            "makeup/nails",
                            "makeup/nails/gel-nail-polish",
                            "makeup/nails/manicure-pedicure-tools",
                            "makeup/nails/nail-art-design",
                            "makeup/nails/nail-care",
                            "makeup/nails/nail-polish",
                            "makeup/nails/nail-polish-stickers",
                            "makeup/nails/press-on-nails",
                            "makeup/nails/top-base-coats",
                            "makeup/travel-size-makeup",
                            "men",
                            "men/body-care",
                            "men/body-care/body-lotion",
                            "men/body-care/deodorant",
                            "men/body-care/shower-gel-body-wash",
                            "men/cologne",
                            "men/hair",
                            "men/hair/conditioner",
                            "men/hair/hair-thinning-hair-loss",
                            "men/hair/shampoo",
                            "men/hair/styling",
                            "men/shaving",
                            "men/shaving/aftershave",
                            "men/shaving/beard-care",
                            "men/shaving/shaving-cream-razors",
                            "men/skin-care",
                            "men/skin-care/face-wash",
                            "men/skin-care/moisturizers-treatments",
                            "men/travel-size-mens-care",
                            "new-beauty-products",
                            "skin-care",
                            "skin-care/all",
                            "skin-care/cleansers",
                            "skin-care/cleansers/cleansing-balms-oils",
                            "skin-care/cleansers/cleansing-exfoliators",
                            "skin-care/cleansers/face-wash",
                            "skin-care/cleansers/face-wipes",
                            "skin-care/cleansers/makeup-remover",
                            "skin-care/cleansers/toner",
                            "skin-care/dermatologist-recommended",
                            "skin-care/eye-treatments",
                            "skin-care/eye-treatments/eye-cream",
                            "skin-care/eye-treatments/eye-masks",
                            "skin-care/eye-treatments/eye-serums",
                            "skin-care/moisturizers",
                            "skin-care/moisturizers/face-mists-essences",
                            "skin-care/moisturizers/face-moisturizer",
                            "skin-care/moisturizers/face-oils",
                            "skin-care/moisturizers/neck-cream",
                            "skin-care/moisturizers/night-cream",
                            "skin-care/moisturizers/tinted-moisturizer",
                            "skin-care/travel-size-skin-care",
                            "skin-care/treatment-serums",
                            "skin-care/treatment-serums/acne-blemish-treatments",
                            "skin-care/treatment-serums/body-treatments",
                            "skin-care/treatment-serums/face-masks",
                            "skin-care/treatment-serums/face-peels-exfoliators",
                            "skin-care/treatment-serums/face-serums",
                            "skin-care/treatment-serums/sheet-masks",
                            "tools-brushes",
                            "tools-brushes/accessories",
                            "tools-brushes/accessories/clips-bobby-pins",
                            "tools-brushes/accessories/elastics",
                            "tools-brushes/accessories/hair-cutting-tools",
                            "tools-brushes/accessories/hair-extensions",
                            "tools-brushes/accessories/headbands",
                            "tools-brushes/accessories/styling-accessories",
                            "tools-brushes/hair-removal-tools",
                            "tools-brushes/hair-styling-tools",
                            "tools-brushes/hair-styling-tools/curling-irons-stylers",
                            "tools-brushes/hair-styling-tools/flat-irons",
                            "tools-brushes/hair-styling-tools/hair-dryers",
                            "tools-brushes/hair-styling-tools/hair-rollers",
                            "tools-brushes/hair-styling-tools/hot-brushes",
                            "tools-brushes/makeup-brushes-tools",
                            "tools-brushes/makeup-brushes-tools/brow-lash-tools",
                            "tools-brushes/makeup-brushes-tools/brush-cleaner",
                            "tools-brushes/makeup-brushes-tools/brush-sets",
                            "tools-brushes/makeup-brushes-tools/makeup-brushes",
                            "tools-brushes/makeup-brushes-tools/mirrors",
                            "tools-brushes/makeup-brushes-tools/sponges-applicators",
                            "tools-brushes/skincare-tools",
                            "tools-brushes/skincare-tools/anti-aging",
                            "tools-brushes/skincare-tools/cleansing-brushes",
                            "tools-brushes/skincare-tools/facial-rollers",
                            "travel-size-mini",
                            "wellness-by-ulta-beauty",
                            "wellness-by-ulta-beauty/all",
                            "wellness-by-ulta-beauty/essential-routines",
                            "wellness-by-ulta-beauty/essential-routines/body-essentials",
                            "wellness-by-ulta-beauty/essential-routines/movement-fitness",
                            "wellness-by-ulta-beauty/essential-routines/oral-care",
                            "wellness-by-ulta-beauty/essential-routines/wearables-devices",
                            "wellness-by-ulta-beauty/intimate-care",
                            "wellness-by-ulta-beauty/intimate-care/feminine-hygiene",
                            "wellness-by-ulta-beauty/intimate-care/menopausal-care",
                            "wellness-by-ulta-beauty/intimate-care/period-care",
                            "wellness-by-ulta-beauty/intimate-care/prenatal-postnatal-care",
                            "wellness-by-ulta-beauty/intimate-care/sexual-wellness",
                            "wellness-by-ulta-beauty/nutrition-supplements",
                            "wellness-by-ulta-beauty/nutrition-supplements/beauty-supplements",
                            "wellness-by-ulta-beauty/nutrition-supplements/daily-vitamins-supplements",
                            "wellness-by-ulta-beauty/nutrition-supplements/digestion-gut-health",
                            "wellness-by-ulta-beauty/nutrition-supplements/hydration",
                            "wellness-by-ulta-beauty/nutrition-supplements/protein-fitness",
                            "wellness-by-ulta-beauty/nutrition-supplements/sleep-stress-relief",
                            "wellness-by-ulta-beauty/nutrition-supplements/womens-health",
                            "wellness-by-ulta-beauty/rest-reset",
                            "wellness-by-ulta-beauty/rest-reset/aromatherapy",
                            "wellness-by-ulta-beauty/rest-reset/relief-recovery",
                            "wellness-by-ulta-beauty/rest-reset/sleep-support",
                            "wellness-by-ulta-beauty/rest-reset/spa-essentials"
                        ],
                        "type": "string",
                        "description": "Ulta category taxonomy path to browse.",
                        "default": "makeup/lips/lipstick"
                    },
                    "brandSlug": {
                        "title": "Brand (mode=byBrand)",
                        "enum": [
                            "about-face",
                            "amika",
                            "arrae",
                            "balmain-paris",
                            "bath-body-works",
                            "beekman-1802",
                            "better-world-fragrance-house",
                            "buttah-skin",
                            "cecred",
                            "charlotte-tilbury",
                            "cocokind",
                            "cymbiotika",
                            "design-essentials",
                            "dibs-beauty",
                            "divi",
                            "dphue",
                            "drmtlgy",
                            "eva-nyc",
                            "fenty-skin-body",
                            "fwee",
                            "gruns",
                            "gucci",
                            "hairstory",
                            "half-magic",
                            "honey-pot-company",
                            "isima",
                            "juvias-place",
                            "kevyn-aucoin",
                            "lemme",
                            "live-tinted",
                            "living-proof",
                            "maelys",
                            "maryruths",
                            "medicine-mama",
                            "milk-makeup",
                            "moroccanoil",
                            "nemat",
                            "neom-wellbeing",
                            "nodpod",
                            "noyz",
                            "nyx-professional-makeup",
                            "octavia-morgan-los-angeles",
                            "pat-mcgrath-labs",
                            "patchology",
                            "pattern",
                            "peach-lily",
                            "polite-society",
                            "rare-beauty",
                            "redken",
                            "saje-natural-wellness",
                            "scarlet-by-reddrop",
                            "sol-de-janeiro",
                            "squishmallows-fragrances",
                            "stripes-beauty-by-naomi-watts",
                            "tgin",
                            "therabody",
                            "ulta-beauty-collection"
                        ],
                        "type": "string",
                        "description": "Curated list of ~57 Ulta brand slugs discoverable from the homepage brand rail. For any other brand, use the Custom brand slug field below to override this.",
                        "default": "rare-beauty"
                    },
                    "customBrandSlug": {
                        "title": "Custom brand slug (mode=byBrand, overrides dropdown)",
                        "type": "string",
                        "description": "Any Ulta brand slug from the brand page URL, e.g. `fenty-skin-body` (from https://www.ulta.com/brand/fenty-skin-body). Overrides the Brand dropdown above if set. Use this for brands not in the curated list (Ulta carries ~700 brands total)."
                    },
                    "productUrls": {
                        "title": "Product URLs (mode=productDetails / productReviews)",
                        "type": "array",
                        "description": "Full Ulta product page URLs, e.g. `https://www.ulta.com/p/vice-hydrating-lipstick-pimprod2026577?sku=2584521`. Get these from the `productUrl` field of a search/category/brand run.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "sortBy": {
                        "title": "Sort by (listing modes)",
                        "enum": [
                            "relevance",
                            "best_sellers",
                            "price_asc",
                            "price_desc",
                            "new_arrivals",
                            "top_rated"
                        ],
                        "type": "string",
                        "description": "Server-side sort order applied by Ulta's own \"Sort by\" control on search, category, and brand listing pages.",
                        "default": "relevance"
                    },
                    "preferences": {
                        "title": "Preferences / Clean at Ulta (listing modes)",
                        "type": "array",
                        "description": "Only include products matching ALL selected ingredient/formulation preferences (Ulta's \"Preferences\" filter panel). Leave empty to skip this filter.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "clean_ingredients",
                                "cruelty_free",
                                "vegan",
                                "sustainable_packaging",
                                "give_back",
                                "aha_glycolic_acid",
                                "alcohol_free",
                                "antioxidants",
                                "cbd",
                                "fragrance_free",
                                "gluten_free",
                                "hyaluronic_acid",
                                "mineral",
                                "niacinamide",
                                "non_comedogenic",
                                "oil_free",
                                "paraben_free",
                                "peptides",
                                "phthalate_free",
                                "salicylic_acid",
                                "silicone_free",
                                "sulfate_free",
                                "talc_free"
                            ],
                            "enumTitles": [
                                "Clean Ingredients",
                                "Cruelty Free",
                                "Vegan",
                                "Sustainable Packaging",
                                "Give Back",
                                "Aha / Glycolic Acid",
                                "Alcohol Free",
                                "Antioxidants",
                                "Cbd",
                                "Fragrance Free",
                                "Gluten Free",
                                "Hyaluronic Acid",
                                "Mineral",
                                "Niacinamide",
                                "Non Comedogenic",
                                "Oil Free",
                                "Paraben Free",
                                "Peptides",
                                "Phthalate Free",
                                "Salicylic Acid",
                                "Silicone Free",
                                "Sulfate Free",
                                "Talc Free"
                            ]
                        },
                        "default": []
                    },
                    "shoppingPreference": {
                        "title": "Shopping preference (listing modes)",
                        "enum": [
                            "",
                            "exclusive",
                            "dermatologist_recommended",
                            "k_beauty",
                            "online_only",
                            "refill",
                            "refillable"
                        ],
                        "type": "string",
                        "description": "Only include products matching this Ulta \"Shopping Preference\" facet.",
                        "default": ""
                    },
                    "specialOffer": {
                        "title": "Special offer (listing modes)",
                        "enum": [
                            "",
                            "gwp",
                            "bmsm"
                        ],
                        "type": "string",
                        "description": "Only include products carrying this Ulta \"Special Offers\" badge. For markdown/sale pricing, use `onSaleOnly` below instead.",
                        "default": ""
                    },
                    "minRating": {
                        "title": "Minimum rating (listing modes)",
                        "minimum": 0,
                        "maximum": 5,
                        "type": "number",
                        "description": "Drop products with an average rating below this value (0-5). Products with no rating pass through."
                    },
                    "minReviewCount": {
                        "title": "Minimum review count (listing modes)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Drop products with fewer reviews than this. Products with no review count pass through."
                    },
                    "maxPrice": {
                        "title": "Maximum price (listing modes)",
                        "minimum": 0,
                        "type": "number",
                        "description": "Drop products priced above this amount (USD). Products with no price pass through."
                    },
                    "onSaleOnly": {
                        "title": "On sale only (listing modes)",
                        "type": "boolean",
                        "description": "Only emit products currently marked down from their original price.",
                        "default": false
                    },
                    "maxItems": {
                        "title": "Max items",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Hard cap on emitted records (products, or reviews in mode=productReviews). The actor scrolls and paginates as far as Ulta's own listing pages allow to get as close to this number as possible. Note: Ulta's anti-bot layer can intermittently limit automated access beyond the first results page (roughly 50-90 products/one search or category page) regardless of this setting - the actor automatically retries blocked pages with a fresh session and proxy identity, but a very large maxItems value is not always fully reachable on every run.",
                        "default": 60
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional. Ulta listing pages usually load fine without a proxy; the actor automatically retries through the free Apify AUTO proxy group if it detects a block. Only the free datacenter (AUTO) group is used - no paid residential proxy.",
                        "default": {
                            "useApifyProxy": 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
