Overview
This workflow scans TikTok daily for trending product videos, extracts product names, and cross-references them with Amazon listings for pricing and availability. The output is an opportunities report that ecommerce sellers and dropshippers use to capitalize on viral products before they sell out or become saturated.
Trigger
Cron schedule (daily at 7:00 AM UTC)
Schedule
Runs daily at 7:00 AM UTC
Workflow Steps
Load product categories to scan
Read target product categories (e.g., kitchen gadgets, beauty, fitness) from configuration.
Search TikTok for trending product videos
Call Scavio TikTok search/videos for each category with product-focused queries.
Extract product references from video titles
Parse video titles to extract product names and brand mentions for Amazon lookup.
Cross-reference with Amazon listings
Search each extracted product on Amazon to check availability, pricing, and ratings.
Score and rank opportunities
Score each opportunity by TikTok engagement and Amazon availability. Output a ranked list.
Python Implementation
import requests
import json
from pathlib import Path
from datetime import datetime
API_KEY = "your_scavio_api_key"
TIKTOK_URL = "https://api.scavio.dev/api/v1/tiktok"
CATEGORIES = ["kitchen gadget tiktok made me buy", "beauty product viral", "fitness equipment must have"]
def search_tiktok_products(query: str) -> list[dict]:
res = requests.post(
f"{TIKTOK_URL}/search/videos",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"query": query},
timeout=15,
)
res.raise_for_status()
return res.json().get("videos", [])
def check_amazon(product: str) -> dict | None:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "amazon", "query": product},
timeout=15,
)
res.raise_for_status()
for item in res.json().get("organic", []):
if item.get("price"):
return {
"title": item.get("title", ""),
"price": item["price"],
"rating": item.get("rating"),
"reviews": item.get("reviews", 0),
"link": item.get("link", ""),
}
return None
def run():
opportunities = []
for category in CATEGORIES:
videos = search_tiktok_products(category)
for video in videos[:10]:
title = video.get("title", "")
views = video.get("views", 0)
likes = video.get("likes", 0)
if views < 1000:
continue
# Search Amazon with video title excerpt
amazon = check_amazon(title[:80])
if amazon:
opportunities.append({
"category": category.split(" ")[0],
"tiktok_title": title[:120],
"tiktok_views": views,
"tiktok_likes": likes,
"amazon_title": amazon["title"][:120],
"amazon_price": amazon["price"],
"amazon_rating": amazon.get("rating"),
"amazon_reviews": amazon["reviews"],
"amazon_link": amazon["link"],
"score": views + (likes * 10) + (amazon["reviews"] * 5),
})
opportunities.sort(key=lambda x: x["score"], reverse=True)
date = datetime.utcnow().strftime("%Y-%m-%d")
report = {"date": date, "categories_scanned": len(CATEGORIES), "opportunities": len(opportunities), "items": opportunities[:30]}
Path(f"tiktok_amazon_scan_{date}.json").write_text(json.dumps(report, indent=2))
print(f"Found {len(opportunities)} TikTok-Amazon opportunities")
for item in opportunities[:5]:
print(f" {item['tiktok_views']:>10,} views | ${item['amazon_price']:>7.2f} | {item['amazon_title'][:50]}")
if __name__ == "__main__":
run()JavaScript Implementation
const API_KEY = "your_scavio_api_key";
const TIKTOK_URL = "https://api.scavio.dev/api/v1/tiktok";
const CATEGORIES = ["kitchen gadget tiktok made me buy", "beauty product viral"];
async function searchTiktok(query) {
const res = await fetch(`${TIKTOK_URL}/search/videos`, {
method: "POST",
headers: { Authorization: `Bearer ${API_KEY}`, "content-type": "application/json" },
body: JSON.stringify({ query }),
});
if (!res.ok) throw new Error(`scavio ${res.status}`);
return (await res.json()).videos ?? [];
}
async function checkAmazon(product) {
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": API_KEY, "content-type": "application/json" },
body: JSON.stringify({ platform: "amazon", query: product }),
});
if (!res.ok) return null;
const items = (await res.json()).organic ?? [];
const found = items.find((i) => i.price);
return found ? { title: found.title ?? "", price: found.price, reviews: found.reviews ?? 0, link: found.link ?? "" } : null;
}
const opps = [];
for (const cat of CATEGORIES) {
const videos = await searchTiktok(cat);
for (const v of videos.slice(0, 10)) {
if ((v.views ?? 0) < 1000) continue;
const amazon = await checkAmazon((v.title ?? "").slice(0, 80));
if (amazon) opps.push({ views: v.views ?? 0, amazonPrice: amazon.price, amazonTitle: amazon.title.slice(0, 50) });
}
}
opps.sort((a, b) => b.views - a.views);
console.log(`Found ${opps.length} opportunities`);
for (const o of opps.slice(0, 5)) console.log(` ${o.views.toLocaleString()} views | $${o.amazonPrice} | ${o.amazonTitle}`);Platforms Used
TikTok
Trending video, creator, and product discovery
Amazon
Product search with prices, ratings, and reviews