TikTok Shop Scraper - Products, Prices and Units Sold avatar

TikTok Shop Scraper - Products, Prices and Units Sold

Pricing

from $1.07 / 1,000 products

Go to Apify Store
TikTok Shop Scraper - Products, Prices and Units Sold

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

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

8

Total users

4

Monthly active users

2 days ago

Last modified

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.

InputSearch terms, collection links, store links, or a bare seller id
OutputOne row per product: title, price, original price, discount, rating, review count, units sold, shop, images and promotion labels
Ceiling5,000 products and 20 targets per run
Account neededNone
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 getField
Product id, title and linkproductId, title, productUrl
Price now, as a number and as the site prints it, and the currencyprice, priceFormatted, currency
The crossed-out price and the percentage offoriginalPrice, discountPercent
Star rating and number of reviewsrating, reviewCount
Units sold, as the card reports itsoldCount
The shop: name, seller id and store linkshopName, sellerId, shopUrl
Brand, when the seller filled it inbrand
ImagesimageUrl, images
Promotion and stock labelspromotionLabels, stockStatus
Which of your targets produced the rowsearchTerm, sourceType, sourceUrl
The storefront that answered, and whenregion, scrapedAt

โ–ถ๏ธ How to scrape TikTok Shop products

  1. Open TikTok Shop Scraper and click Try for free.
  2. Put your keywords into Search terms, deleting the two examples, or paste links into TikTok Shop URLs.
  3. Pick a Sort search results by. Best sellers is the ordering TikTok's own ranking pages use.
  4. Set Maximum products. Start around 20 to see what the rows look like, then click Start.
  5. 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
}
FieldDefaultWhat it is
searchTermsnone (the box holds makeup brush and wireless earbuds)Keywords to search TikTok Shop for. Delete the examples before you run your own.
startUrlsnoneCollection, 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.
sortBynone (the form starts at relevance)relevance, best_sellers or newest. Store pages always come back in the shop's own order.
maxItemsnone (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.
proxyUrlsnoneOptional. 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.
sessionCookiesnoneOptional, 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"
}
FieldHow to read it
originalPrice, discountPercentBoth numbers, and both null when the listing is not discounted.
ratingStars out of five. null on a listing with no score yet, rather than 0.
soldCountLifetime units sold as the card reports it. null when the card carries no figure.
shopUrlFeed it back in as a startUrls entry to pull that seller's whole catalogue.
brandOnly when the seller filled it in, which many do not.
imagesEvery image link on the card, imageUrl being the first. They carry an expiry, so download what you want to keep.
stockStatussold_out, low_stock or null. Only set where the listing itself says something definite, which is rare.
regionThe storefront that answered, as a two-letter code.

๐Ÿงพ Reading the output

Three kinds of row can land in your dataset.

RowHow to spot itBilled
A productok: true and recordType: "product"yes
The sample row_sample: true, written only when the input was emptyno
A diagnosticok: false, _diagnostic: true and an errorCodeno

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.

CodeWhat it means
BAD_INPUTThat link is not a TikTok Shop page this actor can use. A single product link lands here.
NOT_FOUNDThe page or the seller id does not exist.
BLOCKEDTikTok would not serve that target this time. Worth one re-run.
NETWORKThe site was unreachable or answered badly.
NO_RESULTSThe target returned nothing usable. Rare on searches, since TikTok matches loosely.
TIME_BUDGETThe run ran out of time before reaching that target.
PROXY_INPUT_ADJUSTEDSomething you put in proxyUrls was unusable, so the run carried on without it.
CHARGE_ERRORA 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, originalPrice and discountPercent are 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:

  1. Search the category here with Sort search results by on best sellers, and sort the rows on soldCount.
  2. Paste the shopUrl of the sellers that move into TikTok Shop URLs to pull each one's whole shelf.
  3. 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. region on 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.
  • sortBy does 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 wantUse
Products, prices and units sold on TikTok ShopThis one
The videos that come up for a product name, by keyword searchTikTok Scraper
Videos posted under a hashtagTikTok Hashtag Scraper
Ads from TikTok's public ad libraryTikTok Ads Scraper
Follower and like counts for a list of handlesTikTok Profile Scraper
The hashtags ranking in a country right nowTikTok Trending Hashtags
Product data from Amazon, by keyword or ASINAmazon 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.

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.

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.