Shopee Scraper: Product Search, Prices and Discounts
Pricing
from $3.59 / 1,000 products
Shopee Scraper: Product Search, Prices and Discounts
Scrape Shopee search results by keyword in 9 markets (SG, MY, TH, PH, VN, TW, ID, BR, MX): one row per product with item and shop id, title, price, price before discount, discount, rating, seller location, promo labels, image and link. Sort by relevance, sales, newest or price. No login.
Pricing
from $3.59 / 1,000 products
Rating
0.0
(0)
Developer
The Mine Works
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
From The Mine Works, makers of Amazon Product Scraper and Taobao Products Scraper, with over 140,000 runs across 170+ public actors.
Updated 20 Oct 2026: first release. Keyword search on 9 Shopee markets, five sort orders, a price range, and one flat row per product with price, price before discount, discount, rating, seller location and promotion labels. Bookmark this Actor on its Store page so it is one click away next time.
Why choose this actor?
- Nine Shopee markets from one input. Singapore, Malaysia, Thailand, Philippines, Vietnam, Taiwan, Indonesia, Brazil and Mexico. Pick the market, type the keyword the way shoppers there type it, and get prices in that market's own currency.
- Past the first page. Shopee shows 40 products per search page. The actor keeps reading pages, skips products it already gave you, and when your sort runs out it reads the same keyword in the other sorts, so one keyword returned 300 different products in 139 seconds in our test run.
- Pay per product, nothing for a run that finds nothing. The $0.003 run fee is charged only after the first page has come back with products. A keyword Shopee refuses, a bad input, duplicates, rows outside your price range and the summary rows are never charged. No Shopee account, cookies or API key.
Part of The Mine Works E-commerce and marketplaces family: Ozon.ru Scraper, ⭐ Amazon Reviews Scraper, Amazon Product Scraper, Etsy Listings Scraper, AliExpress Scraper, Kleinanzeigen.de Scraper.
Try it in one minute
Paste this into the input (JSON view) and press Start. It returns 30 phone cases from Shopee Singapore, one row each. It took 8 seconds in our test run:
{"keywords": ["phone case"],"country": "SG","maxItems": 30}
Change country to MY, TH, PH, VN, TW, ID, BR or MX for another market. Keywords work in any language the market uses, for example ốp lưng iphone on Shopee Vietnam or capinha iphone on Shopee Brazil.
Apify's free plan includes $5 of credit every month, which covers about 1,100 products at this actor's price.
Copy to your AI assistant
themineworks/shopee-scraper on Apify. Searches Shopee by keyword in one market and returns one flat row per product, with no Shopee login. Call ApifyClient("TOKEN").actor("themineworks/shopee-scraper").call(run_input={"keywords": ["phone case"], "country": "SG", "maxItems": 50}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: keywords (list of search keywords, up to 100). Optional: country ("SG" default, "MY", "TH", "PH", "VN", "TW", "ID", "BR", "MX"), maxItems (products per keyword, default 50, 1 to 1000), sort ("relevance" default, "sales", "newest", "price_asc", "price_desc"), otherSorts (default true; when a sort runs out before maxItems, the keyword is also read in the other sorts), minPrice and maxPrice (in the market's currency), proxyConfiguration (default Apify residential proxy in the market's country). Product rows have no _type field and carry item_id, shop_id, title, price, price_original, currency, discount_percent, discount_label, rating, shop_rating, location, promo_labels, image_url, product_url, product_url_short, country, marketplace, keyword, sort, position, search_page, scraped_at. Each run also writes one row with _type "summary", one with _type "info" when products were delivered, and a row with _type "error" for each keyword that could not be read; none of these is charged. Full spec: GET https://api.apify.com/v2/acts/themineworks~shopee-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
Key features
- 9 markets, local currency. SGD, MYR, THB, PHP, VND, TWD, IDR, BRL and MXN, read as numbers:
31.900 ₫becomes31900,R$ 7,89becomes7.89. - Five sort orders. Relevance, top sales, latest and price low to high or high to low, the same choices as the sort bar on the Shopee site. Shopee does the sorting.
- Price range.
minPriceandmaxPriceare sent to Shopee and checked again on every row, so a product outside your range is never delivered or charged. - Deep keyword reads. Up to 1,000 products per keyword: the actor reads page after page, drops products it already has, and fills up from the other sorts when yours runs dry.
- No duplicates in a run. A product found under two keywords, or on two pages, is delivered and charged once.
- Deadline safe. The actor watches the run's time limit, stops starting requests 15 seconds before it, keeps every product it read and says why in the summary row.
How to use it
Basic: one keyword, one market
{"keywords": ["wireless earbuds"],"country": "MY","maxItems": 100}
Each product is one row. position is the order it was found in for its keyword, search_page the page request that found it.
Price monitoring: track what a product sells for
{"keywords": ["airpods pro 2", "galaxy buds 3"],"country": "SG","sort": "sales","maxItems": 50}
Save it as a task and add a daily schedule. Join the rows of each day on item_id and shop_id to see price and discount changes on the same listing. price_original and discount_percent show how deep the markdown is.
Sourcing: the cheapest listings in a price band
{"keywords": ["phone case"],"country": "SG","sort": "price_asc","minPrice": 5,"maxPrice": 10,"maxItems": 60,"otherSorts": false}
Each page comes back sorted by price. location shows where each seller ships from (a local city, or Mainland China and Overseas for cross border sellers), which matters for delivery time and import duties.
Cross market research: the same product in three countries
Run the same keyword once per market (one market per run) and compare price after converting currency. Example inputs: {"keywords": ["mechanical keyboard"], "country": "TH"}, then "country": "PH" and "country": "ID".
New listings watch
{"keywords": ["labubu"],"country": "PH","sort": "newest","maxItems": 100,"otherSorts": false}
Sorted by latest, the first pages carry the newest listings. A schedule plus a join on item_id shows what appeared since the last run.
Deal hunting: promotions and discounts
promo_labels holds the labels on each card, such as Selling Fast, Any 2 enjoy 10% off, Free Gift, Flash Sale 18:00 20 Oct or Shocking Sale, in the market's language. Filter rows on discount_percent and on these labels to find the strongest offers for a keyword.
Input parameters
| Parameter | Type | Default | What it does |
|---|---|---|---|
keywords | array of strings | required | Search keywords, one per line, up to 100 per run. The same keyword given twice is read once. |
country | string | SG | Shopee market: SG, MY, TH, PH, VN, TW, ID, BR or MX. |
maxItems | integer | 50 | Most products per keyword, 1 to 1,000. |
sort | string | relevance | relevance, sales, newest, price_asc or price_desc. |
otherSorts | boolean | true | When your sort runs out of new products before maxItems, read the keyword in the other sorts too. |
minPrice, maxPrice | number | empty | Price range in the market's currency, for example 9.5 for S$9.50 or 50000 for 50.000 VND. |
proxyConfiguration | object | residential | Apify residential proxy in the market's country. You can pick another group or your own proxy URLs. |
What data do you get?
One row per product. Product rows have no _type field; the summary, info and error rows do, so a filter on _type separates them.
| Field | What it is |
|---|---|
item_id, shop_id | Shopee's ids for the listing and the shop, as strings |
title | Product title as shown in the search results |
price | Current price, after the item discount, in the market's currency |
price_original | Price before discount, when the card shows it crossed out |
currency | SGD, MYR, THB, PHP, VND, TWD, IDR, BRL or MXN |
discount_percent, discount_label | The discount in percent, and the badge as Shopee writes it (-36%, or 3.4折 on Shopee Taiwan) |
rating | Product rating, 0 to 5 stars |
shop_rating | The shop's rating, which Shopee shows instead when the product has no rating yet |
location | Where the seller ships from |
promo_labels | Promotion labels on the card |
image_url | Main product image, full size |
product_url, product_url_short | Link to the product page, and the short form https://<market>/product/<shop_id>/<item_id> |
country, marketplace | Market code and Shopee site, e.g. SG and shopee.sg |
keyword, sort | The keyword and the sort the product was found under |
position, search_page | Order found for its keyword (1 = first), and which page request found it |
scraped_at | When the row was written |
Summary row (_type: "summary", never charged): keywords_requested, keywords_read, keywords_failed, keywords_not_started, products_found, products_delivered, charged_for, duplicates_skipped, filtered_out_by_price, pages_fetched, page_attempts, failed_attempts, run_start_charged, stopped_by_max_cost, ended_on_deadline, shortfall_reason when fewer products came back than asked, and per_keyword, one entry per keyword with pages, products_found, products_delivered, sorts_read and why it stopped. The same summary is saved as the OUTPUT record of the run.
Error rows (_type: "error", never charged): one per keyword whose first page could not be read, with error_type (http_error, no_cards, fetch_error), keyword, reason and http_status.
Stable fields for automations
These were present in every product row of our test runs (9 markets, 809 rows), and their names will not change:
| Field | What it is |
|---|---|
item_id | The listing id, the key to store and join on together with shop_id |
shop_id | The shop id |
title | Product title |
price | Current price |
currency | Currency code |
image_url | Main image |
product_url | Product link |
product_url_short | Short product link |
country | Market code |
marketplace | Shopee site |
keyword | The keyword searched |
sort | The sort that found it |
position | Order found |
search_page | Page request that found it |
scraped_at | When the row was written |
Optional, present only when the card shows a value: price_original (shown by MY, TH, VN, TW, ID and BR; SG, PH and MX show only the discount badge), discount_percent and discount_label (absent on products with no discount), rating (611 of our 809 test rows had it; new products have none), shop_rating (126 rows, shown when the product has no rating yet), location (694 rows), promo_labels (527 rows).
Output examples
Three rows from our test runs on 20 Oct 2026, from Singapore, Taiwan and Malaysia:
[{"item_id": "57164737343","shop_id": "1860938829","title": "Zenso Cute Pink Cartoon Cat Case with Stand for iPhone 11-17 Pro Max, Anti-drop, Anti-fingerprint, Anti-yellowing","price": 7.15,"currency": "SGD","discount_percent": 24,"discount_label": "-24%","rating": 5,"location": "Mainland China","promo_labels": ["Any 2 enjoy 10% off"],"image_url": "https://down-sg.img.susercontent.com/file/sg-11134201-82586-mr18d8qfsbgn21","product_url": "https://shopee.sg/Zenso-Cute-Pink-Cartoon-Cat-Case-with-Stand-for-iPhone-11-17-Pro-Max-Anti-drop-Anti-fingerprint-Anti-yellowing-i.1860938829.57164737343","product_url_short": "https://shopee.sg/product/1860938829/57164737343","country": "SG","marketplace": "shopee.sg","keyword": "phone case","sort": "relevance","position": 1,"search_page": 1},{"item_id": "25376717446","shop_id": "16740752","title": "360度旋轉磁吸支架防摔手機殼適用iPhone 18 17 16 15 14 13 12 Pro Max i18 i17","price": 239,"price_original": 700,"currency": "TWD","discount_percent": 66,"discount_label": "3.4折","rating": 4.9,"location": "臺中市西區","promo_labels": ["蝦皮金選", "5 件折 NT$15"],"image_url": "https://down-tw.img.susercontent.com/file/tw-11134207-7r98u-luk66t5gohdic2","product_url_short": "https://shopee.tw/product/16740752/25376717446","country": "TW","marketplace": "shopee.tw","keyword": "phone case","sort": "relevance","position": 1,"search_page": 1},{"item_id": "27602065203","shop_id": "64923440","title": "UGREEN HiTune S3 True Wireless Earbuds IPX5 Ear-clip Design Hook Earphone Open Audio TWS Sport Headset HD Call Noise Reduction","price": 52.72,"price_original": 207.86,"currency": "MYR","discount_percent": 75,"discount_label": "-75%","rating": 4.9,"location": "Sabah","promo_labels": ["Shopee Lagi Murah", "Shocking Sale 14:00 20 Oct"],"image_url": "https://down-my.img.susercontent.com/file/cn-11134207-7ras8-mdoec2xt3io9bd","product_url_short": "https://shopee.com.my/product/64923440/27602065203","country": "MY","marketplace": "shopee.com.my","keyword": "wireless earbuds","sort": "sales","position": 2,"search_page": 1}]
The summary row of the Malaysia run (300 products for one keyword, read in three sorts), trimmed:
{"_type": "summary","keywords_requested": 1,"keywords_read": 1,"products_found": 300,"products_delivered": 300,"charged_for": 300,"duplicates_skipped": 820,"pages_fetched": 28,"page_attempts": 31,"failed_attempts": 1,"country": "MY","sort": "sales","run_start_charged": true,"ended_on_deadline": false,"per_keyword": [{ "keyword": "wireless earbuds", "pages": 28, "products_delivered": 300, "sorts_read": ["sales", "relevance", "newest"], "stopped": "max_items_reached" }],"run_seconds": 139}
Pricing
Pay per event: you pay for the products you receive, plus a flat $0.003 per run, whatever memory you choose.
| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
product-scraped | Once per product row stored in your dataset | $4.49 per 1,000 | $4.49 per 1,000 | $4.31 per 1,000 | $3.59 per 1,000 |
run-start | Once per run, after the first page has come back with products | $0.003 | $0.003 | $0.003 | $0.003 |
The price of one product is the price per 1,000 divided by 1,000. The residential proxy is included: you do not pay for proxy traffic on top.
Never charged:
- a keyword whose first page Shopee refuses or that comes back empty (it gets an error row);
- a run where no page returns products: it stops before the start fee;
- a run with no keyword, an unsupported market or a wrong price range: it stops before the first request;
- products already delivered in the same run (found again on another page, in another sort or under another keyword);
- products outside your
minPriceandmaxPrice, and products past yourmaxItems; - the summary, info and error rows;
- anything past your "Max cost per run". The actor checks the budget before each product and stops while the total is still below your limit, so the run ends SUCCEEDED with a partial result and a status message saying so.
Run it on a schedule
- Open the actor in Apify Console, set your input and click Save as a new task.
- In the task, open Schedules, click Add schedule and pick how often (every day at 08:00, every Monday and so on).
- Optional: add an integration (Google Sheets, Slack, a webhook) so each day's prices land where your team works.
Each run is independent: join runs on item_id and shop_id to follow a listing's price over time.
FAQ
What does this actor read?
Shopee's public search results page for your keyword, as a visitor who is not logged in. It reads the version of that page Shopee renders on its own servers for link previews, which carries 40 product cards per page. It does not log in, does not open product pages, and does not read shop pages.
Which markets work?
Singapore (shopee.sg), Malaysia (shopee.com.my), Thailand (shopee.co.th), Philippines (shopee.ph), Vietnam (shopee.vn), Taiwan (shopee.tw), Indonesia (shopee.co.id), Brazil (shopee.com.br) and Mexico (shopee.com.mx). All nine returned 40 products on the first page in our tests on 20 Oct 2026. Colombia and Chile are not supported: Shopee closed those sites and their search pages carry no products.
How many products can I get per keyword?
Up to 1,000 per keyword and 100 keywords per run, but Shopee decides how deep a keyword goes. Each page Shopee serves is a sample of 40 from its matches, so later pages repeat more and more products the actor already has. In our tests one sort gave 51 to 212 different products for a keyword; with otherSorts on, "wireless earbuds" on Shopee Malaysia gave 300 from three sorts in 139 seconds. When a keyword stops early, the summary row says why in per_keyword.
Why do two runs with the same input not return exactly the same products?
Shopee serves a different sample of its matches on each request, then sorts it. The best matches come back on most runs, but the tail changes. For price tracking, follow the listings you care about by item_id and shop_id rather than by position.
Why are units sold, the number of ratings, stock and the shop name not in the output?
The search page this actor reads does not show them for a visitor who is not logged in, so the actor does not invent them. What the card shows is in the row: price, price before discount, discount, star rating, seller location, promotion labels, image and links.
Why is price_original missing for Singapore, the Philippines and Mexico?
On those three sites Shopee's search cards show only the discount badge, not the crossed out price. discount_percent and discount_label are still there.
What do sort and otherSorts change?
sort is the order Shopee ranks the results in, the same menu as on the Shopee site; the price sorts come back strictly ordered on each page. otherSorts decides what happens when your sort has no new products left before maxItems: on (the default) the actor reads the same keyword in the other sorts and adds the products not yet delivered, each row naming the sort that found it; off, the keyword stops there.
How do minPrice and maxPrice work?
They are in the market's own currency (S$, RM, ฿, ₱, ₫, NT$, Rp, R$ or MX$). The actor passes them to Shopee and also checks every row itself before it is delivered, so a row outside the range is never in your dataset and never charged. The summary counts the products it dropped in filtered_out_by_price.
How long does a run take?
In our tests: 8 seconds for the 30 product "Try it" input, 6 to 11 seconds for a 5 product run in each market, 56 seconds for two keywords with a price range, and 139 seconds for 300 products of one keyword. A page takes 5 to 10 seconds through the residential proxy; after the first, the actor reads three pages at a time.
Do I need a Shopee account, cookies or a proxy?
No account and no cookies. The proxy is set for you: by default the actor uses Apify's residential proxy in the market's country, included in the price. You can switch to another Apify proxy group or your own proxy URLs under Advanced.
What happens when Shopee refuses a page?
Each page is tried up to four times on a fresh proxy address. If the first page of a keyword fails all four, that keyword gets an error row and nothing is charged for it; the run moves on to the next keyword. Six failed pages in a row stop the run, so a blocked run costs you nothing and ends quickly.
What happens when a run reaches its time limit?
The actor stops starting requests about 15 seconds before the run's timeout (900 seconds unless you change it), delivers every product it read, and ends SUCCEEDED with ended_on_deadline: true, a shortfall_reason, and the keywords it did not start in keywords_not_started.
Which formats can I download?
JSON, CSV, Excel, XML, RSS and HTML from the run's Storage tab or through the API. Rows are flat apart from promo_labels, so CSV and Excel keep every field. The dataset has two ready views: Products, and Ids and deals.
Can I use it from Claude, ChatGPT or Cursor (MCP)?
Yes, through Apify's MCP server. Connector URL: https://mcp.apify.com/?tools=themineworks/shopee-scraper
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code:
claude mcp add -t http shopee-scraper "https://mcp.apify.com/?tools=themineworks/shopee-scraper"
Is it legal to scrape Shopee?
The actor reads only public search results that anyone can see without logging in, and no personal data beyond what sellers publish on their listings. You are responsible for how you use the data, including Shopee's terms and local law. This is general information, not legal advice.
Integrations
- Google Sheets: send each run's products to a sheet with Apify's Google Sheets integration; one row per product fits a sheet as is.
- Make, Zapier and n8n: start a run and read its dataset with the Apify apps and nodes, for example "today's prices for our keywords to Slack".
- Webhooks: have Apify call your URL when a run succeeds, then fetch the dataset.
- API and SDKs: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- MCP clients: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.
More from The Mine Works
E-commerce and marketplaces
- Ozon.ru Scraper
- ⭐ Amazon Reviews Scraper
- Amazon Product Scraper
- Etsy Listings Scraper
- AliExpress Scraper
- Kleinanzeigen.de Scraper
- Carsales.com.au Scraper
- eBay Product Listings Scraper
- Shopify Store Scraper
- 🛒 TikTok Shop Scraper
- Walmart Product & Price Scraper
- Vinted Scraper
Social media and video
Leads and business directories
Marketing, SEO and reviews
Real estate
Science, health and government data
Jobs and hiring
Company and business data
Food and local services
Developer and AI tools
More tools
Support
Found a keyword that returns fewer products than it should, or a market that stopped working? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For a field you need or a new market, email dmineworks@gmail.com.
Search Shopee by keyword in 9 markets and get one row per product, with price, discount, rating, seller location, image and link, no login.

