Ulta Reviews Scraper (Ulta.com)
Pricing
from $0.25 / 1,000 results
Ulta Reviews Scraper (Ulta.com)
⚡ Scrapes Ulta.com product reviews via raw HTTP requests. Structured output: rating, review title & text, reviewer info, helpful/not-helpful votes, verified buyer badges, media, and per-product rating averages. Filter by star rating, sort order, verified-purchase only, and keyword.
Pricing
from $0.25 / 1,000 results
Rating
0.0
(0)
Developer
Vladimir Efimenco
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 hours ago
Last modified
Categories
Share
Ulta.com Reviews Scraper | ⚡ Fast Browserless
Browserless Ulta.com review scraper built on the site's internal review API, not a headless browser. Returns full review content alongside reviewer details, verification badges, media, and product-wide rating stats — for any Ulta product page.
⚡ Why this one
- Full dataset, not a summary — every review comes with the review text, rating, reviewer info, and helpful/not-helpful vote counts.
- Product-wide rating stats included — average rating and recommended ratio are attached alongside each review.
- GTIN resolution built in — reviews are matched to a GTIN via an internal historical SKU-to-GTIN mapping, since Ulta no longer exposes GTIN on the product page itself.
- Flexible filtering — star rating, sort order (Newest, Most Helpful, Highest/Lowest Rating, Oldest, With Images), verified-purchase only, and keyword search that can run server-side or locally.
- Batch by design — scrape multiple products in a single run (up to 5 in parallel), with a configurable result cap per product or unlimited collection.
- Proxies included — proxy pool is built in. You don't need to bring your own.
- Fast — no browser, no rendering wait. Pure HTTP calls to the same internal API the Ulta site uses.
📋 Example output
[{"product_id": "pimprod2051122","product_gtin": null,"review_id": 583417318,"review_title": "It blurs effortlessly and the tones are beautiful","review_text": "This trio of Morphe blushes has very good pigmentation, blends easily and allows you to create from a soft look to a more intense one. I like that it includes matte and luminous finishes, so you can use each tone separately or combine them to give more dimension. The formula feels light and the color lasts well during the day","review_locale": "en_US","review_rating": 5,"review_likes": 0,"review_dislikes": 0,"review_helpful_score": 1684,"reviewed_source": null,"review_created_at": "2026-07-07","review_updated_at": "2026-07-07","review_media": [{"id": "583417301","uri": "//res.cloudinary.com/powerreviews/image/upload/f_auto,q_auto,h_768,w_auto/d_portal-no-product-image_ttlfpi.svg/prod/przvqicg5ia7oqkfscdh.jpg","helpful_votes": 0,"not_helpful_votes": 0,"type": "image","caption": "M202"},{"id": "583417223","uri": "//res.cloudinary.com/powerreviews/image/upload/f_auto,q_auto,h_768,w_auto/d_portal-no-product-image_ttlfpi.svg/prod/sdcbdo5xhllq39m5fvta.jpg","helpful_votes": 0,"not_helpful_votes": 0,"type": "image","caption": "Blind Date"}],"reviewer_nickname": "Melissa","reviewer_location": "Hutto, Texas","reviewer_is_staff": false,"reviewer_is_verified_buyer": false,"reviewer_is_verified": false,"reviews_metrics": {"total_reviews": 166,"recommended_ratio": 0.98,"rating_average": 4.85},"search_keyword": "good","keyword_match": true},{"product_id": "pimprod2051122","product_gtin": null,"review_id": 582813831,"review_title": "I like","review_text": "I love every Morphe product, and this one was no exception. The pigmentation is 10/10, on par with any high-end brand. It blends like butter, and the staying power is good. I absolutely love it.","review_locale": "en_US","review_rating": 5,"review_likes": 0,"review_dislikes": 0,"review_helpful_score": 1532,"reviewed_source": null,"review_created_at": "2026-06-23","review_updated_at": "2026-06-24","review_media": [{"id": "582813836","uri": "//res.cloudinary.com/powerreviews/image/upload/f_auto,q_auto,h_768,w_auto/d_portal-no-product-image_ttlfpi.svg/prod/edjisu6zsdynlvf1k04f.jpg","helpful_votes": 0,"not_helpful_votes": 0,"type": "image","caption": "I love"}],"reviewer_nickname": "Direy","reviewer_location": "NY","reviewer_is_staff": false,"reviewer_is_verified_buyer": false,"reviewer_is_verified": false,"reviews_metrics": {"total_reviews": 166,"recommended_ratio": 0.98,"rating_average": 4.85},"search_keyword": "good","keyword_match": true},{"product_id": "pimprod2051122","product_gtin": null,"review_id": 582145062,"review_title": "Loveeeee","review_text": "I love this blush I love the excellent pigmentation and the best good price😍","review_locale": "en_US","review_rating": 5,"review_likes": 2,"review_dislikes": 0,"review_helpful_score": 1264,"reviewed_source": null,"review_created_at": "2026-06-11","review_updated_at": "2026-06-19","review_media": [{"id": "582145063","uri": "//res.cloudinary.com/powerreviews/video/upload/v1781134681/prod/ls7jxjddq6ckftmvkzkc.mp4","helpful_votes": 0,"not_helpful_votes": 0,"type": "video","caption": "Love blush love color"}],"reviewer_nickname": "Elizabeth","reviewer_location": "Maryland Stevensville","reviewer_is_staff": false,"reviewer_is_verified_buyer": false,"reviewer_is_verified": false,"reviews_metrics": {"total_reviews": 166,"recommended_ratio": 0.98,"rating_average": 4.85},"search_keyword": "good","keyword_match": true}]
🧾 What you get, per review
- Review content — title, text, rating, locale, created/updated date
- Reviewer info — nickname, location, staff/verified-buyer/verified-reviewer badges
- Helpfulness — helpful votes, not-helpful votes, helpful score
- Media — photos/videos attached to the review, if any
- Product-wide stats — total review count, recommended ratio, average rating
- GTIN — resolved from SKU via internal mapping, where available
- Keyword match — whether the search query matched this review
🔍 How keyword search works
The search field is a single query, same as what you'd type into Ulta's own review search box.
searchIsLocalFilterunchecked (default): the query is sent to Ulta as a server-side filter — only matching reviews are returned, and every one of them is markedkeyword_match: true.searchIsLocalFilterchecked: the query is not sent to Ulta. Every review is still fetched and returned, but each one is checked locally against the title and text, and gets akeyword_matchflag showing whether it was found.
Use the checked option when you want the full, unfiltered review set but still want to know which reviews mention your keyword.
🧬 How GTIN resolution works
Ulta product pages no longer expose a GTIN directly. This actor resolves GTIN from the product's SKU (parsed from the input URL, e.g. ?sku=2638343) against an internal historical SKU-to-GTIN mapping.
- If the SKU is present in the URL and found in the mapping —
product_gtinis populated. - If the SKU is missing from the URL, or not found in the mapping —
product_gtinisnull.
🔧 Input options
| Field | Description |
|---|---|
listingUrls | One or more Ulta product page URLs |
maxResults | Max reviews to collect per product. Leave empty to collect all available |
sort | Sort order — Newest, Most Helpful, Highest Rating, Lowest Rating, Oldest, With Images |
rating | Filter by a single star rating (1–5) |
nativeOnly | If checked, only show reviews from verified Ulta purchasers |
search | Keyword to search for in reviews |
searchIsLocalFilter | If checked, search tags reviews locally instead of filtering them via Ulta |
📊 Data Fields
📝 Review Details
| Field | Description |
|---|---|
product_id | Ulta product ID this review belongs to |
product_gtin | GTIN resolved from SKU via internal mapping, if available |
review_id | Unique ID of the review |
review_rating | Reviewer's star rating |
review_title / review_text | Review headline and body text |
review_locale | Locale of the review |
review_created_at / review_updated_at | Dates the review was created/updated |
review_media | Photos/videos attached to the review |
reviewed_source | Brand name associated with the review |
👤 Reviewer
| Field | Description |
|---|---|
reviewer_nickname | Reviewer's display name |
reviewer_location | Reviewer's stated location |
reviewer_is_staff | True if flagged as a staff reviewer |
reviewer_is_verified_buyer | True if a verified purchaser |
reviewer_is_verified | True if a verified reviewer |
⭐ Helpfulness & Matching
| Field | Description |
|---|---|
review_likes / review_dislikes | Helpful / not-helpful vote counts |
review_helpful_score | Computed helpfulness score |
reviews_metrics | Product-wide aggregate stats — total reviews, recommended ratio, average rating |
search_keyword | The search keyword provided in actor input, if any |
keyword_match | True if the query matched this review — verified locally, or because Ulta's own filter already applied it |
🚀 Running the actor
Via Apify Console
Open the actor page, fill in the input form, and click Start.
Via Apify API — Python
import requestsAPIFY_TOKEN = "your_apify_token"ACTOR_ID = "mof1re~ulta-reviews-scraper"run_input = {"listingUrls": [{"url": "https://www.ulta.com/p/cheek-thrills-multi-finish-face-trio-pimprod2051122?sku=2638343"}],"maxResults": 200,"sort": "Newest","rating": "","nativeOnly": False,"search": "","searchIsLocalFilter": False}response = requests.post(f"https://api.apify.com/v2/acts/{ACTOR_ID}/run-sync-get-dataset-items",params={"token": APIFY_TOKEN},json=run_input,)reviews = response.json()print(f"Fetched {len(reviews)} reviews")
Via Apify API — Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'your_apify_token' });const input = {listingUrls: [{ url: 'https://www.ulta.com/p/cheek-thrills-multi-finish-face-trio-pimprod2051122?sku=2638343' }],maxResults: 200,sort: 'Newest',rating: '',nativeOnly: false,search: '',searchIsLocalFilter: false,};const run = await client.actor('mof1re/ulta-reviews-scraper').call(input);const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Fetched ${items.length} reviews`);
Example input JSON
{"listingUrls": [{ "url": "https://www.ulta.com/p/cheek-thrills-multi-finish-face-trio-pimprod2051122?sku=2638343" }],"maxResults": 200,"sort": "MediaSort","rating": "5","nativeOnly": true,"search": "good","searchIsLocalFilter": false}
💳 Pricing
Pay-per-result. You're charged for reviews actually delivered, not for pages fetched or requests made.
⚠️ Notes
- Free-tier accounts are capped at a small sample size per run, and to a single product per run — upgrade to a paid Apify plan for full volume and batch scraping.
- Data reflects what's publicly listed on ulta.com at the time of the run; the source updates continuously.
- GTIN resolution depends on the internal SKU mapping and is not guaranteed for every product.
🔗 See also
Need reviews from another platform? Check out: