Ulta Reviews Scraper (Ulta.com) avatar

Ulta Reviews Scraper (Ulta.com)

Pricing

from $0.25 / 1,000 results

Go to Apify Store
Ulta Reviews Scraper (Ulta.com)

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

Vladimir Efimenco

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

19 hours ago

Last modified

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.

  • searchIsLocalFilter unchecked (default): the query is sent to Ulta as a server-side filter — only matching reviews are returned, and every one of them is marked keyword_match: true.
  • searchIsLocalFilter checked: 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 a keyword_match flag 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_gtin is populated.
  • If the SKU is missing from the URL, or not found in the mapping — product_gtin is null.

🔧 Input options

FieldDescription
listingUrlsOne or more Ulta product page URLs
maxResultsMax reviews to collect per product. Leave empty to collect all available
sortSort order — Newest, Most Helpful, Highest Rating, Lowest Rating, Oldest, With Images
ratingFilter by a single star rating (1–5)
nativeOnlyIf checked, only show reviews from verified Ulta purchasers
searchKeyword to search for in reviews
searchIsLocalFilterIf checked, search tags reviews locally instead of filtering them via Ulta

📊 Data Fields

📝 Review Details

FieldDescription
product_idUlta product ID this review belongs to
product_gtinGTIN resolved from SKU via internal mapping, if available
review_idUnique ID of the review
review_ratingReviewer's star rating
review_title / review_textReview headline and body text
review_localeLocale of the review
review_created_at / review_updated_atDates the review was created/updated
review_mediaPhotos/videos attached to the review
reviewed_sourceBrand name associated with the review

👤 Reviewer

FieldDescription
reviewer_nicknameReviewer's display name
reviewer_locationReviewer's stated location
reviewer_is_staffTrue if flagged as a staff reviewer
reviewer_is_verified_buyerTrue if a verified purchaser
reviewer_is_verifiedTrue if a verified reviewer

⭐ Helpfulness & Matching

FieldDescription
review_likes / review_dislikesHelpful / not-helpful vote counts
review_helpful_scoreComputed helpfulness score
reviews_metricsProduct-wide aggregate stats — total reviews, recommended ratio, average rating
search_keywordThe search keyword provided in actor input, if any
keyword_matchTrue 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 requests
APIFY_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: