
TikTok Shop Scraper
scrape.ly/store/shelfbright/tiktok-shop-scraperE-commerceSocial media
1 monthly user

Scrape public Shopee product listings by keyword, category, or shop URL. Returns price, discount, rating, seller location, and image across nine marketplaces, including Taiwan.
Scrape public Shopee product listings by keyword, category, shop, or product URL across nine marketplaces. Each row is one product with its title, current and original price, discount, rating, seller location, image, and product link. No Shopee login or cookies needed.
tênis, phone, or 耳機.| Field | Type | What it does |
|---|---|---|
location | string | One search keyword, or a Shopee search, category, shop, or product URL. |
keywords | array | Extra keywords, each searched in the selected country. |
shopUrls | array | Shop URLs, such as https://shopee.com.br/shop/1926325983. |
categoryUrls | array | Category URLs, such as https://shopee.com.br/Tenis-de-Treino-cat.11059992.11060201.11062132. |
maxItems | integer | Max products for the whole run. Default 10. |
country | select | BR, ID, TH, MY, SG, PH, VN, MX, TW. Used for keywords only. |
priceSlicing | boolean | Search each keyword or category once per price band. Makes more requests. |
proxyConfiguration | object | Datacenter proxy by default. |
A URL uses the marketplace in its own domain; country applies only to keywords.
{
"location": "tênis",
"country": "BR",
"maxItems": 10
}
Several sources in one run:
{
"location": "smartphone",
"keywords": ["fone bluetooth"],
"shopUrls": ["https://shopee.com.br/shop/1926325983"],
"country": "BR",
"maxItems": 50
}
One dataset row per product.
| Field | Description |
|---|---|
itemId, shopId | Shopee product and shop ids. |
name, url | Product title and canonical link. |
price, priceMax, currency | Current price (and top of a range) in local currency. |
originalPrice, discountPercent, isOnSale | Crossed-out price, discount, and on-sale flag. |
rating | Average rating shown on the card. |
location | Seller location. |
images | Image URL from the listing. |
shopName | Filled when you scrape a shop URL. |
historicalSoldEstimated, favorites, reviewCount, brand, variationOptions | Present for a stable row shape but empty, since the public listing card does not show them. |
{
"itemId": 40560626214,
"shopId": 1540255279,
"name": "New POCO M7 Smartphone | 6GB+128GB/8GB+256GB, 7000mAh (typ) battery, 6.9\" FHD+ display,...",
"price": 281.98,
"priceMax": null,
"currency": "SGD",
"originalPrice": null,
"discountPercent": 17,
"isOnSale": true,
"rating": 4.9,
"location": "SG",
"images": ["https://down-sg.img.susercontent.com/file/sg-11134207-824g1-mfp6lgtfyqz356"],
"url": "https://shopee.sg/new-poco-m7-smartphone-6gb-128gb-8gb-256gb-7000mah-typ-battery-6-9-fh..."
}
The example is trimmed: the name and URL are shortened, and empty fields are left out.
$0.0055 per product saved, which is $5.50 per 1,000 products, plus platform usage for compute and proxy traffic.
Worked example: a 10-product search costs $0.055 in product fees, plus the platform usage of the run (about $0.06 in total on a measured run).
Is it legal to scrape Shopee? The actor reads public listing pages without logging in. You are responsible for how you use the data and for following local law and Shopee's terms.
Do I need an account or my own proxy? No. A datacenter proxy is configured by default.
Which countries work? Brazil, Indonesia, Thailand, Malaysia, Singapore, the Philippines, Vietnam, Mexico, and Taiwan (prices in TWD). Shopee Colombia and Chile are not supported: their public pages show no products without a login.
Why is the sold count empty? The public listing card does not include a sold count, so that field stays empty.
What happens with a bad URL? A URL that is not a Shopee search, category, shop, or product is skipped and the run still finishes.
Can I schedule it or use the API? Yes, through schedules in the console or the API.
Moving from another Shopee actor?
Pass the keyword in location and the cap in maxItems.
discountPercent. Taiwan search cards do not show the crossed-out price, so originalPrice stays empty there.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
locationstringOptionalKeyword or URL
One search keyword, or a Shopee search, category, shop, or product URL. Example: tênis.
keywordsarrayOptionaldefault []More keywords
Extra search keywords. Each one is searched in the selected country until the maximum is reached.
shopUrlsarrayOptionaldefault []Shop URLs
Shopee shop URLs, such as https://shopee.com.br/shop/1926325983 or https://shopee.sg/shopname.
categoryUrlsarrayOptionaldefault []Category URLs
Shopee category URLs, such as https://shopee.com.br/Tenis-de-Treino-cat.11059992.11060201.11062132.
maxItemsintegerOptionaldefault 10Maximum products
Maximum products to save for the whole run.
Country applies to keywords. Price bands split a keyword or category into six local-currency ranges.
countryenumOptionaldefault "BR"Country
Marketplace for keywords. A URL uses its own Shopee domain instead.
priceSlicingbooleanOptionaldefault falseSplit by price range
Search each keyword or category once per price band so more distinct products are returned. This makes more requests.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Proxy used to reach Shopee. Datacenter is enough for public listing pages.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| name | string | null | Product title |
| price | number | null | Current price in the local currency |
| priceMax | number | null | Upper price when the listing shows a range |
| originalPrice | number | null | Price before the discount, when the listing shows one |
| discountPercent | integer | null | Discount shown on the listing |
| currency | string | null | ISO currency code |
| rating | number | null | Star rating from 0 to 5 |
| location | string | null | Seller location shown on the listing |
| url | string | null | Product URL |
| itemId | integer | null | Shopee item id |
| shopId | integer | null | Shopee shop id |
| shopName | string | null | Shop name when the run reads a shop page |
| isOnSale | boolean | null | True when the listing shows a discount |
| images | array | null | Product image URLs |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Result | One Shopee product saved to the dataset. | $0.0055 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('shelfbright/shopee-scraper').call({
"location": "tênis",
"country": "BR",
"maxItems": 10
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run shelfbright/shopee-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=shelfbright/shopee-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
All listed products from a shop URL.
Products from a Shopee category URL.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.