
Google Maps Reviews Scraper
scrape.ly/store/cornerledger/google-maps-reviews-scraperLead generationAutomation
3 monthly users

Scrape Ulta Beauty product reviews by product URL, product id, or category/brand page: star rating, title, text, recommendation, reviewer nickname and location, verified-buyer badge, helpful votes, photos and syndicated brand reviews. No login needed.
Collect every public review of any Ulta Beauty product: star rating, title, full text, "would recommend", reviewer nickname and location, verified-buyer badge, helpful votes, customer photos and the reviews Ulta syndicates from brand websites. Paste product URLs, product ids, or a whole category or brand page, and get clean rows in seconds. No login, no browser, and only $0.25 per 1,000 reviews.
pimprod2021615), or a category or brand page such as https://www.ulta.com/brand/clinique.| Field | What it does |
|---|---|
startUrls | Ulta product URLs, product ids (pimprod..., xlsImpprod..., mkt...), or category/brand pages |
maxReviewsPerProduct | Reviews per product, 0 = all (default 20) |
sortBy | newest, oldest, most_helpful, highest_rating, lowest_rating, with_media |
ratings | Only these star ratings, e.g. ["1", "2"] |
reviewsSince | Only reviews on or after a date (2026-01-01) or a relative age (30 days) |
keyword | Only reviews matching these words (Ulta's own review search) |
withMediaOnly / verifiedBuyersOnly / nativeOnly | Photo reviews only / verified buyers only / reviews written on ulta.com only |
maxProductsPerListing | For category and brand pages: products to scrape (default 10, 0 = all) |
proxyConfiguration | Datacenter proxy by default |
{
"startUrls": [
"https://www.ulta.com/p/moisture-surge-100h-auto-replenishing-hydrator-gel-moisturizer-with-hyaluronic-acid-pimprod2021615",
"https://www.ulta.com/brand/clinique"
],
"maxReviewsPerProduct": 100,
"sortBy": "newest",
"ratings": ["1", "2"],
"reviewsSince": "2026-01-01",
"maxProductsPerListing": 5
}
One row per review.
| Field | Description |
|---|---|
review_id | Review id (also ugc_id, legacy_id, internal_review_id) |
product_page_id, product_name, product_url | The product |
product_brand, product_price, product_sale_price | Filled for products found on a category or brand page |
product_average_rating, product_review_count, product_recommended_ratio | Product summary at scrape time |
rating | Stars, 1 to 5 |
headline, comments | Review title and text |
bottom_line | "Yes" / "No": would recommend |
nickname, location, locale | Reviewer as shown on Ulta |
created_date, updated_date | ISO 8601 (UTC) |
helpful_votes, not_helpful_votes, helpful_score | Helpfulness |
is_verified_buyer, is_verified_reviewer, is_staff_reviewer | Badges |
source | native (written on ulta.com) or syndicated (from the brand's site) |
brand_name, brand_base_url, brand_logo_uri, disclosure_code | Syndication source and disclosure (e.g. sampling for free-product reviews) |
properties | Survey answers such as age, skin type, "was this a gift?" |
media, image_urls | Customer photos and videos with captions |
position, scraped_at | Order within the product, scrape time |
Example row from a test run (shortened):
{
"review_id": 588488125,
"product_page_id": "pimprod2057355",
"product_name": "Double Wear Stay-in-Place Longwear Matte Foundation",
"product_url": "https://www.ulta.com/p/double-wear-stay-in-place-longwear-matte-foundation-pimprod2057355",
"product_average_rating": 4.24,
"product_review_count": 10234,
"product_recommended_ratio": 0.88,
"rating": 5,
"headline": "Best makeup",
"comments": "I really enjoyed trying the Estée Lauder Double Wear Foundation! It blends well into my skin and provides great coverage without feeling overly heavy...",
"bottom_line": "Yes",
"nickname": "Christy99",
"location": "US",
"created_date": "2026-10-14T17:33:28.179Z",
"helpful_votes": 1,
"is_verified_buyer": false,
"is_verified_reviewer": true,
"source": "syndicated",
"brand_name": "Estee Lauder US",
"disclosure_code": "communitycontent",
"properties": [{"key": "wasthisagift", "label": "Was this a gift?", "type": "tag", "value": ["Yes"]}],
"image_urls": ["https://res.cloudinary.com/powerreviews/image/upload/f_auto,q_auto,h_768,w_auto/d_portal-no-product-image_ttlfpi.svg/prod/fpetg6dwrscibrexccdn.jpg"],
"position": 22,
"scraped_at": "2026-10-22T04:25:55Z"
}
You pay $0.25 per 1,000 reviews ($0.00025 per review saved), plus the small platform usage of the run (compute and datacenter proxy traffic).
Is it legal to scrape Ulta reviews? The actor only reads reviews that anyone can see on ulta.com without logging in. Reviews contain nicknames and locations that people chose to publish; check the rules that apply to how you use personal data (for example GDPR or CCPA).
Do I need an Ulta account or a proxy? No account. The default datacenter proxy works; the run switches to US residential proxies by itself if requests start being refused.
How many reviews can I get? As many as you ask for. Ulta's review service pages through at most 10,000 reviews per sort order; past that the actor combines star ratings and sort orders. For the very largest products (tens of thousands of reviews, most of them 5 stars) some reviews in the middle of the 5-star range can still be out of reach; the run's status message says so when it happens.
Why is a field empty?
Fields are empty when Ulta has no value: bottom_line is missing when the reviewer did not answer, brand_name only exists for syndicated reviews, and product_brand / product_price are only filled for products found on a category or brand page.
Can I schedule it or use the API? Yes. Schedule it (for example daily with "Reviews newer than: 1 day"), call it from the API, or connect it to your integrations.
I used a similar actor on another platform. Will my input work?
Yes: product_urls, max_results_per_product, sort (Newest, Mosthelpful...) and native_only are understood, and the output keeps the familiar review field names.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
startUrlsarrayOptionalUlta product URLs, product ids or category/brand pages
One per line. Product pages (https://www.ulta.com/p/...-pimprod2021615), bare product ids (pimprod2021615, xlsImpprod12021005), or category and brand pages (https://www.ulta.com/shop/makeup/face/foundation, https://www.ulta.com/brand/clinique) to scrape the reviews of every product they list.
maxReviewsPerProductintegerOptionaldefault 20Max reviews per product
How many reviews to save for each product. 0 saves every review the product has. Ulta's review service lets anyone page through at most 10,000 reviews per sort order; for bigger products the actor combines several sort orders and star ratings to collect as many as possible.
sortByenumOptionaldefault "newest"Sort reviews by
The order reviews are collected in, as on the product page.
ratingsarrayOptionalStar ratings
Only reviews with these star ratings. Leave empty for all ratings.
reviewsSincestringOptionalReviews newer than
Only reviews written on or after this date (YYYY-MM-DD), or a relative age such as '30 days', '6 months' or '1 year'. Fastest with the 'Most recent' sort, which stops at the first older review.
keywordstringOptionalReviews mentioning
Only reviews that match these words, using Ulta's own review search (for example 'dry skin').
withMediaOnlybooleanOptionaldefault falseOnly reviews with photos or videos
Skip reviews without customer photos or videos.
verifiedBuyersOnlybooleanOptionaldefault falseOnly verified buyers
Skip reviews without the verified-buyer badge.
nativeOnlybooleanOptionaldefault falseOnly reviews written on Ulta
Ulta also shows reviews syndicated from brand websites (marked with source 'syndicated'). Turn this on to keep only reviews written on ulta.com.
maxProductsPerListingintegerOptionaldefault 10Max products per category or brand page
For category and brand page URLs: how many of the listed products to scrape reviews for, in the page's order. 0 takes every product the listing has (all of its pages).
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy
Datacenter proxies work for Ulta's reviews. The run switches to US residential exits by itself if requests start being refused.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| review_id | integer | string | null | |
| ugc_id | integer | string | null | |
| legacy_id | integer | string | null | |
| internal_review_id | integer | string | null | |
| product_page_id | string | null | |
| product_name | string | null | |
| product_brand | string | null | |
| product_url | string | null | |
| product_price | string | null | |
| product_sale_price | string | null | |
| product_average_rating | number | null | |
| product_review_count | number | null | |
| product_recommended_ratio | number | null | |
| rating | number | null | |
| headline | string | null | |
| comments | string | null | |
| bottom_line | string | null | |
| nickname | string | null | |
| location | string | null | |
| locale | string | null | |
| created_date | string | null | |
| updated_date | string | null | |
| helpful_votes | number | null | |
| not_helpful_votes | number | null | |
| helpful_score | number | null | |
| is_verified_buyer | boolean | null | |
| is_verified_reviewer | boolean | null | |
| is_staff_reviewer | boolean | null | |
| source | string | null | |
| brand_name | string | null | |
| brand_base_url | string | null | |
| brand_logo_uri | string | null | |
| disclosure_code | string | null | |
| properties | array | null | |
| media | array | null | |
| image_urls | array | null | |
| position | number | null | |
| scraped_at | string | null | |
| responses | array | object | null |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Review | One Ulta review saved to the dataset, with its rating, text, reviewer details, badges, photos and product summary. | $0.00025 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('shelfbright/ulta-scraper').call({
"startUrls": [
"https://www.ulta.com/p/moisture-surge-100h-auto-replenishing-hydrator-gel-moisturizer-with-hyaluronic-acid-pimprod2021615"
],
"maxReviewsPerProduct": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run shelfbright/ulta-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=shelfbright/ulta-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Latest reviews of the first products on the Clinique brand page, with each product's brand, price and average rating.
The 8 most helpful reviews of two popular foundations, by product id, with rating, text, reviewer and badges.
The newest critical reviews of a product: see what customers complain about.
Only reviews written on ulta.com that include customer photos, newest first.
Reviews from the past year for the first products of the foundation category, newest first.

Scrape Google Maps places for any search term and city, with no code or with one API call. A real run, its output, its log and its exact cost, plus the limits and the legal side.
Read the article
Paste an Amazon search or product URL into a ready-made Actor and get one row per product with price, ASIN, rating and review count. This guide covers the no-code steps, the API, ZIP code pricing, a real run and its cost.
Read the article
Scrape Google search results by query and country and get each results page as JSON: organic results with positions, People Also Ask and related searches. Run it without code or from Python, with a real run, the cost per page and Google's terms.
Read the articleScrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.