Ulta Beauty API
Ulta Beauty data as structured JSON: keyword search and category listings with list and sale prices, product detail with every shade, GTIN, ingredients and recent reviews, and in stock or out of stock for one shade at the 10 stores nearest a ZIP.
50 free credits on signup. No card, no Ulta account.
{ "data": { "query": "lipstick", "page": 1, "page_size": 64, "total_results": 186, "total_pages": 3, "count": 73, "sponsored_count": 14, "has_more": true, "products": [ { "position": 1, "product_id": "pimprod2057119", "sku_id": "2648428", "brand": "Maybelline", "name": "Serum Lipstick", "url": "https://www.ulta.com/p/serum-lipstick-pimprod2057119?sku=2648428", "list_price": 9.99, "list_price_range": null, "sale_price": 4.99, "sale_price_range": "$4.99 - $9.99", "discount": 5, "rating": 4.7, "review_count": 431, "badge": "Sale", "variant_label": "16 colors", "sponsored": false }, { "position": 8, "product_id": "pimprod2043355", "sku_id": "2619368", "brand": "Charlotte Tilbury", "name": "Matte Revolution Hydrating Lipstick", "url": "https://www.ulta.com/p/matte-revolution-hydrating-lipstick-pimprod2043355?sku=2619368", "list_price": 37, "list_price_range": "$37.00 - $39.00", "sale_price": null, "sale_price_range": null, "discount": null, "rating": 4.6, "review_count": 521, "badge": null, "variant_label": "21 colors", "sponsored": true } ] }, "response_time": 6589}Live call against the real endpoint. 3 free runs, then it's your own key.
What is the Scavio Ulta Beauty API?
The Scavio Ulta Beauty API is a REST API that returns Ulta Beauty product data as structured JSON. Ulta has no public API. Its 4 POST endpoints cover search, category listings, product detail with every shade, GTIN and ingredients, and shade-level stock at nearby stores, at 1 credit per call.
- 4
- endpoints, all live in production
- 1
- credit per call, every endpoint
- 10
- nearby stores checked for one shade in one call
The Ulta Beauty data buyers actually need
What it costs today, which shades exist, and which store near you has the one you want.
Shade-level stock at 10 stores
POST /api/v1/ulta/storesPass a product id, the shade's sku id and a ZIP, and one call returns the 10 nearest Ulta Beauty stores, each in stock or out of stock for that exact shade, with distance and hours. Near ZIP 10001, our capture found Serum Lipstick in Crop Top in stock at 7 of 10 stores.
Every shade, GTIN and ingredients
POST /api/v1/ulta/productOne product by URL: list and sale price, GTIN, rating, review count, description, ingredients, breadcrumbs and images, plus every shade or size with its sku id, shade description and availability. Serum Lipstick came back with 16 shades.
Search with sale prices
POST /api/v1/ulta/searchSearch Ulta Beauty by keyword, 64 products per page: list price, sale price, dollars off, promo text, rating, review count, badges such as Only at Ulta, and a sponsored flag on every placement.
Category listings
POST /api/v1/ulta/categoryAny ulta.com category that lists products, in the site's own order. Our capture of /shop/makeup/lips/lipstick counted 254 products over 4 pages.
All 4 Ulta Beauty API endpoints
Every route is a POST, returns JSON, and takes the same API key. 1 credit per successful call.
| Endpoint | Returns | Credits |
|---|---|---|
Search/api/v1/ulta/search | Keyword search, 64 products per page plus sponsored placements: ids, brand, name, URL, image, list and sale price (with the range when shades are priced differently), discount, promo text, rating, review count, badge and shade count | 1 |
Category listing/api/v1/ulta/category | Products in an ulta.com category such as /shop/makeup/lips/lipstick, 64 per page, with the category title, total results and the same product fields as search | 1 |
Product detail/api/v1/ulta/product | One product by URL for the selected shade or size: prices, availability, GTIN, rating, description, ingredients, breadcrumbs, images, every shade or size, ship, pickup and same-day eligibility, and the up to 5 most recent reviews on the page | 1 |
In-store availability/api/v1/ulta/stores | One shade or size at the 10 Ulta Beauty stores nearest a US ZIP: in stock or out of stock per store, address, distance, open-now label and curbside pickup | 1 |
50 free credits on signup covers 50 Ulta Beauty calls. See plans
Search, open a product, then find it in a store
Search returns list and sale prices with each product's url, product_id and sku_id; product adds every shade, and stores checks one shade at 10 nearby stores. The response on the right is a real capture.
from scavio import ScavioClient
client = ScavioClient(api_key="sk_live_your_key")
# Search Ulta Beauty - 1 credit
res = client.ulta.search(query="lipstick")
p = res["data"]["products"][0]
print(p["brand"], p["name"], p["list_price"], "sale", p["sale_price"], p["rating"])
# Full product: every shade, GTIN, ingredients, recent reviews - 1 credit
detail = client.ulta.product(url=p["url"])["data"]
print(detail["gtin"], len(detail["variants"]), "shades")
# Which stores near ZIP 10001 have this shade - 1 credit
stores = client.ulta.stores(product_id=p["product_id"], sku_id=p["sku_id"], zip="10001")["data"]
print([s["name"] for s in stores["stores"] if s["in_stock"]])
# A whole category, 64 per page - 1 credit
lipsticks = client.ulta.category(category="/shop/makeup/lips/lipstick")["data"]["products"]{
"data": {
"query": "lipstick",
"page": 1,
"page_size": 64,
"total_results": 186,
"total_pages": 3,
"count": 73,
"sponsored_count": 14,
"has_more": true,
"products": [
{
"position": 1,
"product_id": "pimprod2057119",
"sku_id": "2648428",
"brand": "Maybelline",
"name": "Serum Lipstick",
"url": "https://www.ulta.com/p/serum-lipstick-pimprod2057119?sku=2648428",
"list_price": 9.99,
"list_price_range": null,
"sale_price": 4.99,
"sale_price_range": "$4.99 - $9.99",
"discount": 5,
"rating": 4.7,
"review_count": 431,
"badge": "Sale",
"variant_label": "16 colors",
"sponsored": false
},
{
"position": 8,
"product_id": "pimprod2043355",
"sku_id": "2619368",
"brand": "Charlotte Tilbury",
"name": "Matte Revolution Hydrating Lipstick",
"url": "https://www.ulta.com/p/matte-revolution-hydrating-lipstick-pimprod2043355?sku=2619368",
"list_price": 37,
"list_price_range": "$37.00 - $39.00",
"sale_price": null,
"sale_price_range": null,
"discount": null,
"rating": 4.6,
"review_count": 521,
"badge": null,
"variant_label": "21 colors",
"sponsored": true
}
]
},
"response_time": 6589
}Why not the official Ulta Beauty API?
Ulta Beauty has no public API for product, price, review or store-availability data.
Ulta Beauty, without an API
- No public API or self-serve developer key for product, price or stock data
- In-store availability is checked one shade and one product at a time on the site
- Shades, prices, ingredients and reviews sit on separate product pages with no export
- Sponsored placements are mixed into search and category results
Scavio Ulta Beauty API
- One API key, issued at signup, with no Ulta account
- Search and category listings with list price, sale price and dollars off
- Every shade with its sku id, GTIN, ingredients and recent reviews in one product call
- One shade's stock at the 10 nearest stores in a single call
- Same JSON envelope as every other Scavio platform
Scavio returns publicly available data only, and never signs in as an Ulta Beauty customer.
What developers build with it
Beauty price and sale tracking
Track Ulta list prices, sale prices and dollars off for a product list or a whole category, and catch markdowns as they happen.
search + category + productShade-level store stock finder
Given a shade and a ZIP, list the nearby Ulta Beauty stores that have it in stock, with distance, hours and curbside pickup.
product + storesBrand and shelf monitoring
See where a brand ranks in a category or a search, which placements are sponsored, and which items carry badges such as Only at Ulta or Sale.
category + searchCatalog enrichment
Fill a beauty catalog with GTINs, shade names and descriptions, swatches, ingredients, usage notes, breadcrumbs and images.
productCross-retailer beauty pricing
Compare an item's Ulta price with Target, Walmart and Amazon for the same product, on one API key.
search + Target + Walmart + AmazonHow to get Ulta Beauty data as JSON
- 1
Get an API key
Sign up for a Scavio account and copy your key from the dashboard. You get 50 credits free on signup, with no card required and no Ulta account.
- 2
Search or browse
Send {"query": "lipstick"} to https://api.scavio.dev/api/v1/ulta/search with an Authorization: Bearer header, or a category path to /api/v1/ulta/category. Each product comes back with its url, product_id and sku_id.
- 3
Get detail and store stock
Pass a product's url to /api/v1/ulta/product for every shade, GTIN and ingredients, or its product_id, sku_id and a ZIP to /api/v1/ulta/stores for in-store availability at the 10 nearest stores.
Ulta Beauty API FAQ
Does Ulta Beauty have a public API?
+
No. Ulta Beauty does not offer a public API for product, price, review or store-availability data. The Scavio Ulta Beauty API fills that gap with 4 POST endpoints that return ulta.com data as structured JSON: search, category listings, product detail and in-store availability near a ZIP.
What is the Scavio Ulta Beauty API?
+
It is a REST API that returns public Ulta Beauty data as structured JSON. It covers keyword search and category listings with list and sale prices, product detail with every shade or size, GTIN, ingredients and recent reviews, and shade-level stock at the 10 Ulta stores nearest a ZIP code, at 1 credit per call.
Can I check if a shade is in stock at a nearby Ulta store?
+
Yes. Call /api/v1/ulta/stores with a product_id, the shade's sku_id and a US ZIP. One call returns the 10 nearest stores, each with in_stock, the availability label, address, distance, open-now label and curbside pickup. Near ZIP 10001, Maybelline Serum Lipstick in Crop Top was in stock at 7 of 10 stores.
Does the API return unit quantities per store?
+
No. Ulta publishes In Stock or Out of Stock for each store, not a unit count, so in_stock is true or false and availability carries the label. Online availability of the selected shade is on the product endpoint as availability.
Does the API return Ulta reviews?
+
Partly. The product endpoint returns rating, review_count and the most recent reviews Ulta shows on the product page, up to 5, each with title, body, rating, date, author and location. It is not the full review history, and there is no paging through older reviews. Search and category return rating and review_count only.
How are Ulta prices returned?
+
In dollars, as decimals. list_price is the regular price, sale_price the sale price (null when the item is not on sale) and discount the dollars off. In our capture, Serum Lipstick had a list_price of 9.99, a sale_price of 4.99 and a discount of 5.
What are list_price_range and sale_price_range?
+
When an item's shades or sizes are priced differently, Ulta shows a range. list_price and sale_price then hold the low end as a number, and the *_range field carries the range exactly as shown, such as "$37.00 - $39.00" for Charlotte Tilbury Matte Revolution. They are null when there is a single price.
How do I get every shade of a product?
+
Call /api/v1/ulta/product with the product URL. variants[] lists every shade or size with its sku_id, name, shade description, availability, image and swatch; Serum Lipstick returned 16. Pass sku to select a different shade and get its price and availability.
Does the product endpoint include ingredients and the GTIN?
+
Yes. It returns gtin (041554100051 for Serum Lipstick in Crop Top), ingredients, usage, restrictions, summary and description when the page has them, plus category, breadcrumbs and images.
Can I browse an Ulta category?
+
Yes. Pass a category URL or path, such as /shop/makeup/lips/lipstick, to /api/v1/ulta/category. It returns 64 products per page in the site's own order with the category title and total_results; our capture counted 254 lipsticks. Department landing pages such as /shop/makeup that show no product grid answer 404.
Are sponsored products marked?
+
Yes. Every search and category result has a sponsored flag, and the response carries sponsored_count. Our lipstick search returned 73 results on page 1, 14 of them sponsored. Placements can repeat products from other pages, so dedupe by product_id when merging pages.
How much does an Ulta Beauty request cost?
+
Every Ulta Beauty endpoint costs 1 credit, including a stores call that checks 10 stores at once. New accounts get 50 free credits on signup, one time, with no card required. Paid plans start at $30 per month for 7,000 credits.
How fresh is the data?
+
Every request fetches live from Ulta Beauty at the moment you call it, and nothing is cached. Each response carries fetched_at, the time the data was retrieved.
Which languages and tools are supported?
+
Every endpoint is a plain HTTPS POST with a JSON body, so any language works. Scavio also ships Python and JavaScript SDKs, a remote MCP server at mcp.scavio.dev for AI agents, and an n8n community node, all on the same API key.
Is using Ulta Beauty data legal?
+
Scavio returns publicly available Ulta Beauty data and does not access accounts, Ultamate Rewards or order history. You remain responsible for how you use the data, including compliance with Ulta Beauty's terms. Talk to your own counsel for your specific use case.
Explore more of Scavio
Target API
Search, categories, detail and reviews.
Walmart API
Search, product, reviews and store-level pricing.
Amazon API
Search, product detail by ASIN and seller offers.
TikTok Shop API
Shop search, products, reviews and categories.
Dollar General API
Store prices, units on hand, deals and coupons.
Ulta Beauty API docs
All 4 endpoints with params and real responses.
Try the Ulta Beauty API free
50 free credits on signup, no card. Your first request is a POST with a product name in it.