Ulta Product Reviews Scraper
Pricing
Pay per event
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
Maintained by CommunityActor 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?
| Field | Description |
|---|---|
recordType | product or review |
brand | Product brand when available |
productName | Product name |
price | Regular/list price |
salePrice | Sale price when present |
rating | Aggregate star rating |
reviewCount | Aggregate review count |
availability | Availability from product structured data |
productUrl | Canonical Ulta product URL |
productId | Ulta product ID, for example pimprod2059833 |
skuId | Ulta SKU from the URL or product data |
variant | Shade, color, or variant label when available |
reviewTitle | Review title |
reviewText | Review body |
reviewRating | Review star rating |
reviewAuthor | Public review author name |
reviewLocation | Public reviewer location |
reviewDate | Review publication date |
sourceUrl | Page where the row was discovered |
scrapedAt | Actor 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
- Open the actor on Apify.
- Add an Ulta category or search URL to
startUrls. - Keep
includeReviewsenabled if you want the actor to follow discovered product pages. - Set
maxItemsto the number of product/review rows you want. - 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
| Input | Type | Default | Notes |
|---|---|---|---|
startUrls | array | required | Ulta category, search, or product URLs |
maxItems | integer | 20 | Total product + review rows to save |
includeReviews | boolean | true | Follow product URLs and save review rows |
maxReviewsPerProduct | integer | 10 | Cap 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
maxItemssmall during testing. - Schedule daily or weekly runs for price and reputation monitoring.
- Use
recordTypeto 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 ApifyClientclient = 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.
Related scrapers
You may also want these Automation Lab actors:
- https://apify.com/automation-lab/amazon-reviews-scraper
- https://apify.com/automation-lab/sephora-reviews-scraper
- https://apify.com/automation-lab/walmart-products-scraper
- https://apify.com/automation-lab/target-products-scraper
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.