Ulta Beauty research
Browse and search Ulta Beauty's catalog and pull product detail, shade
variants, questions, reviews, and nearby store locations — all as
normalized JSON from the Crawlora API, with no HTML scraping.
When to use this skill
- "Find [product] on Ulta" or "what does Ulta sell for [need]?"
- "Browse Ulta's [department] category" / "filter by [brand/benefit]."
- "What do customers ask and say about this Ulta product before I
recommend it?" (Q&A + reviews)
- "Find shade/sku options for this Ulta product."
- "Is there an Ulta store near [zip/city]?"
Setup (one-time)
- Get a free Crawlora API key (2,000 credits/mo, no card) at https://crawlora.net.
- Set
CRAWLORA_API_KEY in the environment before running the helper.
- The helper reads
CRAWLORA_API_KEY from the environment and sends requests to https://api.crawlora.net/api/v1. Missing/invalid key → 401.
How it works
- Discover categories —
/ulta/categories lists the storefront
navigation (department, group, and a category value ready to pass to
/ulta/category).
- Browse or search —
/ulta/category (category) paginates a
category's product grid and returns guided-navigation filter facet
codes to narrow it; /ulta/search (query) does keyword search
instead. /ulta/suggest (query) returns typeahead suggestions plus
each suggestion's top product matches, useful for finding query ideas
or a featured best match for a partial term.
- Detail —
/ulta/product/{productId} fetches full product detail:
name, brand, description, pricing, rating, and every purchasable
color/shade variant; pass sku to pin a specific shade.
- Q&A and reviews —
/ulta/product/questions and
/ulta/product/reviews (both keyed by product_id) pull paginated
customer questions/answers and written reviews plus the rating summary.
- Nearby stores —
/ulta/stores resolves a search string (zip,
city, address) or explicit lat/lng to nearby physical Ulta
locations, with hours, services, and phone.
Full endpoint list, methods, and params: reference/endpoints.md.
Calling the API
# Search Ulta by keyword:
scripts/crawlora.sh /ulta/search query="vitamin c serum" | jq '.'
# Browse a category, filtered:
scripts/crawlora.sh /ulta/category category="shop/skin-care/serums" filter="BENEFIT--BRIGHTENING" | jq '.'
# Product detail (path param) for a specific shade:
scripts/crawlora.sh /ulta/product/pimprod2020260 sku=2540468 | jq '.data'
# Nearby stores:
scripts/crawlora.sh /ulta/stores search="60614" | jq '.'
Use scripts/crawlora.sh for all requests; it keeps the API key out of command-line arguments.
Endpoint reference
See reference/endpoints.md for every Ulta
Beauty endpoint this skill uses (method, path, params, description).
Examples
- Filtered category browse:
/ulta/categories to find a
department's category value, then /ulta/category paginated with
filter set to a facet code from that category's own response, to
narrow by benefit/brand.
- Product due diligence:
/ulta/product/{productId} for
price/rating/shades, then /ulta/product/questions and
/ulta/product/reviews (both by product_id) to summarize what
shoppers ask and say before recommending it.
- Find a store:
/ulta/stores with search set to a zip code or
city, then check hours/services on the closest result.
Notes & limits
- Credits / pay-on-success: billed only on
2xx; free tier 2,000 credits/mo.
Key at https://crawlora.net.
- Public data only — public Ulta Beauty product/category/store pages; respect Ulta's terms.
- Security: key lives in
CRAWLORA_API_KEY only — never hardcode, query-param, or commit it.
- Results are paginated — pass
page (1-based) to walk category, search,
questions, and reviews listings.
- Product identity is
product_id (aka productId, from a search
result's product_id field or the product URL) — /ulta/product/{productId},
/ulta/product/questions, and /ulta/product/reviews all key off it;
sku is optional and only narrows /ulta/product/{productId} to one
shade/color variant.
/ulta/stores needs either search or both lat and lng; an
unresolved search or an empty radius returns a well-formed empty
result, not an error — same for a nonsense search/query on
/ulta/search and /ulta/suggest.
- An unrecognized
category on /ulta/category returns 404, but an
unrecognized product_id on /ulta/product/questions or
/ulta/product/reviews returns a normal empty result instead.
1---2name: ulta-research3description: Researches Ulta Beauty's catalog — categories, products, shades, questions, reviews, and nearby stores — using the Crawlora API, returning clean JSON. Use when the user asks to find a beauty product on Ulta, browse an Ulta category, pull product Q&A/reviews before recommending an item, or find a nearby Ulta store — instead of scraping ulta.com.4---56# Ulta Beauty research78Browse and search Ulta Beauty's catalog and pull product detail, shade9variants, questions, reviews, and nearby store locations — all as10normalized JSON from the Crawlora API, with no HTML scraping.1112## When to use this skill1314- "Find [product] on Ulta" or "what does Ulta sell for [need]?"15- "Browse Ulta's [department] category" / "filter by [brand/benefit]."16- "What do customers ask and say about this Ulta product before I17 recommend it?" (Q&A + reviews)18- "Find shade/sku options for this Ulta product."19- "Is there an Ulta store near [zip/city]?"2021## Setup (one-time)2223- Get a free Crawlora API key (2,000 credits/mo, no card) at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).24- Set `CRAWLORA_API_KEY` in the environment before running the helper.25- The helper reads `CRAWLORA_API_KEY` from the environment and sends requests to `https://api.crawlora.net/api/v1`. Missing/invalid key → `401`.2627## How it works28291. **Discover categories** — `/ulta/categories` lists the storefront30 navigation (department, group, and a `category` value ready to pass to31 `/ulta/category`).322. **Browse or search** — `/ulta/category` (`category`) paginates a33 category's product grid and returns guided-navigation `filter` facet34 codes to narrow it; `/ulta/search` (`query`) does keyword search35 instead. `/ulta/suggest` (`query`) returns typeahead suggestions plus36 each suggestion's top product matches, useful for finding query ideas37 or a featured best match for a partial term.383. **Detail** — `/ulta/product/{productId}` fetches full product detail:39 name, brand, description, pricing, rating, and every purchasable40 color/shade variant; pass `sku` to pin a specific shade.414. **Q&A and reviews** — `/ulta/product/questions` and42 `/ulta/product/reviews` (both keyed by `product_id`) pull paginated43 customer questions/answers and written reviews plus the rating summary.445. **Nearby stores** — `/ulta/stores` resolves a `search` string (zip,45 city, address) or explicit `lat`/`lng` to nearby physical Ulta46 locations, with hours, services, and phone.4748Full endpoint list, methods, and params: [`reference/endpoints.md`](reference/endpoints.md).4950## Calling the API5152```sh53# Search Ulta by keyword:54scripts/crawlora.sh /ulta/search query="vitamin c serum" | jq '.'5556# Browse a category, filtered:57scripts/crawlora.sh /ulta/category category="shop/skin-care/serums" filter="BENEFIT--BRIGHTENING" | jq '.'5859# Product detail (path param) for a specific shade:60scripts/crawlora.sh /ulta/product/pimprod2020260 sku=2540468 | jq '.data'6162# Nearby stores:63scripts/crawlora.sh /ulta/stores search="60614" | jq '.'64```6566Use `scripts/crawlora.sh` for all requests; it keeps the API key out of command-line arguments.676869## Endpoint reference7071See [`reference/endpoints.md`](reference/endpoints.md) for every Ulta72Beauty endpoint this skill uses (method, path, params, description).7374## Examples7576- **Filtered category browse:** `/ulta/categories` to find a77 department's `category` value, then `/ulta/category` paginated with78 `filter` set to a facet code from that category's own response, to79 narrow by benefit/brand.80- **Product due diligence:** `/ulta/product/{productId}` for81 price/rating/shades, then `/ulta/product/questions` and82 `/ulta/product/reviews` (both by `product_id`) to summarize what83 shoppers ask and say before recommending it.84- **Find a store:** `/ulta/stores` with `search` set to a zip code or85 city, then check `hours`/`services` on the closest result.8687## Notes & limits8889- **Credits / pay-on-success:** billed only on `2xx`; free tier 2,000 credits/mo.90 Key at [https://crawlora.net](https://crawlora.net?utm_source=github&utm_medium=referral&utm_campaign=crawlora-skills).91- **Public data only** — public Ulta Beauty product/category/store pages; respect Ulta's terms.92- **Security:** key lives in `CRAWLORA_API_KEY` only — never hardcode, query-param, or commit it.93- Results are paginated — pass `page` (1-based) to walk `category`, `search`,94 `questions`, and `reviews` listings.95- **Product identity is `product_id`** (aka `productId`, from a search96 result's `product_id` field or the product URL) — `/ulta/product/{productId}`,97 `/ulta/product/questions`, and `/ulta/product/reviews` all key off it;98 `sku` is optional and only narrows `/ulta/product/{productId}` to one99 shade/color variant.100- `/ulta/stores` needs either `search` or both `lat` and `lng`; an101 unresolved `search` or an empty radius returns a well-formed empty102 result, not an error — same for a nonsense `search`/`query` on103 `/ulta/search` and `/ulta/suggest`.104- An unrecognized `category` on `/ulta/category` returns `404`, but an105 unrecognized `product_id` on `/ulta/product/questions` or106 `/ulta/product/reviews` returns a normal empty result instead.