TikTok Shop Trending Products + AI Ad Hooks & UGC Scripts avatar

TikTok Shop Trending Products + AI Ad Hooks & UGC Scripts

Pricing

from $3.50 / 1,000 product (search result)s

Go to Apify Store
TikTok Shop Trending Products + AI Ad Hooks & UGC Scripts

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

Mr Zack

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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_TOKEN
Input: {"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:

FieldWhat it is
whyItSells1-2 sentences tying the demand signals (sold count, velocity, rating, discount) to the product's appeal
buyerPersona, painPointswho buys it and what it solves
bestAnglethe strongest angle for a TikTok video
adHooks3 opening lines (≤ 12 words) in different styles: question, bold claim, POV / story
ugcScript4-5 timed beats for a 15-20 s UGC video (sec, beat, line)
objectionslikely buyer objections with short honest answers
contentFormats, priceVerdict, riskNotesvideo 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."

  1. Keywords for your niches, sortBy: "best_sellers", trackTrends: true, aiAngles: true.
  2. Schedule the run daily (Apify Schedules). From the second run every product shows soldPerDay — real sales velocity between your runs — and trendSignal (hot / selling / flat / price-drop).
  3. Add minSoldPerDay (e.g. 20) and onlyChanges: true to pay only for products that are moving; the AI angles then go to the products that just started selling.
  4. Read the free changes-digest row 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 in verdictReason (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 free changes-digest row per run: who sells fastest, price drops/rises, sold-out and removed products, plus stockChange on every detail row.
  • Dropshippers & product researchers — filter by demand and margin before paying (minSoldCount, maxPrice, minSoldPerDay), then validate the niche with the free market-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 — includeShopLeaderboard ranks the shops that dominate a keyword (sold share, median price, rating, shopVerified); searchPosition is a product's place in TikTok's search order.
  • Deal hunters — minDiscountPct, onlyDiscounted, and with trackTrends the lowestPriceSeen / isNewLowestPrice fields and the digest's price-drop list.
  • Automations (Sheets, Slack, Make, Zapier) — read the changes-digest row's headline and counts instead of every product.

Input

FieldDescription
keywordsSearches, one per line ("air fryer").
maxResultsPerKeywordProducts per keyword (30/page, max 600). Default 60. With filters it counts matching products.
productUrlsshop.tiktok.com/us/pdp/…/<id>, tiktok.com/view/product/<id> or bare 19-digit ids → detail rows.
enrichDetailsFetch full details for every (matching) search result (charged per detail).
includeMarketSummaryFree aggregate row per keyword (default on).
trackTrendsCompare with your previous run: sold velocity, price moves, rank moves, free changes-digest (default off).
onlyChangesWith trackTrends: unchanged products are skipped and not charged.
includeShopLeaderboard · includeShops · includeFiltersFree extra rows (see below).
sortByrelevance (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.

FilterKeeps products…
minSoldCount / maxSoldCountwhose lifetime sold count is at least / at most this
minPrice / maxPricepriced (USD) at least / at most this
minRatingrated at least this (products without reviews have no rating and are skipped)
minReviewCountwith at least this many reviews
minDiscountPctat least this % below the strike-through price
freeShippingOnlywith TikTok's "Free shipping" label
onlyDiscountedshown with a strike-through price
onlyWithCreatorVideowith a TikTok video bound to the listing
minSoldPerDayselling at least this many units/day since your last run (needs trackTrends; nothing matches on the first, baseline run)
minVerdictwith 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)

verdictRule
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
skipeverything 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, verdictReasonfree shortlist label and its reason (see above)
shopVerifiedTikTok's blue-check shop badge
searchPositionplace 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.

Run it on a schedule with trackTrends: true and every product carries what actually happened since the last run:

FieldMeaning
soldCountChange, soldPerDayunits sold since last run and the observed daily velocity — not an estimate
priceChange, priceChangePctprice moves; trendSignal: "price-drop" when ≥10 % cheaper
rankChangeposition change for the same keyword (positive = climbed)
isNewListingproduct not seen in the previous run
trendSignalhot (≥50 sold/day observed), selling, flat, price-drop, price-up
lowestPriceSeen, isNewLowestPricelowest price seen across your runs, and whether today's price is below every earlier one (0.1.8)
stockChangeproduct-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:

FieldMeaning
headlineone line, e.g. "<keyword>: <n> hot, <n> price drops ≥10 %, <n> new in results, <n> dropped out · top: "<title>" <n>/day"
countshot, selling, flat, priceDrops, priceRises, newLowestPrice, newEntries, droppedOut, soldOut, unavailable
topSoldPerDayup to 10 products with the highest observed soldPerDay
priceDrops, priceRisesprice moves of 10 % or more, with previousPrice
newEntries, droppedOutproducts 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, unavailableProductsdetails 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)

EventPrice
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; event ai-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.
  • soldCount is TikTok's own lifetime counter shown on the listing; estimatedGmv in the summary = Σ soldCount × current price (rough, lower-bound-ish).
  • Default order is TikTok's relevance; sortBy re-orders the fetched set. Results are de-duplicated per keyword.
  • TikTok changes its storefront often; if a field turns null where 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