TikTok Shop Trending Products + AI Ad Hooks & UGC Scripts
Pricing
from $3.50 / 1,000 product (search result)s
TikTok Shop Trending Products + AI Ad Hooks & UGC Scripts
TikTok Shop trending products & best selling products by keyword: sold count, sold per day, price, discount, rating, shop + AI ad hooks, UGC script, buyer persona and objections per product. For dropshipping, affiliates and TikTok Shop sellers. US, no login.
Pricing
from $3.50 / 1,000 product (search result)s
Rating
0.0
(0)
Developer
Mr Zack
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Find TikTok Shop trending products and best selling products by keyword — sold count, sales velocity (soldPerDay), price, discount, rating, reviews, shop and the creator video bound to each listing — and get an AI ad angle for every product: why it sells, who buys it, 3 scroll-stopping ad hooks, a 15-20 second UGC script, objections with answers, content formats and a price verdict. Built for dropshipping, TikTok Shop affiliates, UGC creators and sellers who check what is selling every day.
{ "keywords": ["posture corrector", "lip oil"], "sortBy": "best_sellers", "trackTrends": true, "aiAngles": true, "maxAiAngles": 20 }
No browser, no cookies, no login. Straight from TikTok Shop US's own web endpoints. $0.005 per product, +$0.02 per AI ad angle (only when delivered). Same engine as our TikTok Shop Product Scraper — this listing adds the AI angles and a daily trending setup.
For AI agents & LLMs — copy this block
Actor: tactful_anvil/tiktok-shop-trending-products (TikTok Shop US)Run: POST https://api.apify.com/v2/acts/tactful_anvil~tiktok-shop-trending-products/run-sync-get-dataset-items?token=APIFY_TOKENInput: {"keywords": ["lip oil"], "maxResultsPerKeyword": 30, "sortBy": "best_sellers", "trackTrends": true,"aiAngles": true, "maxAiAngles": 20, "aiLanguage": "en","minSoldCount": 0, "minRating": 0, "minVerdict": "any", "productUrls": []}Output: product rows {productId, title, url, price, originalPrice, discountPct, soldCount, soldPerDay (trackTrends),rating, reviewCount, shopName, video, verdict, verdictReason,aiAngle {whyItSells, buyerPersona, painPoints[], bestAngle, adHooks[3], ugcScript[{sec,beat,line}],objections[{objection,answer}], contentFormats[], priceVerdict, riskNotes},aiWhyItSells, aiBestAngle, aiHook1, aiHook2, aiHook3}+ free rows: market-summary (per keyword), changes-digest (trackTrends), failed.Price: $0.005 per product row, $0.01 per product-detail row, $0.02 per AI angle (only when delivered), $0.001 start.Notes: US marketplace only (geo-fenced). AI uses only the scraped data — no invented claims.
AI ad angles — what one product gets
aiAngles: true adds an aiAngle object (plus flat columns aiWhyItSells, aiBestAngle, aiHook1-aiHook3 for spreadsheets) to the best-placed products of every keyword, up to maxAiAngles per run:
| Field | What it is |
|---|---|
whyItSells | 1-2 sentences tying the demand signals (sold count, velocity, rating, discount) to the product's appeal |
buyerPersona, painPoints | who buys it and what it solves |
bestAngle | the strongest angle for a TikTok video |
adHooks | 3 opening lines (≤ 12 words) in different styles: question, bold claim, POV / story |
ugcScript | 4-5 timed beats for a 15-20 s UGC video (sec, beat, line) |
objections | likely buyer objections with short honest answers |
contentFormats, priceVerdict, riskNotes | video formats that fit, impulse-buy vs premium, claim / compliance / saturation risks |
The AI (Anthropic Claude) reads only the data scraped for that product and is told never to invent features, results or numbers. Products the AI could not analyse say why in aiAngle.error and are not charged for an angle. On the Apify free plan the first 10 products of a run are analysed.
Real example (cloud run, 29 Oct 2026 — keyword "lip oil")
e.l.f. Glow Reviver Lip Oil — $13 · 228,195 sold · 4.8★ (18,637 reviews)
- whyItSells: "Over 228,000 units sold with 18,637 reviews at 4.8 stars signals strong proven demand and trust for a low-cost beauty staple. A flash sale, free shipping and a creator video with over 9 million plays make it an easy impulse add-to-cart at 13 USD."
- adHooks: "Why does everyone on my feed have the same glossy lips?" · "This 13 dollar lip oil has 18,000+ five-star reviews." · "POV: you finally found a gloss that doesn't cost designer prices."
- ugcScript (0-3 s, hook): "Show bare lips, then say: this lip oil has over 228,000 sold, and I see why."
3-Count Moisturizing Lip Balm Set — $4.39 · 6 sold — the AI stays honest about thin data: "Only 6 units sold and no creator video, so demand proof is still thin."
Daily trending setup (schedule it)
- Keywords for your niches,
sortBy: "best_sellers",trackTrends: true,aiAngles: true. - Schedule the run daily (Apify Schedules). From the second run every product shows
soldPerDay— real sales velocity between your runs — andtrendSignal(hot / selling / flat / price-drop). - Add
minSoldPerDay(e.g. 20) andonlyChanges: trueto pay only for products that are moving; the AI angles then go to the products that just started selling. - Read the free
changes-digestrow per keyword for the headline: new listings, fastest sellers, price drops.
Who uses this (and the free signals you get without AI)
- Affiliates & creators — shortlist products worth promoting:
minVerdict: "shortlist",onlyWithCreatorVideo,minRating. Every row says why inverdictReason(sold, reviews, rating, discount, creator video). Commission rates are not shown on TikTok Shop's public pages, so this Actor does not output them. - Sellers watching competitors — a scheduled watch-list (
productUrls+trackTrends) gives one freechanges-digestrow per run: who sells fastest, price drops/rises, sold-out and removed products, plusstockChangeon every detail row. - Dropshippers & product researchers — filter by demand and margin before paying (
minSoldCount,maxPrice,minSoldPerDay), then validate the niche with the freemarket-summary: price quartiles, units sold, estimated GMV, discount share, top-3 shop share and TikTok's own related searches/categories as next keywords. - Agencies & brands —
includeShopLeaderboardranks the shops that dominate a keyword (sold share, median price, rating,shopVerified);searchPositionis a product's place in TikTok's search order. - Deal hunters —
minDiscountPct,onlyDiscounted, and withtrackTrendsthelowestPriceSeen/isNewLowestPricefields and the digest's price-drop list. - Automations (Sheets, Slack, Make, Zapier) — read the
changes-digestrow'sheadlineandcountsinstead of every product.
Input
| Field | Description |
|---|---|
keywords | Searches, one per line ("air fryer"). |
maxResultsPerKeyword | Products per keyword (30/page, max 600). Default 60. With filters it counts matching products. |
productUrls | shop.tiktok.com/us/pdp/…/<id>, tiktok.com/view/product/<id> or bare 19-digit ids → detail rows. |
enrichDetails | Fetch full details for every (matching) search result (charged per detail). |
includeMarketSummary | Free aggregate row per keyword (default on). |
trackTrends | Compare with your previous run: sold velocity, price moves, rank moves, free changes-digest (default off). |
onlyChanges | With trackTrends: unchanged products are skipped and not charged. |
includeShopLeaderboard · includeShops · includeFilters | Free extra rows (see below). |
sortBy | relevance (default), best_sellers, price_asc, price_desc, newest. |
{ "keywords": ["air fryer", "led strip lights"], "maxResultsPerKeyword": 90,"productUrls": ["https://shop.tiktok.com/us/pdp/9qt-dual-air-fryer/1732304925049327689"] }
Filters — applied before charging
Products that don't match are skipped and never charged. maxResultsPerKeyword counts only matching products: the Actor keeps paging TikTok's results (up to offset 2,000, stopping after 2 pages with no new products) until it has enough. Filters apply to keyword search results; product URLs are always returned. Empty or 0 = off, so inputs written before 0.1.8 run exactly as before.
| Filter | Keeps products… |
|---|---|
minSoldCount / maxSoldCount | whose lifetime sold count is at least / at most this |
minPrice / maxPrice | priced (USD) at least / at most this |
minRating | rated at least this (products without reviews have no rating and are skipped) |
minReviewCount | with at least this many reviews |
minDiscountPct | at least this % below the strike-through price |
freeShippingOnly | with TikTok's "Free shipping" label |
onlyDiscounted | shown with a strike-through price |
onlyWithCreatorVideo | with a TikTok video bound to the listing |
minSoldPerDay | selling at least this many units/day since your last run (needs trackTrends; nothing matches on the first, baseline run) |
minVerdict | with at least this verdict: watch or shortlist |
With filters on, the free market-summary and shop-leaderboard still describe every product scanned (the market), and the summary adds matchedFilters and filters.
{ "keywords": ["air fryer"], "maxResultsPerKeyword": 20, "minSoldCount": 500, "minRating": 4.5, "freeShippingOnly": true, "onlyWithCreatorVideo": true }
Verdict (free, on every product and product-detail row)
verdict | Rule |
|---|---|
shortlist | ≥ 500 sold, ≥ 20 reviews, ≥ 4.0★ and a discount or a creator video — or, with trackTrends, ≥ 50 sold/day observed since the last run (rating ≥ 4.0★ or none yet) |
watch | ≥ 100 sold, or selling since the last run |
skip | everything else, ratings under 3.5★ with 5+ reviews, sold-out or unavailable products |
verdictReason says it in plain words, e.g. "4,350 sold · 779 reviews · 4.7★ · 29% off · creator video" or "1,139 sold · 170 reviews · 4.6★ — no discount or creator video" (real rows from an "air fryer" search).
Output
product (one per search result):
{ "type": "product", "position": 1, "searchPosition": 1, "keyword": "air fryer", "productId": "1732306737130869211","title": "6-Quart Air Fryer with Window, 12-in-1 Square Design …", "url": "https://shop.tiktok.com/us/pdp/6-quart-air-fryer-with-window/1732306737130869211","price": 59.03, "originalPrice": 81.98, "discountPct": 28, "currency": "USD", "saving": 22.95,"rating": 5, "reviewCount": 6, "soldCount": 25, "sellerId": "7496210586501679579", "shopName": "Floft", "shopVerified": false, "brand": null,"freeShipping": true, "limitedTimeDeal": true, "labels": ["Limited time deal", "Free shipping"], "skuCount": 4, "seoUpdatedAt": "2026-04-01T15:47:54.251Z","image": "https://p16-oec-general-useast5.ttcdn-us.com/…600.webp","video": { "itemId": "7648948884764462367", "authorName": "Brenda Paola", "playCount": 1500, "likeCount": 161, "durationSec": 82, "isCreatorCommission": true, "url": "https://www.tiktok.com/@_/video/7648948884764462367" },"verdict": "skip", "verdictReason": "25 sold · 5★ — little proof of demand yet" }
| New field (0.1.8) | Meaning |
|---|---|
verdict, verdictReason | free shortlist label and its reason (see above) |
shopVerified | TikTok's blue-check shop badge |
searchPosition | place in TikTok's search order among the products read (position is the place in your output after sorting and filters) |
product-detail (one per product id):
{ "type": "product-detail", "productId": "1732306737130869211", "title": "6-Quart Air Fryer with Window …", "price": 59.03, "originalPrice": 81.98, "discountPct": 28,"rating": 5, "reviewCount": 6, "soldCount": 25, "shopName": "Floft", "available": true, "freeShipping": true, "deliveryMinDays": 3, "deliveryMaxDays": 6,"description": "6 Quart Air Fryer with Window: Your Versatile Kitchen Companion\n✨ Spacious 6.34QT Capacity …","images": ["https://p16-oec-general-useast5.ttcdn-us.com/…"], "videoCount": 1,"skuCount": 4, "totalStock": 311, "soldOut": false, "variantDimensions": { "Color": ["pink", "black", "White", "Gray"] },"skus": [{ "skuId": "1732306737131000283", "options": { "Color": "pink" }, "price": 59.03, "originalPrice": 81.98, "stock": 311, "inStock": true, "weightKg": 5.448, "dimensionsCm": "31x39x38" }],"dealEndsAt": "2026-09-07T06:56:00.000Z","properties": { "CA prop 65: repro. chems": "No" }, "businessName": "Shenzhen Yunqi Network Technology Co Ltd", "businessAddress": "Room 502, …, Shenzhen, Guangdong, China","verdict": "skip", "verdictReason": "25 sold · 5★ — little proof of demand yet" }
soldOut is true only when every SKU shows 0 stock. dealEndsAt is the end of the limited-time-deal countdown shown on the page (null without one).
market-summary (free, per keyword): listings, priceMin, priceP25, priceMedian, priceP75, priceMax, avgRating, totalSoldCount, avgSoldCount, estimatedGmv, withVideoPct, freeShippingPct, discountedPct, avgDiscountPct, topShops[], top3ShopSoldShare, verdictCounts {shortlist, watch, skip}, relatedSearches[], relatedCategories[] {name, categoryId, url} — plus matchedFilters, filters when filters are on. relatedSearches / relatedCategories are the related links TikTok shows on the search page: ready-made next keywords.
Failed ids / blocked keywords are pushed as type: "failed" rows and are never charged.
Trends between runs (what a one-off scraper can't tell you)
Run it on a schedule with trackTrends: true and every product carries what actually happened since the last run:
| Field | Meaning |
|---|---|
soldCountChange, soldPerDay | units sold since last run and the observed daily velocity — not an estimate |
priceChange, priceChangePct | price moves; trendSignal: "price-drop" when ≥10 % cheaper |
rankChange | position change for the same keyword (positive = climbed) |
isNewListing | product not seen in the previous run |
trendSignal | hot (≥50 sold/day observed), selling, flat, price-drop, price-up |
lowestPriceSeen, isNewLowestPrice | lowest price seen across your runs, and whether today's price is below every earlier one (0.1.8) |
stockChange | product-detail rows: total stock now minus at the last run (0.1.8) |
changes-digest (free, 0.1.8) — one row per keyword and one for your productUrls watch-list, so you don't have to read every product:
| Field | Meaning |
|---|---|
headline | one line, e.g. "<keyword>: <n> hot, <n> price drops ≥10 %, <n> new in results, <n> dropped out · top: "<title>" <n>/day" |
counts | hot, selling, flat, priceDrops, priceRises, newLowestPrice, newEntries, droppedOut, soldOut, unavailable |
topSoldPerDay | up to 10 products with the highest observed soldPerDay |
priceDrops, priceRises | price moves of 10 % or more, with previousPrice |
newEntries, droppedOut | products that entered / left this keyword's results since its last run (droppedOut only judges positions this run covered; lists restart when your filters change) |
soldOutProducts, unavailableProducts | details now at 0 stock (with previousStock), watch-list products that no longer load |
The first run only saves a baseline (baseline: true). Add onlyChanges: true for a watch-list: unchanged products are skipped and not charged — the digest still covers all of them. Add includeShopLeaderboard: true for a free per-keyword ranking of the shops that dominate the results (shop-leaderboard rows: listings, sold share, median price, rating, best position, shopVerified).
Example (daily schedule): { "keywords": ["air fryer", "led mask"], "maxResultsPerKeyword": 100, "trackTrends": true, "includeShopLeaderboard": true } · watch-list: { "productUrls": ["…"], "trackTrends": true, "onlyChanges": true } · rising products only: { "keywords": ["air fryer"], "trackTrends": true, "minSoldPerDay": 20 }
Trend memory lives in a key-value store named tiktok-shop-trends in your own account (one small record per product, plus the last result list per keyword).
Pricing (pay per event)
| Event | Price |
|---|---|
| Product (search result) | $0.005 (lower on paid Apify plans) |
| Product detail | $0.01 (lower on paid Apify plans) |
AI ad angle (aiAngles) | $0.02 per analysed product, only when delivered |
| Actor start | $0.001 |
Examples: 1 keyword × 30 products with 20 AI angles ≈ $0.55 · 5 keywords × 30 products, AI off ≈ $0.75. Products skipped by filters or onlyChanges, products without an angle, summary, leaderboard, digest, failed and duplicate rows are free. "Maximum cost per run" is respected exactly: AI angles are only written for what still fits after the product rows.
Changelog
- 0.1.0 (29 Oct 2026) — First release: the TikTok Shop Product Scraper engine (0.1.8: filters before charging, verdicts, trends, digest) with a daily trending setup and AI ad angles (
aiAngles,maxAiAngles,aiLanguage; eventai-angle$0.02).
Notes
- US marketplace only (shop.tiktok.com/us). Other regions are served by different storefronts and are not covered yet — open an issue if you need one.
soldCountis TikTok's own lifetime counter shown on the listing;estimatedGmvin the summary = Σ soldCount × current price (rough, lower-bound-ish).- Default order is TikTok's relevance;
sortByre-orders the fetched set. Results are de-duplicated per keyword. - TikTok changes its storefront often; if a field turns
nullwhere you can see it on the page, open an issue with the product id.
Found this useful? A review helps more than you'd think
If this Actor saved you time, a short review on the Reviews tab of this Store page takes 30 seconds and helps other users decide before they spend anything. If something is broken instead, open a ticket on the Issues tab — parser bugs and field requests get fixed.
Related Actors from the same account