Ulta Beauty API endpoint
Returns one Ulta Beauty product's full detail: name, brand, description, category, pricing, rating, review count, images, and every purchasable color/shade variant. productId is taken from a search result's product_id field or a product page's URL (e.g. pimprod2020260). sku is optional and selects a specific color/shade variant; an omitted or invalid sku still resolves the base product using its own default variant. An unrecognized productId returns 404.
/ulta/product/{productId}productId is required, taken from a search result's product_id field or a product page's URL (e.g. pimprod2020260 from https://www.ulta.com/p/lash-sensational-sky-high-mascara-pimprod2020260?sku=2574523). sku is optional and selects a specific color/shade variant (e.g. 2574523); an omitted or invalid sku still resolves the base product using its own default variant.
Notable response behavior:
category lists the product's category breadcrumb (e.g. ["Makeup", "Eyes", "Mascara"]).variants lists every purchasable color/shade of the base product, each with its own product_id/sku_id/name.images is the featured variant's image gallery as absolute URLs.sale_price is only present when the product is currently on sale.productId returns 404. A malformed productId returns 400 before any upstream request is made.| Field | Filled in, of 9 checked | Values in the sample |
|---|---|---|
| product_id | 9 | |
| sku_id | 9 | |
| name | 9 | “Blackest Black” and 8 other values |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| productId (path) | string | Yes | Ulta product id, from a search result's product_id field | pimprod2020260 | |
| sku | string | No | Numeric Ulta sku id selecting a specific color/shade variant | 2574523 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/ulta/product/pimprod2020260" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"product_id": "pimprod2020260",
"sku_id": "2574523",
"brand_name": "Maybelline",
"product_name": "Lash Sensational Sky High Mascara",
"description": "#### Benefits\n\n- Sky high lash impact from every angle\n- Soft, lightweight lashes with no flaking or smudging",
"category": [
"Makeup",
"Eyes",
"Mascara"
],
"currency_code": "USD",
"list_price": "$13.99",
"unavailable": false,
"rating": 4.5,
"review_count": 11861,
"images": [
"https://media.ulta.com/i/ulta/2574523",
"https://media.ulta.com/i/ulta/2574523_sm"
],
"variants": [
{
"product_id": "pimprod2020260",
"sku_id": "2574523",
"name": "Blackest Black"
},
{
"product_id": "pimprod2020260",
"sku_id": "2617940",
"name": "Burgundy Haze"
}
],
"url": "https://www.ulta.com/p/product-pimprod2020260?sku=2574523",
"source_url": "https://www.ulta.com/dxl/graphql?...",
"fetched_at": "2026-08-10T10:00:00Z"
}
}Request schema
No body schema
Response schema
#/definitions/ulta.productDetailResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | ulta.ProductDetailResponse | No | ||||
| data.brand_name | string | No | ||||
| data.category | array | No | ||||
| data.currency_code | string | No | ||||
| data.description | string | No | ||||
| data.fetched_at | string | No | ||||
| data.images | array | No | ||||
| data.list_price | string | No | ||||
| data.product_id | string | No | ||||
| data.product_name | string | No | ||||
| data.rating | number | No | ||||
| data.review_count | integer | No | ||||
| data.sale_price | string | No | ||||
| data.sku_id | string | No | ||||
| data.source_url | string | No | ||||
| data.unavailable | boolean | No | ||||
| data.url | string | No | ||||
| data.variants | array | No | ||||
| data.variants[].name | string | No | ||||
| data.variants[].product_id | string | No | ||||
| data.variants[].sku_id | string | No | ||||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 404 | Not Found | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 503 | Service Unavailable | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/ulta/product/pimprod2020260" \
-H "x-api-key: $CRAWLORA_API_KEY"