Shein Search Products Scraper (Multi-Country Price Analytics)
Pricing
from $4.99 / 1,000 results
Shein Search Products Scraper (Multi-Country Price Analytics)
Shein Search Products Scraper extracts public product data including titles, prices, ratings, reviews, brands, categories, and product URLs. Compare prices across multiple countries to analyze regional pricing, product trends, competitors, and market opportunities.
Pricing
from $4.99 / 1,000 results
Rating
0.0
(0)
Developer
API Empire
Maintained by CommunityActor stats
0
Bookmarked
22
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
Shein Scraper — Extract Products, Prices and Comparisons as JSON
Search Shein by keyword and pull back typed product data — name, sale and retail price, discount %, and a direct product link — from any of 38 regional Shein storefronts in one job. Point it at two or more countries and it also matches the same product across markets and ranks every match by USD price, so the cheapest storefront for that item surfaces automatically. Every row is normalized JSON — no HTML, no selectors, no parsing. After a run, you have a clean dataset ready to load into a spreadsheet, a BI tool, or an LLM context window for cross-border pricing analysis.
What is the Shein Search Products Scraper (Multi-Country Price Analytics)?
It's an Apify Actor that searches Shein's public storefronts by keyword and returns two kinds of rows: individual products (with clean scalar price fields) and, when you search 2+ countries at once, cross-country price comparisons that rank the same matched product by its cheapest and most expensive market. No Shein account or login is used anywhere in the run — it only ever reaches Shein's public homepage and search results pages.
- 🔍 Search Shein products by keyword, across one or many regional sites in the same run
- 💱 Match the same product across countries (by normalized title or product ID) and rank it by USD price
- 📉 Get
discountPercentandisOnSalecomputed automatically on every product row - 📦 Export results as JSON, CSV, Excel, or any format the Apify dataset supports
- 🔒 No proxy setup required — residential Apify Proxy with per-country sticky sessions is handled internally
What data does the Shein Search Products Scraper collect?
The actor writes two distinct row types to the same dataset, distinguished by their type field.
| Data Type | Key Fields | JSON Field Names |
|---|---|---|
| Products (per query, per country) | Product name, image, local & USD sale/retail price, discount %, on-sale flag, product link | goods_name, goods_img, salePriceAmount, salePriceUsd, retailPriceAmount, discountPercent, isOnSale, productUrl |
| Cross-country price comparisons | Matched product, cheapest/priciest market, USD price spread, full per-country rank | goodsName, cheapestCountry, cheapestPriceUsd, mostExpensiveCountry, mostExpensivePriceUsd, priceSpreadUsd, priceRankByCountry |
How does the Shein Search Products Scraper differ from building this yourself?
Shein does not publish a public product-search API for developers, so the alternative to this Actor is writing and maintaining your own browser automation. That is a heavier lift than it looks: direct navigation to a /pdsearch/ URL is gated behind a DataDome /risk/ challenge, so a working scraper has to warm up the homepage first, generate believable mouse/scroll behavior, and drive the search box with trusted input events — a synthetic KeyboardEvent('Enter') is silently ignored by Shein's handler. Bare Apify datacenter IPs are blocked outright, so residential proxy sessions have to be pinned per country and rotated on challenge, and Apify Proxy's country code for the UK storefront (GB) doesn't match Shein's own regional code (uk) — a mismatch that otherwise reads as "Shein blocked us." This Actor already implements homepage warm-up, trusted-event search, a dual browser backend (Camoufox primary, Playwright + stealth fallback), proxy session pinning with automatic rotation on a /risk/ hit, and a fallback DOM scrape if Shein's embedded JSON payload shape changes.
Build it yourself if you need custom navigation logic beyond keyword search. Use this Actor if you want reliable Shein product and price data today without maintaining anti-bot countermeasures.
Why do developers and teams scrape Shein?
For dropshippers and arbitrage sellers
Search the same product keyword across every regional Shein storefront you sell into, enable enablePriceComparison, and read cheapestCountry / cheapestPriceUsd straight off the comparison rows to find where a SKU is currently priced lowest before you list it. priceSpreadUsd flags the products with the widest cross-border gap, which is where arbitrage margin is largest.
For pricing analysts and market researchers
Run the same query set on a schedule against countryCodes you track, and use discountPercent and isOnSale on every product row to monitor how aggressively Shein discounts a category by region over time, without writing a single price parser.
For AI engineers and agent builders
Feed salePriceUsd, discountPercent, and productUrl per matched item directly into an agent tool call or a RAG index — every field arrives typed and pre-normalized to USD, so a shopping or price-comparison agent doesn't need a currency-conversion or HTML-parsing step before it can reason over the data.
For developers building data products
Call the Actor from a scheduled job, store the dataset rows in your own database, and build a price-tracking dashboard or alerting product on top — the output schema (type: "product" / type: "priceComparison") is stable, so downstream code doesn't need per-run adjustment.
How to scrape Shein (step by step)
- Open the Actor's page on the Apify Store and click Try for free (or Run, if you already have it in your account).
- Provide the required input —
query, an array of search keywords (e.g.["jacket", "dress"]). - Set
countryCodesto 2 or more regional codes (e.g.["us", "uk", "de"]) to unlock cross-country comparison, or leave it empty and set the legacycountryCodefield for a classic single-region search. Optionally narrow results withorderBy,minPrice/maxPrice,categoryId, orfilter. - Click Start and watch rows land in the Output tab in real time — the Actor pushes each product to the dataset as soon as it's scraped, not buffered to the end of the run.
- Download results as JSON, CSV, Excel, or XML from the dataset's Export button, or pull them programmatically via the Apify API.
What to do when Shein changes its structure
The Actor reads products from Shein's embedded JSON payload first, and falls back to a direct DOM read of the product cards if that payload's shape changes or comes back empty — a change on Shein's side does not necessarily break the output schema on your end. The Actor is maintained; no specific fix turnaround is promised.
⬇️ Input
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
query | Yes | array | Product types to search (jacket, dress, shoes...). Add multiple items to run separate searches. Default ["jacket"]. | ["jacket", "dress"] |
countryCodes | No | array | Pick 2+ regional Shein sites to run the same queries against and unlock cross-country price comparison rows. Leave empty to fall back to countryCode. | ["us", "uk", "de"] |
countryCode | No | string | Legacy single-region field, used only when countryCodes is empty. Default "us". Enum: see supported codes below. | "us" |
orderBy | No | string | Sort order applied to every country searched. Default "recommend". Enum: recommend, MostPopular, NewArrivals, TopRated, PriceLowtoHigh, PriceHightoLow. | "recommend" |
maxItems | No | integer | Maximum products to scrape per search query, per country. Minimum 1, maximum 10000. Default 10. | 20 |
page | No | integer | Start page for pagination. Minimum 1. Default 1. | 1 |
perPage | No | string | Products per page. Default "120". Enum: "20", "40", "60", "80", "100", "120". | "120" |
filter | No | string | Extra attribute-id filter options. Default "" (none). | "" |
categoryId | No | string | Restrict results to one Shein category ID. Default "" (all categories). | "" |
minPrice | No | string | Minimum price, in each country's local currency. Default "" (none). | "10" |
maxPrice | No | string | Maximum price, in each country's local currency. Default "" (none). | "100" |
enablePriceComparison | No | boolean | When 2+ countries are searched, adds priceComparison rows ranking the matched product by USD price. Default true. Every product row gets discountPercent/isOnSale regardless. | true |
matchStrategy | No | string | How the same product is matched across countries. Default "normalizedTitle". Enum: normalizedTitle (cleaned, lowercased title — recommended), goods_id (Shein's own product ID — same-catalog only). | "normalizedTitle" |
proxyConfiguration | No | object | Apify Proxy settings. Residential recommended — Shein blocks bare datacenter IPs. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
Example JSON input
{"query": ["dress", "jacket"],"countryCodes": ["us", "uk", "de"],"countryCode": "us","orderBy": "recommend","maxItems": 20,"page": 1,"perPage": "120","filter": "","categoryId": "","minPrice": "","maxPrice": "","enablePriceComparison": true,"matchStrategy": "normalizedTitle","proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
⚠️ The most common input mistake: maxItems is a per query, per country ceiling, not a run total. Two queries against three countries with maxItems: 20 can produce up to 120 product rows, not 20.
⬆️ Output
Every row is typed, normalized JSON pushed live to the Apify dataset as it's scraped — export it as JSON, CSV, Excel, or XML directly from the Output tab, or read it via the Apify API. Two structurally different row shapes share the dataset, told apart by type.
Scraped product (type: "product")
The actor spreads every field from Shein's own product payload straight through unmodified (a superset, not a subset), then adds the derived and normalized fields below. Because Shein's own payload isn't guaranteed identical for every listing, the exact raw key set can vary slightly between products — goods_id, goods_name, goods_img, goods_url_name, and the nested salePrice/retailPrice objects are the raw fields the row-building code itself reads, not an exhaustive list of everything Shein may include.
{"type": "product","section_index": 1,"section": "jacket","query": "jacket","country": "US","sort_order": "recommend","goods_id": "167962972","goods_name": "Plus Size Blue Denim Casual Skinny Flare Jacket","goods_img": "https://img.ltwebstatic.com/images3_pi/2024/example.jpg","goods_url_name": "plus-size-blue-denim-casual-skinny-flare-jacket","salePrice": { "amount": "23.99", "currency": "USD", "amountWithSymbol": "$23.99", "usdAmount": "23.99", "usdAmountWithSymbol": "$23.99" },"retailPrice": { "amount": "29.99", "currency": "USD", "amountWithSymbol": "$29.99", "usdAmount": "29.99", "usdAmountWithSymbol": "$29.99" },"salePriceAmount": 23.99,"salePriceCurrency": "USD","salePriceAmountWithSymbol": "$23.99","salePriceUsd": 23.99,"salePriceUsdWithSymbol": "$23.99","retailPriceAmount": 29.99,"retailPriceCurrency": "USD","retailPriceAmountWithSymbol": "$29.99","retailPriceUsd": 29.99,"retailPriceUsdWithSymbol": "$29.99","discountPercent": 20.01,"isOnSale": true,"productUrl": "https://us.shein.com/plus-size-blue-denim-casual-skinny-flare-jacket-p-167962972.html","normalizedTitle": "plus size blue denim casual skinny flare jacket","matchGoodsId": "167962972","scrapedAt": "2026-07-30T12:00:00+00:00"}
Cross-country price comparison (type: "priceComparison")
Emitted only when countryCodes has 2+ entries, enablePriceComparison is true, and the same product was found with a resolvable USD price in at least 2 of the searched countries — never fabricated from a partial or single-country match.
{"type": "priceComparison","section": "dress","query": "dress","matchKey": "aloruh women s solid color sleeveless mini dress","matchedBy": "normalizedTitle","goodsName": "Aloruh Women's Solid Color Sleeveless Mini Dress","countriesCompared": ["UK", "US"],"countriesPriced": ["US", "UK"],"cheapestCountry": "US","cheapestPriceUsd": 15.89,"mostExpensiveCountry": "UK","mostExpensivePriceUsd": 16.67,"priceSpreadUsd": 0.78,"priceRankByCountry": [{ "country": "US", "priceUsd": 15.89, "rank": 1 },{ "country": "UK", "priceUsd": 16.67, "rank": 2 }],"scrapedAt": "2026-07-30T12:00:00+00:00"}
Both row types charge the same row_result pay-per-event — a product row and a price-comparison row cost the same per unit; there is no separate uncharged status or error row pushed to this dataset.
How does the Shein Search Products Scraper compare to other Shein scrapers?
| Feature | This Actor | Generic single-region Shein scraper |
|---|---|---|
| Country coverage | Runs the same queries against 2+ of 38 regional storefronts in one job | ✅ / ❌ — typically one storefront per run |
| Cross-country price matching | Matches the same product by title or ID across countries and ranks it by USD price | ❌ — no cross-country concept |
| Price fields | Flattened scalar salePriceAmount/salePriceUsd/retailPriceAmount plus computed discountPercent/isOnSale | ❌ — often only the raw nested price object |
| Anti-bot handling | Dual browser backend (Camoufox, Playwright+stealth fallback), residential proxy session pinning, automatic challenge-clear retries | ✅ / ❌ — varies by implementation |
| Output format | Typed JSON, superset of Shein's own fields plus derived analytics | ✅ — typically also JSON |
If you're building an AI agent or RAG pipeline, the output format row is the decision-maker — parsing HTML inside an agent loop is a reliability failure mode, not a feature. Every field this Actor returns is already typed and USD-normalized, so no post-processing step sits between the dataset and your model.
How many results can you scrape with the Shein Search Products Scraper?
maxItems caps results at up to 10,000 products per query, per country (minimum 1, default 10) — this is the Actor's own input ceiling, not a documented Shein platform limit. Pagination is controlled by page (start page) and perPage (20–120 products per page); the Actor keeps requesting further pages until it hits maxItems, runs out of results, or two consecutive pages return zero new products, whichever comes first. With multiple query entries and multiple countryCodes, maxItems applies per combination — 2 queries × 3 countries × maxItems: 20 can yield up to 120 product rows in one run. No benchmark run time is published; actual throughput depends on how many /risk/ challenges the session needs to clear.
Integrate the Shein Search Products Scraper and automate your workflow
The Shein Search Products Scraper works with any language or tool that can send an HTTP request, through the Apify API.
REST API integration
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_API_TOKEN>")run = client.actor("API-Empire/shein-search-products-scraper-multi-country-price-analytics").call(run_input={"query": ["jacket", "dress"],"countryCodes": ["us", "uk", "de"],"maxItems": 20,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["type"], item.get("goods_name") or item.get("goodsName"))
Works in Python, Node.js, Go, Ruby, cURL — any client that can call the Apify API with your API token.
Automation platforms (n8n, Make)
In n8n, use the official Apify node's "Run Actor and get dataset" operation, pointing it at this Actor's ID with your query/countryCodes input. In Make, the Apify app's "Run an Actor" module does the same — both wait for the run to finish and hand you the dataset items directly, no polling logic required on your end.
⚖️ Is it legal to scrape Shein?
Scraping publicly accessible Shein search-result pages is generally lawful; this Actor only reads data that is visible to any anonymous site visitor, without logging in or accessing account-specific content. This Actor returns product and pricing data — not personal data — so GDPR/CCPA personal-data obligations do not attach to its output. What does apply is Shein's own Terms of Service and applicable database-rights law, particularly for bulk collection or redistribution of catalogue data. Consult legal counsel for commercial use cases involving large-scale or redistributed data collection.
❓ Frequently asked questions
Does the Shein Search Products Scraper work without a Shein account?
Yes. The Actor only ever navigates Shein's public homepage and search results pages — no login, cookies, or account credentials are used or required.
How often is the scraped data updated?
Every run performs a live browser navigation and search against Shein at the moment you start it — there is no caching layer. Prices and stock reflect whatever Shein's site returns at scrape time.
What happens if a search returns no products?
If Shein returns zero matches (or blocks every attempt) for a given query/country combination, that combination is logged as "no products collected" but other queries and countries in the same run still complete normally. If every requested country fails entirely, the run raises an error rather than silently returning an empty dataset.
Can I scrape login-gated or account-specific Shein content?
No. Only publicly accessible search results are returned. The Actor does not authenticate as a Shein user and has no access to cart, order, or account data.
What does a run cost?
Every row pushed to the dataset — a product row or a price-comparison row — charges one row_result pay-per-event unit; check the Actor's Pricing tab on its Apify Store listing for the current per-event rate.
Does the Shein Search Products Scraper work for AI agent workflows and LLM pipelines?
Yes. Call it as an HTTP endpoint via the Apify API from any agent framework. Every response is typed, USD-normalized JSON with stable field names — no HTML and no parsing step before you pass results to an LLM.
How does the Shein Search Products Scraper handle Shein's anti-bot system?
It warms up the regional homepage with human-like mouse movement and scrolling before searching, drives the search box with trusted (not synthetic) input events, and reads results from Shein's embedded JSON payload with a DOM-scrape fallback. Proxy traffic defaults to Apify residential with a sticky session per country, rotating to a fresh session and retrying (up to 8 attempts) whenever a request lands on Shein's /risk/ challenge page.
How does the Shein Search Products Scraper compare to other Shein scrapers?
It's built specifically for cross-border price analysis: it runs identical queries against multiple regional storefronts in one job and adds matched cross-country price ranking, which a single-region search scraper has no concept of. See the comparison table above for the specific fields this adds.
Can I use the Shein Search Products Scraper without managing proxies?
Yes. Apify residential proxy with per-country sticky sessions, automatic rotation on a blocked request, and the Apify-proxy-country-code mapping for storefronts like the UK (uk → GB) are all handled internally. You only need to supply a custom proxy if you specifically want one.
What happens when Shein changes its structure or blocks the scraper?
The Actor is maintained and the output schema stays stable — field names and types don't change on your end even if Shein's underlying page structure does. The Actor already reads two independent extraction paths (embedded JSON payload, then a DOM fallback) precisely so a partial site change doesn't break your integration. No specific fix turnaround time is promised.
💬 Your feedback
Found a bug, or a product field you need that isn't in the output yet? Open an issue from the Issues tab on this Actor's Apify Console page — that feedback goes straight to the people maintaining it.