Lululemon API endpoint
Returns one lululemon category's product listing page: products with pricing, sale detection, sizes, colors, and style numbers. category and cdp_hash are the two path segments of a lululemon category URL (https://shop.lululemon.com/c/{category}/{cdp_hash}), e.g. women-new-styles and n14f1wz6o10 -- both are also available from lululemon-categories's own category and cdp_hash fields. Pagination is page-based and real: requesting a page beyond the category's real last page returns a normal response with an empty products array rather than an error. An unrecognized category/cdp_hash pair returns 404.
/lululemon/categorycategory and cdp_hash are both required — the two path segments of a lululemon category URL (https://shop.lululemon.com/c/{category}/{cdp_hash}), e.g. women-new-styles and n14f1wz6o10. Both are also available from lululemon-categories's own category and cdp_hash fields. page is optional, one-based, defaults to 1. page_size is optional, 1 to 100, defaults to 24.
Notable response behavior:
page returns identical results on repeat requests, and different pages return different, non-overlapping products.page beyond the category's real last page returns a normal 200 with an empty products array. total_products stays at its real, nonzero value in that case.category/cdp_hash pair returns 404.products[].colors[] and products[].style_numbers[] are parallel arrays: index i of one corresponds to index i of the other.products[].image_url is the first image lululemon's own listing lists for the product — not reliably paired to a specific color, since a product can carry more images than colors.products[].sale_price is only populated when on_sale is true.| Field | Filled in, of 24 checked | Values in the sample |
|---|---|---|
| id | 24 | |
| unified_id | 24 | |
| name | 24 | “Scuba Cropped Funnel-Neck Half Zip *Waffle” and 18 other values |
| url | 24 | shop.lululemon.com |
| image_url | 24 | images.lululemon.com |
| currency | 24 | USD in all 24 |
| price | 24 | 58 to 148, median 118 |
| list_price | 24 | 58 to 148, median 118 |
| on_sale | 24 | true in 9 of 24 |
| new_arrival | 24 | true in 24 of 24 |
| category | 24 | Hoodies & Sweatshirts (8), Sweatpants (5), Shorts (5) and 3 more |
| category_id | 24 | |
| activities | 24 | median 2 entries |
| sizes | 24 | median 6 entries |
| colors | 24 | median 3 entries |
| style_numbers | 24 | median 3 entries |
| sale_price | 9 | 19 to 104, median 84 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| category | string | Yes | lululemon category slug, from a category URL's first path segment | women-new-styles | |
| cdp_hash | string | Yes | lululemon category id, from a category URL's second path segment | n14f1wz6o10 | |
| page | integer | No | 1 | Page number, one-based, defaults to 1 | 1 |
| page_size | integer | No | 24 | Results per page, 1 to 100, defaults to 24 | 24 |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/lululemon/category?category=women-new-styles&cdp_hash=n14f1wz6o10&page=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"category": "women-scuba-clothes",
"cdp_hash": "n14uwkz9uld",
"page": 1,
"page_size": 2,
"total_products": 31,
"count": 2,
"source_url": "https://shop.lululemon.com/c/women-scuba-clothes/n14uwkz9uld?format=json&No=0&Nrpp=2&locale=en_US&sl=US",
"fetched_at": "2026-08-14T06:00:00Z",
"products": [
{
"id": "lt5o6p8kho",
"unified_id": "Scuba-Evolve-Straight-Leg-Pant-Regular",
"name": "Scuba Evolve Straight-Leg Pant *Regular",
"url": "https://shop.lululemon.com/p/scuba-evolve-straight-leg-pant-regular/lt5o6p8kho",
"image_url": "https://images.lululemon.com/is/image/lululemon/LW5JKOS_077007_1",
"currency": "USD",
"price": 118,
"list_price": 118,
"on_sale": false,
"new_arrival": true,
"category": "Sweatpants",
"category_id": "womens-sweatpants",
"activities": [
"Casual",
"Lounge"
],
"sizes": [
"L",
"M",
"S",
"XL",
"XS",
"XXS"
],
"colors": [
"Raspberry Rave",
"Heathered Core Ultra Light Grey",
"Mahogany Muse",
"Black"
],
"style_numbers": [
"LW5JKOS-077007",
"LW5JL9S-032493",
"LW5JKOS-074110",
"LW5JKOS-0001"
]
},
{
"id": "lp4yqrz3sp",
"name": "Scuba Evolve Half-Zip Hoodie",
"url": "https://shop.lululemon.com/p/scuba-evolve-half-zip-hoodie/lp4yqrz3sp",
"currency": "USD",
"price": 128,
"list_price": 128,
"sale_price": 98,
"on_sale": true,
"category": "Hoodies & Sweatshirts",
"category_id": "womens-hoodies-and-sweatshirts",
"colors": [
"Black",
"True Navy"
],
"style_numbers": [
"LW1AXQS-0001",
"LW1AXQS-069243"
]
}
]
}
}Request schema
No body schema
Response schema
#/definitions/lululemon.categoryResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | lululemon.CategoryResponse | No | ||||
| data.category | string | No | Category slug that was requested, such as `women-new-styles`. | |||
| data.cdp_hash | string | No | Short id segment of the category URL that was requested. | |||
| data.count | integer | No | Number of products returned on this page. | |||
| data.fetched_at | string | No | Time the data was fetched, in UTC (RFC 3339). | |||
| data.page | integer | No | Page number returned, starting at 1. | |||
| data.page_size | integer | No | Maximum number of products on a page. | |||
| data.products | array | No | Products listed on this page of the category. | |||
| data.products[].activities | array | No | Activities the product is designed for, such as `Casual` or `Lounge`. | |||
| data.products[].category | string | No | Name of the product's category, such as `Sweatpants`. | |||
| data.products[].category_id | string | No | Id of the product's category, such as `womens-sweatpants`. | |||
| data.products[].colors | array | No | Names of the colors the product comes in. Positions match `style_numbers`. | |||
| data.products[].currency | string | No | Currency code of the prices, such as `USD`. | |||
| data.products[].id | string | No | lululemon product id. | |||
| data.products[].image_url | string | No | URL of the first image lululemon lists for the product. | |||
| data.products[].list_price | number | No | List price of the product. | |||
| data.products[].name | string | No | Product name as shown on lululemon. | |||
| data.products[].new_arrival | boolean | No | Whether lululemon flags the product as a new arrival. | |||
| data.products[].on_sale | boolean | No | Whether the product is on sale. | |||
| data.products[].price | number | No | Current price of the product. | |||
| data.products[].sale_price | number | No | Sale price of the product. Set only when `on_sale` is `true`. | |||
| data.products[].sizes | array | No | Sizes the product is available in. | |||
| data.products[].style_numbers | array | No | Style numbers of the product, one per color. Positions match `colors`. | |||
| data.products[].unified_id | string | No | lululemon's unified product id, a slug such as `Scuba-Evolve-Straight-Leg-Pant-Regular`. | |||
| data.products[].url | string | No | URL of the product page on lululemon. | |||
| data.source_url | string | No | URL the data was read from. | |||
| data.total_products | integer | No | Total number of products in the category. | |||
| 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/lululemon/category?category=women-new-styles&cdp_hash=n14f1wz6o10&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"