TikTok Shop Scraper
Scrape TikTok Shop products by keyword, collection or store URL. Rows carry price, discount, rating, reviews, units sold and images. US only. $1.10 per 1,000.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
searchTerms,startUrls,sortBy(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0011 per product = $1.1 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Product scraped | One TikTok Shop product row delivered to the dataset. Sample rows and diagnostic rows are never charged. | $0.0011 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-16, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
searchTerms | Keywords to search TikTok Shop for, for example "makeup brush" or "wireless earbuds". Up to 20 targets per run in total, counting the URLs below. Each term is searched in turn until the run reaches the row limit. | array |
startUrls | TikTok Shop pages to read instead of, or as well as, search terms. Three shapes are understood: a collection page (https://shop.tiktok.com/us/k/probiotic-sodas), a store page (https://www.tiktok.com/shop/store/bk-beauty-brushes/7495182121564604692) and a search page (https://www.tiktok.com/shop/s/makeup%20brush). A bare seller id also works. | array |
sortBy | How TikTok orders the products it returns for a search term or a collection URL. Store pages always come back in the shop's own order. "relevance" is what the site shows by default. | string |
maxItems | Total number of products to return across all search terms and URLs. The budget is shared evenly between the targets, so four targets and 100 rows gives you 25 of each. Keep it low while you are testing - you pay per product. | integer |
proxyUrls | Leave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, one URL per line, in the form http://user:pass@host:port. | array |
sessionCookies | Optional. Leave this empty. TikTok Shop search, collection and store pages are read without any account and that is the normal path. Supply your own TikTok account cookie only if you run heavily, and the run uses it where an account is needed. In Chrome: F12 -> Application -> Cookies -> tiktok.com, and copy the value of sessionid (a whole "sessionid=...; sid_tt=..." cookie string is also accepted). Anyone with this value can act as your account, so treat it like a password. | array |
What you get
A structured dataset — each result includes fields like:
productIdtitlepricecurrencyoriginalPricediscountPercentratingreviewCountsoldCountshopNameproductUrlimageUrlstockStatussearchTermExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
1 ready-to-run use cases
TikTok Shop Best Sellers by Keyword
Find best-selling TikTok Shop products for any keyword: title, price, units sold, rating and shop.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
TikTok Shop Scraper: products, prices and units sold, by keyword or shop link
Type the searches you would type into TikTok Shop, or paste collection and store links, and get one row per product: 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 |
| Ceiling | 5,000 products and 20 targets per run |
| Account needed | None |
| Price | $1.10 per 1,000 products, flat on every plan |
🛒 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 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 | Starts at | What it is |
|---|---|---|
searchTerms | box holds makeup brush and wireless earbuds | Keywords to search TikTok Shop for. Delete the examples before you run your own. |
startUrls | empty | Collection, store or search pages, or a bare seller id. Up to 20 targets per run counting the terms above. |
sortBy | relevance | relevance, best_sellers or newest. Store pages always come back in the shop's own order. |
maxItems | 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 | empty | 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 | empty | Optional. 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. |
Run it with the input empty and you get one labelled sample row and nothing else, so you can see the shape of a row before you spend anything.
📤 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 | What it is |
|---|---|
price, priceFormatted | What is being charged now, as a number and as the site prints it. |
originalPrice, discountPercent | The crossed-out price and the percentage off, both numbers. 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. |
sellerId, shopUrl | The seller behind the listing. Feed shopUrl back in as a startUrls entry to pull the whole catalogue. |
brand | Only when the seller filled it in, which many do not. |
images | Every image link on the card. imageUrl is the first one. These 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. |
searchTerm, sourceType, sourceUrl | Which of your targets produced the row, so a mixed run stays sortable. |
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 |
|---|---|
| A product | ok: true and recordType: "product" |
| The sample row | _sample: true, written only when the input was empty |
| A diagnostic | ok: false, _diagnostic: true and an errorCode |
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.
▶️ How to run it
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.
💰 How much does it cost?
$1.10 per 1,000 products. Flat on every Apify plan, no volume tiers.
You are charged per product row delivered. Duplicates dropped inside a run, the sample row and every diagnostic row are not charged.
💡 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, re-run on a schedule, and diff on
productId. - Price history:
price,originalPriceanddiscountPercentare numbers, so a daily run turns
into a series with no parsing.
- Finding the seller behind a product that is moving, through
shopUrl. - Watching which listings are running a promotion right now, through
promotionLabels.
🚧 What it does not do
- US storefront. TikTok decides which catalogue to serve from where the request lands. For
another country, supply your own servers in proxyUrls. 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.
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 store pages will not open for a signed-out reader. The run then looks that shop up by name
and keeps what it finds, which usually recovers most of the shelf 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 |
| Videos under a hashtag | TikTok Hashtag Scraper |
| Comments under a video | TikTok Comments Scraper |
| Follower counts and profile stats | TikTok Profile Scraper |
| Trending hashtags by country | TikTok Trending Hashtags |
❓ 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.
Then what is sessionCookies for? Heavy use, where you would rather have a rate limit nobody else shares. It is optional and most people should leave it empty.
Can I get a storefront outside the US? Only by putting your own servers into proxyUrls, landing in a country where TikTok Shop operates. Check region on the rows that come back.
What happens when a term matches nothing? You get one uncharged diagnostic row for that target and the run carries on with the rest.
Can I run it on a schedule? Yes. productId is stable, so working out what is new since last time is a join.
Is scraping TikTok Shop legal? These are public listings. Apify's write-up on scraping and the law 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.