TikTok Shop Scraper | Products, Sellers, Reviews & Videos avatar

TikTok Shop Scraper | Products, Sellers, Reviews & Videos

Pricing

from $2.90 / 1,000 results

Go to Apify Store
TikTok Shop Scraper | Products, Sellers, Reviews & Videos

TikTok Shop Scraper | Products, Sellers, Reviews & Videos

Scrape TikTok Shop US products by keyword or URL: price, discount, rating, units sold, SKU stock, variants, seller analytics, 1-5 star review histogram and registered business name - plus the TikTok video selling each listing (views, likes, creator). 79 fields, incremental monitoring.

Pricing

from $2.90 / 1,000 results

Rating

0.0

(0)

Developer

Corvuslab

Corvuslab

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

What does TikTok Shop Scraper do?

TikTok Shop Scraper turns the TikTok Shop US storefront into a clean product database: search any keyword — or paste product and shop URLs — and get back 79 structured fields per product, including price and discount, rating, reviewCount, soldCount, live SKU stock, full seller analytics, the 1–5 star review histogram, and the TikTok video that is actually selling the listing (videoUrl, videoPlayCount, videoLikeCount, videoCaption, creator ID). No code, no login: results export as JSON, CSV, Excel, or straight into your API, AI agent or spreadsheet.

New to Apify? Sign up free and use the included monthly platform credit to try this Actor — no credit card needed.

More TikTok data from the same publisher: TikTok Comments Scraper pulls comment threads with likes, replies and commenter handles · TikTok Profile Scraper pulls followers, following and bio emails. Pair either with this Actor to go from a winning product to the creator and the audience selling it.


What data can you extract from TikTok Shop?

Every record carries up to 79 fields, grouped like this:

GroupWhat you get
Product & pricingid, title, url, slug, brand, price, originalPrice, discountPercent, savingAmount, currency, minSkuPrice / maxSkuPrice, categoryId, categoryName, categoryPath, breadcrumbUrl
Demand & social proofrating, reviewCount, soldCount, ratingBreakdown (1★–5★ counts) and reviews[] with text, star rating, verified-purchase and incentivized flags, variant bought, reviewer and date
🎬 The selling TikTok videovideoId, videoUrl, videoAuthorId, videoCaption, videoPlayCount, videoLikeCount, videoCoverImage, videoDurationMs, videoPostedAt
Seller & shop analyticsshopName, sellerId, shopUrl, shopLogo, isVerifiedShop, shopSoldCount, shopFollowers, shopProductCount, shopVideoCount, shopReviewCount, shopRegion, shopDescription, shopCreatorName, plus registered businessName and businessAddress
Inventory & fulfilmentskus[] (SKU ID, option values, live stock, weight, dimensions), skuCount, variants[] with swatch images, specifications, totalStock, inStock, isPreOrder, shippingFee, deliveryMinDays / deliveryMaxDays
Media, copy & contactsimageUrl, imageUrls[], description as text / HTML / Markdown, descriptionImages, aiTitle, aiDescription, aiKeywords, plus extractedEmails, extractedPhones, extractedUrls and socialProfiles

Incremental runs add changeType (NEW / UPDATED / UNCHANGED / EXPIRED) and repost markers (isRepost, repostOfId, repostDetectedAt) that flag a listing re-uploaded under a new ID.


Key features

  • 🎬 The video behind the listing — every product carries its bound TikTok video with play count, like count, caption, cover image and creator ID. Rank a category by what is going viral, not by search position.
  • 🧩 Four surfaces, one Actor — keyword search, full product detail, seller/shop analytics and reviews in a single run.
  • 🏢 Registered business identity — businessName and businessAddress name the entity behind a listing, which is how you unmask a white-label reseller.
  • 📦 SKU-level stock — per-SKU prices, option values, live stock counts, weight and dimensions.
  • 🎚️ Filters enforced exactly — price band, minRating, minSoldCount and dealsOnly are applied before anything is billed, so you never pay for rows you filtered out.
  • ♻️ Incremental monitoring — schedule it and get only what changed; unchanged products are recognised before their detail page is fetched, so you skip both the work and the cost.
  • 🔗 Notion and Clay, natively — every product lands in your table as it is scraped, with Notion columns created for you from an empty database.
  • 🔔 Alerts where you work — Slack, Telegram, Discord or any webhook (n8n, Make, Zapier).
  • 🤖 AI-ready — compact mode plus excludeEmptyFields keep payloads small for LLM pipelines and MCP clients.

🚀 How to scrape TikTok Shop

  1. Type one or more search terms (e.g. lash serum) — or paste product / shop URLs into Product or shop URLs.
  2. Pick your filters — price band, minimum rating, minimum units sold, deals only — and a sort order (Best sellers for product research).
  3. Set Max products, then decide whether to fetch full product details and add seller statistics.
  4. (Optional) Turn on incremental mode, point it at Notion, Slack or a webhook, then open Schedules for a recurring run.
  5. Click Start — results stream into the Output tab. Download as JSON, CSV or Excel, or pull them from the API.

No login, no cookies, no setup — it runs out of the box.

{
"searchTerms": ["lash serum"],
"sortBy": "best sellers",
"minSoldCount": 1000,
"maxResults": 100,
"includeShopStats": true
}

That returns the 100 best-selling lash-serum listings that have already moved 1,000+ units, each with its price, rating, sold count, the video driving it and the seller's shop stats.


Input

Configure it in the visual editor — no code needed — or pass JSON via the API. 37 inputs, grouped exactly as they appear in the editor.

FieldTypeWhat it does
searchTermsarrayKeywords to search, one per line. Each gets an even share of maxResults.
productUrlsarrayScrape specific products or shops instead of, or as well as, searching.
maxResultsintegerStop after this many products in total, split across your search terms (default 40).
sortByenumrelevance, best sellers, price low to high, price high to low, newest.

How maxResults is shared. The budget splits evenly, and any share a keyword can't fill passes to the ones after it — so two keywords at 40 give roughly 20 each, but if the first only finds 5 the second may return 35. You still get maxResults in total whenever the catalogue can supply it; the split only decides which keyword contributes.

🎚️ Filters

FieldTypeWhat it does
minPrice / maxPriceintegerOnly return products inside this price band (USD).
minRatingenum"3", "4" or "5" — 3 stars & up, 4 stars & up, or 5 stars only.
minSoldCountintegerOnly return products that have sold at least this many units.
dealsOnlybooleanRestrict the search to products currently running a promotion.
categoryIdsarrayBias a search towards categories (a soft hint — TikTok re-ranks rather than excludes).
strictFiltersbooleanDrop products outside your bounds (default on).

📄 Output & AI modes

FieldTypeWhat it does
includeProductDetailsbooleanAdds descriptions, every image, variants and SKUs with live stock, specifications, shipping, category path, star histogram, reviews and business identity.
includeShopStatsbooleanAttach the seller's units sold, followers, product, video and review counts to every product.
compactbooleanCore decision fields only — ideal for LLM pipelines.
excludeEmptyFieldsbooleanOmit null or empty fields for a smaller payload.
descriptionFormatenumall, text, html or markdown.
descriptionMaxLengthintegerTruncate descriptions at this many characters.

♻️ Monitoring & alerts

FieldTypeWhat it does
incrementalModebooleanLabel every product NEW, UPDATED or UNCHANGED; unchanged ones are skipped and cost nothing.
stateKeystringName the monitor so several scheduled searches track different sets independently.
emitUnchanged / emitExpiredbooleanAlso return UNCHANGED products, or emit an EXPIRED record for delisted ones.
slackWebhookUrl / discordWebhookUrlstringPost new and updated products to a Slack or Discord channel.
telegramToken / telegramChatIdstringSend the same summary to a Telegram chat or channel.
webhookUrl / webhookHeadersstring / objectPOST them as JSON to n8n, Make, Zapier or your own service.
notificationLimitintegerHow many products to list per message (default 5).

🔗 Destinations

FieldTypeWhat it does
notionApiKeystringA Notion internal-integration secret (ntn_…).
notionDatabaseIdstringThe target database's URL or 32-character ID. One product = one page.
notionCreatePropertiesbooleanCreate missing columns with the right Notion type (on by default).
clayWebhookUrl / clayAuthTokenstringA Clay table's webhook URL, plus its auth token if you set one.

⚙️ Advanced

FieldTypeWhat it does
detailConcurrencyintegerProduct pages fetched in parallel when full details are on (default 6).
maxRequestRetriesintegerRetries before giving up on a failed request (default 3).
ignoreUrlFailuresbooleanWarn and continue when a start URL can't be interpreted.
proxyConfigurationobjectTikTok Shop serves only its US storefront, so the run must exit from the US. The default is already set.

More example inputs

Deep-dive specific products, then watch a niche daily:

{
"productUrls": ["https://shop.tiktok.com/us/pdp/lash-enhancing-serum-grandelash-md/1729385295623787416"],
"includeProductDetails": true,
"descriptionFormat": "markdown"
}
{
"searchTerms": ["collagen peptides", "hair growth oil"],
"sortBy": "best sellers",
"incrementalMode": true,
"emitExpired": true,
"slackWebhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ"
}

A shop URL (/us/store/.../7495...) returns one seller-summary row, not its catalogue — to get a shop's products, search its brand name and filter by shopName.


Output

Each dataset item is one TikTok Shop product. A real record (trimmed):

{
"id": "1729385295623787416",
"title": "GrandeLASH-MD Lash Enhancing Serum - Grande Cosmetics - Ophthalmologist Tested Formula for Healthier & Thicker Looking Lashes",
"url": "https://shop.tiktok.com/us/pdp/lash-enhancing-serum-grandelash-md-for-longer-healthier-lashes/1729385295623787416",
"searchKeyword": "lash serum",
"price": 46.8,
"originalPrice": 58.5,
"discountPercent": "20%",
"savingAmount": 18.0,
"currency": "USD",
"minSkuPrice": 46.8,
"maxSkuPrice": 162.5,
"skuCount": 3,
"rating": 4.8,
"reviewCount": 4172,
"soldCount": 25286,
"ratingBreakdown": { "star1": 124, "star2": 33, "star3": 49, "star4": 292, "star5": 3674 },
"brand": "GRANDE COSMETICS",
"categoryPath": ["Beauty & Personal Care", "Skincare", "Eye Treatments"],
"categoryId": "601646",
"totalStock": 368665,
"inStock": true,
"shippingFee": 3.95,
"deliveryMinDays": 7,
"deliveryMaxDays": 10,
"videoId": "7579383383285845261",
"videoUrl": "https://www.tiktok.com/@/video/7579383383285845261",
"videoAuthorId": "6813519343507309574",
"videoCaption": "Lash serum I use @Grande Cosmetics - Lash Curler that I am using is from @Tweezerman",
"videoPlayCount": 8365500,
"videoLikeCount": 271551,
"videoPostedAt": "2025-12-02T21:59:04+00:00",
"shopName": "Grande Cosmetics",
"sellerId": "7495032900699327384",
"shopUrl": "https://shop.tiktok.com/us/store/grande-cosmetics/7495032900699327384",
"isVerifiedShop": true,
"shopSoldCount": 183711,
"shopFollowers": 135090,
"shopProductCount": 31,
"shopVideoCount": 2949,
"shopReviewCount": 8642,
"businessName": "Grande Cosmetics, LLC",
"businessAddress": "420 Columbus Ave, Valhalla, New York, 10595, The United States",
"detailFetched": true,
"scrapedAt": "2026-09-11T23:36:48.734972+00:00"
}

Which switch adds what

SwitchAdds
(none — every run)core commerce fields, the selling video, shopName / sellerId
includeProductDetailsdescriptions, imageUrls, skus, variants, specifications, stock, shipping, categoryPath, ratingBreakdown, reviews, business identity, ai* copy — and everything includeShopStats gives
includeShopStatsshop units sold, followers, product / video / review counts, region, shopUrl, shopLogo, isVerifiedShop
incrementalModechangeType, contentHash, isRepost, repostOfId, repostDetectedAt

Every field is present in standard mode (missing values are null); compact mode returns the core decision fields only; excludeEmptyFields drops empties. The Output tab ships two views: Overview and Best sellers.


♻️ How to monitor TikTok Shop prices with incremental mode

Schedule the Actor and turn on incremental mode: each run compares against the last and emits only NEW / UPDATED / EXPIRED products. A product counts as UPDATED when its title, price, rating, review count or units sold has moved. Unchanged products are recognised before their detail page is fetched, so you skip both the work and the cost.

Because you are billed per product returned, a monitor bills only for what actually moved:

Daily churnProducts trackedProducts billed per runProducts you are not billed for
5 %1,00050950
15 %1,000150850
30 %1,000300700

Multiply the billed column by the per-product figure on the Pricing tab to get your own number. A quiet day bills nothing at all beyond the run itself.

To set one up: turn on Incremental mode, give the monitor a stateKey so it doesn't collide with your other scheduled searches, run it once to seed the baseline, then add a recurring run in the Schedules tab. emitExpired also tells you when a product is delisted.


🔔 How to set up TikTok Shop alerts

Fill in any of slackWebhookUrl, discordWebhookUrl, telegramToken + telegramChatId, or webhookUrl (with optional webhookHeaders for auth), and you get told when a matching product appears, changes price or is delisted. All fire independently at the end of a run, and a broken channel can never stop the scrape. Pair them with incremental mode to hear only about genuinely new or changed products.


🔗 How to send TikTok Shop data to Notion

Paste a Notion integration token and a database ID, and every product is written into that database as it is scraped — no export, no CSV, no middleman. One product becomes one page with its main image as the cover, so a gallery view reads as a visual product board.

  1. Create an internal integration at notion.so/my-integrations and copy its secret (starts with ntn_) into notionApiKey.
  2. Make a database — leave it completely empty, the default Name column is enough.
  3. Open it, click ⋯ → Connections, connect your integration. Skip this and Notion answers object_not_found for a database that plainly exists.
  4. Paste its URL (or 32-character ID) into notionDatabaseId and run.

On the first run the Actor creates every column the database is missing, correctly typed — URL, date, number, select, multi-select, checkbox. price, soldCount and videoPlayCount arrive as real numbers you can sort and roll up, categoryPath and aiKeywords as filterable multi-selects. Set notionCreateProperties to false to write only into columns you made yourself. Nested fields (skus, variants, reviews) have no honest Notion column, so they stay in the Apify dataset rather than arriving as unusable JSON text.

Prefer Clay? clayWebhookUrl does the same into a Clay table — one product per row, nested fields as JSON a Clay formula column can parse.


💡 What can you do with TikTok Shop data?

Find winning products before they saturate

Sort by Best sellers with minSoldCount and minRating for a shortlist of proven movers in any niche. The bound video's play and like counts tell you whether momentum is still building or already peaked.

Reverse-engineer the video that is selling the product

Every record names the video driving the listing. Sort a whole category by videoPlayCount to see which creative formats, hooks and creators actually convert — then run that creator through the Profile or Comments Actor for their audience.

Unmask the real manufacturer behind a white-label listing

businessName and businessAddress expose the registered entity behind a shop. Group by business name and the duplicated supply chain shows up immediately.

Track prices, stock and delistings

Track price, discountPercent and soldCount and let changeType flag every move. Each run also returns current totalStock and per-SKU stock, so diffing two runs shows which size or colour is running down. emitExpired catches delistings the day they happen.

Rank sellers, and mine their reviews

Shop-level units sold, followers and product counts turn a product list into a seller-strength ranking, while reviews[] and ratingBreakdown give the exact 1★–5★ distribution behind each average — negatives for product fixes, positives for ad copy.


💰 How much does it cost to scrape TikTok Shop?

This Actor uses Apify's pay-per-event model: a small fee when a run starts, plus a per-product fee. See the Pricing tab for the current numbers — they render live, so this page never goes stale.

It runs on a lightweight, low-memory path with no browser overhead, which is why the per-product fee sits at the low end of the market. Two things cut your bill further: filters are applied during the search, so rows you filtered out are never fetched and never billed; and incremental mode means that after the baseline you pay only for what changed.


🔌 Integrations, export & the TikTok Shop API

Written to directly, row by row, while the run is still going: Notion and Clay. No export step, no middleman.

Everything else works the usual way: export to JSON, CSV, Excel or an HTML table, run it on a schedule, connect it to Google Sheets, Slack, Make, Zapier and n8n, or use it as an MCP tool for AI agents. To drive it from your own code:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("corvuslab/tiktok-shop-scraper").call(run_input={
"searchTerms": ["lash serum"],
"sortBy": "best sellers",
"minSoldCount": 1000,
"maxResults": 50,
"includeShopStats": True,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item["soldCount"], item["videoPlayCount"])

It also works with the JavaScript/TypeScript client and the Apify CLI.


❓ FAQ

Do I need a TikTok account, login or cookies? No — it reads public storefront pages and runs out of the box.

Which TikTok Shop storefront does it cover? The US storefront only. The run exits from the US, so you get the catalogue US shoppers see, in USD.

Why are the video fields empty on some products? Not every listing has a TikTok video bound to it. Those come back with the video fields null; listings pushed by creator content carry the full video block.

Why are businessName, ratingBreakdown and reviews missing? They live on the product page, so they need Fetch full product details. Even then businessName depends on the seller having filed it, and a listing with no reviews has an empty histogram.

Is soldCount lifetime or recent? The storefront's cumulative units-sold figure, rounded as TikTok Shop displays it. For velocity, schedule with incremental mode and diff soldCount between runs.

How many reviews come back per product? The most recent page of reviews plus the complete ratingBreakdown histogram — so you always get the exact 1★–5★ distribution behind the average, even when the text list is short.

Is there a TikTok Shop API? TikTok Shop has no public product API — no official endpoint for prices, ratings or units sold. This Actor is the practical substitute: structured JSON over the Apify REST API, with Python and JavaScript clients and an MCP interface.

Why doesn't originalPrice match savingAmount? savingAmount is the seller's promotional deduction and can include coupons stacked on the listed discount, so it won't always equal originalPrice − price. Where the storefront hides the pre-discount figure, originalPrice is reconstructed from price and discountPercent.

Is my data kept private? Your webhook URLs and API tokens are secret inputs on your own run — encrypted at rest, masked in the UI and never written to the run log.


This Actor collects only publicly available data — product listings, public shop pages and public reviews anyone can view without logging in. You are responsible for how you use it, in particular any personal information such as reviewer names or seller business addresses, and for complying with the site's terms and applicable law (including the GDPR/LGPD where they apply). Not affiliated with, endorsed by or sponsored by TikTok or ByteDance.


Keywords: tiktok shop scraper · tiktok shop api · scrape tiktok shop products · tiktok shop product data · tiktok shop search scraper · tiktok shop reviews scraper · tiktok shop seller data · tiktok shop sales data · tiktok product research · dropshipping product research · trending products tiktok · ecommerce competitor analysis · price monitoring · units sold tracking · tiktok shop to notion · export to CSV · export to Excel · no-code scraper · MCP tool for AI agents