Tiktok Shop Product Scraper avatar

Tiktok Shop Product Scraper

Pricing

from $3.20 / 1,000 product results

Go to Apify Store
Tiktok Shop Product Scraper

Tiktok Shop Product Scraper

Extract TikTok Shop products, prices, discounts, sold counts, ratings, variants, seller info, shipping, and review signals from product URLs, keywords, categories, and seller pages.

Pricing

from $3.20 / 1,000 product results

Rating

0.0

(0)

Developer

Delowar Munna

Delowar Munna

Maintained by Community

Actor stats

2

Bookmarked

157

Total users

27

Monthly active users

3 days ago

Last modified

Share

Extract TikTok Shop products with live prices, discounts, sold counts, ratings, real customer reviews, variants, stock, shipping and seller data — from keywords, product URLs, categories, or a seller's whole catalogue.

Then go one step further than any other TikTok Shop scraper: filter by price, rating and sales volume, and let the built-in analysis engine sort every product into shortlist / review / skip with a plain-English reason.

TikTok Shop Product Scraper


Quick start

  1. Type a keyword — e.g. portable blender.
  2. Set Max Results Per Query (start with 20).
  3. Click Start.

You get back one row per product, with price, discount, sold count, rating, review count and seller. That's it — no proxy setup, no cookies, no configuration.

Want the deep data? Turn on Include Variants, Stock, Shipping & Seller Profile, or Include Reviews. These fetch extra data per product and are billed as separate events — see Pricing.


Best for

  • Dropshippers hunting winning products by keyword, price band and proven sales.
  • TikTok Shop sellers tracking competitor prices, discounts and stock.
  • E-commerce analysts pulling category or seller catalogues into Sheets/BI.
  • Brand teams monitoring who is selling their products and at what price.

Not best for

  • Non-US markets. TikTok Shop data is currently only available for the United States — see Supported markets.
  • TikTok video/engagement data (views, likes, creator stats). This actor returns shop data. Use a TikTok video scraper for that.
  • Buyer contact details. Not exposed by TikTok and not collected here.

Discovery modes

ModeInputWhat you get
Keyword searchportable blenderProducts matching the keyword — the fastest and cheapest way to discover
Product URL or IDhttps://shop.tiktok.com/view/product/<id> or 1732417183133045688One product, always fully enriched (variants, stock, shipping)
Seller / Store URL or IDhttps://shop.tiktok.com/us/store/<slug>/<id> or 7495975800231332547Every product in that seller's catalogue
CategoryKitchenwareProducts from a TikTok Shop category (240 categories resolved by name)

Modes are auto-detected and can be combined in a single run.


Input

ParameterTypeDefaultDescription
keywordsstring[][]Keywords to search TikTok Shop
productUrlsstring[][]Product URLs or bare product IDs
sellerUrlsstring[][]Seller/store URLs or bare seller IDs
categoriesstring[][]Category names, e.g. Kitchenware, Beauty & Personal Care
countriesstring[]["US"]Market. Currently US only
maxResultsPerQueryinteger50Max products per keyword / category / seller
maxResultsTotalinteger0Hard cap for the whole run (0 = no cap)
minPrice / maxPricenumberKeep only products in this price band
minRatingnumberKeep only products rated at or above this (0–5)
minSoldCountintegerKeep only products with at least this many units sold
includeProductDetailsbooleanfalseVariants, stock, shipping and seller profile — one call, one charge. Billed separately
includeReviewsbooleanfalseReal customer reviews. Billed separately
maxReviewsinteger20Reviews per product when reviews are on. Billed per review record
deduplicateProductsbooleantrueRemove duplicates across modes
includeSummarybooleantrueSave a run summary to the key-value store, key SUMMARY (free)

Filters run before any paid enrichment, so you never pay to enrich a product your filter was going to discard.

1. Keyword discovery — the cheap path

No enrichment: one API call returns ~30 products, so this is the cheapest way to see a market.

{
"keywords": ["portable blender"],
"countries": ["US"],
"maxResultsPerQuery": 30
}

2. Find the winners, then enrich only those

Filters run before the paid detail call, so you pay to enrich the 12 products that survived — not the 100 you started with.

{
"keywords": ["portable blender", "juicer cup"],
"countries": ["US"],
"maxResultsPerQuery": 100,
"minPrice": 10,
"maxPrice": 60,
"minRating": 4.3,
"minSoldCount": 1000,
"includeProductDetails": true
}

3. Audit a seller's entire catalogue, with reviews

This is the run that produced every output sample below. demandBucket ranks the catalogue against itself, so you find the winners inside a small store instead of getting 50 rows that all say skip.

{
"sellerUrls": ["7494525317462591244"],
"countries": ["US"],
"maxResultsPerQuery": 50,
"includeProductDetails": true,
"includeReviews": true,
"maxReviews": 20
}

4. Deep-dive specific products

Paste product URLs, bare product IDs, or a mix of both. Product URL mode is always fully enriched — variants, stock, shipping and the seller profile — because that is the request.

{
"productUrls": [
"https://shop.tiktok.com/us/pdp/jetech-matte-case-for-iphone-16-shockproof-anti-fingerprint/1732347639758557964",
"1732359237559685900"
],
"countries": ["US"],
"includeReviews": true
}

5. Browse a category

{
"categories": ["Kitchenware"],
"countries": ["US"],
"maxResultsPerQuery": 100,
"minSoldCount": 500
}

6. Mixed run, with a hard cost ceiling

Modes are auto-detected and combined. maxResultsTotal caps the whole run, whatever it discovers.

{
"keywords": ["iphone 16 case"],
"sellerUrls": ["7494525317462591244"],
"categories": ["Phones & Electronics"],
"countries": ["US"],
"maxResultsPerQuery": 50,
"maxResultsTotal": 100,
"minRating": 4.0
}

Output

One flat row per product. Five dataset views: Products, Pricing, Sellers, Reviews, Analysis.

Products view

Every sample below is copied verbatim from one real run — sample input #3 above, a 50-product seller catalogue with details and reviews on. Nothing here is invented.

A full product record

Discovery alone (keyword / category / seller with no enrichment) returns everything down to hasReviewSignal. The variants, stock, shipping and seller-profile blocks need includeProductDetails; the review block needs includeReviews.

{
"productId": "1732359237559685900",
"productTitle": "JETech Screen Protector for iPad (A16) 11th/10th Generation (2025/2022), 9H Tempered Glass Film, HD Clear, 2-Pack",
"productUrl": "https://shop.tiktok.com/us/pdp/jetech-screen-protector-for-ipad-a16-9h-tempered-glass-2-pack/1732359237559685900",
"brandName": "JETech",
"productCategory": "Tablet Screen Protectors",
"categoryPath": "Phones & Electronics > Tablet & Computer Accessories > Tablet Screen Protectors",
"countryCode": "US",
"currency": "USD",
"listPrice": 11.99,
"salePrice": 10.79,
"discountAmount": 1.2,
"discountPercent": 10,
"isDiscounted": true,
"priceRangeMin": 10.79,
"priceRangeMax": 10.79,
"soldCount": 68,
"ratingAverage": 4.8,
"ratingCount": 8,
"reviewCount": 8,
"popularityLabel": "low",
"variantCount": 1,
"variantSummary": "Color: Clear; Size: iPad(A16)11/10",
"variantOptions": ["Clear / iPad(A16)11/10"],
"hasVariants": false,
"availableQuantity": 5,
"inStock": true,
"shippingFee": 4.44,
"shippingType": "paid",
"estimatedDelivery": "4-7 days",
"shippingInfo": "Shipping 4.44, 4-7 days",
"sellerName": "JETech US Shop",
"sellerId": "7494525317462591244",
"sellerUrl": "https://shop.tiktok.com/us/store/jetech-us-shop/7494525317462591244",
"sellerRating": 4.4,
"sellerFollowerCount": 875,
"sellerProductCount": 307,
"sellerTrustBucket": "moderate",
"demandBucket": "top",
"pricePositionBucket": "budget",
"ratingQualityBucket": "excellent",
"analysisBucket": "review",
"analysisReason": "Top-quarter demand in this run (68 sold), High rating (4.8), Meaningful discount (10%), Rating 4.8 but only 8 review(s) — unproven",
"isResearchCandidate": true,
"sourceMode": "seller",
"sourceInputType": "id",
"sourceCountries": ["US"],
"position": 4,
"scrapedAt": "2026-07-13T11:53:04.724Z"
}

Read that analysisReason — it is the whole product in one line. 68 units sold is nothing in absolute terms, but it is top-quarter demand inside this seller's own catalogue. The 4.8 rating looks excellent and is explicitly not trusted, because only 8 people left one. So the verdict is review, not shortlist — and you can see exactly why.

ratingAverage is null, not 0, when a product has no reviews. No rating is not a bad rating.

Reviews (when includeReviews is on)

{
"productTitle": "JETech Matte Case for iPhone 17e / iPhone 16e, Shockproof Military Grade Drop Protection...",
"ratingAverage": 4.6,
"reviewCount": 14,
"ratingDistribution": {
"5": 11, "4": 2, "3": 0, "2": 1, "1": 0,
"fiveStarPercent": 78.6,
"oneStarPercent": 0
},
"reviewsAccessible": true,
"reviewsFetched": 14,
"reviewsTotal": 14,
"incentivizedReviewPercent": 21.4,
"reviewSummaryText": "So far so goood I like the feeling. Good quality super...",
"reviews": [
{
"reviewId": "7648184584026392334",
"rating": 5,
"text": "So far so goood I like the feeling\nGood quality super\nPreformance is amazing the screen protector is glass so that's good",
"author": "T**.",
"reviewedAt": "2026-06-06T07:43:08.320Z",
"isVerifiedPurchase": true,
"isIncentivized": true,
"variant": "Clear, iPad(A16)11/10",
"country": "US",
"imageCount": 0
}
]
}

Two fields no other TikTok Shop scraper gives you:

isIncentivized — whether the reviewer was paid or gifted. This is the difference between a 4.8 that means something and a 4.8 that was bought. incentivizedReviewPercent summarises it per product — and on the product above, 1 in 5 of its reviews were incentivized.

ratingDistribution — the full star breakdown. An average hides the shape: "4.1 from 828 reviews" could be 545 five-stars and 128 one-stars — a polarised product, not a mediocre one. Only the breakdown tells you which.

Reviews are best-effort

TikTok throttles its review endpoint at random — the same request can be refused several times and then succeed. We retry up to 7 times per page. (On the 50-product run above, 47 of 50 products returned reviews.)

When reviews can't be fetched, the record says so explicitly and you are not charged:

{ "reviewsAccessible": false, "reviewsUnavailableReason": "throttled", "reviewCount": 4829 }

"throttled" (couldn't fetch — re-run to retry) is always distinguishable from "none" (this product genuinely has no reviews):

{ "reviewsAccessible": false, "reviewsUnavailableReason": "none", "reviewCount": 0, "ratingAverage": null }

We will not blame TikTok for an empty result we can already explain.

ratingAverage and reviewCount are always available and need no extra option — only the review text, star breakdown, and incentivized flags depend on this endpoint.

Run summary

Written to the key-value store under the key SUMMARY — not into the dataset, so it never pollutes your product rows or CSV export. Free.

{
"recordType": "summary",
"totalProducts": 50,
"totalAfterDedup": 50,
"productsBySourceMode": { "seller": 50 },
"averageSalePrice": 12.01,
"averageDiscountPercent": 10.53,
"averageRating": 4.46,
"averageSoldCount": 26.3,
"topSellers": [{ "name": "JETech US Shop", "count": 50 }],
"productsByAnalysisBucket": { "review": 11, "skip": 39 },
"runStatus": "completed",
"charged": { "product-result": 50, "product-detail-result": 50, "review-result": 180 }
}

Output field reference

IdentityproductId, productUrl, productTitle, productDescription, brandName (sparse — see below), productCategory, categoryPath, imageUrls, countryCode

brandName is sparse and the key is omitted when absent. Most TikTok Shop listings come from unbranded third-party sellers and carry no brand at all — roughly 1 in 10 in keyword search (a branded seller's own catalogue will naturally be higher). When a product has no registered brand the field is left out of the record entirely rather than written as null, so "brandName" in record is a reliable test. It is also not available in Product URL mode: TikTok's product-detail endpoint does not return a brand field, so that mode never emits the key. Do not treat a missing brandName as a scrape failure — it means the listing is unbranded.

Pricingcurrency, listPrice, salePrice, discountAmount, discountPercent, priceRangeMin, priceRangeMax, isDiscounted (see below)

Discounts are visible in keyword, seller and category mode — not in Product URL mode. The list price (and therefore the discount) is only carried on TikTok's product cards, which is what search, seller and category browsing return. TikTok's product-detail endpoint — the only source for a product fetched by URL or ID — does not include a list price at all.

So in Product URL mode, listPrice, discountAmount and discountPercent are null, and isDiscounted is null too — meaning "we can't see whether it's discounted", not "it isn't". In every other mode isDiscounted is a real true / false.

If discount data matters to you, discover products by keyword, seller or category.

DemandsoldCount, ratingAverage, ratingCount, reviewCount, hasReviewSignal, popularityLabel

Variants & stock (needs includeProductDetails)variantCount, variantSummary, variantOptions, hasVariants, availableQuantity, inStock

Shipping (needs includeProductDetails)shippingFee, shippingType, estimatedDelivery, shippingInfo, shipsFrom (often null — most US merchants don't publish a warehouse region)

SellersellerName, sellerId, sellerUrl, storeName — always present. sellerRating, sellerFollowerCount, sellerProductCount need includeProductDetails, and are what feed sellerTrustBucket.

Reviews (needs includeReviews, best-effort)reviews[], ratingDistribution, reviewSummaryText, incentivizedReviewPercent, reviewsAccessible, reviewsFetched, reviewsTotal, reviewsUnavailableReason

AnalysisanalysisBucket, analysisReason, isResearchCandidate, demandBucket, isDiscounted, pricePositionBucket, ratingQualityBucket, sellerTrustBucket

Lineage & runsourceMode, sourceInputType, sourceKeywords, sourceCategories, sourceSellerUrls, sourceCountries, position, scrapedAt, isPartial, errorType, errorMessage


Analysis buckets

Every product is classified, with a reason you can read:

  • shortlist — proven demand (500+ sold) and a rating backed by at least 20 reviews, plus a reason to act (a real discount, or a seller with a track record).
  • review — worth a look: a credible rating with real sales, or strong sales on their own.
  • skip — not enough signal.

A rating only counts as evidence if enough people left one. A 5.0 from 2 reviews is noise, and it is never shortlisted — you'll see "Rating 5 but only 2 review(s) — unproven" in analysisReason. This is the difference between a shortlist you can act on and a list of lottery tickets.

Demand is judged two ways

Sales are measured absolutely (500+ / 1,000+ sold — "sells a lot by TikTok Shop standards") and relatively (demandBucket: where the product sits in your result set — top / mid / bottom quartile). The stronger of the two signals wins.

The relative measure exists for seller and category audits. A small store's entire catalogue can top out around 90 sold; against the absolute bar every row scores skip, and a column that says the same thing fifty times tells you nothing. The question a seller audit actually asks is "which of these are the winners" — so analysisReason will say "Top-quarter demand in this run (89 sold)" rather than "Low sold count (89)".

Keyword and category runs over the open market are unaffected: absolute thresholds still apply, and the relative lane only ever adds a way for a product to qualify. Ranking is skipped when the result set is too small (under 8 products) or flat (every product has the same sold count) — there's no meaningful "top quarter" of either.


Pricing

Pay-per-event. You pay for data you receive — nothing else.

The three events

EventChargedTriggered by
product-resultonce per product rowEvery run. This is the base charge.
product-detail-resultonce per productOnly if Include Variants, Stock, Shipping & Seller Profile is on — or in Product URL mode, which always enriches.
review-resultonce per review recordOnly if Include Reviews is on. 20 reviews on one product = 20 events.

Per-1,000 rates are on the Actor's Pricing tab.

What you are never charged for

  • Failed extractions. If a product can't be fetched, you get a record explaining why — free.
  • Reviews that couldn't be fetched. TikTok throttles its review endpoint; when reviews don't come back, reviewsAccessible is false and no review-result events are billed.
  • Duplicates. Removed before they are charged.
  • The run summary.
  • Retries. However many attempts a request takes, you pay once for the result.

Filters run before enrichment

minPrice / maxPrice / minRating / minSoldCount are applied to the cheap discovery data before any per-product enrichment call is made. A product your filter rejects never incurs a product-detail-result or review-result charge — so filtering hard is also the cheapest way to run.

Estimating a run

Enrichment fetches extra data per product, which is why both enrichment options default to off.

product-result = number of products kept (after filters + dedup)
product-detail-result = number of products kept … only if Variants/Shipping is on
review-result = products kept × reviews found … only if Reviews is on

Worked examples (event counts — multiply by the rates on the Pricing tab):

Runproduct-resultproduct-detail-resultreview-result
100 products, keyword search, no enrichment10000
100 products + product details1001000
100 products + reviews (maxReviews: 20)1000up to 2,000
100 found, filtered down to 12, + product details12120

Reviews are the big multiplier. At maxReviews: 20, a 100-product run generates up to 2,000 review events — 20× the product count. That's 20× the data, but check it's what you want before enabling it on a large run. Use maxResultsTotal to cap any run.

Tip: TikTok serves reviews in pages of 20. maxReviews: 20 fetches a full page with nothing wasted; 21 costs an entire extra page for one more review. Multiples of 20 are the efficient choices.


Supported markets

United States only.

TikTok Shop data for other regions is not currently retrievable — keyword search, category browse and seller catalogues all return an error outside the US. We tested and confirmed this for GB, ID, MY, TH, SG, VN, PH, AU, JP, BR, MX, DE, FR, IT, ES and IE.

We would rather tell you this than offer a country dropdown where most options silently return nothing. Additional markets will be added here if and when they become available.


FAQ

Do I need a proxy? No. There is nothing to configure — no proxy, no cookies, no session.

Do I get real review text? Yes — turn on includeReviews. You get the review text, star rating, verified-purchase flag, the variant purchased, and whether the review was incentivized (paid/gifted).

Why is ratingAverage null on some products? Because the product has no reviews yet. We report that as null, not 0, so it can't be mistaken for a bad rating.

Do failed runs cost me anything? No. Failed extractions aren't charged, the run summary isn't charged, duplicates aren't charged, and retries aren't charged. If reviews can't be fetched for a product, you aren't charged for them either.

Why did enabling reviews increase my cost so much? Reviews are billed per review, not per product. At the default maxReviews: 20, a 100-product run can generate 2,000 review events — 20× the product count. That's 20× the data, but set maxReviews lower (or use filters) if you only need a sample.

How do I keep a run cheap? Leave the enrichment options off, and filter hard. Filters are applied before any paid per-product call, so a product excluded by minRating or minSoldCount costs you nothing beyond its discovery row.

How do I scrape a specific seller? Paste their store URL, or just the seller ID. Every product row includes a sellerId — copy it straight back into the seller field to pull that seller's whole catalogue.

Why does maxResultsPerQuery return fewer products than I asked for? Either the source has fewer products, duplicates were removed (deduplicateProducts), or your filters excluded them. The log tells you which.

Can I scrape markets other than the US? Not today. See Supported markets.

Where is the run summary? In the key-value store, under the key SUMMARY — not in the dataset. It holds averages, top sellers and the bucket breakdown, and keeping it out of the dataset means your product rows and CSV exports stay clean.

Which category names can I use? Any of the 240 TikTok Shop categories — e.g. Kitchenware, Beauty & Personal Care, Phones & Electronics, Womenswear & Underwear. Names are matched loosely; if a name isn't found, the log lists the valid top-level categories.

Can I re-run a product from a previous dataset? Yes. Copy the productUrl or productId from any row straight into the product field.


Limitations

  • US market only (see above).
  • Keyword search is the only mode that discovers products by text. TikTok does not expose a public search for other regions.
  • TikTok Shop links are geo-gated. A productUrl in the output opens the product for a US visitor; from other regions TikTok may redirect the link to its main feed. The data in the dataset is unaffected.
  • Product URL mode cannot see discounts. TikTok's product-detail endpoint carries no list price, so isDiscounted is null (not false) and discountPercent is null for products fetched by URL or ID. Discover by keyword, seller or category if you need discount data.
  • soldCount is lifetime units sold, not a recent rate. TikTok does not publish 30-day sales, revenue, or a category rank on any public surface, so a product that sold 100K last month and one that sold 100K over three years look the same in this field. demandBucket ranks products against each other within your run, which is the closest honest substitute.
  • Some sellers return no products — dormant or delisted stores. The run log says so explicitly rather than failing silently.
  • Product descriptions are image-only for some merchants; productDescription will be null in that case.
  • brandName is only present for the minority of listings that have a registered brand (~1 in 10 in our sampling), and is never present in Product URL mode — TikTok's detail endpoint carries no brand field. The key is omitted rather than nulled.
  • Analysis fields are derived heuristics, not TikTok-provided data.
  • Pricing and stock reflect what was publicly displayed at scrape time.

API integration

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('coregent/tiktok-shop-product-scraper').call({
keywords: ['portable blender'],
countries: ['US'],
maxResultsPerQuery: 30,
minRating: 4.3,
minSoldCount: 1000,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("coregent/tiktok-shop-product-scraper").call(run_input={
"keywords": ["portable blender"],
"countries": ["US"],
"maxResultsPerQuery": 30,
"minRating": 4.3,
"minSoldCount": 1000,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

CLI

apify call coregent/tiktok-shop-product-scraper --input='{
"keywords": ["portable blender"],
"countries": ["US"],
"maxResultsPerQuery": 30
}'

MCP — use this Actor as a tool in Claude, Cursor, or any MCP client

Add Apify's MCP server to your client's config, scoped to just this Actor so your agent sees one clean tool instead of the whole Apify store:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=coregent/tiktok-shop-product-scraper"
}
}
}

Your client will prompt you to sign in to Apify on first use. If you'd rather use a token directly:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=coregent/tiktok-shop-product-scraper",
"headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
}
}
}

Then just ask for what you want:

"Find portable blenders on TikTok Shop rated 4.3+ with over 1,000 sold, and tell me which ones are worth stocking."

The agent fills in the inputs, runs the Actor, and reads the dataset back. The analysisBucket and analysisReason fields are built for exactly this — the agent gets a shortlist with a stated reason per product, not 30 raw rows it has to rank itself.


Data & compliance

All data comes from public TikTok Shop surfaces. No login, no personal buyer data. Reviewer names are returned exactly as TikTok displays them (already masked, e.g. G**a G**.).