Ulta Beauty API: Get product
Looks up one Ulta Beauty product by name or product link and returns its details, prices, sizes or shades, ingredients, directions, ratings and images. Prices and availability may change.
Unofficial. Not affiliated with or endorsed by Ulta Beauty.
Inputs
Values from the run on Oct 23, 2026, shown under Output.
- Brand optional
brand Brand to distinguish products with similar names, for example Moroccanoil.
(default)
- Product, required
product Product name or Ulta product link, for example Moroccanoil Treatment.
https://www.ulta.com/p/moroccanoil-treatment-hair-oil-pimprod2052832?sku=2644185
Input as JSON
{ "product": "https://www.ulta.com/p/moroccanoil-treatment-hair-oil-pimprod2052832?sku=2644185" }Output
{ "brand": "Moroccanoil", "price": 20, "sku_ids": [ "2644185", "2644187", "2644186" ], "currency": "USD", "how_to_use": "Apply a small amount to clean, towel-dried hair, from mid-length to ends. Blow-dry or let dry naturally. Apply on dry hair to tame flyaways, condition split ends and smooth hair. \n\nCaution: Use product only as directed. Do not use in or around the area of the eye, mouth, or nose. For external use o…", "sale_price": null, "description": "Benefits\n\n- Instantly enhances shine\n- Reduces frizz and flyaways\n- Conditions for a healthier look and feel\n- Detangles, speeds up drying time, and provides heat protection\n- Features the Moroccanoil signature scent, a Mediterranean-inspired blend of spicy amber and sweet floral notes\nKey Ingredien…", "image_links": [ "https://media.ulta.com/i/ulta/2644185" , "https://media.ulta.com/i/ulta/2644186cm_alt01" , "https://media.ulta.com/i/ulta/2644186cm_alt02" ], "ingredients": "Cyclomethicone, Dimethicone, Argania Spinosa (Argan) Kernel Oil, Fragrance, Linum Usitatissimum (Linseed) Seed Extract, CI 26100 (Red 17), CI 47000 (Yellow 11)", "star_rating": 4.8, "product_link": "https://www.ulta.com/p/moroccanoil-treatment-hair-oil-pimprod2052832" , "product_name": "Moroccanoil Treatment Hair Oil", "review_count": 149, "ulta_product_id": "pimprod2052832", "sizes_and_shades": [ { "name": "0.85 oz", "size": "0.85 oz", "price": 20, "in_stock": true }, { "name": "1.7 oz", "size": "1.7 oz", "price": 38, "in_stock": true }, { "name": "3.4 oz", "size": "3.4 oz", "price": 50, "in_stock": true } ]}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"ulta.com/get_product","input":{"product":"https://www.ulta.com/p/moroccanoil-treatment-hair-oil-pimprod2052832?sku=2644185"}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "ulta.com/get_product" , "input": { "product": "https://www.ulta.com/p/moroccanoil-treatment-hair-oil-pimprod2052832?sku=2644185" }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "ulta.com/get_product" , "input": { "product": "https://www.ulta.com/p/moroccanoil-treatment-hair-oil-pimprod2052832?sku=2644185" } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run ulta.com/get_product# with {"product":"https://www.ulta.com/p/moroccanoil-treatment-hair-oil-pimprod2052832?sku=2644185"}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "product" ], "properties": { "brand": { "type": "string", "default": "", "description": "Brand to distinguish products with similar names, for example Moroccanoil." }, "product": { "type": "string", "description": "Product name or Ulta product link, for example Moroccanoil Treatment." } }}Output schema
{ "type": "object", "required": [ "product_name", "brand", "price", "currency", "sale_price", "sizes_and_shades", "description", "ingredients", "how_to_use", "star_rating", "review_count", "image_links", "product_link", "ulta_product_id", "sku_ids" ], "properties": { "brand": { "type": [ "string", "null" ] }, "price": { "type": [ "number", "null" ] }, "sku_ids": { "type": "array", "items": { "type": "string" }, "x-fous-developer": true }, "currency": { "type": "string" }, "how_to_use": { "type": [ "string", "null" ] }, "sale_price": { "type": [ "number", "null" ] }, "description": { "type": [ "string", "null" ] }, "image_links": { "type": "array", "items": { "type": "string" } }, "ingredients": { "type": [ "string", "null" ] }, "star_rating": { "type": [ "number", "null" ] }, "product_link": { "type": "string" }, "product_name": { "type": "string" }, "review_count": { "type": [ "integer", "null" ] }, "ulta_product_id": { "type": [ "string", "null" ], "x-fous-developer": true }, "sizes_and_shades": { "type": "array", "items": { "type": "object", "required": [ "name", "size", "price", "in_stock" ], "properties": { "name": { "type": "string" }, "size": { "type": [ "string", "null" ] }, "price": { "type": [ "number", "null" ] }, "in_stock": { "type": "boolean" } } } } }}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
ulta.com/get_product- Returns
- product name, brand, prices, sizes or shades, description, ingredients, how to use, rating, review count, images, product link, SKU ids
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method ulta.com/get_product with the inputs above.
Ask your agent
- Can you pull up the details for the Moroccanoil Treatment, including the price and shade options?
- What are the ingredients and how-to-use directions for the Fenty Beauty Pro Filt'r foundation?
- Find the current price and customer rating for a 50 ml bottle of Olaplex No. 3 hair perfector.
- I need the review count and product images for the Tarte Shape Tape concealer, please.
- Look up the SKU and available sizes for the Drunk Elephant C-Firma serum on ulta.com.
See more
All Ulta Beauty methodsSearches Ulta Beauty products by keyword, brand, USD price range and sort order, and returns each product with its starting prices.
ulta.com/search_productsGets a Sephora US product's full details from its name (optionally narrowed by brand) or its Sephora product link: price, sizes and shades with stock, highlights, description, ingredients, usage, ratings and images.
sephora.com/get_productFinds a Sephora US product by name or Sephora link and returns its review summary and customer reviews, sorted and optionally filtered by skin type.
sephora.com/get_product_reviewsSearches Sephora US beauty products in Sephora's order, with brand and USD price filters and shopper sort options. Loves counts are null when a product page cannot be loaded.
sephora.com/search_productsGets a B&H Photo product's details by name, product link, or B&H number. A name uses the best matching search result; details and prices reflect the public page.
bhphotovideo.com/get_productGets details, price and availability for a Walmart product by name or product link, using Walmart's default location.
walmart.com/get_productFinds a Lowe's product by name, item number or product link and returns its details, price, specifications, images and availability at the nearest store for a ZIP code (or the site's default store).
lowes.com/get_productGet one AliExpress product’s prices, variants, reviews, shipping to a chosen country, seller and specifications from its link or the best-selling name match. Sold counts may be rounded, and shipping options are those shown for the displayed variant.
aliexpress.com/get_product