Ulta Beauty Scraper: Shade, Size and Store-Level Data

An Ulta Beauty scraper built for a shelf where drugstore and prestige sit together: one product id can carry thirty shades, and only the SKU row tells you which of them a shopper can actually buy.

Plans from €169/month · Free project assessment · Reply within 1 business day

Ulta Beauty Scraper
Solutions

How Ulta Beauty data is collected and delivered

Ulta puts its busiest entry points behind a queue, so a crawler that hammers site search learns nothing while one that walks the category tree and the sku sitemap gets the whole shelf. Anti-bot handling, proxy rotation and CAPTCHA solving are part of what we run, and the crawl is paced to read like traffic rather than a flood.

Delivery is CSV, JSON, XLSX or an API endpoint on the schedule you set: daily for price and stock, weekly for assortment, more than once a day around an event. The usual shape is linked tables - one row per product keyed on the product id, one row per variant keyed on the skuId, with reviews and store stock as tables of their own. Every run ships a short report: rows delivered, fields that came back empty, and SKUs that were present last time and are not present now.

Ulta Beauty product fields we extract, SKU by SKU

An Ulta Beauty record has two levels we keep apart: the product level holds what is true of the whole item, the SKU level everything that changes shade by shade and size by size.

  • Product - brand name, product name, product id, the colon-delimited category path, the benefits list, key ingredients, the full ingredient declaration, how-to-use copy, and the brand-level note saying whether Ulta coupons apply.
  • SKU - skuId, printed on the page as the Item number, shade name, the undertone sentence beside the swatch such as very fair with neutral undertones, size such as 1.0 oz, list price, sale price, discount, the flags marking a variant disabled or unavailable, and the swatch and smoosh images keyed on skuId.
  • Listing tile - brand, product name, list price given as a range across sizes, rating, review count, badges such as New, Online only, Only at Ulta and Beauty Steal, promo copy such as Buy 1 Get 1 50% Off, and a sponsored flag separating paid slots from organic rank.
  • Fulfilment - the three tiles shown on every product, ship, pickup and same day, each with its own state, plus the delivery speed line and the Replenish and Save subscription price.
  • Preferences - the attribute vocabulary Ulta filters on: Clean Ingredients, Cruelty Free, Vegan, Sustainable Packaging, Give Back, Paraben Free, Sulfate Free, and named actives such as Hyaluronic Acid and Niacinamide.
  • Reviews - star average and review count, and per review the headline, the body, the reviewer nickname, a city and state string, a creation date and a rating, plus the positive and negative pair the page surfaces.
  • Stores - store number, postal address, phone, coordinates and opening hours per weekday.

Facet vocabularies are not global, and that is where a generic crawler goes wrong. Foundation exposes Form, Finish, Coverage, Skin Type and SPF; shampoo exposes Type and Concern; lipstick exposes a Color facet whose values carry hex swatch codes; face serums expose Skin Type and a Concern list from Acne and Blemishes to Uneven Skin Tone. A field list right for makeup is wrong for hair care, so we map facets per category first. If Ulta stops publishing a field, the column arrives empty and the run report says so.

Ulta Beauty product fields we extract, SKU by SKU
Store stock, loyalty offers and the limits we keep

Store stock, loyalty offers and the limits we keep

Two things about Ulta are easy to underestimate. The first is that stock is a store fact, not a site fact. Pickup and same day delivery are fulfilled from a named location, and the In Store filter on a listing does nothing at all until a store has been chosen. Every branch carries its number in its own address and publishes street address, phone, coordinates and weekday opening hours. We record the store a stock reading was taken under, because a stock value without its store cannot be reproduced.

The second is loyalty pricing. Ulta Beauty Rewards, still called Ultamate Rewards in the app and on the credit card, shapes what a shopper pays: points multipliers run on named brands for a fixed window, Diamond and Platinum members get shipping that other members do not, and some event offers are gated on membership. The offer copy is public and we collect it. The member benefit chart is published as an image rather than as text, and account pricing sits behind a login. We do not sign in, so we never report a member price as though it were a shelf price.

On personal data the default is narrow. Ulta prints a reviewer nickname and a city and state beside each review. Our standard output carries review text, rating and date, with reviewer identifiers excluded and location reported in aggregate rather than person by person. Anything wider than that is agreed in writing before the first run. We collect only publicly available data - everything a visitor can see on Ulta Beauty - and we collect it legally.

What Ulta Beauty sells and how its catalogue is addressed

Ulta Beauty is a United States beauty retailer that puts drugstore and prestige on the same shelf. Its foundation aisle runs from e.l.f. Cosmetics and Maybelline through to CHANEL, Dior and PAT McGRATH LABS, with the house label Ulta Beauty Collection in the same list. That choice shapes every extraction plan: one category spans an order of magnitude in price, and a competitor set drawn from a single brand tier misses half the shelf.

Addressing is simple once the pattern is clear. A product sits at /p/{slug}-{productId} and the buyable variant is carried in a query parameter, ?sku={skuId}. Product ids come in three families that live side by side: bare numeric ids such as 2486, PIM ids such as pimprod2053446, and legacy import ids such as xlsImpprod15511061. The slug is descriptive and can be rewritten, so the product id paired with the skuId is the join key we carry between runs.

Browse pages sit under /shop/ as a three-level tree such as /shop/makeup/face/foundation, and the same path appears inside the page as a colon-delimited string, makeup:face:foundation. Brand pages live at /brand/{slug} and can be crossed with a category in one address, /brand/{slug}?category=makeup,face,foundation. Stores sit at /stores/{city}-{state}-{storeId}, and that trailing number keys pickup and same day delivery.

The catalogue is enumerated at variant level rather than product level. In September 2026 the product sitemap resolved to 54,601 addresses across 28 files, one entry per purchasable sku, alongside 1,098 brand pages and 1,549 store pages. Ulta also runs its own marketplace, so third-party items sit among the core assortment, marked as sold and shipped by the brand.

Get a Quote
dev_w
25

Developers

customers
500+

Customers worldwide

pages
1 500 000 000+

Pages extracted

stime
15000+

Hours saved for our clients

Plans

Ulta Beauty Scraping Plans and Pricing

Airplane

€199 / one-time

setup fee - included

Data limits100,000
Frequencyone-time
Run timeup to 5 days
Data storing7 days

Helicopter

€169 / mo

setup fee €499

Data limits250,000
Frequencymonthly
Run timeup to 5 days
Data storing14 days

Glasses

€229 / mo

setup fee €499

Data limits1,000,000
Frequencyweekly
Run timeup to 5 days
Data storing30 days

DNA

€549 / mo

setup fee €799

Data limits3,000,000
Frequency3 times daily
Run timesame day
Data storing90 days

Delivery: CSV, JSON or XLSX files, our API or a JSON feed. MCP server on request.

Full plan details →

Why Ulta price monitoring has to happen at shade level

The reason to extract Ulta Beauty data carefully rather than quickly is that a listing row does not carry a usable number. Ulta prints the tile price as a range across sizes, so a shampoo shows $12.00 - $58.00 and a hair oil shows something similar. There is no single Ulta price at product level. There is a price per skuId, and that is the only row a buyer or a merchant can act on.

Shades multiply the same problem. A complexion product can offer thirty options behind one product id, each with its own skuId, its own shade name and its own undertone line. Availability is set per variant as well: the selector marks individual shades unavailable while the product page stays live and buyable. A crawler writing one row per product URL records an item that is in stock and never notices that the fair end of the range has sold out. That gap is exactly the signal a brand team is paying for.

Then there is the calendar. Prices here move on events rather than drift. The 21+ Days of Beauty run sells Daily and Weekly Beauty Steals at half price and rotates them day by day, with the upcoming days published in advance. The Gorgeous Hair Event runs twice a year, in May and October, for three weeks. Buy More Save More, Gift With Purchase and brand coupon exclusions layer on top of both. Ulta price tracking that samples weekly will see the shelf price and never see the deal.

Related Case Studies

eBay Data: 1.9M Auto Parts Listings from eBay.de, Specs Translated

eBay Data: 1.9M Auto Parts Listings from eBay.de, Specs Translated

About 1.9 million auto parts listings from eBay.de with brand, OEM, EAN and fitment, plus titles and specs machine-translated for the client's team.

Learn More about eBay Data: 1.9M Auto Parts Listings from eBay.de, Specs Translated
Takealot Data: 1,951 Top-Rated Products for a New Seller's Niche Research

Takealot Data: 1,951 Top-Rated Products for a New Seller's Niche Research

A one-off Takealot product list for an entrepreneur choosing niches: only products rated 4 stars or higher with at least 50 reviews.

Learn More about Takealot Data: 1,951 Top-Rated Products for a New Seller's Niche Research
Trendyol Data: 66,600 of 66,775 Products in a Category, Stock by Size

Trendyol Data: 66,600 of 66,775 Products in a Category, Stock by Size

Trendyol product data for an e-commerce startup reselling Turkish fashion: 27 categories in JSON on FTP, with in-stock status for every size.

Learn More about Trendyol Data: 66,600 of 66,775 Products in a Category, Stock by Size
Our Blog

Reads Our Latest News & Blog

Learn how to use web scraping to solve data problems for your organization

6 E-Commerce Sites Like eBay to Scrape in 2026

6 E-Commerce Sites Like eBay to Scrape in 2026

If you sell online, run a marketplace, or advise e-commerce clients, you already know why eBay matters: it’s one of the few places where big retailers compete side by side with thousands of small merchants and private sellers.

Top 8 E-commerce Websites to Scrape in 2026 (From Amazon to 1688)

Top 8 E-commerce Websites to Scrape in 2026 (From Amazon to 1688)

E-commerce teams do not just need “some” competitor data anymore. They need a continuous stream of real prices, discounts, stock levels, reviews, and seller behavior from the platforms that actually shape their markets.

How to Scrape Amazon Data: Benefits, Challenges & Best Practices

How to Scrape Amazon Data: Benefits, Challenges & Best Practices

Amazon provides valuable information gathered in one place: products, reviews, ratings, exclusive offers, news, etc. So scraping data from Amazon will help solve the problems of the time-consuming process of extracting data from e-commerce.

scrapeit logo

About ScrapeIt

ScrapeIt is a managed web scraping agency. We build the crawler, run it on your schedule, watch it and hand over clean files. There is nothing to install and no library to learn. When Ulta changes its markup, repairing the parser is our work and not a ticket for your team, because this is billed as a service rather than a tool. Tell us the categories, the brands, the stores and the refresh rate you need, and we come back with a field list and a sample before anything is committed.

FAQ

Do you offer an Ulta Beauty API for product data?

Yes. The ScrapeIt Ulta Beauty API returns skuId, shade name, size, list price, sale price and the ship, pickup and same day states as JSON from an endpoint we host, refreshed on the schedule you set. The same data also comes as CSV or XLSX files or straight into your database. We have no partnership or affiliation with Ulta Beauty. We collect what is publicly visible and return it in a structured form.

Do you return one row per product or one row per shade?

One row per shade or size by default. Every variant gets its own row keyed on skuId, carrying the shade name, the undertone description, the size, its own list price and sale price and its own availability state, with the product id as the foreign key back to the parent. A collapsed product-level table can ship alongside it when your reporting needs one, but the SKU table is the source of truth, because a product-level price on Ulta is a range and not a number.

How often should Ulta Beauty data be refreshed?

It depends on what you are watching. Assortment and new-brand launches survive a weekly run. Price and stock want daily, because shades sell through without warning and promo copy changes without a version number. Around an event we run more than once a day: the 21+ Days of Beauty Daily Beauty Steals rotate on a fixed calendar, and a weekly crawler will record the regular shelf price for a product that spent that day at half off.

Can you get Ulta stock for a specific store?

Yes, store by store. Each Ulta location has its own numbered page carrying the address, phone, coordinates and opening hours, and that store number is what scopes an availability check. Give us the branches you care about, by number or by city and state, and each stock row arrives with the store recorded on it. Ulta runs a single United States storefront priced in dollars, so there is no country dimension to configure, only a store one.

How is scraping Ulta Beauty different from scraping Sephora?

The two catalogues answer different questions. Ulta carries mass and prestige side by side plus a third-party marketplace, so a category sweep returns a full price ladder rather than a prestige slice, and the seller has to be kept as a field. The identifiers differ too: Ulta mixes three product id families and hangs the variant on a sku parameter. Reviews come from a different provider, so the review attributes on one site have no counterpart on the other. Runs on the two sites are configured separately and delivered as separate tables.

How does it Work?

Step 1 - Make a Request

You share your needs, expectations, and desired timeframe. We’ll suggest the best solution based on your request and budget.

Step 2 - Configuring Custom Web Crawlers

Our specialists configure the crawlers and extract a sample dataset for your review before proceeding with the full-scale extraction.

Step 3 - Collect and Deliver

Once you approve the sample, we launch the project and start full data collection. We gather, filter, and structure the data for easy use, delivering it on time in your preferred format.

Step 4 - Maintain and Support

Our team manages ongoing processes, monitors website changes, and supports all data extraction cycles. We can also help integrate data into your systems or create dashboards to simplify analysis.

Request a Quote

Tell us more about you and your project information.
Which sites, which fields, how often. A couple of lines is enough.

This form is protected by Google reCAPTCHA, which loads when you start filling it in. If you prefer not to use it, email us at info@scrapeit.io. Privacy & Cookie Policy

We reply within 1 business day. No obligation.

Ulta Beauty data from €169/month. Free project assessment, reply within 1 business day.

scrapiet

Scrapeit Sp. z o.o.
10/208 Legionowa str., 15-099, Bialystok, Poland
KRS: 0000996672
NIP: 5423457175
REGON: 523384582