Shein Search Products Scraper By Category, Store & Product URL
Under maintenancePricing
from $2.99 / 1,000 results
Shein Search Products Scraper By Category, Store & Product URL
Under maintenance๐๏ธ Search & scrape Shein product data from 38 countries. ๐ Keywords, filters, price range & sort options. ๐ฆ Output: titles, prices, images, ratings & more.
Pricing
from $2.99 / 1,000 results
Rating
0.0
(0)
Developer
SimpleAPI
Maintained by CommunityActor stats
0
Bookmarked
17
Total users
2
Monthly active users
3 days ago
Last modified
Categories
Share
Shein Product Scraper โ Search, Category, Store & Price Data
Scrape structured Shein product data by keyword search, or discover products directly by product URL, category/collection URL, or store/mall URL โ all in the same run, across 38 regional Shein storefronts. Every row returns the product name, flattened sale and retail prices (local currency plus USD), a clickable product deep-link, the product image, and store/seller metadata that flags Shein-fulfilled listings versus third-party "mall" sellers. Dropshippers, price-monitoring teams, and marketplace researchers use it to pull a competitor's entire store catalog or track one SKU's price over time without touching Shein's own search box. Point it at a keyword, a product, a category, or a whole store, and get the same clean schema back every time.
What is the Shein Product Scraper?
The Shein Product Scraper is an Apify Actor that scrapes Shein's public storefront and search pages and returns product records as structured JSON โ one row per product, with a consistent schema regardless of how the product was discovered. No Shein account, login, or API key is required; the Actor navigates Shein's regional sites (us.shein.com, uk.shein.com, etc.) directly through a stealth browser.
Key capabilities:
- ๐งญ Four discovery modes in one run โ keyword search, a direct product URL or bare Goods ID, a category/collection page URL, or a store/mall storefront URL. Every mode can be combined in a single input; each row is tagged with the
discoveryModeit came from. - ๐ฆ Core identifying fields โ
goods_id,goods_name,goods_img, and a ready-to-clickproductUrldeep-link, built even when Shein's own payload doesn't expose one. - ๐ฐ Flattened, scalar pricing โ
salePriceAmount,retailPriceAmount, and their USD equivalents, instead of Shein's nested price objects. - ๐ฌ Store & seller metadata โ
storeCode,businessModel,mallCode, and a derivedsellerTypedistinguishing Shein-operated listings from third-party marketplace ("mall") sellers. - ๐ 38 regional storefronts โ one
countryCodeparameter switches the entire run to that region's Shein site and currency. - โ๏ธ Sort and price-range filters โ recommended, most popular, new arrivals, top rated, or price low/high, plus a keyword-search price band and category-ID restriction.
- โฌ๏ธ Standard Apify dataset output โ results land in the run's dataset and export as JSON, CSV, Excel, HTML table, or RSS from the Apify Console.
What data can I extract with the Shein Product Scraper?
Every product row carries identity, pricing, store, and provenance fields:
| Field | Example value | Use case |
|---|---|---|
goods_id | "18234561" | Shein's own numeric product ID โ stable key for de-duplication and re-checks |
goods_name | "Solid Ribbed Knit Long Sleeve Sweater" | Product title for catalog listings and search matching |
goods_img | "https://img.ltwebstatic.com/images3_pi/.../abc.jpg" | Product thumbnail for catalog display |
productUrl | "https://us.shein.com/solid-ribbed-knit-sweater-p-18234561.html" | Direct deep-link back to the live product page |
salePriceAmount | 12.99 | Current sale price as a number, ready for price-tracking math |
salePriceText | "$12.99" | Display-ready formatted price string |
salePriceUsd / salePriceUsdText | 12.99 / "$12.99" | USD-normalized sale price, for cross-region comparison |
retailPriceAmount / retailPriceText | 24.99 / "$24.99" | List/retail price before discount |
retailPriceUsd / retailPriceUsdText | 24.99 / "$24.99" | USD-normalized retail price |
storeCode | "1234567" | Seller/storefront identifier |
businessModel | "1" | "1" = third-party marketplace seller, "0" = Shein-operated |
mallCode | "1" | Marketplace/region grouping code (see note below โ not a third-party signal) |
sellerType | "third_party_mall" | Derived flag: "shein" or "third_party_mall" |
discoveryMode | "keyword" | Which input mode produced this row: keyword, product, category, or store |
section / query | "summer dress" | The target label (query text, category URL, store URL, or product ID) โ both hold the same value |
section_index | 1 | 1-based index of the discovery target this row belongs to, in input order |
country | "US" | The regional storefront the row was scraped from |
sort_order | "MostPopular" | The orderBy value in effect for this target (null for product mode) |
scrapedAt | "2026-07-30T10:15:03.221+00:00" | UTC timestamp the row was collected |
Two things worth knowing about this table:
salePriceandretailPrice(Shein's own nested objects, e.g.{"amount": "12.99", "amountWithSymbol": "$12.99", ...}) are kept on the row in addition to the flattenedsalePriceAmount/retailPriceAmountcolumns above โ nothing is deleted, only added to.- Whatever else Shein's own product JSON includes on a given listing (e.g.
goods_sn,cat_id,tag_3p_label_name) is passed through unfiltered. The Actor never strips fields it doesn't explicitly need, so columns can vary slightly by region and category.
Pricing and store/seller data
Sale and retail prices arrive twice โ as Shein's native nested object and as flat, typed columns (salePriceAmount, retailPriceAmount, plus USD-normalized variants) โ so a discount percentage or a price-drop alert needs no parsing step. Store/seller data (storeCode, businessModel, mallCode, sellerType) lets you split a category or search result set into Shein-fulfilled versus third-party listings before doing margin or sourcing analysis. One caveat confirmed against live data: mallCode is essentially constant across almost every listing on a regional site โ it identifies a marketplace/region grouping, not who fulfils the order. businessModel (and the sellerType derived from it) is the real Shein-vs-third-party signal.
Targeting and provenance fields
discoveryMode, section/query, and section_index tell you which input target (which keyword, which category URL, which store URL, or which product) produced each row, so a single multi-target run can still be grouped back per target. country and sort_order record which regional site and ordering were active. scrapedAt timestamps every row for freshness checks in repeated runs.
Why not build this yourself?
Shein does publish a developer platform (open.sheincorp.com, checked 2026-07-30), but it is scoped to onboarded merchants: API keys are issued only after a specific Shein shop authorizes the integration, and the endpoints cover that shop's own orders, inventory, and returns โ not public product search or catalog browsing by a third party. There is no official way for a buyer, researcher, or dropshipper to query Shein's catalog by keyword, category, or another seller's storefront.
Building that yourself means solving several problems Shein actively resists:
- Bot detection on every direct page load. A cold request or a plain headless browser gets redirected to a
/risk/device-check page. This Actor warms up the regional homepage first, mimics mouse movement and scrolling, and only then navigates to the target. - Search requires trusted browser events. Shein's search handler ignores synthetic JavaScript keyboard events โ it only responds to a real, trusted
Enterkeypress from an actual input focus/click sequence, which the Actor drives through Playwright/Camoufox's native input APIs. - Datacenter IPs get blocked outright. Residential-grade proxying is required; the Actor defaults to Apify's residential proxy group and keeps a sticky session per target across pagination, rotating only on a block.
- The embedded product-JSON key path moves. Shein has relocated the product list inside its page payload more than once. Rather than hardcode one path, the Actor recursively scans the embedded JSON tree for product-shaped objects, with a DOM-scrape fallback if the JSON isn't present at all.
Why does a direct page load get blocked while browsing normally doesn't?
Shein's /risk/ challenge triggers on navigations that look like a bot jumping straight to a results or product page without the browsing signals a real visitor leaves behind โ no prior homepage visit, no mouse movement, and (for search) no trusted keypress event. It's a device/behavior check, not a login wall, so it resolves without credentials once those signals are present. This Actor covers the gap by warming up the homepage, generating mouse/scroll activity, driving the search box through trusted input events instead of synthetic ones, and retrying with a rotated residential proxy session (up to 8 attempts) if a challenge doesn't clear.
Build it yourself if you only need a handful of one-off lookups and are comfortable maintaining the anti-bot logic as Shein changes it. Use this Actor if you need repeatable, scheduled, or high-volume Shein product data without owning that maintenance burden.
How to use data extracted from Shein?
Dropshipping and product sourcing
Point categoryUrls or storeUrls at a category page or a competitor's storefront and pull every listing with pricing and images in one run โ no need to page through the site by hand. sellerType lets you filter out third-party "mall" listings before building a sourcing shortlist, and productUrl gives a direct link back for manual verification.
Agencies monitoring stores on behalf of clients
Run the same storeUrls target on a schedule to track a specific seller's live catalog size, pricing, and new-arrival churn over time, using scrapedAt and goods_id to diff runs and flag additions, removals, or price changes without re-scraping the whole site by hand each time.
Market research and pricing intelligence
Combine query keyword targets with orderBy: "PriceLowtoHigh"/"PriceHightoLow" and minPrice/maxPrice bands to map price distribution within a product category, or compare salePriceAmount against retailPriceAmount across a category URL to quantify discount depth at scale.
AI agents and automated pipelines
Because input and output are plain JSON, the Actor drops into an agent tool call or a scheduled pipeline directly โ an agent can pass a product URL, category URL, or keyword and get back typed price/store fields to reason over, without scraping or parsing HTML itself.
โฌ๏ธ Input sample
Every parameter below is optional โ required: [] in the input schema โ and comes straight from .actor/actor.json.
| Parameter | Type | Default | Description |
|---|---|---|---|
query | array of strings | ["jacket"] (prefill) | Product keywords to search. One search per keyword. Optional โ leave empty to run only the discovery modes below. A comma-separated string is also accepted. |
countryCode | string (enum) | "us" | SHEIN regional site. One of 38 codes: us, de, fr, it, ch, pl, pt, es, se, uk, ca, mx, br, ae, sa, ru, jp, kr, cn, tw, hk, au, in, id, ph, my, sg, tr, nl, be, at, dk, no, fi, ie, vn, th, il. |
orderBy | string (enum) | "recommend" | Sort order: recommend, MostPopular, NewArrivals, TopRated, PriceLowtoHigh, PriceHightoLow. Applies to keyword search and category/store browsing. |
maxItems | integer | 300 (min 1, max 10000) | Maximum products to collect per keyword/category/store target. Product-URL targets always return at most 1 row regardless of this value. |
page | integer | 1 (min 1) | Start page for pagination on keyword/category/store targets. |
perPage | string (enum) | "120" | Products per page: 20, 40, 60, 80, 100, 120. |
filter | string | "" | Extra raw filter options, applied to keyword searches only. |
categoryId | string | "" | Restricts a keyword search to one category ID. To browse a category page directly with no keyword, use categoryUrls instead. |
minPrice | string | "" | Minimum price in local currency (e.g. "10"). Applies to keyword search. |
maxPrice | string | "" | Maximum price in local currency (e.g. "100"). Applies to keyword search. |
productUrls | array of strings | [] (prefill) | Direct Shein product page URLs (e.g. https://us.shein.com/some-title-p-12345678.html) or bare numeric Goods IDs (e.g. 12345678). Each returns exactly one row. |
categoryUrls | array of strings | [] (prefill) | Direct Shein category/collection page URLs (e.g. https://us.shein.com/Women-Dresses-c-1727.html). Browses and paginates the listing directly โ no keyword needed. |
storeUrls | array of strings | [] (prefill) | Direct Shein store/seller storefront URLs (e.g. https://us.shein.com/store/home?store_code=...). Scrapes every product on that seller's storefront. |
includeStoreMetadata | boolean | true | Adds storeCode/businessModel/mallCode and a derived sellerType to every output row, whenever Shein's payload provides that data. |
proxyConfiguration | object (proxy editor) | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} | Apify Proxy configuration. Residential is required โ Shein blocks bare datacenter IPs. |
Example input โ mixed discovery modes in one run:
{"query": ["summer dress"],"categoryUrls": ["https://us.shein.com/Women-Dresses-c-1727.html"],"storeUrls": ["https://us.shein.com/store/home?store_code=1234567"],"productUrls": ["98765432"],"countryCode": "us","orderBy": "MostPopular","maxItems": 100,"includeStoreMetadata": true}
Common pitfall: categoryId, filter, minPrice, and maxPrice only affect query (keyword) targets โ they are silently ignored on categoryUrls and storeUrls targets, which are browsed as-is via direct navigation. To narrow a category page itself, use a category URL that already has the narrowing built in (Shein's own category/filter URL), not the categoryId/minPrice/maxPrice parameters.
โฌ๏ธ Output sample
Each result is one JSON row pushed to the run's dataset (charged event row_result) as soon as it's collected โ no waiting for the whole run to finish. Results export from the Apify Console as JSON, CSV, Excel, HTML table, or RSS.
{"section_index": 1,"discoveryMode": "keyword","section": "summer dress","query": "summer dress","country": "US","sort_order": "MostPopular","goods_id": "18234561","goods_name": "Solid Ribbed Knit Long Sleeve Sweater","goods_img": "https://img.ltwebstatic.com/images3_pi/2026/07/12/abc123.jpg","goods_url_name": "solid-ribbed-knit-long-sleeve-sweater","salePrice": { "amount": "12.99", "amountWithSymbol": "$12.99", "usdAmount": "12.99", "usdAmountWithSymbol": "$12.99" },"retailPrice": { "amount": "24.99", "amountWithSymbol": "$24.99", "usdAmount": "24.99", "usdAmountWithSymbol": "$24.99" },"salePriceAmount": 12.99,"salePriceText": "$12.99","salePriceUsd": 12.99,"salePriceUsdText": "$12.99","retailPriceAmount": 24.99,"retailPriceText": "$24.99","retailPriceUsd": 24.99,"retailPriceUsdText": "$24.99","productUrl": "https://us.shein.com/solid-ribbed-knit-long-sleeve-sweater-p-18234561.html","storeCode": "1234567","businessModel": "1","mallCode": "1","sellerType": "third_party_mall","scrapedAt": "2026-07-30T10:15:03.221+00:00"}
How do you filter and target specific products?
This Actor combines four independent targeting axes, and you can run several in the same call:
- Keyword vs. direct URL.
queryruns a real Shein search โ best when you don't know the exact product or storefront, and want Shein's own relevance/keyword matching.productUrls,categoryUrls, andstoreUrlsskip search entirely and go straight to a known product, category page, or seller โ more precise when you already have the link, and immune to keyword-matching noise. - Scope precision.
categoryIdnarrows a keyword search to one category;categoryUrlsnarrows by pointing at an already-filtered Shein category/collection page URL instead.minPrice/maxPriceset a price band, but only for keyword search โ for category or store targets, build the price filter into the URL itself if Shein's own page supports it. - Quality thresholds. There is no rating- or review-count filter in this schema โ Shein's own product-list payload doesn't expose a review score at the listing level, and the Actor does not invent one.
- Volume controls.
maxItems(1โ10,000) caps rows per target;pageandperPage(20โ120) control where pagination starts and how many rows load per page. Product-URL targets always return exactly one row regardless ofmaxItems.
Three real targeting examples:
{ "query": ["running shoes"], "categoryId": "1727", "minPrice": "20", "maxPrice": "60", "orderBy": "TopRated" }
{ "categoryUrls": ["https://us.shein.com/Women-Dresses-c-1727.html"], "maxItems": 500, "perPage": "120" }
{ "storeUrls": ["https://us.shein.com/store/home?store_code=1234567"], "includeStoreMetadata": true, "maxItems": 1000 }
โถ๏ธ Want to try other marketplace scrapers?
| Scraper | What it extracts |
|---|---|
| eBay Search Scraper With Buyer Reviews & Ratings | eBay search results with seller ratings and buyer review data |
| eBay Product Details Scraper With Sold Price & Deal Analytics | eBay item pages with sold price history and deal scoring |
| Etsy Reviews Scraper | Etsy shop reviews โ buyer, rating, text, date, and product details |
How to extract Shein data programmatically
The Actor runs as a standard Apify Actor: one API call starts the run, and the dataset comes back as structured JSON โ no Shein login or API key involved.
Python example
from apify_client import ApifyClientclient = ApifyClient("<APIFY_API_TOKEN>")run_input = {"query": ["summer dress"],"countryCode": "us","orderBy": "PriceLowtoHigh","maxItems": 100,}run = client.actor("<store-username>/shein-search-products-scraper-by-category-store-and-product-url").call(run_input=run_input)for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["goods_name"], item["salePriceAmount"], item["productUrl"])
Export to spreadsheets or CRM
From the Apify Console, open the run's dataset and choose Export โ CSV (or Excel). Map goods_name โ Product Name, salePriceAmount โ Price, storeCode/sellerType โ Supplier/Channel, and productUrl โ Link columns in your spreadsheet or CRM import.
โ๏ธ Is it legal to scrape Shein?
Yes โ scraping publicly listed product and pricing data that Shein displays to any visitor without logging in is generally lawful. These are business/product records โ product names, prices, images, and store identifiers โ not personal data about identifiable individuals, so GDPR and CCPA do not attach to this dataset. What applies instead is Shein's own Terms of Service, which govern automated access to the site, and database-rights considerations around republishing a large, structured extract of Shein's catalog. Consult legal counsel for commercial applications involving bulk storage or resale of scraped data.
โ FAQ
Does the output flag when a product has been delisted or gone out of stock?
No. The Actor returns each product's data exactly as it appears on the live page at request time, and there is no dedicated "delisted" or "out of stock" field in the code. If a productUrls target no longer resolves to a real listing, that target simply returns no row for that run.
Can I get store/seller metadata along with the product records?
Yes, by default. With includeStoreMetadata set to true (the default), every row includes storeCode, businessModel, mallCode, and a derived sellerType ("shein" or "third_party_mall"), whenever Shein's own payload for that product provides that data.
How accurate is the price data?
The Actor returns the sale and retail prices exactly as displayed on Shein's page at the moment of the request โ both as Shein's native price object and as flattened scalar columns. Accuracy depends entirely on how current Shein's own listing is; for time-sensitive pricing, re-run on a schedule and compare scrapedAt timestamps.
What's the difference between storeCode, businessModel, mallCode, and sellerType?
storeCode identifies the seller's storefront. businessModel is the real signal for who fulfils the order: "1" means a third-party marketplace seller, "0" means Shein-operated. mallCode looks related but is essentially constant across a regional site's listings โ it marks a marketplace/region grouping, not the seller type, so don't filter on it for that purpose. sellerType is the Actor's derived "shein"/"third_party_mall" label, computed from businessModel (and Shein's own marketplace badge tag when present) โ it is left null rather than guessed when neither signal is available.
How many products can I get per run?
Up to maxItems per keyword/category/store target (1โ10,000, default 300), with page/perPage (20โ120) controlling where pagination starts. Product-URL targets are the one exception โ they always return exactly one row, regardless of maxItems.
Can I combine keyword search, product URLs, category URLs, and store URLs in one run?
Yes. Every target you provide across query, productUrls, categoryUrls, and storeUrls runs in the same call, and each row's discoveryMode and section_index identify which target it came from โ nothing is merged or dropped.
What makes this different from a simple keyword-only Shein scraper?
A keyword-only tool only finds what a search query happens to surface. This Actor also takes a product URL, a category page, or a whole store's URL directly โ so you can pull an entire seller's catalog or a specific category page verbatim, in the same schema as a keyword search, without reverse-engineering a query that reproduces that page.
Does this scraper work with Claude, ChatGPT, and AI agent frameworks?
It has no dedicated MCP server, but it is callable as a standard Apify Actor run through the apify-client SDK or the Apify API from any agent framework that can make an HTTP call or run a tool function โ including custom LangChain tools or a Claude/ChatGPT function-calling setup.
Can I use it without a Shein API key or developer account?
Yes. No Shein account, login, or API key is needed. You only need an Apify account to run the Actor and, for reliable results, the residential proxy configuration it uses by default.
Conclusion
The Shein Product Scraper turns Shein's search box, product pages, category pages, and store storefronts into one consistent JSON schema โ flattened prices, a working deep-link, and store/seller metadata on every row, no matter which discovery mode found it. It's built for dropshippers sourcing inventory, agencies tracking client-relevant storefronts, and researchers mapping category pricing, all without maintaining Shein's anti-bot defenses themselves. Start a run from the Apify Console or trigger it with apify-client to get structured Shein product data in minutes.