Ulta Beauty category

GET https://api.api.sh/ulta/v1/category
1 credit / call e-commerce try it in the playground →

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

nametypedescription
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"

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).

The fastest way to see the full response is the playground: it runs this endpoint with your account and shows the exact JSON.