๐Ÿ›๏ธ TikTok Shop Data Scraper: Reviews & Sentiment Analysis avatar

๐Ÿ›๏ธ TikTok Shop Data Scraper: Reviews & Sentiment Analysis

Pricing

from $2.99 / 1,000 results

Go to Apify Store
๐Ÿ›๏ธ TikTok Shop Data Scraper: Reviews & Sentiment Analysis

๐Ÿ›๏ธ TikTok Shop Data Scraper: Reviews & Sentiment Analysis

๐Ÿ›๏ธ TikTok Shop Data Scraper extracts product & store data with speed and accuracy. ๐Ÿ“Š Ideal for market research, competitor tracking, and trend analysisโ€”helping you find opportunities faster. ๐Ÿš€ Download now!

Pricing

from $2.99 / 1,000 results

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

2 days ago

Last modified

Share

TikTok Shop Scraper โ€” Products, Reviews & Sentiment Analysis

TikTok Shop Scraper extracts product listings, full customer reviews, and reviewer trust signals from TikTok Shop's US storefront โ€” searchable by keyword, category link, seller store link, or direct product URL. Each record returns price, rating, sold count, seller details, and top affiliate creators, plus โ€” when reviews are enabled โ€” every fetched review with reviewer ID, verified-purchase and incentivized-review flags, and optional AI-generated sentiment and topic tags. Built for e-commerce analysts, dropshippers, brand-monitoring teams, and market researchers who need structured TikTok Shop data as clean JSON, not screenshots.

๐Ÿงญ What is TikTok Shop Scraper?

TikTok Shop Scraper is an Apify Actor that collects product and review data from shop.tiktok.com without requiring a TikTok account, seller login, or API key of any kind. It reverse-engineers the same JSON endpoints the TikTok Shop web app itself calls, so results come back as typed, structured records rather than raw HTML.

Key features:

  • ๐Ÿ” Discovery by keyword, category, seller, or URL โ€” run a free-text keyword search, or paste a product (/pdp/), category (/c/), or seller/store (/store/) link and the type is auto-detected
  • ๐Ÿ’ฒ Core commerce fields โ€” price, formatted price, currency, original price and discount when a product is on sale, rating, review count, sold count, and a real (non-guessed) stock/sold-out signal
  • ๐Ÿ“ Full review collection with trust signals โ€” reviewer ID, avatar, verified-purchase flag, incentivized-review flag, plus computed verifiedPurchaseRatio and incentivizedReviewRatio per product
  • ๐Ÿค– Optional AI sentiment & topic analysis โ€” sends fetched review text to an LLM of your choice (Anthropic, OpenAI, Google, xAI, DeepSeek, Perplexity, or Mistral) and returns per-review sentiment plus up to 5 topic tags
  • ๐Ÿ‘ฅ Affiliate creator aggregation โ€” the top 5 TikTok creators driving traffic to each product, with video count, plays, likes, and an affiliate flag
  • ๐Ÿ“ค Standard Apify dataset output โ€” every record is pushed live as it's collected, exportable as JSON, CSV, Excel, or HTML directly from the Output tab

๐Ÿ“Š What data can I extract with TikTok Shop Scraper?

Every product record combines commerce fields, review/sentiment data, and creator data in one row. Fields marked "conditional" only appear when the relevant input is enabled or the data exists for that product.

FieldExample ValueUse Case
product_id"1729496283565954438"Unique key for deduping and re-fetching a specific product
title"Nike Air Max 270 Men's Shoes"Product name for search/matching
url"https://shop.tiktok.com/us/pdp/1729496283565954438"Canonical link back to the live listing
price74.95Numeric price for sorting/filtering
price_formatted"$74.95"Display-ready price string
currency"USD"Currency code
original_price (conditional)99.95Pre-discount price โ€” only present when the product is on sale
discount (conditional)"-25%"Discount label โ€” only present alongside original_price
rating4.8Overall star rating
review_count1243Total review count TikTok reports for the product
seller_id"7000123456789012345"TikTok Shop seller/store identifier
seller_name"Nike Official Store"Seller display name
image_url"https://p16-oec-va.ibyteimg.com/..."Primary product image
sold_count5000Units sold, per TikTok's own counter
is_sold_outfalseReal stock signal derived from per-SKU quantities; null when the row degraded to listing-card data (see the limitation below)
creator_count12Distinct TikTok creators whose videos are linked to this product
has_creator_datatrueWhether any creator/affiliate video data was found
total_creator_videos34Total linked videos across all creators
top_creators (conditional)see Output sampleTop 5 creators by video count โ€” only present when creator_count > 0
reviews_fetched10Reviews actually returned this run, bounded by maxReviews
reviews_accessibletrueWhether TikTok's review endpoint returned any usable data for this product at all
reviews (conditional)see Output sampleParsed review objects โ€” only present when includeReviews is on and at least one review was fetched
verifiedPurchaseRatio (conditional)0.8Share of fetched reviews flagged verified-purchase โ€” only present alongside reviews
incentivizedReviewRatio (conditional)0.2Share of fetched reviews flagged as incentivized (free product/discount for a review) โ€” only present alongside reviews
aiSentimentSummary (conditional){"positive":7,"neutral":2,"negative":1}Per-product sentiment breakdown โ€” only present when AI enrichment produced at least one result
scraped_at"2026-08-04T10:15:32.123456"ISO timestamp of collection
source"product_page""product_page" for a full detail fetch, "listing_card" when the detail page was blocked and the row degraded to search/listing data

๐Ÿ“ Review & sentiment data

Each entry in reviews[] carries: review_id, rating, text, reviewer_id, reviewer_name, reviewer_avatar_url, review_time (Unix seconds), is_verified_purchase, is_incentivized_review, sku_specification, country, images (array of URLs), and display_image_url. When aiEnhancement is on, each review also gets ai_sentiment ("positive"/"neutral"/"negative"/null) and ai_topics (up to 5 short tags, or null on a failed call) โ€” these two keys are absent entirely when AI enrichment is off. reviewer_id, reviewer_avatar_url, and display_image_url are the fields this variant harvests that a bare product scrape would drop. This is the decision-driving layer: verifiedPurchaseRatio and incentivizedReviewRatio tell you how much to trust a product's star rating before you buy or list it, and aiSentimentSummary gives a one-glance read on whether reviews skew positive without reading them all.

๐ŸŽฏ Targeting & segmentation fields

price, rating, sold_count, is_sold_out, seller_id/seller_name, and source are the fields you filter and segment on downstream. Combine sortBySoldCount with price to find high-volume, low-price products for dropshipping, or filter seller_id to track one seller's full catalog over repeated runs. creator_count and total_creator_videos let you segment products by how much organic/affiliate video traffic they're already getting.

๐Ÿ› ๏ธ Why not build this yourself?

TikTok Shop has no public, general-purpose API for browsing arbitrary sellers' catalogs or pulling reviews at scale โ€” its Partner API surface is scoped to a seller managing their own shop, not to a third party researching the marketplace. Building this yourself means reverse-engineering the __MODERN_ROUTER_DATA__ payload embedded in the product page HTML, the product_list and get_product_reviews JSON endpoints, and handling the fact that TikTok Shop only serves real data to US exit IPs โ€” which means running your own proxy escalation logic (direct โ†’ datacenter โ†’ residential) and retry/backoff handling before you've extracted a single field.

TikTok Shop Scraper already does that reverse-engineering, escalates through Apify's proxy tiers automatically, and normalizes the result into a stable JSON schema โ€” so you get structured data on day one instead of after weeks of endpoint archaeology.

๐Ÿ’ก How to use data extracted from TikTok Shop?

๐Ÿ“Š E-commerce & pricing analysts

Pull a category or keyword's full product set with sortBySoldCount: "highest_first" to rank best-sellers by real sold-count, then compare price, original_price, and discount across sellers to spot underpriced or overpriced listings. Combine with rating and review_count to separate genuinely popular products from ones propped up by discounting.

๐Ÿข Agencies & brand-monitoring services

Point urls at a client's own /store/ link on a recurring Apify schedule to track their full catalog โ€” sold_count, is_sold_out, and verifiedPurchaseRatio over time flag stockouts, price drift, or a sudden dip in review trustworthiness before the client notices.

๐Ÿ”ฌ Market research and intelligence

Run the same keyword across multiple runs to map category density and price distribution, or use aiSentimentSummary across a product set to find which product attributes (ai_topics like "sizing", "shipping", "quality") drive negative reviews across an entire niche, not just one listing.

๐Ÿค– AI agents and automated pipelines

Feed reviews[].text and ai_sentiment into a RAG pipeline or agent tool for automated competitor-review summarization, or trigger the Actor from an agent framework via the Apify API whenever a new product URL needs enrichment.

๐Ÿ”ผ Input sample

None of the parameters are required โ€” provide at least one of searchKeywords or urls, or the run exits immediately with nothing to scrape.

ParameterRequiredTypeDescriptionExample Value
searchKeywordsNoArray of stringsKeywords to search TikTok Shop for. Each keyword runs its own search.["shoes", "skincare"]
urlsNoArray of stringsTikTok Shop URLs to scrape โ€” type auto-detected: product (/pdp/), category (/c/), or seller/store (/store/).["https://shop.tiktok.com/us/pdp/1729496283565954438"]
maxProductsNoInteger (10โ€“100000, default 10)Maximum products to fetch per search keyword / category / seller.50
includeReviewsNoBoolean (default false)Fetch product reviews, reviewer trust fields, and trust ratios. Required for AI sentiment analysis. Not every product exposes accessible reviews.true
maxReviewsNoInteger (1โ€“100, default 10)Maximum reviews to fetch per product.25
sortBySoldCountNoString enum: "none" | "highest_first" | "lowest_first" (default "none")Orders products by units sold. Products are always pushed live in real time regardless of sort; the sorted order is additionally saved as a Key-Value Store snapshot at the end of the run."highest_first"
aiEnhancementNoBoolean (default false)Runs each fetched review through an LLM for sentiment + up to 5 topic tags, plus a per-product summary. Requires includeReviews: true and an API key. Any failure leaves sentiment fields null, never fabricated.true
aiModelNoString enum (default "claude-haiku-4-5")AI model/provider โ€” see full list below. Provider is auto-detected from the model name prefix."claude-haiku-4-5"
aiApiKeyNoString (secret)API key for the selected provider. Falls back to an environment variable (ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, XAI_API_KEY, DEEPSEEK_API_KEY, PERPLEXITY_API_KEY, or MISTRAL_API_KEY) if left blank."sk-ant-..."
maxRetriesNoInteger (1โ€“10, default 5)Maximum retry attempts per request before giving up.5
requestDelayNoInteger, ms (0โ€“2000, default 0)Delay between requests. Lower is faster but may trigger rate limits.200
maxConcurrencyNoInteger (1โ€“20, default 20)Maximum concurrent requests.10
timeoutNoInteger, seconds (10โ€“300, default 60)Per-request timeout. Increase if using slow proxies.60
proxyConfigurationNoObject (default {"useApifyProxy": false})By default the scraper connects directly and auto-escalates to Datacenter then Residential (US) proxy. Residential in the US is recommended for the most reliable results.{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}
{
"searchKeywords": ["wireless earbuds"],
"maxProducts": 50,
"includeReviews": true,
"maxReviews": 25,
"sortBySoldCount": "highest_first",
"aiEnhancement": true,
"aiModel": "claude-haiku-4-5",
"aiApiKey": "",
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

Common pitfall: turning on aiEnhancement without also turning on includeReviews does nothing โ€” there is no review text to analyze, and the Actor logs a warning and skips AI enrichment entirely. Also note urls must match shop.tiktok.com (the input schema enforces this pattern); links from www.tiktok.com/shop/... search-result pages won't validate.

๐Ÿ”ฝ Output sample

Output is typed, normalized JSON with a consistent schema per record, pushed live to the Apify dataset as each product finishes. Export as JSON, CSV, Excel, or HTML from the Output tab, or pull it via the Apify API/apify-client.

{
"product_id": "1729496283565954438",
"title": "Nike Air Max 270 Men's Running Shoes",
"url": "https://shop.tiktok.com/us/pdp/1729496283565954438",
"price": 74.95,
"price_formatted": "$74.95",
"currency": "USD",
"original_price": 99.95,
"discount": "-25%",
"rating": 4.8,
"review_count": 1243,
"seller_id": "7000123456789012345",
"seller_name": "Nike Official Store",
"image_url": "https://p16-oec-va.ibyteimg.com/example-image~tplv-obj.jpg",
"sold_count": 5000,
"is_sold_out": false,
"creator_count": 3,
"has_creator_data": true,
"total_creator_videos": 7,
"top_creators": [
{
"nickname": "sneakerdrops",
"video_count": 4,
"total_plays": 812400,
"total_likes": 45200,
"is_affiliate": true
}
],
"reviews_fetched": 2,
"reviews_accessible": true,
"reviews": [
{
"review_id": "7123456789012345678",
"rating": 5,
"text": "True to size and shipped fast, exactly what I expected.",
"reviewer_id": "7009988776655443322",
"reviewer_name": "j***n",
"reviewer_avatar_url": "https://p16-oec-va.ibyteimg.com/avatar~tplv.jpg",
"review_time": 1753142400,
"is_verified_purchase": true,
"is_incentivized_review": false,
"sku_specification": "Size: 10, Color: Black",
"country": "US",
"images": [],
"display_image_url": null,
"ai_sentiment": "positive",
"ai_topics": ["sizing", "shipping"]
}
],
"verifiedPurchaseRatio": 0.5,
"incentivizedReviewRatio": 0.0,
"aiSentimentSummary": { "positive": 1, "neutral": 1, "negative": 0 },
"scraped_at": "2026-08-04T10:15:32.123456",
"source": "product_page"
}

๐ŸŽฏ How do you filter and target specific products?

TikTok Shop Scraper supports four real narrowing controls โ€” combine them rather than running one keyword at a time:

  1. Keyword vs. direct URL. searchKeywords runs a live category-agnostic search and is best when you don't know the exact seller or product yet. urls is more precise: a /store/ link pulls one seller's entire catalog, a /c/ link scopes to a specific category, and a /pdp/ link fetches one exact product. Mixing both in one run is supported โ€” keyword results and URL results are deduplicated by product_id.
  2. Volume controls. maxProducts (10โ€“100,000) caps how many products come back per keyword/category/seller โ€” the scraper paginates the listing internally in pages of 20 with a generous page budget, and stops early once two consecutive pages return no new products. maxReviews (1โ€“100) caps reviews per product independently.
  3. Ranking, not filtering. sortBySoldCount reorders by units sold (highest_first for best-sellers, lowest_first for the long tail) โ€” this doesn't reduce the result count, it changes which end of the list you see first in the sorted Key-Value Store snapshot.
  4. Post-fetch quality signals. There's no input-level minimum-rating or minimum-review-count filter โ€” instead, rating, review_count, verifiedPurchaseRatio, and incentivizedReviewRatio come back on every row so you filter or sort on them after the run, in whatever tool you export to.
{ "searchKeywords": ["phone case"], "maxProducts": 200, "sortBySoldCount": "highest_first" }
{ "urls": ["https://shop.tiktok.com/us/store/seller/789"], "maxProducts": 100, "includeReviews": true, "maxReviews": 50 }
{ "urls": ["https://shop.tiktok.com/us/pdp/1729496283565954438"], "includeReviews": true, "maxReviews": 100, "aiEnhancement": true }

โ–ถ๏ธ Want to try other TikTok scrapers?

ScraperWhat it extracts
TikTok Data Scraper โ€” Video, Hashtag & Sound PerformanceVideo, hashtag, and sound performance analytics from TikTok
TikTok Trending Creator Insights Scraper With Per-Video StatsTrending TikTok creators with per-video engagement stats
Otomoto.pl Scraper With Dealer Contact LeadsVehicle marketplace listings with dealer contact details
Google Maps places + the booking platform each venue runs onBusiness directory listings with reservation/ordering links

โš™๏ธ How to extract TikTok Shop data programmatically

TikTok Shop Scraper runs as a standard Apify Actor: one API call starts the run, and results land in a dataset you fetch as structured JSON โ€” no separate TikTok credentials needed.

Python example

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_API_TOKEN>")
run = client.actor("<your-username>/tiktok-shop-data-scraper-reviews-and-sentiment-analysis").call(
run_input={
"searchKeywords": ["skincare"],
"maxProducts": 50,
"includeReviews": True,
"maxReviews": 20,
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item["price_formatted"], item["rating"])

Export to spreadsheets or CRM

From the Output tab, export directly to CSV or Excel โ€” title, price, seller_name, rating, and sold_count map cleanly to spreadsheet columns for a pricing tracker, or into a CRM/BI tool via the dataset's JSON/CSV API endpoint for ongoing seller or category monitoring.

Yes โ€” TikTok Shop's product listings, prices, and seller catalogs are public pages published for anyone to browse, and scraping publicly accessible data is generally lawful. Product, price, and seller records are business/product data, not personal data, and are governed primarily by TikTok's Terms of Service and database-rights considerations rather than GDPR or CCPA. Reviews are a partial exception: when includeReviews is on, fetched review records include a reviewer_name and reviewer_id, which can be personal data under GDPR/CCPA if the reviewer is identifiable โ€” so storing or reusing review data at scale should account for that lawful basis. Consult legal counsel for commercial applications involving bulk storage of personal data.

โ“ Frequently asked questions

Does it tell me if a product is out of stock or delisted?

Yes โ€” is_sold_out is computed from real per-SKU stock quantities (or a stock-status fallback), not a guessed constant, and defaults to false only when no stock signal exists at all. It comes back null on rows that degraded to source: "listing_card" (see "What happens if the product detail page is blocked?" below), because a listing card genuinely carries no per-SKU stock data.

Can I get reviews along with the main product data?

Yes โ€” set includeReviews: true to get up to maxReviews (max 100) reviews per product, each with reviewer ID, avatar, verified-purchase and incentivized-review flags, plus computed verifiedPurchaseRatio/incentivizedReviewRatio. Not every product exposes accessible reviews to the reviews endpoint; the reviews_accessible field tells you whether TikTok returned anything for that product at all.

How accurate is the price and rating data?

The Actor returns data exactly as it appears on the public TikTok Shop listing at request time. Accuracy depends on how current the seller keeps their own listing โ€” for time-sensitive use (pricing alerts, stock monitoring), re-run on a schedule rather than relying on a single snapshot.

How many products and reviews can I get per run?

maxProducts accepts 10 to 100,000 per keyword/category/seller (default 10), and maxReviews accepts 1 to 100 per product (default 10) โ€” both are hard input caps enforced by the Actor. There's no separate result-count limit beyond what TikTok Shop's own listing actually contains.

What happens if the product detail page is blocked?

If TikTok's anti-bot blocks the per-product detail fetch even after the proxy ladder escalates to Residential, the row doesn't get dropped outright โ€” when the product came from a keyword/category/store search, the Actor falls back to the real title/price/rating/seller/sold-count data already captured during discovery (source: "listing_card"). These fallback rows never include reviews, creator data, or AI sentiment, and is_sold_out is null since a listing card carries no per-SKU stock data. A bare product URL with no prior listing card and a blocked detail page is skipped entirely โ€” it's not pushed and not charged.

How do I target one seller's entire catalog?

Paste that seller's /store/ URL into urls and raise maxProducts to cover the catalog size โ€” the Actor walks that seller's full product listing the same way it walks a keyword search.

Does TikTok Shop Scraper work with Claude, ChatGPT, and AI agent frameworks?

There's no dedicated MCP server for this Actor. It's callable as a standard HTTP endpoint via the Apify API or apify-client SDK from any agent framework, and the aiModel/aiApiKey inputs let you route the built-in review-sentiment step through Anthropic, OpenAI, Google, xAI, DeepSeek, Perplexity, or Mistral models โ€” that's a data-enrichment feature of the scraper, separate from calling the Actor itself as an agent tool.

How does this differ from a plain TikTok Shop product scraper?

Compared to a bare product/price scraper, this variant adds the review-analytics layer: reviewer ID, reviewer avatar URL, the incentivized-review flag, and display_image_url on every review, plus the computed verifiedPurchaseRatio/incentivizedReviewRatio trust signals and optional AI sentiment/topic tagging โ€” none of which a listing-only scrape can produce, since they require the reviews endpoint and (for sentiment) an LLM call on top.

Can I use it without a TikTok account or developer credentials?

Yes โ€” no TikTok login, account, or API key is required to scrape products and reviews. The only credential you might supply is your own LLM API key (aiApiKey), and only if you turn on AI sentiment analysis.

โœ… Conclusion

TikTok Shop Scraper turns TikTok Shop's product catalog and reviews into structured, exportable JSON โ€” prices, ratings, sold counts, reviewer trust signals, and optional AI sentiment, without a TikTok account or any reverse-engineering on your end. It's built for analysts, agencies, and automated pipelines that need to monitor a category, a seller, or a single product's review sentiment on a repeatable basis. Start a run from the Apify Console with a keyword or a product/store/category URL, or call it from your own code with apify-client.