---
title: "Shein scraper"
description: "Scrape Shein products, prices, discounts, bestseller ranks, units sold and shipping labels as structured JSON. One API request from Python, Node.js, the CLI or MCP."
canonical: https://www.zenrows.com/scrape/shein
updated: 2026-10-20
---

# Shein scraper

The Zenrows Shein scraper turns a Shein category or search URL into structured data: goods ID, title, price, discount, bestseller rank, units sold, store name, QuickShip and free shipping labels, product URL and image, plus the category's filters. You send the URL, Fetch in Adaptive Stealth Mode opens the page, and Extract returns the fields. Run it from an API call, the CLI or an AI agent.

- Site: shein.com
- Returns: Products, prices, discounts, bestseller ranks and units sold

## Run it: one Shein category in, JSON out

```json Input
{
  "url": "https://us.shein.com/Women-Dresses-c-1727.html",
  "mode": "auto",
  "extract": "auto",
  "proxy_country": "us"
}
```

```json Output
{
  "category_context": {
    "title": "Women Short Dresses",
    "breadcrumb": ["Home", "Women Apparel", "Women Clothing", "Women Dresses", "Women Short Dresses"],
    "currency": "USD"
  },
  "products": [
    {
      "position": 1,
      "goods_id": "568824474",
      "title": "Halter Cutout Ribbed Bodycon Mini Dress Night Out Outfit",
      "price": 38.88,
      "discount_label": "-19%",
      "bestseller_rank": "#3 Bestseller in Soft Women Dresses",
      "units_sold": "300+ sold",
      "labels": ["Local", "QuickShip", "Free Shipping"],
      "product_url": "https://us.shein.com/Halter-Cutout-Ribbed-Bodycon-Mini-Dress-Night-Out-Outfit-p-568824474.html",
      "thumbnail_url": "https://img.ltwebstatic.com/v4/j/spmp/2026/09/21/09/178997845205207e5ae775accfc79555fcb19f8db8_thumbnail_405x.avif"
    }
  ]
}
```

Sample output for a Shein US category page, built from a live request on Oct 20, 2026, trimmed for length. A field is returned when the product card shows it.

## What data can you scrape from Shein?

A Shein category or search page returns one record per product card, in the order Shein shows them, plus the category's breadcrumb and filters. These are the fields teams use most, with the path where each lives in the JSON.

| Field | What it holds | Example |
|---|---|---|
| `products[].goods_id` | Shein's product ID, the number after `-p-` in every product URL | `568824474` |
| `products[].title` | Product title as listed | `Halter Cutout Ribbed Bodycon Mini Dress…` |
| `products[].price` | The price shown on the card, in the site's currency | `38.88` |
| `products[].discount_label` | The discount badge on the card | `-19%` |
| `products[].price_note` | A condition on the price, such as a coupon | `after coupon` |
| `products[].bestseller_rank` | Shein's bestseller rank and the list it ranks in | `#3 Bestseller in Soft Women Dresses` |
| `products[].units_sold` | Sales bucket shown on the card | `300+ sold` |
| `products[].store` | The brand or marketplace store selling the item | `Sweetra` |
| `products[].labels[]` | Shipping labels such as QuickShip, Free Shipping and Local | `QuickShip` |
| `products[].product_url` | The product page, ready to request | `https://us.shein.com/…-p-568824474.html` |
| `products[].thumbnail_url` | The main product photo | `https://img.ltwebstatic.com/…avif` |
| `products[].position` | Order of the card on the page | `1` |
| `category_context.title` | The category the page shows | `Women Short Dresses` |
| `category_context.breadcrumb[]` | The category path from the home page | `["Home", "Women Apparel", …]` |
| `category_context.currency` | Currency of every price on the page | `USD` |
| `filters.color[]` | Filter values Shein offers for the category | `Black` |
| `filters.price_range_usd[]` | Price bands Shein suggests for the category | `Under $15` |

## How to scrape Shein with Zenrows

1. **Create a free Zenrows account** and copy your API key from the dashboard.
2. **Pick the Shein URL.** Category pages end in `-c-<id>.html` (`/Women-Dresses-c-1727.html`), searches live under `/pdsearch/<keyword>/`, and product pages end in `-p-<goods_id>.html`. Use the country site you sell or shop in, such as us.shein.com.
3. **Send it with the default configuration**: Adaptive Stealth Mode to open the page, Extract to return the fields, and the country that matches the Shein site, so prices and shipping labels match a local shopper's.
4. **Read `parsed.products`** from the response. To keep only some fields, list their paths and the response returns just those.
5. **Run every category and page in Batch** when one page returns what you need, with the category or goods ID as your `external_id`.

```python Python
# pip install requests
import json
import requests

params = {
    "apikey": "YOUR_ZENROWS_API_KEY",
    "url": "https://us.shein.com/Women-Dresses-c-1727.html",
    "mode": "auto",          # Adaptive Stealth Mode
    "extract": "auto",       # structured JSON
    "proxy_country": "us",   # US prices and shipping labels
}
response = requests.get("https://api.zenrows.com/v1/", params=params, timeout=180)
response.raise_for_status()

data = response.json()["parsed"]
for p in data["products"]:
    print(p["goods_id"], p["price"], p.get("bestseller_rank"), p.get("units_sold"))
print(json.dumps(data["category_context"], indent=2))
```

```javascript Node.js
// Node 18+ (built-in fetch)
const params = new URLSearchParams({
  apikey: "YOUR_ZENROWS_API_KEY",
  url: "https://us.shein.com/Women-Dresses-c-1727.html",
  mode: "auto",
  extract: "auto",
  proxy_country: "us",
});

const response = await fetch(`https://api.zenrows.com/v1/?${params}`, {
  signal: AbortSignal.timeout(180_000),
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);

const { parsed } = await response.json();
const ranked = parsed.products.filter((p) => p.bestseller_rank);
console.log(ranked.map((p) => [p.goods_id, p.price, p.bestseller_rank]));
```

```bash cURL
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fus.shein.com%2FWomen-Dresses-c-1727.html&mode=auto&extract=auto&proxy_country=us"

# Only the fields you need
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fus.shein.com%2FWomen-Dresses-c-1727.html&mode=auto&extract=auto&proxy_country=us&extract_fields=products.goods_id%2Cproducts.price%2Cproducts.units_sold%2Cproducts.bestseller_rank"
```

```python Python SDK
# pip install zenrows
from zenrows import ZenRowsClient

client = ZenRowsClient("YOUR_ZENROWS_API_KEY")
response = client.get(
    "https://us.shein.com/pdsearch/dress/",
    params={"mode": "auto", "extract": "auto", "proxy_country": "us"},
)
for p in response.json()["parsed"]["products"]:
    print(p["title"][:60], p.get("price"), p.get("labels"))
```

## Input

The scraper takes one Shein URL per request, plus the options below. A Batch job applies the same options to every task, so a daily sweep over 200 categories is a list of URLs with these settings.

| Parameter | Type | Default | Description |
|---|---|---|---|
| `url` | string | required | A Shein category (`-c-<id>.html`), search (`/pdsearch/<keyword>/`) or product page (`-p-<goods_id>.html`), on any Shein country site |
| `mode` | string | `auto` | Adaptive Stealth Mode: starts with the lightest setup and adds rendering and protected-site handling only when the page needs them |
| `extract` | string | `auto` | Returns the page's fields as JSON in `parsed`, next to the raw `html` |
| `extract_fields` | string | all fields | Comma-separated paths to keep, such as `products.goods_id,products.price,products.units_sold` |
| `proxy_country` | string | any | Two-letter country code. Shein sets currency, prices, coupons and shipping labels by the visitor's country, so match it to the Shein site |
| `wait_for` | string | none | A CSS selector to wait for before the page is read |
| `session_id` | integer | none | Keep the same session across several requests, up to 10 minutes, for example while you page through one category |

```json Batch input
{
  "type": "regular",
  "status": "closed",
  "zenrows_params": {
    "mode": "auto",
    "extract": "auto",
    "proxy_country": "us"
  },
  "tasks": [
    { "url": "https://us.shein.com/Women-Dresses-c-1727.html", "external_id": "cat-1727" },
    { "url": "https://us.shein.com/pdsearch/dress/", "external_id": "search-dress" },
    { "url": "https://us.shein.com/Halter-Cutout-Ribbed-Bodycon-Mini-Dress-Night-Out-Outfit-p-568824474.html", "external_id": "goods-568824474" }
  ]
}
```

## Output

Every response is JSON with two keys: `html`, the page as Shein served it, and `parsed`, the structured record. A category page returns `products[]`, the category context and the filters Shein offers for it. The sample below comes from the same live US category page: two more products, one sold by a marketplace store and one priced after a coupon, plus part of the filter list.

```json Category page
{
  "category_context": {
    "title": "Women Short Dresses",
    "breadcrumb": ["Home", "Women Apparel", "Women Clothing", "Women Dresses", "Women Short Dresses"],
    "currency": "USD"
  },
  "products": [
    {
      "position": 3,
      "goods_id": "568567052",
      "title": "Women's Half-Zip Suede Shift Dress For Western Casual Outing",
      "price": 49.9,
      "discount_label": "-17%",
      "units_sold": "200+ sold",
      "labels": ["Local", "QuickShip", "Free Shipping"],
      "product_url": "https://us.shein.com/Women-s-Half-Zip-Suede-Shift-Dress-For-Western-Casual-Outing-p-568567052.html",
      "thumbnail_url": "https://img.ltwebstatic.com/v4/j/spmp/2026/09/21/20/17899581414ac099c0c12e3cec4fb8f6c5ffa4dab5_thumbnail_405x.avif"
    },
    {
      "position": 5,
      "goods_id": "563188478",
      "title": "Sweetra Sweet Romantic Autumn/Winter Women's Short Long Sleeve Dress, Off-Shoulder Petal Sleeve…",
      "store": "Sweetra",
      "price": 19.69,
      "discount_label": "-22%",
      "bestseller_rank": "#1 Bestseller in Beach Women Short Dresses",
      "units_sold": "1.8k+ sold",
      "product_url": "https://us.shein.com/Sweetra-Sweet-Romantic-Autumn-Winter-Women-s-Short-Long-Sleeve-Dress-…-p-563188478.html"
    },
    {
      "position": 7,
      "goods_id": "564071039",
      "title": "Elouméa European And American Autumn/Winter Fuzzy Ribbed Soft Comfortable Long Sleeve Mid-Length Dress…",
      "price": 13.19,
      "price_note": "after coupon",
      "discount_label": "-38%",
      "units_sold": "200+ sold",
      "product_url": "https://us.shein.com/Eloum-a-European-And-American-Autumn-Winter-Fuzzy-Ribbed-…-p-564071039.html"
    }
  ],
  "filters": {
    "color": ["Multi", "Black", "White", "Pink", "Blue"],
    "size": ["one-size", "XXS", "XS", "S", "M", "L"],
    "style": ["Casual", "Elegant", "Boho", "Cute", "Sexy", "Party"],
    "price_range_usd": ["Under $15", "$15 - $20", "Over $20"]
  }
}
```

Need a spreadsheet? Load `products` into pandas with `pd.json_normalize(...)` and write CSV or Excel. Need the page for an LLM? Ask for Markdown instead of JSON.

## Scrape Shein from your coding agent

Claude Code, Cursor, Codex and any MCP client can scrape Shein from a prompt.

The agent calls the same Fetch and Extract request shown above and reads the same `products` array. Connect the Zenrows MCP server once, or install the CLI and let the agent run it in the terminal. No key is needed to try either: the first call creates a free account.

```bash Connect the MCP server (Claude Code)
claude mcp add zenrows -e ZENROWS_API_KEY=YOUR_ZENROWS_API_KEY -- npx -y @zenrows/mcp
```

```json MCP config (Cursor, Claude Desktop, Windsurf)
{
  "mcpServers": {
    "zenrows": {
      "command": "npx",
      "args": ["-y", "@zenrows/mcp"],
      "env": { "ZENROWS_API_KEY": "YOUR_ZENROWS_API_KEY" }
    }
  }
}
```

```bash Or run the CLI
npx -y @zenrows/cli init
zenrows extract "https://us.shein.com/Women-Dresses-c-1727.html" --proxy-country us
```

```text Then ask your agent
Use Zenrows to read the Shein US women's dresses category, first three pages.
List every product with a bestseller rank, its price, discount and units sold,
and tell me which styles and price band hold most of the bestsellers.
```

## Scrape Shein at scale with Batch and Crawl

**Batch** runs a list of Shein URLs as one job, in parallel, with your own ID on each result. Use it for a daily snapshot of the categories you compete in, one task per category and page, so you can see new arrivals, price cuts and which items climb the bestseller lists.

**Crawl** finds product URLs for you. Start it on a category page, keep only links that contain `-p-`, and it returns every product page it reaches. Send those URLs to Batch when you want to follow the same items over time.

```bash Batch (cURL)
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "regular",
    "status": "closed",
    "zenrows_params": { "mode": "auto", "extract": "auto", "proxy_country": "us" },
    "tasks": [
      { "url": "https://us.shein.com/Women-Dresses-c-1727.html", "external_id": "cat-1727" },
      { "url": "https://us.shein.com/pdsearch/dress/", "external_id": "search-dress" }
    ]
  }'

# Read the results when the job finishes
curl "https://async.api.zenrows.com/v1/jobs/JOB_ID/results?status=successful" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY"
```

```bash Batch (CLI)
# shein.jsonl: one {"url": "...", "external_id": "...", "extract": "auto"} per line
zenrows batch create shein.jsonl --proxy-country us --wait
zenrows batch results <job-id> --out shein-products.jsonl
```

```bash Crawl (cURL)
curl -X POST "https://api.zenrows.com/v1/crawls" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://us.shein.com/Women-Dresses-c-1727.html",
    "depth": 1,
    "max_pages": 200,
    "include_patterns": ["-p-"]
  }'
```

**Scheduled jobs** run the same Batch job on a timetable, on Zenrows' side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can tell your app when a run finishes, and you can pause or resume the schedule at any time, with no cron server to keep alive.

```bash Scheduled job (cURL)
# Runs every day on Zenrows' side; each run keeps its own results
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
      "type": "scheduled",
      "status": "closed",
      "schedule": {
        "rate": {
          "every": 1,
          "unit": "day"
        }
      },
      "zenrows_params": {
        "mode": "auto",
        "extract": "auto",
        "proxy_country": "us"
      },
      "tasks": [
        {
          "url": "https://us.shein.com/Women-Dresses-c-1727.html",
          "external_id": "shein"
        }
      ]
    }'

# Or at set times: "schedule": { "calendar": { "times_of_day": ["09:00"],
#   "cadence": { "weekly": { "days": ["mon", "thu"] } } }, "timezone": "Europe/Madrid" }
```

## What teams do with Shein data

| Use case | Data they pull | Who runs it |
|---|---|---|
| Fast-fashion trend tracking | New products, bestseller ranks and units sold per category, week over week | Fashion buyers, designers and trend analysts |
| Competitive pricing | Price, discount and coupon price for comparable items | Apparel brands and marketplace sellers |
| Assortment analysis | Products per style, color, size and price band from the category filters | Merchandising and category teams |
| Marketplace seller research | Third-party stores, their bestsellers and price points | Sellers and agencies on Shein's marketplace |
| Copy and IP monitoring | Titles and photos close to a protected design, and the store selling them | Brand protection and legal teams |
| Product data for AI agents | The category record, or the page as Markdown | AI and data teams |

## Tips for scraping Shein

- **Read the ID from the URL.** Every product URL ends in `-p-<goods_id>.html` and every category in `-c-<id>.html`. Store those IDs as keys instead of the long slugs, which change with the title.
- **Match the country to the Shein site.** us.shein.com, mx.shein.com and au.shein.com each price in their own currency and show their own coupons. Set the country to the site you read and keep it fixed across a dataset.
- **Note coupon prices.** Some cards show a price that only applies "after coupon". Keep that label next to the price so you do not compare coupon prices with list prices.
- **Track bestseller ranks over time.** `bestseller_rank` names the list it belongs to, such as "Beach Women Short Dresses". Snapshot the same categories daily and you get a ranking history Shein does not publish.
- **Separate Shein's own items from marketplace stores.** Cards from third-party stores carry a store name. Group by `store` to see which sellers drive a category.
- **Parse units sold as a bucket.** "1.8k+ sold" is a lower bound. Expand the `k`, store the number and keep the label.

## Frequently asked questions

### Is it legal to scrape Shein?

Collecting public Shein data, such as product titles, prices, discounts and sales labels shown to every visitor, is common practice for trend research and price monitoring. Reviews can include shoppers' names, body measurements and photos, and personal data is protected by laws such as the GDPR and the CCPA, so collect only what you have a legitimate reason to use. Check Shein's terms of use for your use case and ask your lawyer if you are unsure.

### Is there an official Shein API?

Shein has no public API for its product catalog. Its open platform serves approved sellers and partners, who use it to manage their own listings, orders and inventory, and its affiliate program gives creators product links. To read the catalog, prices and bestseller lists as shoppers see them, teams scrape the site.

### What Shein pages can I scrape?

Category pages ( -c-<id>.html ), search pages ( /pdsearch/<keyword>/ ) and product pages ( -p-<goods_id>.html ), on us.shein.com and the other Shein country sites. Send the URL as it appears in your browser.

### Can I scrape Shein prices for a specific country?

Yes. Use the Shein site for that country and set the same country in the request. Zenrows opens the page from that location, so the currency, price, coupons and shipping labels match what a shopper there sees.

### How do I track Shein trends?

Run the same category and search URLs in Batch every day and store the products with the date. New goods IDs show new arrivals, rising units_sold buckets and bestseller ranks show what sells, and the filters show which styles and colors a category leans on.

### How do I scrape Shein with Python?

Send a GET request to https://api.zenrows.com/v1/ with your API key, the Shein URL, Adaptive Stealth Mode and Extract turned on, as in the Python example above. The response's parsed key holds the products as a Python dictionary. The zenrows package on PyPI wraps the same request.

### How many Shein products can I scrape?

Send one URL per request, or a whole list as a Batch job that runs the URLs in parallel and keeps your own ID on each result. One Batch job accepts more than 10,000 URLs, sent inline or as a CSV file.

### Can AI agents scrape Shein with Zenrows?

Yes. Connect the Zenrows MCP server to Claude, Cursor, Codex or any MCP client, or give your agent the Zenrows CLI. Ask for the categories or products you want in plain language and the agent calls Fetch and Extract for you.

### Can I scrape Shein on a schedule?

Yes. Create a scheduled Batch job with your Shein URLs and the same settings as a single request, and Zenrows runs it on its side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can notify your app when a run finishes, and the schedule can be paused or resumed at any time.

### Which integrations work with the Shein scraper?

Zenrows works with n8n, Make, Zapier, Clay, Dify, LangChain, LlamaIndex, CrewAI and Mastra, plus the Python, Node.js and Go SDKs and any HTTP client. Send products to Google Sheets, a BI tool or a database from the workflow tool you already use. See the integrations page for the full list.

### What format does the data come in?

JSON by default, with the structured record in parsed and the original page in html . You can also ask for the page as Markdown or plain text, which is what most LLM and RAG pipelines want.

All scrapers: https://www.zenrows.com/scrape. Start free: https://app.zenrows.com/register. Docs: https://docs.zenrows.com
