SHEIN Scraper at a glance
SHEIN Scraper is a ready-to-run Apify actor from abotapi for collecting ecommerce data. Its documented output includes id, title, link, category and price, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $2.20 per 1,000 results on the Apify Free plan and from $1.60 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Ecommerce, Automation, Developer Tools
- Pricing
- $2.20 per 1,000 results (Free plan), from $1.60 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 22 options
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.
What SHEIN Scraper can do
- 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 ways in, with SHEIN's own sorting. Paste RecommendSelection, search or category links (from any SHEIN address, desktop or mobile) or just type keywords; sort order and price range are applied by SHEIN itself, and rating, discount and category filters trim what comes back.
- 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. Other storefronts (US, UK and the rest) were re-tried on 2026-10-12 with the same browser session, direct and through a residential exit, and stayed on SHEIN's verification page on 4 of 4 attempts (the Australian control link was served in the same test), so they are not offered; each storefront's currency is fixed by the storefront, so there is no separate country or currency input.
- 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.
Choose what to collect
These inputs let you configure SHEIN Scraper - Products, Prices, Discounts & Ratings. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
urlsarray | SHEIN listing links. Three link shapes are read, one example of each is pre-filled (two RecommendSelection examples): RecommendSelection listings (e.g. https://au.shein.com/RecommendSelection/Home-Kitchen-sc-017185546.html), search results pages (e.g. https://au.shein.com/pdsearch/summer%20dress/) and category pages (e.g. https://au.shein.com/Women-Dresses-c-1727.html). Links are read in order and each returns up to about 120 products (SHEIN's first listing page), so with the default 'Maximum products' only the first link is needed. Leave this field untouched and the three example links (one RecommendSelection listing, one search page, one category page) are scraped; a run that sets only 'Search keywords' does not use them. Paste several links for larger pulls: every usable link is read in the same run and results are deduplicated across them. Links on www.shein.com or the m.shein.com mobile site are opened on the selected storefront's own site with the same path. Product, daily-new, sale, store, brand and share links are not listings; a run with a mix skips those with a warning naming each one and still reads the rest. The storefront (Australia/Singapore/Canada) is detected from the link's own host, or from the mobile site's /au/, /sg/ or /ca/ prefix, when 'Storefront' below is left on its default. |
searchTermsarray | Optional. Plain keywords, one per line (e.g. summer dress). Each keyword is searched on the selected storefront exactly like SHEIN's own search box and returns up to about 120 products. Use with or instead of listing links. A SHEIN link typed here is read as a link. |
storefrontstring | Which regional storefront to read. This sets the catalogue, language and currency of the results, and where keywords are searched. Left on the default, it is auto-detected from the pasted link's own host (au./sg./ca.) when that host is one of the three supported storefronts; set it explicitly to override that detection. |
includeOutOfStockboolean | Keep products that are sold out. Turn off to return only products currently available. |
sortBystring | Order of the results. The first five are SHEIN's own sort orders: the listing is opened already sorted, so with a 'Maximum products' cap you get e.g. the cheapest or newest products of the whole listing, not just the default ones re-ordered. The last three have no SHEIN equivalent: they only re-order the products the listing returned. Applies to every link and keyword. |
minPricenumber | Lowest current price, in the storefront's currency (AU$, S$ or CA$). Sent to SHEIN's own price filter, so the listing returns products in range, and checked again on every product, so every published price is inside the range. Leave empty for no minimum. Applies to every link and keyword. |
maxPricenumber | Highest current price, in the storefront's currency. Works like 'Minimum price'. Leave empty for no maximum. |
Show 15 more inputs
| Input | What it controls |
|---|---|
minRatingnumber | Keep only products rated at least this many stars (1 to 5). SHEIN has no rating filter, so this is applied after fetching: products below it, or not rated yet, are removed from what the listing returned, and a run can return fewer than 'Maximum products'. Leave empty for no filter. |
onSaleOnlyboolean | Keep only products with a genuine was-price above the current price. Applied after fetching, so a run can return fewer than 'Maximum products'. |
categoriesarray | Optional. Keep only products in these categories, one per line. Type a plain category name or part of one (e.g. dresses keeps Women Short Dresses and Women Midi Dresses; matched case-insensitively against each product's category name), or a SHEIN category number (e.g. 1727, which also keeps every sub-category under it). A product matching any line is kept. Applied after fetching, so a run can return fewer than 'Maximum products'; to read one whole category, paste its category page link above instead. |
maxItemsinteger | Stop after this many products in total, across all listing URLs. Set 0 for no limit. |
maxPagesinteger | How many listing pages to read for each listing URL. Set 0 for no limit. |
enableLegacyBrowserLaneboolean | Retired option kept so saved inputs keep validating. It has no effect. |
resumeFromRunIdstring | Continue an interrupted run: paste its run ID and products it already returned are skipped. |
incrementalModeboolean | For recurring runs of the same listing URLs: remembers what was seen last time and returns only new and changed products. Compared: price, original price, in-stock flag, title, link, category and the other catalogue details (a change is reported as UPDATED with the changed field names). Never compared, still returned on every row: rating, review count, sold count, fit split, stock count, USD price, pictures, flash-sale flag, card labels, promotions and deal timing, the coupon-estimated price, formatted price strings, and brand and store display names. Add more with the ignore-fields option below. |
stateKeystring | Name the saved state used by incremental mode. Leave empty to derive one from the listing URLs. |
emitUnchangedboolean | In incremental mode, also return products whose details have not changed since the last run. |
emitExpiredboolean | In incremental mode, also return products that were seen before but have now disappeared from the listing. |
ignoreFieldsForChangesarray | Optional. Field names to exclude from UPDATED change detection, in addition to the built-in handling. Built in, these never trigger an UPDATED by themselves: rating, review count and its rounded text, the sold-count text and the fit split (they move as shoppers buy and review); stock count, the USD-converted price, image links (image, images, full-size images, colour images and colour variants), the flash-sale flag, card labels (badges, rank label), deal end time, promotions, the coupon-estimated price, the formatted price strings and the brand and store names (whose codes stay tracked) (marketing timing, exchange rates and CDN hosting rather than a real catalogue change; the price itself is still tracked). Use this if another field in your setup turns out to be noisy. |
mcpConnectorsarray | Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a page per product; other connectors get a best-effort write. Leave empty to skip. Never changes the dataset output. |
notionParentPageUrlstring | URL or id of the Notion page under which product pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListingsinteger | Cap on products written to each connector per run. Does not affect the dataset. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
productIdIDtitleTitleurlLink (link)categoryCategorypricePrice (number)originalPriceWas (number)discountPercentDiscount % (number)isOnSaleOn sale (boolean)currencyCurrencyratingRating (number)reviewsCountReviews (number)inStockIn stock (boolean)Show 6 more fields
imageImage (image)scrapedAtScraped at (date)changeTypeChangechangedFieldsChanged fieldsfirstSeenAtFirst seen (date)lastSeenAtLast seen (date)Example output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"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,
"originalPrice": 20,
"discountPercent": 25,
"discountAmount": 5,
"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",
"brand": "EMERY ROSE",
"storeName": null,
"sourceUrl": "https://au.shein.com/RecommendSelection/Women-Clothing-sc-017172961.html",
"searchQuery": null
}Ways to use this data
- 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: every record carries the listing's current star rating and review count, so comparing two runs' datasets shows how they moved. (If you also turn on Incremental mode, note that a rating/review-count change by itself never produces an UPDATED row there, see "Incremental mode" below, so for pure review-trend tracking, run without incremental suppression, or with emitUnchanged on.)
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does SHEIN Scraper return?
The documented output for SHEIN Scraper includes id, title, link, category, price, was, discount % and on sale. Availability of each field depends on the source page and the selected mode.
How much does SHEIN Scraper cost?
It costs $2.20 per 1,000 results on the Apify Free plan and from $1.60 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
Can I get only new or changed products on a schedule?
Yes. Turn on Incremental mode and schedule the run: the first run returns everything as NEW, later runs return only NEW and UPDATED products (with changedFields), and unchanged products are neither returned nor billed. A run where nothing changed succeeds with an empty dataset and a status message saying so. See "Incremental mode" above for which fields never count as a change.
Can I paste several listing links in one run?
Yes. Every usable link in Listing URLs is scraped in the same run (see "Multiple listing links per run" above), deduplicated by product ID, up to Maximum products in total. A link in an unsupported shape (product-detail, daily-new, store, etc.) is skipped with a warning naming it, and the rest still run.
Why did my run fail instead of returning an empty dataset?
A run fails, with the reason in its status message, in two cases. Either no listing page could be read at all (SHEIN's verification page refused every attempt), or SHEIN did return products but none of them could be returned to you, because none matched your filters (Categories, Minimum rating, Discounted products only, the price range, in-stock only) or every one was already returned by the run you are resuming. The message gives the counts, and no product is billed. An incremental run where nothing changed since the last run is not a failure: it succeeds with an empty dataset. Loosen the filters or paste other links and try again, or retry a refused run in a few minutes.
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.
