Ulta Product Reviews Scraper avatar

Ulta Product Reviews Scraper

Pricing

Pay per event

Go to Apify Store
Ulta Product Reviews Scraper

Ulta Product Reviews Scraper

Scrape Ulta products, prices, ratings, availability, and recent customer reviews from public Ulta category/search/product pages.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Scrape Ulta product listings, prices, ratings, availability, and recent customer reviews from public Ulta pages.

Use this actor to monitor beauty products, price changes, merchandising, star ratings, and review sentiment without building your own Ulta parser.

What does Ulta Product Reviews Scraper do?

Ulta Product Reviews Scraper extracts structured ecommerce data from Ulta category, search, and product pages.

It can collect product rows from pages such as https://www.ulta.com/shop/makeup and can also open product detail pages to collect recent review rows embedded in Ulta's public structured data.

Typical fields include:

  • ๐Ÿ’„ Brand and product name
  • ๐Ÿท๏ธ Regular price and sale price
  • โญ Rating and review count
  • ๐Ÿ›’ Availability
  • ๐Ÿ–ผ๏ธ Image URL
  • ๐Ÿ”— Product URL, product ID, and SKU
  • ๐Ÿ“ Review title, body, rating, author, location, and date

Who is it for?

Beauty brands

Track how your products appear on Ulta, watch ratings, and collect recent review language for voice-of-customer analysis.

Retail analysts

Monitor assortment, discounting, new launches, product availability, and category-level pricing across Ulta pages.

Reputation intelligence teams

Collect recent review text and star ratings for recurring sentiment monitoring.

Price intelligence vendors

Use category and product URLs as repeatable inputs for scheduled price and promotion checks.

Why use this Ulta scraper?

  • โœ… HTTP-first implementation for low compute cost
  • โœ… Works with category/search pages and direct product URLs
  • โœ… Product rows and review rows in one export
  • โœ… Includes source URL and scrape timestamp for auditability
  • โœ… Designed for recurring ecommerce monitoring workflows

What data can I extract from Ulta?

FieldDescription
recordTypeproduct or review
brandProduct brand when available
productNameProduct name
priceRegular/list price
salePriceSale price when present
ratingAggregate star rating
reviewCountAggregate review count
availabilityAvailability from product structured data
productUrlCanonical Ulta product URL
productIdUlta product ID, for example pimprod2059833
skuIdUlta SKU from the URL or product data
variantShade, color, or variant label when available
reviewTitleReview title
reviewTextReview body
reviewRatingReview star rating
reviewAuthorPublic review author name
reviewLocationPublic reviewer location
reviewDateReview publication date
sourceUrlPage where the row was discovered
scrapedAtActor run timestamp

How much does it cost to scrape Ulta products and reviews?

This actor uses pay-per-event pricing.

You pay a small start fee for each run and a per-result fee for each dataset row saved.

A row can be either:

  • one product row, or
  • one review row with product context.

Use a low maxItems value for first tests, then increase it for scheduled monitoring.

How to scrape Ulta category pages

  1. Open the actor on Apify.
  2. Add an Ulta category or search URL to startUrls.
  3. Keep includeReviews enabled if you want the actor to follow discovered product pages.
  4. Set maxItems to the number of product/review rows you want.
  5. Start the run and download the dataset as JSON, CSV, Excel, or via API.

How to scrape one Ulta product's reviews

Use a direct product URL, for example:

{
"startUrls": [
{ "url": "https://www.ulta.com/p/soft-pinch-lip-oil-stick-pimprod2059833?sku=2658777" }
],
"maxItems": 25,
"includeReviews": true,
"maxReviewsPerProduct": 20
}

The actor saves a product row and recent review rows available in the page's public structured data.

Input options

InputTypeDefaultNotes
startUrlsarrayrequiredUlta category, search, or product URLs
maxItemsinteger20Total product + review rows to save
includeReviewsbooleantrueFollow product URLs and save review rows
maxReviewsPerProductinteger10Cap embedded reviews per product

Output example

{
"recordType": "review",
"brand": "Rare Beauty",
"productName": "Soft Pinch Lip Oil Stick",
"price": "25.00",
"rating": 4.8,
"reviewCount": 79,
"reviewTitle": "Beautiful pigmentation",
"reviewText": "The lip oil stick by Rare Beauty is such a smooth gliding...",
"reviewRating": 5,
"reviewAuthor": "Keetabeeta",
"reviewLocation": "Buffalo, NY",
"reviewDate": "2026-07-06",
"productUrl": "https://www.ulta.com/p/soft-pinch-lip-oil-stick-pimprod2059833?sku=2658777",
"productId": "pimprod2059833",
"skuId": "2658777",
"scrapedAt": "2026-07-08T00:00:00.000Z"
}

Tips for best results

  • Start with category URLs for product discovery.
  • Use direct product URLs when you care about a known SKU.
  • Keep maxItems small during testing.
  • Schedule daily or weekly runs for price and reputation monitoring.
  • Use recordType to split products and reviews in your BI tool.

Integrations

Use the dataset with:

  • ๐Ÿ“Š Google Sheets dashboards for price checks
  • ๐Ÿง  sentiment analysis pipelines for review text
  • ๐Ÿ›’ retail intelligence systems
  • ๐Ÿ”” alerts when ratings or prices change
  • ๐Ÿงพ product catalog enrichment workflows

API usage with Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/ulta-product-reviews-scraper').call({
startUrls: [{ url: 'https://www.ulta.com/shop/makeup' }],
maxItems: 100,
includeReviews: true,
});
console.log(run.defaultDatasetId);

API usage with Python

from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("automation-lab/ulta-product-reviews-scraper").call(run_input={
"startUrls": [{"url": "https://www.ulta.com/shop/makeup"}],
"maxItems": 100,
"includeReviews": True,
})
print(run["defaultDatasetId"])

API usage with cURL

curl -X POST "https://api.apify.com/v2/acts/automation-lab~ulta-product-reviews-scraper/runs?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"startUrls":[{"url":"https://www.ulta.com/shop/makeup"}],"maxItems":100,"includeReviews":true}'

MCP usage

Connect Apify MCP to use this scraper from Claude Desktop or Claude Code.

MCP endpoint:

https://mcp.apify.com/?tools=automation-lab/ulta-product-reviews-scraper

Claude Code CLI setup:

$claude mcp add apify-ulta --transport http "https://mcp.apify.com/?tools=automation-lab/ulta-product-reviews-scraper"

Claude Desktop JSON config:

{
"mcpServers": {
"apify-ulta": {
"url": "https://mcp.apify.com/?tools=automation-lab/ulta-product-reviews-scraper"
}
}
}

Example prompts:

  • "Run the Ulta Product Reviews Scraper for this product URL and summarize negative review themes."
  • "Scrape Ulta makeup category products and list the highest-rated items."
  • "Monitor these Ulta product URLs weekly and flag price changes."

Data quality notes

Ulta pages can contain several public data sources, including HTML product cards, hydration state, and JSON-LD structured data.

The actor prefers stable public data embedded in the initial page response.

Review pagination beyond embedded recent reviews may require a future API-specific enhancement.

FAQ

Does this actor scrape full historical review pagination?

The MVP extracts recent reviews embedded in public product structured data. Full pagination can be added later if Ulta exposes a stable public endpoint.

Can I schedule recurring Ulta monitoring?

Yes. Use Apify schedules with category or product URLs and export the dataset to your warehouse, webhook, or dashboard.

Troubleshooting

Why did I get fewer rows than expected?

Some category pages only embed a limited number of product cards in the initial HTML. Enable includeReviews or provide more category/product URLs to collect more rows.

Why are some fields empty?

Ulta does not expose every field on every page type. For example, category cards may have product information but not full review text.

Can I scrape private account data?

No. This actor is designed for public Ulta pages only.

Legality and responsible use

This actor extracts publicly available product and review information from Ulta pages.

Make sure your use case complies with applicable laws, Ulta's terms, and privacy requirements.

Do not use scraped data for spam, harassment, or unlawful profiling.

You may also want these Automation Lab actors:

Changelog

0.1

Initial version with Ulta category/product extraction and recent review rows from product structured data.

Support

If a public Ulta URL stops working or a field becomes unavailable, open an Apify issue with the run ID and input used.