# SHEIN Product Scraper (`native_emblem/shein-product-scraper`) Actor

Get SHEIN product data by URL, goods ID or SKU, or browse whole categories. Clean JSON: price in local currency and USD, full-res images, colour variants, rating, stock, size-fit. 40+ regions. From $5/1,000 results.

- **URL**: https://apify.com/native_emblem/shein-product-scraper.md
- **Developed by:** [Cartpie](https://apify.com/native_emblem) (community)
- **Categories:** E-commerce
- **Features:** Limited permissions
- **Stats:** 291 total users, 72 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $10.00 / 1,000 product — full details

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## SHEIN Product Scraper: SHEIN scraper API for product, price and category data

Scrape **SHEIN** product data two ways: **browse a category** to pull whole
product lists, or pass a **product URL, goods ID or SKU** for a single product,
in **any region and currency**. Output is clean JSON, CSV or Excel, or you can
pull it through the Apify API. Built for reliability: when other SHEIN scrapers
break, this one keeps working.

> **Reliability:** detail lookup (URL / `goods_id`) resolves across **40+ SHEIN storefronts in real local currency** — prices checked against the live SHEIN websites (UK, DE, FR, IT, ES, NL, PT, AT, CH, PL, RO, TR) and identical · 🧹 clean ~22-field schema · 🖼️ **full-resolution images**

Perfect for **price monitoring, dropshipping & reselling, competitor research,
catalog enrichment, and fashion-trend analytics**.

#### Two ways in — one clean output

- **🎯 Detail (URL / ID):** give it exact product URLs, `goods_id`s or SKUs and get the full detail record for each. Works across every storefront.
- **📂 Browse (category):** paste SHEIN category links (`categoryUrls`) or their `categoryIds` to pull every product in that category, optionally narrowed by `searchTerms` to keep only matching titles.

Both return the **same clean product schema**, so one pipeline handles any of them.

***

### ✨ Why this scraper

- **It keeps working when SHEIN changes things.** SHEIN periodically changes how it routes and gates requests; this actor automatically falls back to a working route rather than returning empty results, and tells you (via `regionFallback`) when it had to.
- **Detail works everywhere, in real local currency.** Any `goods_id` / product URL resolves at the same price the SHEIN website shows in that country — GBP in the UK, AED in the UAE, JPY in Japan, and so on. If SHEIN doesn't sell a product in that country you get a clear `not_available_in_region` instead of a misleading price.
- **Clean output.** A tidy ~22-field record — no internal junk, ready for a sheet, DB, or app.
- **Full-resolution images** — the complete gallery plus colour-variant swatches.
- **Fast & cheap.** Batched fetching.

> ℹ️ **Keyword search is no longer available** — SHEIN stopped serving that service. Paste category links (`categoryUrls`) to browse categories (with `searchTerms` as an optional title filter) or `productUrls` / `goodsIds` for exact products. A run with nothing to do ends immediately and is not charged.

### 💷 Pricing

**Pay per product record** — you're billed only for products actually returned,
never for empty results. **Free trial included** so you can test before you spend.

| Event | What you get | Price |
|---|---|---|
| **Product** | one product from a **category browse** — price, images, rating, stock, discount | **$5 / 1,000** |
| **Product (full detail)** | one product from a **URL / goods ID** — adds size-fit %, full gallery, colour variants, review count | **$10 / 1,000** |

Category browsing is the cheap, high-volume way to pull catalogs; full detail is the
premium, targeted lookup. A browse of 500 products costs **$2.50**; 50 exact
product lookups cost **$0.50**.

### 📥 Input

| Field | Type | Description |
|---|---|---|
| `searchTerms` | string\[] | **Title filter** for `categoryUrls` / `categoryIds`: keep only products whose title matches. Keyword search on its own is no longer available. |
| `maxProductsPerTerm` | integer | How many products to return per category (default 100). |
| `sort` | string | Category sort: empty = recommended, `10` = price low→high, `11` = price high→low. |
| `productUrls` | string\[] | **Detail.** SHEIN product URLs, any region (`www.shein.co.uk`, `us.shein.com`, `de.shein.com`, …). |
| `goodsIds` | string\[] | **Detail.** SHEIN `goods_id` values — alternative/addition to URLs. Pair with `country`. |
| `skus` | string\[] | **Detail.** SHEIN SKUs (the `sku` field in every record, e.g. `sz260429143242426816727`) — alternative/addition to URLs and IDs. Pair with `country`. |
| `categoryUrls` | string\[] | **Browse.** SHEIN category links, e.g. `https://www.shein.co.uk/Women-Dresses-c-12472.html`. Pulls every product in the category, in that storefront's region and currency. Combine with `searchTerms` to keep only title matches. |
| `categoryIds` | string\[] | **Browse.** The same by number: the digits after `-c-` in a category link (`12472`). Pair with `country`. |
| `country` | string | ISO country for pricing/locale (`GB`, `US`, `DE`, `FR`, …). Sets the region for `categoryIds` and `goodsIds`; overrides the region of product and category links. |
| `currency` | string | Optional currency override (`GBP`, `USD`, `EUR`, …). |
| `maxItems` | integer | Stop after N records total. |
| `proxyConfiguration` | object | Apify Proxy (default) — recommended for larger runs. |

#### Example input

**Browse a category:**

```json
{
  "categoryUrls": [
    "https://www.shein.co.uk/Women-Dresses-c-12472.html",
    "https://us.shein.com/Men-Clothing-c-6273.html"
  ],
  "searchTerms": ["midi"],
  "maxProductsPerTerm": 100
}
```

To get a category link, open the category from SHEIN's menu and copy the address
from your browser. Links with `-c-` in them work, from any storefront, desktop or
mobile. Curated selection pages (`-sc-` in the link, e.g. `RecommendSelection/...`)
can't be browsed: pick the matching category from the menu instead. Those links
come back as an `unsupported_selection_page` row and are never charged.

**By product URL or ID (detail):**

```json
{
  "productUrls": [
    "https://www.shein.co.uk/...-p-209758798.html",
    "https://us.shein.com/...-p-56100852.html"
  ],
  "proxyConfiguration": { "useApifyProxy": true }
}
```

Or fetch by ID:

```json
{ "goodsIds": ["209758798", "56100852"], "country": "GB" }
```

Or by SKU:

```json
{ "skus": ["sz260429143242426816727"], "country": "GB" }
```

### 📤 Output

One clean record per product, pushed to the dataset (export JSON / CSV / Excel,
or pull via the Apify API). See [`examples/example-output.json`](./examples/example-output.json)
for a full real sample.

| Field | Description |
|---|---|
| `id`, `sku`, `spu` | Product / SKU / product-family identifiers |
| `url` | Canonical product URL |
| `title` | Product name |
| `category`, `categoryId` | Category |
| `price`, `priceFormatted` | Current price (number + display string) |
| `listPrice`, `listPriceFormatted`, `discountPercent` | Original price + discount (when on sale) |
| `currency`, `priceUsd` | Currency + USD price (cross-region compare) |
| `inStock` | Availability |
| `images` | Full-resolution image gallery |
| `colorVariants` | Colour-variant swatch images |
| `color` | Colour (when labelled) |
| `rating`, `reviewsCount` | Ratings & review count |
| `fit` | Size-fit breakdown (true-size / large / small %) |
| `videoUrl` | Product video (when present) |
| `storeCode` | Marketplace store/seller code |
| `region` | `{ country, currency }` |
| `regionFallback` | `true` when the record came from the actor's second route because that country's own web storefront wasn't reachable. Price and currency are still that country's — it's a transparency flag, not a warning. Omitted otherwise. |
| `scrapedAt` | ISO timestamp |

```jsonc
{
  "id": "209758798",
  "sku": "sz25092919833193799",
  "title": "Sweetra Women's Oblique Shoulder Flounce Bodycon Dress",
  "url": "https://www.shein.co.uk/...-p-209758798.html",
  "category": "Women Mini Dresses",
  "price": 9.49,
  "priceFormatted": "£9.49",
  "listPrice": 11.99,
  "discountPercent": 20,
  "currency": "GBP",
  "priceUsd": 12.54,
  "inStock": true,
  "images": ["https://img.ltwebstatic.com/...jpg", "..."],
  "colorVariants": ["https://img.ltwebstatic.com/...jpg", "..."],
  "rating": 4.68,
  "reviewsCount": 94,
  "fit": { "trueSize": "88%", "large": "0%", "small": "12%" },
  "region": { "country": "GB", "currency": "GBP" },
  "scrapedAt": "2026-06-26T11:15:20.505Z"
}
```

### 🚀 How to scrape SHEIN product data

- **In the app:** set the input, click **Start**, download from the dataset.
- **Via API / CLI:** call the actor with the input above; read results from the
  dataset. Integrate with Make, Zapier, n8n, or your own code.

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('native_emblem/shein-product-scraper').call({
  goodsIds: ['209758798'],
  country: 'GB',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].priceFormatted); // e.g. £9.49
```

Runnable Python, Node and curl examples, plus a daily SHEIN price tracker script,
are in the [shein-product-scraper repo on GitHub](https://github.com/votiakov/shein-product-scraper).

### SHEIN price tracker and price monitoring

Schedule the actor daily (Apify Schedules) on the same `goodsIds` or
`categoryUrls` and compare `price`, `listPrice` and `discountPercent` between
runs. Every record carries `scrapedAt`, so a day-by-day price history is one
dataset export away. Set `country` per run to track the same product in several
regions: `priceUsd` makes the cross-region comparison direct.

### Is there a SHEIN API?

SHEIN has no public product API. This actor is the practical substitute: give it
a product URL, goods ID, SKU or category link and it returns the product record as
structured JSON, with local prices for 40+ storefronts. Call it from the Apify
API, or use the ready-made integrations for Make, Zapier and n8n.

### Scraping SHEIN for dropshipping and competitor research

Browse a category with `categoryUrls` to pull the whole listing (price, discount,
rating, stock, images), then filter with `searchTerms` to keep only the titles
you care about. Pull full detail (size-fit %, colour variants, review count)
only for the products that make the shortlist, so you pay the higher detail
price just where it matters.

### ❓ FAQ

**Which regions are supported?** 40+ SHEIN storefronts — UK, US, all major EU,
LATAM, MENA, and APAC. Set `country` (or just use a regional URL) and prices
come back in that country's currency, matching the SHEIN website there. If a
product isn't sold in that country, its record has
`error: "not_available_in_region"` (not charged).

**URLs or IDs?** Either. Paste product URLs, or pass `goods_id` values with a
`country`. Mix both. Categories work the same way: a category link, or its number
with a `country`.

**How fast / how much can I scrape?** Batched fetching (up to 20/50 ids per
request depending on mode). Suitable for one-off lookups up to large catalog
runs via `categoryUrls`.

**How fresh is the data?** Live — fetched at request time (note `scrapedAt`).

**Is the output stable?** Yes — a fixed, clean schema (above), so it won't break
your pipeline.

**Do I need a proxy?** Apify Proxy is on by default and recommended for larger runs.

**Support?** Open an issue on the actor page — fast turnaround.

**Is scraping SHEIN allowed?** This actor collects publicly available product
information. You are responsible for using the data in line with SHEIN's terms
and applicable law.

### 🔗 More scrapers

Same proxyless, clean-JSON approach, other data sources:

- **[App Reviews Scraper](https://apify.com/native_emblem/app-reviews-scraper)** — Google Play + App Store reviews & app metadata
- **[Google Trends Scraper](https://apify.com/native_emblem/google-trends-scraper)** — interest over time & region, related queries, trending searches
- **[ATS Job Feed Scraper](https://apify.com/native_emblem/ats-job-feed-scraper)** — live jobs from Greenhouse, Lever, Ashby & SmartRecruiters

***

*Also searched as: shein scraper, scrape shein, shein api, shein product data,
shein price scraper, shein price tracker, shein dropshipping data, fashion data,
ecommerce scraper.*

# Changelog

This Actor's version history is a separate document: https://apify.com/native_emblem/shein-product-scraper/changelog.md

# Actor input Schema

## `searchTerms` (type: `array`):

Optional. With category links or IDs, keep only products whose title contains one of these words (e.g. "dress", "cargo"). Keyword search on its own is no longer available. Use category links, Product URLs or Goods IDs.

## `maxProductsPerTerm` (type: `integer`):

How many products to return for each category. Default 100.

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

Sort order for category browsing.

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

SHEIN product page URLs (any region, e.g. www.shein.co.uk, us.shein.com, de.shein.com). The goods_id and region are parsed from each URL. Returns the full detail record.

## `goodsIds` (type: `array`):

SHEIN goods_id values, as an alternative (or in addition) to URLs. Combine with Country to set the region.

## `skus` (type: `array`):

SHEIN SKUs (the `sku` / goods_sn value, e.g. sz260429143242426816727). Returns the same full detail record as a product URL. Combine with Country to set the region.

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

SHEIN category page links, e.g. https://www.shein.co.uk/Women-Dresses-c-12472.html. Open a category from SHEIN's menu and copy the link: links with "-c-" work, curated selection pages with "-sc-" don't. Each link's storefront sets the region unless Country is set. Returns every product in the category (price, images, rating, stock).

## `categoryIds` (type: `array`):

Same as category links, by number: the digits after "-c-" in a category link (12472 in Women-Dresses-c-12472.html). Uses Country for the region. Optionally narrow with the title filter above.

## `country` (type: `string`):

ISO country code for pricing/locale (e.g. GB, US, DE, FR). Sets the region/currency for category IDs and Goods IDs, and overrides the region parsed from product and category links.

## `currency` (type: `string`):

Optional currency override (e.g. GBP, USD, EUR). Defaults to the country's currency.

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

Stop after pushing this many records across all terms and URLs. Leave empty for no limit.

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

Apify Proxy is recommended for reliability on larger runs.

## Actor input object example

```json
{
  "maxProductsPerTerm": 100,
  "sort": "",
  "productUrls": [
    "https://www.shein.co.uk/Sweetra-Women-s-Oblique-Shoulder-Flounce-Sexy-Bodycon-Dress-p-209758798.html"
  ],
  "country": "GB",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Clean SHEIN product records (price, stock, images, variants, ratings) in the dataset.

# 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 = {
    "productUrls": [
        "https://www.shein.co.uk/Sweetra-Women-s-Oblique-Shoulder-Flounce-Sexy-Bodycon-Dress-p-209758798.html"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("native_emblem/shein-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 = {
    "productUrls": ["https://www.shein.co.uk/Sweetra-Women-s-Oblique-Shoulder-Flounce-Sexy-Bodycon-Dress-p-209758798.html"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("native_emblem/shein-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 '{
  "productUrls": [
    "https://www.shein.co.uk/Sweetra-Women-s-Oblique-Shoulder-Flounce-Sexy-Bodycon-Dress-p-209758798.html"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call native_emblem/shein-product-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,native_emblem/shein-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/5BDKbqx8RGKFY2JxY/builds/udA6mHdLig19q6ddX/openapi.json
