SHEIN Scraper - Products, Prices, Discounts & Ratings
Pricing
from $1.60 / 1,000 product results
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
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
an hour ago
Last modified
Categories
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,discountPercentanddiscountAmountare 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
resumeFromRunIdat 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.
| Field | Example |
|---|---|
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" |
price | 15.0 |
originalPrice | 20.0 (null unless the item is genuinely reduced) |
discountPercent / discountAmount | 25 / 5.0 (null unless originalPrice is also set) |
isOnSale | true |
currency | "AU$" |
priceUsd | 9.9 |
rating | 4.6 |
reviewsCount | 812 |
inStock / stock | true / 143 |
isFlashSale / isClearance | false / false |
hasVideo | true |
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
- Paste one SHEIN RecommendSelection listing link (category and search links are not accepted) and pick the storefront it belongs to.
- Set Maximum products if you need fewer than the listing's own curated set (about 20 products).
- Set Resume from run ID to continue an interrupted run without repaying for products it already returned.
- 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 ApifyClientclient = 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.
One listing link per run
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.
- Authorize a connector once under Apify, Settings, Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto 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
| Parameter | Type | Default | Description |
|---|---|---|---|
urls | array | prefill: 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. |
storefront | string | au | Which 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. |
includeOutOfStock | boolean | true | Keep products that are sold out. Turn off to return only what is currently available. |
maxItems | integer | 20 | Upper 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. |
maxPages | integer | 0 | Limit on how many pages of the listing are read. Has no effect on the run path this actor currently uses. |
resumeFromRunId | string | (none) | Continue an interrupted run: paste its run ID and products it already returned are skipped. |
incrementalMode | boolean | false | Present 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. |
stateKey | string | (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. |
emitUnchanged | boolean | false | Would also return (and bill) unchanged products in incremental mode. Has no practical effect currently, see "Incremental mode" above. |
emitExpired | boolean | false | Would also return (and bill) products that disappeared from the listing. Has no practical effect currently, see "Incremental mode" above. |
proxy | object | prefill and default: Apify Proxy, residential group | Connection setting. Not read on the run path this actor currently uses; used only by the optional backup pass (enableLegacyBrowserLane). |
mcpConnectors | array | (none) | Optional: send a summary of each product to apps you authorized under Integrations. |
notionParentPageUrl | string | (none) | Notion connector only: page under which product pages are created. Ignored by other connectors. |
maxNotifyListings | integer | 50 | Cap on products written to each connector per run. Does not affect the dataset. |
enableLegacyBrowserLane | boolean | false | Off 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.
Is it legal to scrape SHEIN?
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.
Why did my run only return products from one of the links I pasted?
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.