SHEIN Scraper - Products, Prices, Discounts & Ratings avatar

SHEIN Scraper - Products, Prices, Discounts & Ratings

Pricing

from $1.60 / 1,000 product results

Go to Apify Store
SHEIN Scraper - Products, Prices, Discounts & Ratings

SHEIN Scraper - Products, Prices, Discounts & Ratings

Scrape SHEIN product listings by keyword or from any category, sale or search link. Returns product ID, SKU, title, link, category, current price, genuine was-price and discount, star rating, review count, stock, flash-sale and clearance flags, and images. Nine regional storefronts.

Pricing

from $1.60 / 1,000 product results

Rating

0.0

(0)

Developer

Abot API

Abot API

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

an hour ago

Last modified

Share

SHEIN Scraper: Products, Prices, Discounts and Ratings

SHEIN Scraper turns SHEIN's own curated storefront listings into clean, structured product data. Paste a SHEIN RecommendSelection listing link and get back product names, links, categories, current price, a was-price and discount that are only shown when the item is genuinely marked down, star rating, review count, stock and promotion flags, for the Australian, Singapore and Canadian storefronts. Export to JSON, CSV or Excel, pull it through the API, or pipe results into your own apps.

Why This Scraper?

  • Genuine was-price and discount. originalPrice, discountPercent and discountAmount are only filled in when a product is actually marked down, never invented from the current price alone.
  • Three storefronts, one shape. Australia, Singapore and Canada each keep their own catalogue and currency, and every record uses the same fields regardless of storefront.
  • Ratings, reviews and stock, straight from the listing. No separate step is needed to see how a product is rated or whether it is in stock.
  • Resume without repaying. Point resumeFromRunId at an interrupted run and the next run skips everything it already returned.
  • Optional delivery to your own apps. Pipe results into Notion, Linear, Airtable or another Apify-connected app as an extra step; the dataset itself is never changed by it.

Use Cases

  • Price trackers and deal sites: monitor genuine markdowns across the Australian, Singapore and Canadian storefronts.
  • Competitor and marketplace research: compare SHEIN's own pricing, ratings and stock against other retailers you track.
  • Assortment and trend analysis: watch which products rotate through SHEIN's curated selections over time.
  • Review monitoring: track how a catalogue's star ratings and review counts move from run to run.

Data You Get

Sample shape: values are illustrative placeholders, not from a live record.

FieldExample
productId / sku / spu"48213097" / "sw2412089988771" / "mp2412089988771"
title"Fictional Wrapstone Print Midi Dress"
url"https://au.shein.com/fictional-wrapstone-print-midi-dress-p-48213097-cat-1745822.html"
category / categoryId"Women Dresses" / "1745822"
price15.0
originalPrice20.0 (null unless the item is genuinely reduced)
discountPercent / discountAmount25 / 5.0 (null unless originalPrice is also set)
isOnSaletrue
currency"AU$"
priceUsd9.9
rating4.6
reviewsCount812
inStock / stocktrue / 143
isFlashSale / isClearancefalse / false
hasVideotrue
image"https://img.ltwebstatic.com/images3_pi/2026/09/29/fictional-9988776-1.jpg"
images["https://img.ltwebstatic.com/images3_pi/2026/09/29/fictional-9988776-1.jpg", "https://img.ltwebstatic.com/images3_pi/2026/09/29/fictional-9988776-2.jpg"]
storeCode / mallCode"12345" / "1"
scrapedAt"2026-09-29T02:15:40+00:00"
changeType"NEW" (incremental mode only; currently always "NEW", see "Incremental mode" below)
changedFields / firstSeenAt / lastSeenAt["price"] / "2026-09-01T00:00:00+00:00" / "2026-09-29T02:15:40+00:00" (incremental mode only)

There is a single record type: one row per product, typically about 20 products per listing link. The last two rows above only appear once Incremental mode is turned on; see "Incremental mode" below for why changeType currently always comes back NEW.

How to Use

  1. Paste one SHEIN RecommendSelection listing link (category and search links are not accepted) and pick the storefront it belongs to.
  2. Set Maximum products if you need fewer than the listing's own curated set (about 20 products).
  3. Set Resume from run ID to continue an interrupted run without repaying for products it already returned.
  4. Click Start, then download the dataset as JSON, CSV or Excel, or read it through the API.

Scrape a listing on the Australian storefront:

{
"urls": ["https://au.shein.com/RecommendSelection/Women-Clothing-sc-017172961.html"],
"storefront": "au",
"maxItems": 100
}

Singapore storefront, in-stock products only:

{
"urls": ["https://sg.shein.com/RecommendSelection/Home-Kitchen-sc-017185546.html"],
"storefront": "sg",
"includeOutOfStock": false,
"maxItems": 50
}

Continue an interrupted run:

{
"urls": ["https://au.shein.com/RecommendSelection/Home-Kitchen-sc-017185546.html"],
"storefront": "au",
"resumeFromRunId": "<PASTE_THE_INTERRUPTED_RUN_ID>"
}

Run it from your code

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/shein-product-scraper").call(run_input={
"urls": ["https://au.shein.com/RecommendSelection/Women-Clothing-sc-017172961.html"],
"storefront": "au",
})
for product in client.dataset(run["defaultDatasetId"]).iterate_items():
print(product["title"], product["price"], product["currency"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/shein-product-scraper').call({
urls: ['https://au.shein.com/RecommendSelection/Women-Clothing-sc-017172961.html'],
storefront: 'au',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.

You can paste several links in Listing URLs, and an invalid one (a category or search link, which SHEIN itself rejects) is skipped with a warning rather than failing the whole run. A given run, however, reads the first usable link in the list. If you want to cover several listings, run the actor again once per link, for example on separate schedules, rather than expecting one run to combine them.

Resume

Resume (resumeFromRunId) continues one interrupted run: paste its run ID and the actor skips everything already returned there, so you don't pay twice.

Incremental mode (incrementalMode)

Incremental mode's classification logic (NEW, UPDATED with changedFields, UNCHANGED, REAPPEARED, EXPIRED) is present in this actor, but on the run path this actor currently uses, the run does not save its results back to the saved state at the end. That means each scheduled run starts from an empty baseline again, so every product currently comes back NEW every time (and is billed every time), never UPDATED or UNCHANGED. REAPPEARED and EXPIRED additionally require a prior run to have written a complete scan to that state, which does not currently happen either, so they cannot occur. stateKey, emitUnchanged and emitExpired have no practical effect until this is fixed. Use resumeFromRunId instead if you want to avoid paying twice for products across runs.

Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape: the Apify dataset is never changed.

What gets written to the connector: a condensed, human-readable summary of each product, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.

  1. Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
  2. Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
  3. For Notion, also set notionParentPageUrl to the page where products should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip. A problem with a connector never fails the run or changes the dataset.

Input Parameters

ParameterTypeDefaultDescription
urlsarrayprefill: one sample link (no default; required)SHEIN RecommendSelection listing links, one per line. A run reads the first usable link; category and search links are skipped with a warning.
storefrontstringauWhich storefront to read: au (AU$), sg (S$) or ca (CA$). Must match the domain of the pasted link; the catalogue and currency come from the link itself, this value is used to build product URLs.
includeOutOfStockbooleantrueKeep products that are sold out. Turn off to return only what is currently available.
maxItemsinteger20Upper bound on products requested from the listing. 0 currently falls back to the same default of about 20, not to no limit; the listing itself typically has only about 20 curated products anyway.
maxPagesinteger0Limit on how many pages of the listing are read. Has no effect on the run path this actor currently uses.
resumeFromRunIdstring(none)Continue an interrupted run: paste its run ID and products it already returned are skipped.
incrementalModebooleanfalsePresent for recurring monitoring of the same listing link, but does not currently persist state between runs on this actor's run path, see "Incremental mode" above; every run currently returns products as NEW regardless of this setting.
stateKeystring(none)Name the saved state used by incremental mode. Has no practical effect until incremental mode's state-saving step runs, see "Incremental mode" above.
emitUnchangedbooleanfalseWould also return (and bill) unchanged products in incremental mode. Has no practical effect currently, see "Incremental mode" above.
emitExpiredbooleanfalseWould also return (and bill) products that disappeared from the listing. Has no practical effect currently, see "Incremental mode" above.
proxyobjectprefill and default: Apify Proxy, residential groupConnection setting. Not read on the run path this actor currently uses; used only by the optional backup pass (enableLegacyBrowserLane).
mcpConnectorsarray(none)Optional: send a summary of each product to apps you authorized under Integrations.
notionParentPageUrlstring(none)Notion connector only: page under which product pages are created. Ignored by other connectors.
maxNotifyListingsinteger50Cap on products written to each connector per run. Does not affect the dataset.
enableLegacyBrowserLanebooleanfalseOff by default. Runs an extra backup connection pass when the main connection returns nothing. In testing this backup pass has not published products; enable it only to help diagnose a failed run.

urls is the one required field and carries only a prefill sample link in the input schema, not a schema default; every other row above shows a real schema default, except where marked "(none)".

Output Example

Sample shape: values are illustrative placeholders, not from a live record.

{
"productId": "48213097",
"sku": "sw2412089988771",
"spu": "mp2412089988771",
"title": "Fictional Wrapstone Print Midi Dress",
"url": "https://au.shein.com/fictional-wrapstone-print-midi-dress-p-48213097-cat-1745822.html",
"category": "Women Dresses",
"categoryId": "1745822",
"price": 15.0,
"originalPrice": 20.0,
"discountPercent": 25,
"discountAmount": 5.0,
"isOnSale": true,
"currency": "AU$",
"priceUsd": 9.9,
"rating": 4.6,
"reviewsCount": 812,
"inStock": true,
"stock": 143,
"isFlashSale": false,
"isClearance": false,
"hasVideo": true,
"storeCode": "12345",
"mallCode": "1",
"image": "https://img.ltwebstatic.com/images3_pi/2026/09/29/fictional-9988776-1.jpg",
"images": [
"https://img.ltwebstatic.com/images3_pi/2026/09/29/fictional-9988776-1.jpg",
"https://img.ltwebstatic.com/images3_pi/2026/09/29/fictional-9988776-2.jpg"
],
"scrapedAt": "2026-09-29T02:15:40+00:00"
}

Plan Requirement

No specific proxy plan is required for the standard run path; the Connection setting is only used by the optional backup pass (enableLegacyBrowserLane), which is off by default and has not published products in testing.

FAQ

How much does it cost?

You pay per product returned, plus a one-off start fee for the run. There is no separate detail-fetch charge: everything published comes from the listing itself, with no per-product detail step to pay for. Duplicate products within the same run are filtered out before they are billed. The Pricing tab shows the current rates.

This actor collects only publicly available product data shown on SHEIN's own storefronts. You are responsible for how you use it: follow SHEIN's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Product names and prices are generally facts, but photos and video may be subject to third-party or seller rights.

Can I get only new or changed products on a schedule?

Not currently. Incremental mode exists in the input but does not persist state between runs on this actor's run path, so every scheduled run currently returns every product as NEW again, billed again. Use resumeFromRunId if you want to avoid paying twice for products across runs, or compare exports yourself.

A run reads the first usable link in Listing URLs. Pasting more links does not make one run combine them; run the actor again for each additional listing.

Why did my run fail instead of returning an empty dataset?

The run is marked failed when the listing page loaded but nothing could be published, which includes a resumed run where every product on that listing had already been returned, or a filter (like excluding out-of-stock items) that happens to exclude everything on that listing, not only a genuine connection problem. Conversely, if the page itself could not be read at all (for example a browser error), the run can finish successfully with an empty dataset instead of failing. Run it again in a few minutes, and check whether your filters are excluding everything on that listing.

Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

๐Ÿ”— Want more e-commerce data?

Pair this actor with these related scrapers from the same team:

๐Ÿ”Œ PB Tech Scraper
Scrape pbtech.co.nz products with full specifications, price, brand, condition, per-store...
๐Ÿฅฆ E.Leclerc Scraper
Scrape E.Leclerc France (e.leclerc) grocery and retail products. Search by keyword or...
๐Ÿ›’ MUJI Scraper
Scrape MUJI products from the United States, Canada and Australia storefronts. Search by...
๐Ÿ”Œ MediaMarkt Germany Scraper
Scrape MediaMarkt.de products by keyword or URL. Extract current and original prices...
๐Ÿ”Œ Thegioididong Scraper
Scrape thegioididong.com products with full specifications, current & original price...
๐Ÿ›’ Officeworks Scraper
Scrape Officeworks products by keyword, category, or URL. Extract names, brands, prices...

๐Ÿ‘‰ Browse all abotapi scrapers

๐Ÿ’ฌ Support & custom scrapers

  • ๐Ÿž Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
  • ๐Ÿ› ๏ธ Need another site, extra fields or a private build? Email abotapi@proton.me or message Telegram @abotapi.
  • โญ Enjoying it? A quick review on the actor page helps other users find it.