# Lululemon Product Scraper (`axlymxp/lululemon-product-scraper`) Actor

Scrape lululemon products by keyword, category, URL or full catalog — name, current/list/sale price, size-level stock, colors, images, fabric and fit as structured JSON. Track markdowns and stock for price monitoring and resale. Pay only for the results you get.

- **URL**: https://apify.com/axlymxp/lululemon-product-scraper.md
- **Developed by:** [axly](https://apify.com/axlymxp) (community)
- **Categories:** E-commerce, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 dataset items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Lululemon Product Scraper

Turn any lululemon keyword, category, product URL, or the **entire catalog** into
clean, structured JSON — with **size-level stock**, current/list/**sale** prices,
colors, images, fabric and fit. Runs on lululemon's own product API, so results
are fast and complete. No proxy, no login, no CAPTCHA solving on your side.

> Not affiliated with, endorsed by, or sponsored by lululemon athletica inc. Use
> responsibly and in line with applicable terms and laws.

### Who it's for

- **Price & markdown intelligence** — track prices, "We Made Too Much" markdowns
  and stock across the catalog over time.
- **Resellers & arbitrage** — spot drops, sale %, and which sizes/colors are
  still available on the official store.
- **E-commerce, affiliate & catalog feeds** — a clean, incremental product feed
  (name, price, variants, images) for comparison sites and marketplaces.
- **Analysts & researchers** — assortment, pricing and sustainability studies.
- **AI / agents** — call it from an MCP-enabled assistant to pull live product data.

### What you get (output fields)

| Field | Type | Description |
| ----- | ---- | ----------- |
| `id`, `legacyId`, `unifiedId` | string | Product identifiers. |
| `name` | string | Product name. |
| `brand`, `gender`, `tier` | string | Brand, gender, product tier. |
| `category` | string | Category (e.g. "Leggings"). |
| `url` | string | Full product page URL. |
| `currency` | string | USD or CAD (per `locale`). |
| `price`, `priceMax` | number | Current price range (sale price when discounted). |
| `listPrice`, `listPriceMax` | number | Original list price range. |
| `salePrice` | number | Lowest sale price (present when on sale). |
| `onSale` | boolean | Whether any SKU is discounted. |
| `inStock` | boolean | Whether any size is available. |
| `availableSizes`, `sizes`, `inseams` | array | Sizes in stock, all sizes, inseams. |
| `skuCount` | integer | Number of SKUs (size × color × inseam). |
| `skus` | array | Per-SKU: `size`, `inseam`, `color`, `listPrice`, `salePrice`, `isAvailable`, `isLowStock`, `fulfillmentType`, `isFinalSale`. |
| `colors`, `colorNames`, `colorCount` | array/int | Color options and count. |
| `image`, `images` | string/array | Primary image + full image set. |
| `description` | string | Marketing description. |
| `fabric`, `fit`, `fitDescription` | string | Fabric, fit name and description. |
| `features` | array | Product feature bullets. |
| `designedFor`, `activities` | string/array | Intended activity/use. |
| `highlights`, `collections` | array | Badges (e.g. "Best Gift") and collection. |
| `sustainability` | string | Sustainability claim, when present. |
| `reviewsId` | string | Bazaarvoice reviews id (for cross-referencing reviews). |
| `source`, `locale`, `lastmod`, `scrapedAt` | string | Provenance and timestamps. |

Empty/irrelevant fields are omitted per row, so the output stays clean.

### High-value use cases

- **Daily price & markdown tracking** — schedule `scrapeFullCatalog` with
  `updatedSince` to capture only what changed since your last run, then diff
  prices and `onSale` to detect markdowns the moment they land.
- **Size-availability monitoring** — watch `availableSizes` / `skus[].isAvailable`
  on a set of `productUrls` to know exactly when a size or color sells out or
  restocks.
- **Category assortment snapshots** — pull an entire category (e.g. women's
  leggings) with one `categoryUrls` entry to analyze breadth, pricing tiers and
  color counts.
- **Competitive & resale intelligence** — compare official-store price and stock
  against resale marketplaces to price inventory or find arbitrage.
- **Product feed for a site or app** — keep a comparison site or app in sync with
  a nightly incremental catalog crawl.

### Input parameters

| Field | Type | Default | Description |
| ----- | ---- | ------- | ----------- |
| `searchQueries` | string\[] | `["align leggings"]` | Keywords to search; each is fully paginated. |
| `categoryUrls` | string\[] | – | Category pages, e.g. `https://shop.lululemon.com/c/women-leggings/n1udsq`. |
| `productUrls` | string\[] | – | Product URLs or bare IDs (`prod8780551`, `nydfvgl10k`); always fetched with full detail. |
| `scrapeFullCatalog` | boolean | `false` | Crawl the full product sitemap for the locale (~4,000 styles). |
| `updatedSince` | string | – | Catalog only: ISO date; scrape only products modified on/after it (incremental). |
| `includeDetails` | boolean | `true` | Enrich each product with full detail (SKUs, fabric, fit, images). Turn off for lighter rows. |
| `locale` | string | `en-us` | `en-us` (USD), `en-ca` (CAD), `fr-ca` (CAD). |
| `sort` | string | `""` | `new_arrivals`, `top_rated`, `price_high_to_low`, `price_low_to_high`. |
| `maxItems` | integer | `100` | Stop after this many products across all sources. |
| `filters` | string | – | Advanced raw refinement string (e.g. a color filter). |
| `proxyConfiguration` | object | off | Optional Apify proxy; not needed for normal use. |

Provide at least one of `searchQueries`, `categoryUrls`, `productUrls`, or set
`scrapeFullCatalog=true`.

### Example input

```json
{
  "searchQueries": ["align leggings"],
  "includeDetails": true,
  "locale": "en-us",
  "sort": "price_low_to_high",
  "maxItems": 50
}
```

### Example output (one row, trimmed)

```json
{
  "id": "prod8780551",
  "legacyId": "prod8780551",
  "unifiedId": "Align-Pant-Full-Length-28",
  "reviewsId": "Align_Pant_Full_Length_28",
  "name": "lululemon Align™ High-Rise Pant 28\"",
  "brand": "lululemon",
  "gender": "Women",
  "category": "Leggings",
  "url": "https://shop.lululemon.com/p/womens-leggings/Align-Pant-Full-Length-28/_/prod8780551",
  "currency": "USD",
  "price": 98,
  "listPrice": 98,
  "onSale": false,
  "inStock": true,
  "availableSizes": ["0", "2", "4", "6", "8", "10", "12"],
  "colorCount": 12,
  "skuCount": 111,
  "skus": [
    {"id": "124926329", "size": "0", "inseam": "28\"", "color": "True Navy",
     "listPrice": 98, "currency": "USD", "isAvailable": true, "fulfillmentType": "ship"}
  ],
  "fabric": "Nulu™",
  "fit": "Tight",
  "designedFor": "Yoga",
  "activities": ["Dance", "Pilates", "Yoga"],
  "images": ["https://images.lululemon.com/is/image/lululemon/LW5JYYS_077007_1"],
  "source": "search:align leggings",
  "locale": "en-us",
  "scrapedAt": "2026-08-29T00:00:00Z"
}
```

### Scheduling & integrations

- **Schedule** runs (hourly/daily) from the Apify Console to keep a price/stock
  feed fresh; pair `scrapeFullCatalog` with `updatedSince` for cheap incremental
  syncs.
- **Webhooks** can fire on run completion to push new data into your systems.
- Export to **JSON, CSV, Excel or the API**, or connect to **Google Sheets,
  Make, Zapier, Airbyte or S3** via Apify's integrations.
- Every run also resumes from a **checkpoint** if interrupted — no duplicate rows.

### Use it from an AI assistant (MCP)

This Actor works with the **Apify MCP server**, so an MCP-enabled assistant
(Claude, ChatGPT, VS Code, etc.) can call it as a tool — e.g. "get lululemon
align leggings prices and which sizes are in stock" — and receive the structured
rows above. See Apify's MCP documentation to connect it.

### FAQ

**Do I need a proxy or account?** No. The Actor talks to lululemon's public
product API, which it reaches directly. A proxy is optional (e.g. a Canadian IP
for `en-ca`).

**How fresh is the data?** It is fetched live on each run — prices, sale status
and size availability reflect the store at run time.

**How many products can it return?** As many as you want via `maxItems`; the full
catalog is ~4,000 styles per locale. Search pages 20/request, categories 100/request.

**Can I get only what changed?** Yes — `scrapeFullCatalog` + `updatedSince` scrape
only products whose sitemap `lastmod` is on/after your date.

**Does it include reviews?** Not the review text — lululemon serves reviews via a
separate gated system. Each row includes `reviewsId` so you can cross-reference.

**Which regions?** United States (`en-us`, USD) and Canada (`en-ca` / `fr-ca`,
CAD).

**Is it reliable against anti-bot?** Yes — it impersonates a real browser at the
TLS layer to pass Akamai, with retries and graceful per-item error handling.

**Is this legal?** It collects publicly available product data. You are
responsible for complying with lululemon's terms and applicable laws; don't use
it for anything unlawful.

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords to search lululemon for, e.g. "align leggings", "scuba hoodie", "yoga mat". Each query is fully paginated. Needs no proxy.

## `categoryUrls` (type: `array`):

Lululemon category pages to browse, e.g. https://shop.lululemon.com/c/women-leggings/n1udsq . This is the richest listing (per-size and inseam data). Fully paginated.

## `productUrls` (type: `array`):

Specific lululemon product pages (e.g. https://shop.lululemon.com/p/womens-leggings/Align-Pant-Full-Length-28/\_/prod8780551) or bare product IDs (e.g. prod8780551, nydfvgl10k). Always fetched with full detail.

## `scrapeFullCatalog` (type: `boolean`):

Iterate the lululemon product sitemap to scrape the entire catalog for the selected locale (~4,000 styles). Combine with "Updated since" for incremental syncs. Respects the max-results cap.

## `updatedSince` (type: `string`):

Only used with "Scrape the full catalog". ISO date (e.g. 2026-08-01); only catalog products with a sitemap lastmod on or after this date are scraped. Leave empty to scrape everything.

## `includeDetails` (type: `boolean`):

Enrich each product with full detail: every SKU with size-level price and availability, all colors, the image set, fabric, fit and features (one extra request per product). Turn off for faster, lighter rows.

## `locale` (type: `string`):

Region and currency. en-us = United States (USD), en-ca = Canada (CAD), fr-ca = Canada French (CAD).

## `sort` (type: `string`):

Sort order for search and category results. Leave empty for the site's default (relevance / featured).

## `maxItems` (type: `integer`):

Stop after pushing this many products across all sources.

## `filters` (type: `string`):

Optional raw lululemon refinement string applied to search/category, e.g. "colorGroupId\_ss:Black^black\_swatch". Leave empty for no refinement.

## `ignoreSslErrors` (type: `boolean`):

Disable TLS certificate verification. Only needed when running behind an intercepting/corporate proxy with a custom CA.

## `proxyConfiguration` (type: `object`):

Optional Apify proxy. Lululemon's endpoints work without a proxy; use one only if you need a specific egress region (e.g. a Canadian IP for en-ca).

## Actor input object example

```json
{
  "searchQueries": [
    "align leggings"
  ],
  "scrapeFullCatalog": false,
  "includeDetails": true,
  "locale": "en-us",
  "sort": "",
  "maxItems": 100,
  "ignoreSslErrors": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchQueries": [
        "align leggings"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("axlymxp/lululemon-product-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "searchQueries": ["align leggings"] }

# Run the Actor and wait for it to finish
run = client.actor("axlymxp/lululemon-product-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchQueries": [
    "align leggings"
  ]
}' |
apify call axlymxp/lululemon-product-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,axlymxp/lululemon-product-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/7K9mwGdypVLZlFhxj/builds/FMwdPVPRhV9xwHxix/openapi.json
