Ulta Beauty category
An Ulta Beauty category or brand page's products: product id, SKU, brand, name, link, price, list and sale price, discount, promotion, extra offers, rating, review count, variant count (shades/sizes), badge, sponsored flag and image, with paging. Sort and filter with the site's own options (brand, price range, minimum rating, sale, and any facet such as coverage, finish, form, skin type, SPF or preferences). facets lists every filter group the page offers (brand, price, rating, form, finish, coverage, skin type, SPF, preferences, special offers...) with each option's product count, whether it is applied, and the param and value to pass in filters.
Every response includes credits_used: the credits this call cost.
Parameters
| name | type | description |
|---|---|---|
pathrequired | string | Category or brand page path, e.g. /shop/makeup/face/foundation or /brand/clinique. Example: /shop/makeup/face/foundation |
page | integer | Page number (default 1). next_page is null on the last page. Example: 1 |
sort | best_sellers | top_rated | price_asc | price_desc | new_arrivals | Sort order (default: the site's featured order). |
brand | string | Brand name(s) as shown in facets (brand group), comma-separated, e.g. Clinique,MAC. |
price_min | number | Lowest price in USD. |
price_max | number | Highest price in USD. |
rating | 1 | 2 | 3 | 4 | Only products rated this many stars and up. |
sale | boolean | true: only products on sale. |
filters | string | Any other facet filters as param:value pairs separated by ;, several values of one facet comma-separated, using the param and value of options in facets, e.g. coverage:full;finish:matte,natural. |
Every endpoint also takes fresh, raw, fields (see lean responses and caching).
Example
curl "https://api.api.sh/ulta/v1/category?path=%2Fshop%2Fmakeup%2Fface%2Ffoundation" \
-H "x-api-key: $APISH_KEY" import os, requests
res = requests.get(
"https://api.api.sh/ulta/v1/category",
params={"path": "/shop/makeup/face/foundation"},
headers={"x-api-key": os.environ["APISH_KEY"]},
timeout=120,
)
res.raise_for_status()
data = res.json() const url = new URL("https://api.api.sh/ulta/v1/category");
url.searchParams.set("path", "/shop/makeup/face/foundation");
const res = await fetch(url, { headers: { "x-api-key": process.env.APISH_KEY } });
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const data = await res.json(); Response
A JSON object with the fields described above, plus raw (the source's own data), cached, fetched_at and credits_used. Errors return {"success": false, "error": "…"} with the HTTP status (see errors). A lookup that ran but found nothing (404) costs the price above; refused calls and errors on our side are free (what's charged).