# Ulta Beauty US Product Scraper (`dromb/ulta-beauty-us-product-scraper`) Actor

Extract comprehensive product information from Ulta Beauty US storefront including search, categories, and product details with pricing, reviews, and variants.

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

## Pricing

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

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## Ulta Beauty US Product Scraper

Turn public Ulta Beauty storefront pages into structured product data for price monitoring, beauty catalog research, assortment comparison, ingredient analysis, and workflow automation.

The Actor keeps search and category results compact while the item operation returns richer product details such as ingredients, usage, variants, reviews, badges, and images.

### What you can extract

- Product search results with prices, ratings, reviews, images, badges, and URLs
- Category product listings with pagination and sorting
- Rich product details including ingredients, usage, variants, breadcrumbs, and review samples
- Public category links
- Search filters and sort options
- A lightweight storefront connectivity probe

### Quick start

Search for products:

```json
{
  "operation": "search",
  "query": "lipstick",
  "page": 1,
  "sort": "relevance",
  "proxy": "auto"
}
```

Get a category:

```json
{
  "operation": "category",
  "url": "https://www.ulta.com/shop/makeup/lips/lip-liner",
  "page": 1,
  "proxy": "auto"
}
```

Get rich product details:

```json
{
  "operation": "item",
  "url": "https://www.ulta.com/p/macximal-silky-matte-lipstick-pimprod2043558?sku=2621440",
  "proxy": "auto"
}
```

### Operations

| Operation | Required input | Dataset records |
| --- | --- | --- |
| `search` | `query` | One record per product |
| `category` | `url` or `path` | Products, or one landing-category record |
| `item` | `url`, `path`, or `sku` | One rich product record |
| `categories` | None | One record per discovered category |
| `search/filters` | `query` | One filter metadata record |
| `probe` | None | One connectivity record |

For item lookups, a full public product URL is more reliable than SKU-only resolution.

### Output

Product and category data is written to the default Dataset. Service summaries and errors are not mixed into product rows.

The `OUTPUT` record in the default key-value store contains:

- success status
- number of Dataset records
- source result count and pagination when available
- selected connection route
- an actionable `errors` array

A failed source request fails the Actor run instead of producing a misleading successful run with an error row.

### Proxy choices

`auto` starts with the cheapest direct route. You can explicitly select:

- `direct`
- `datacenter`
- `residential`
- `special` with `specialProxyGroup`
- `custom` with `customProxyUrl`

Current cloud validation shows that direct is the best default and US residential is the working paid fallback. Ulta currently blocks the tested Apify datacenter route, while tested account-specific special groups did not produce usable search results. Use a paid proxy tier only if direct access is blocked. Proxy credentials are never written to Dataset or `OUTPUT`.

### Common use cases

- Monitor price and promotion changes for a product list
- Compare brands and assortments within a beauty category
- Build ingredient-aware beauty research datasets
- Track ratings and review volume
- Enrich a CRM, spreadsheet, or internal product catalog

### Limitations

- Ulta can change its storefront data structures or access controls.
- SKU-only lookup is best effort; use a product URL when possible.
- Top-level category pages may be navigation landings and return subcategories instead of products.
- Availability can vary by store and user location; the Actor reports only public storefront data exposed by the selected page.

### Responsible use

This is an unofficial Actor and is not affiliated with, endorsed by, or sponsored by Ulta Beauty. Use it responsibly and in accordance with applicable laws and website terms.

# Actor input Schema

## `operation` (type: `string`):

Choose product search, category listing, rich product details, category discovery, filters, or a connectivity probe.

## `query` (type: `string`):

Required for Search products and Search filters.

## `url` (type: `string`):

Use a full public Ulta product URL for the richest and most reliable item lookup.

## `path` (type: `string`):

Alternative to URL, for example /shop/makeup/lips/lip-liner.

## `sku` (type: `string`):

Best-effort item resolution. A full product URL is preferred.

## `page` (type: `integer`):

One-based result page.

## `sort` (type: `string`):

Optional ordering for search and category product results.

## `proxy` (type: `string`):

Auto currently uses the cheapest direct route. Choose an Apify tier only when a direct run is blocked.

## `proxyCountry` (type: `string`):

Optional two-letter country code, such as US. Availability depends on the selected Apify proxy tier.

## `specialProxyGroup` (type: `string`):

Required only for Apify special group. Enter a group enabled for your Apify account.

## `customProxyUrl` (type: `string`):

Required only for Custom proxy. Credentials are never written to Dataset or OUTPUT.

## Actor input object example

```json
{
  "operation": "search",
  "query": "lipstick",
  "page": 1,
  "sort": "relevance",
  "proxy": "auto"
}
```

# Actor output Schema

## `results` (type: `string`):

Products, categories, product details, filters, or probe data returned by the selected operation.

## `summary` (type: `string`):

Run status, row count, pagination, errors, and the proxy tier used.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("dromb/ulta-beauty-us-product-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 = {}

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

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/PhBofU8QTa10sypa4/builds/xRFzyshHx8hzad9sk/openapi.json
