ScavioScavio
Pricing
Tools
Sign InsGet Startedg
Blog
Ulta6 min readNov 2, 2026

How to Get Ulta Beauty Product Data, Prices and Store Stock Through an API

Use Scavio's Ulta Beauty API: search returns list and sale prices, product returns every shade with its GTIN, and stores shows one shade's stock at 10 stores.

Scavio Team

Nov 2, 2026

Try the Ulta Beauty API free
scavio
Ecommerce / Price monitoring
Ulta

To get Ulta Beauty product data programmatically, use Scavio's Ulta Beauty API. POST /api/v1/ulta/search returns a page of products with list price, sale price, dollars off, rating, review count and shade count; /category does the same for any ulta.com category; /product returns every shade with its sku id, the GTIN, ingredients and the five latest reviews; and /stores tells you whether one shade is in stock at the 10 Ulta Beauty stores nearest a ZIP. Every call costs 1 credit, about $0.002 on the Growth plan billed yearly.

Ulta Beauty publishes no developer API, and its site checks store availability one product and one shade at a time, so a price tracker, a shade finder or an agent needs another source. Each step below is a real call we made on November 2, 2026, with the response trimmed but not altered.

Step 1: Search products

Bash
curl -s https://api.scavio.dev/api/v1/ulta/search \
  -H "Authorization: Bearer $SCAVIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "lipstick"}'

"lipstick" returned 186 results over 3 pages, with 66 products on page 1, 3 of them sponsored, in 1.5 seconds. The first row, as captured:

JSON
{
  "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,
  "promo_text": "Up to $20 off with qualifier: Code GIFTS",
  "rating": 4.7,
  "review_count": 431,
  "badge": "Sale",
  "variant_label": "16 colors",
  "is_limited_stock": false,
  "sponsored": false
}

Prices are in dollars and discount is dollars off, not a percentage. sale_price is null when an item is not on sale; 7 of the 63 organic rows on this page were on sale. badge carries Ulta's own labels such as "Sale", "Only at Ulta" and "Online only", and sponsored lets you drop paid placements. Every row hands you the url, product_id and sku_id the next two steps need.

Step 2: Get every shade of a product

Bash
curl -s https://api.scavio.dev/api/v1/ulta/product \
  -H "Authorization: Bearer $SCAVIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://www.ulta.com/p/glow-reviver-lip-oil-pimprod2042290?sku=2615649"}'

For e.l.f. Glow Reviver Lip Oil the response named the selected shade, Pink Quartz (light pink), at $9 with no sale, a 0.25 oz size, GTIN 609332820043, a 4.7 rating from 11,774 reviews and the category path Makeup, Lips, Lip Oil. Then the shades, 10 in all; the first of them as captured:

JSON
{
  "sku_id": "2615654",
  "name": "Coral Fixation",
  "shade_description": "coral orange",
  "selected": false,
  "available": true,
  "out_of_stock_label": null,
  "image": "https://media.ultainc.com/i/ulta/2615654",
  "swatch": "https://media.ultainc.com/i/ulta/2615654_sw?img404=2615654"
}

fulfillment splits the ways to get it: shipping was "In stock and ready to ship" with "Free standard shipping over $35", same-day delivery was "Delivered for $6.95", and pickup read "Unavailable" because no store was selected. recent_reviews held the five newest reviews, each with title, body, rating, date, author and location; the newest, dated October 26, 2026, was a 4-star review that begins "I love Money Mauve!". Pass sku to switch to another shade and get its own price and availability.

Step 3: Find which nearby stores have that shade

Bash
curl -s https://api.scavio.dev/api/v1/ulta/stores \
  -H "Authorization: Bearer $SCAVIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"product_id": "pimprod2042290", "sku_id": "2615649", "zip": "10001"}'

Pink Quartz near ZIP 10001 came back in stock at 8 of the 10 nearest stores. Trimmed to 2 of the 10:

JSON
{
  "product_id": "pimprod2042290",
  "sku_id": "2615649",
  "zip": "10001",
  "count": 10,
  "in_stock_count": 8,
  "stores": [
    {
      "store_id": "1638",
      "name": "2 Herald Square",
      "address": "51 West 34th Street, Suite 110, New York, NY 10001",
      "distance_miles": 0.17,
      "is_open": false,
      "open_label": "Closed",
      "curbside_label": null,
      "in_stock": false,
      "availability": "Out of Stock"
    },
    {
      "store_id": "1448",
      "name": "College Point Center",
      "address": "133-05 20th Avenue, College Point, NY 11356",
      "distance_miles": 8.37,
      "is_open": false,
      "open_label": "Closed",
      "curbside_label": "Curbside pickup until 5:00 pm",
      "in_stock": true,
      "availability": "In Stock"
    }
  ]
}

The nearest store, 0.17 miles away, was out of this shade, and so was Kings Plaza in Brooklyn; the other eight had it. open_label read "Closed" because we called late at night. Stock is per shade: across all 10 shades of this lip oil the same 10 stores were in stock in 93 of 100 checks, and the nearest store was out of 4 shades. Ulta publishes In Stock or Out of Stock, not a unit count, so never quote a quantity. Our 36 store calls took 0.7 to 8.3 seconds each.

Step 4: List a whole category

Bash
curl -s https://api.scavio.dev/api/v1/ulta/category \
  -H "Authorization: Bearer $SCAVIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"category": "/shop/makeup/lips/lip-oil"}'

The response opens with the category's own counts:

JSON
{
  "category": "/shop/makeup/lips/lip-oil",
  "title": "Lip Oil",
  "url": "https://www.ulta.com/shop/makeup/lips/lip-oil",
  "page": 1,
  "page_size": 64,
  "total_results": 147,
  "total_pages": 3,
  "count": 67,
  "sponsored_count": 5,
  "has_more": true
}

products[] then lists the page in Ulta's own order, in the same shape as search: e.l.f. Glow Reviver Lip Oil first at $9, then Buxom's sponsored Full-On Plumping Glossy Lip Oil at $27. Three organic rows were on sale, including Milani Fruit Fetish Lip Oil at $6.49 against a list price of $12.99. Pass page for the rest, filter on sponsored, and dedupe by product_id when you merge pages, because sponsored placements can repeat products.

All four endpoints

EndpointWhat it returnsCredits
/api/v1/ulta/searchProducts for a keyword with list and sale price, discount, promo text, rating, review count, badge and shade count1
/api/v1/ulta/categoryProducts in an ulta.com category, same fields, with the category title and total1
/api/v1/ulta/productOne product: every shade or size, GTIN, ingredients, usage, images, fulfillment options and the 5 most recent reviews1
/api/v1/ulta/storesOne shade's In Stock or Out of Stock at the 10 stores nearest a US ZIP, with distance, hours and curbside1

For how this compares with every other way to get Ulta data, see the best Ulta Beauty product data APIs. For what Ulta's store stock label can and cannot tell you, see checking Ulta stock at nearby stores.

Getting started

  1. Sign up at dashboard.scavio.dev/sign-up: 50 free credits, no card required.
  2. Copy your API key from the dashboard.
  3. Send a POST to /api/v1/ulta/search with your key in the Authorization header.

Try the Ulta Beauty API free in the playground first, or call it from Claude and other agents through the MCP server.

Reference: Ulta Beauty API overview · search · category · product · stores

Frequently asked questions

Does Ulta Beauty have an API for product data?

No. Ulta Beauty does not publish a developer API for products, prices, reviews or store stock, and its affiliate program pays referral commissions rather than sharing catalogue data. Scavio's Ulta Beauty API returns that public data as JSON with one API key: search, category listings, product detail and in-store availability near a ZIP.

How do I get an Ulta product's sale price?

Search and category results carry list_price, sale_price and discount in dollars for every product. sale_price is null when the item is not on sale. On November 2, 2026, Maybelline Serum Lipstick returned a list_price of 9.99, a sale_price of 4.99 and a discount of 5. When shades are priced differently, list_price_range and sale_price_range hold the range Ulta shows.

Can I check whether a shade is in stock at a nearby Ulta store?

Yes. Call /api/v1/ulta/stores with the product_id, the shade's sku_id and a US ZIP. One call returns the 10 nearest Ulta Beauty stores with in_stock, the availability label, address, distance, hours and curbside pickup. Stock is per shade, so pass the exact sku_id you want.

How much does Ulta data cost with Scavio?

Every Ulta Beauty endpoint costs 1 credit: about $0.002 on the Growth plan billed yearly and $0.0043 on the $30 monthly Project plan. A stores call checks 10 stores for that 1 credit. New accounts get 50 free credits with no card.

How do I list every product in an Ulta category?

Pass the category path, such as /shop/makeup/lips/lip-oil, to /api/v1/ulta/category and page through it with page. Each page holds up to 64 products plus sponsored placements; the lip oil category held 147 products over 3 pages on November 2, 2026. Department landing pages without a product grid answer 404.

Ulta Beauty data as JSON

  • Search and categories with sale prices
  • Every shade, GTIN, ingredients and reviews
  • Store stock per shade, 1 credit a call
Try the Ulta Beauty API free

50 free credits, no credit card

On this page

  1. Step 1: Search products
  2. Step 2: Get every shade of a product
  3. Step 3: Find which nearby stores have that shade
  4. Step 4: List a whole category

Related articles

View all
  • scavio
    Comparison / Ecommerce
    Ulta
    5 Best Ulta Beauty Product Data APIs in 2026: Scavio Checks Every Shade at 10 Nearby Stores
  • scavio
    Ecommerce / Price monitoring
    Sephora
    How to Get Sephora Product Data, Prices and Shades Through an API
ScavioScavio

One scraper API for every social, search, e-commerce and real estate platform. Built for AI agents.

Product

  • Features
  • Pricing
  • Dashboard
  • Affiliates

Developers

  • Documentation
  • API Reference
  • Quickstart
  • MCP Integration
  • Python SDK

Alternatives

  • Tavily Alternative
  • SerpAPI Alternative
  • Firecrawl Alternative
  • Exa Alternative
  • Serper Alternative
  • Tavily vs Scavio
  • SerpAPI vs Scavio
  • All alternatives
  • Compare Scavio vs alternatives

Search APIs

  • Google Search API
  • Amazon Product API
  • YouTube API
  • Reddit API
  • Walmart Product API
  • TikTok API
  • Instagram API

Tools

  • All Tools

© 2026 Scavio. All rights reserved.

Featured on TAAFT
Terms of ServicePrivacy Policy