TikTok Shop Scraper - Products, Prices and Units Sold
Pricing
from $1.07 / 1,000 products
TikTok Shop Scraper - Products, Prices and Units Sold
Scrape TikTok Shop products by keyword, collection or store link, mixed in one run. Each row has the title, price, original price, discount, rating, review count, units sold, the shop, the link and images, so you can rank a category by what sells. US storefront. $1.10 per 1,000 products.
Pricing
from $1.07 / 1,000 products
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
8
Total users
4
Monthly active users
2 days ago
Last modified
Categories
Share
Scrape TikTok Shop products by keyword, collection or store link: one row per product with the title, price, the crossed-out original price, the discount, star rating, review count, units sold, the shop behind it and the images. Units sold sits on the card, so sorting a category by what actually moves needs no second lookup.
The awkward part first. This reads the US storefront, and a row describes the shelf rather than the product page: no per-unit stock count, no variant or SKU prices, no shipping, no description, no individual reviews. A single product link is not a valid target either.
| Input | Search terms, collection links, store links, or a bare seller id |
| Output | One row per product: title, price, original price, discount, rating, review count, units sold, shop, images and promotion labels |
| Ceiling | 5,000 products and 20 targets per run |
| Account needed | None |
| Price | $1.10 per 1,000 products, flat on every plan. The free plan's $5 a month covers about 4,500 |
๐ What TikTok Shop Scraper does
Three ways in, and you can mix them in one run.
Search terms. makeup brush, wireless earbuds, whatever you would type into the shop's own
search box. Each term is worked through in turn until the run reaches your row limit.
Collection and store links. A collection page like https://shop.tiktok.com/us/k/probiotic-sodas
gives you that shelf. A store page gives you a seller's catalogue in the shop's own order. A bare
15 to 25 digit number is read as a seller id, so you can paste one straight out of a URL.
Products are deduplicated on product id across the whole run, so a listing that matches two of your terms comes back once.
๐ What data you get from each TikTok Shop product
| What you get | Field |
|---|---|
| Product id, title and link | productId, title, productUrl |
| Price now, as a number and as the site prints it, and the currency | price, priceFormatted, currency |
| The crossed-out price and the percentage off | originalPrice, discountPercent |
| Star rating and number of reviews | rating, reviewCount |
| Units sold, as the card reports it | soldCount |
| The shop: name, seller id and store link | shopName, sellerId, shopUrl |
| Brand, when the seller filled it in | brand |
| Images | imageUrl, images |
| Promotion and stock labels | promotionLabels, stockStatus |
| Which of your targets produced the row | searchTerm, sourceType, sourceUrl |
| The storefront that answered, and when | region, scrapedAt |
โถ๏ธ How to scrape TikTok Shop products
- Open TikTok Shop Scraper and click Try for free.
- Put your keywords into Search terms, deleting the two examples, or paste links into TikTok Shop URLs.
- Pick a Sort search results by. Best sellers is the ordering TikTok's own ranking pages use.
- Set Maximum products. Start around 20 to see what the rows look like, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
Start it with the input empty and you get one labelled sample row and nothing else.
๐ฐ How much does it cost to scrape TikTok Shop products?
$1.10 per 1,000 products. Flat on every Apify plan, no volume tiers. On the free plan, the $5 Apify gives you each month covers about 4,500 products.
You are charged per product row delivered. Duplicates dropped inside a run, the sample row and every diagnostic row are not charged.
๐ฅ What you give it
{"searchTerms": ["makeup brush", "wireless earbuds"],"startUrls": ["https://www.tiktok.com/shop/store/bk-beauty-brushes/7495182121564604692"],"sortBy": "best_sellers","maxItems": 200}
| Field | Default | What it is |
|---|---|---|
searchTerms | none (the box holds makeup brush and wireless earbuds) | Keywords to search TikTok Shop for. Delete the examples before you run your own. |
startUrls | none | Collection, store or search pages, or a bare seller id. Up to 20 targets per run, counting the terms above. Any other link gets an uncharged BAD_INPUT row. |
sortBy | none (the form starts at relevance) | relevance, best_sellers or newest. Store pages always come back in the shop's own order. |
maxItems | none (the box holds 50) | Total products across every target, up to 5,000. The budget is split evenly, so four targets and 100 rows gives you 25 of each. |
proxyUrls | none | Optional. Your own servers, in the form http://user:pass@host:port, used exactly as given. They have to land in a country where TikTok Shop operates. |
sessionCookies | none | Optional, and most people should leave it empty. Your own TikTok sessionid, for heavy runs; the run uses it where an account is needed. Anyone holding that value can act as your account, so treat it like a password. The field is stored encrypted. |
๐ค What you get back
A real product row from a recent run, with the image links trimmed:
{"ok": true,"charged": true,"recordType": "product","productId": "1732461774795346037","title": "14/8pcs Professional Beauty Brush Set with Storage Bag - Metal Frame, Cosmetics Brush...","price": 10.26,"currency": "USD","priceFormatted": "$10.26","originalPrice": 20.8,"discountPercent": 51,"rating": 4.5,"reviewCount": 281,"soldCount": 2349,"shopName": "Jovial US","sellerId": "7494658995239093365","shopUrl": "https://www.tiktok.com/shop/store/jovial-us/7494658995239093365","brand": null,"productUrl": "https://shop.tiktok.com/us/pdp/14pcs-professional-beauty-brush-set.../1732461774795346037","imageUrl": "https://p16-oec-general-useast5.ttcdn-us.com/tos-useast5-i-omjb5zjo8w-tx/edfbc3...","images": ["https://p16-oec-general-useast5.ttcdn-us.com/...", "https://p19-oec-general-useast5.ttcdn-us.com/..."],"promotionLabels": ["Limited time deal", "Free shipping"],"stockStatus": null,"searchTerm": "makeup brush","sourceType": "search","sourceUrl": "https://www.tiktok.com/shop/s/makeup%20brush","region": "US","scrapedAt": "2026-09-14T05:47:20.586Z"}
| Field | How to read it |
|---|---|
originalPrice, discountPercent | Both numbers, and both null when the listing is not discounted. |
rating | Stars out of five. null on a listing with no score yet, rather than 0. |
soldCount | Lifetime units sold as the card reports it. null when the card carries no figure. |
shopUrl | Feed it back in as a startUrls entry to pull that seller's whole catalogue. |
brand | Only when the seller filled it in, which many do not. |
images | Every image link on the card, imageUrl being the first. They carry an expiry, so download what you want to keep. |
stockStatus | sold_out, low_stock or null. Only set where the listing itself says something definite, which is rare. |
region | The storefront that answered, as a two-letter code. |
๐งพ Reading the output
Three kinds of row can land in your dataset.
| Row | How to spot it | Billed |
|---|---|---|
| A product | ok: true and recordType: "product" | yes |
| The sample row | _sample: true, written only when the input was empty | no |
| A diagnostic | ok: false, _diagnostic: true and an errorCode | no |
Filter on recordType == "product" and you have your data. charged: true marks a real product row
and false marks a sample or diagnostic one. Read it as the row type: it is stamped as the row is
built, so it is not a receipt. Your run's own event count in Apify is the billing record.
| Code | What it means |
|---|---|
BAD_INPUT | That link is not a TikTok Shop page this actor can use. A single product link lands here. |
NOT_FOUND | The page or the seller id does not exist. |
BLOCKED | TikTok would not serve that target this time. Worth one re-run. |
NETWORK | The site was unreachable or answered badly. |
NO_RESULTS | The target returned nothing usable. Rare on searches, since TikTok matches loosely. |
TIME_BUDGET | The run ran out of time before reaching that target. |
PROXY_INPUT_ADJUSTED | Something you put in proxyUrls was unusable, so the run carried on without it. |
CHARGE_ERROR | A charge could not be recorded. A couple in a row stops the run. |
One bad target never stops the others, and a diagnostic row never fails the run.
๐ก What people use it for
- Category research: pull a shelf, sort on
soldCount, and filter out the one-review listings before deciding what to stock. - Shelf tracking: feed in a store link, run it again next week, and diff on
productId. - Price history:
price,originalPriceanddiscountPercentare numbers, so a daily run turns into a series with no parsing. - Watching which listings are running a promotion right now, through
promotionLabels.
From a category to the sellers and the videos behind it, in three runs:
- Search the category here with Sort search results by on best sellers, and sort the rows on
soldCount. - Paste the
shopUrlof the sellers that move into TikTok Shop URLs to pull each one's whole shelf. - Put the names of the top products into the Search queries box of TikTok Scraper to see the videos that sell them.
๐ง What it does not do
- US storefront. For another country, put your own servers in
proxyUrls, landing in a country where TikTok Shop operates.regionon every row tells you which storefront actually answered. - No product detail. Per-unit stock, variant and SKU prices, shipping, delivery estimates, descriptions and reviews are not on the listing surface this reads.
- A single product link is not a target. This returns lists of products. Paste the shop link from that page instead, or search the product name.
sortBydoes not reach store pages. A shop's own shelf order is the only one TikTok offers there.- Search depth stops at a few hundred products per term. When TikTok stops handing out pages the run moves on rather than repeating rows. Add more terms to go wider.
- Some shops hide their store page from signed-out visitors. Those shelves usually come back mostly complete, but not always all of it.
- Rows are a snapshot. Prices, ratings and sold counts move, sometimes hourly during a sale.
๐งญ Which TikTok scraper do you need?
| If you want | Use |
|---|---|
| Products, prices and units sold on TikTok Shop | This one |
| The videos that come up for a product name, by keyword search | TikTok Scraper |
| Videos posted under a hashtag | TikTok Hashtag Scraper |
| Ads from TikTok's public ad library | TikTok Ads Scraper |
| Follower and like counts for a list of handles | TikTok Profile Scraper |
| The hashtags ranking in a country right now | TikTok Trending Hashtags |
| Product data from Amazon, by keyword or ASIN | Amazon Scraper |
โ Questions people ask
Do I need a TikTok account or an API key?
No. There is no key to apply for and nothing to log into. Runs read the same public shop pages a signed-out visitor sees.
What is the cookie field for, then?
Heavy use. With your own cookie in it, the run uses your account where an account is needed. It is optional and most people should leave it empty.
Can I scrape a TikTok Shop storefront outside the US?
Only by putting your own servers into proxyUrls, landing in a country where TikTok Shop operates.
Check region on every row that comes back.
What happens when a search term matches nothing?
You get one uncharged diagnostic row for that target and the run carries on with the rest.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has ready-made code
for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/tiktok-shop-scraper. Either way the
run happens on your Apify account at the same price.
Is scraping TikTok Shop legal?
These are public listings. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
๐ If something breaks
Open the Issues tab on the actor page. Send the term or the link that misbehaved and the run ID.
The errorCode on the diagnostic row usually names the problem on its own.