TikTok génère des ventes e-commerce massives. Les produits qui deviennent viraux sur TikTok se vendent en quelques jours sur Amazon. Détecter ces tendances tôt vous donne un avantage d'approvisionnement. Ce tutoriel construit un pipeline de détection de tendances TikTok en utilisant les endpoints API Scavio TikTok. Recherchez des vidéos liées à des produits, suivez la vélocité d'engagement (vues par heure) et recoupez avec les données de recherche Amazon pour valider la viabilité commerciale. Les appels API TikTok utilisent le modèle d'authentification par jeton Bearer.
Prérequis
- Python 3.9+ installé
- Bibliothèque requests installée
- Une clé API Scavio depuis scavio.dev
- Compréhension de base de l'approvisionnement en produits e-commerce
Parcours
Étape 1: Rechercher des vidéos liées à des produits sur TikTok
Utilisez l'endpoint de recherche de vidéos TikTok pour trouver du contenu lié à des produits. Un nombre élevé de vues et des dates de téléchargement récentes indiquent des produits tendance.
import os, requests, time
from datetime import datetime
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
TT_URL = 'https://api.scavio.dev/api/v1/tiktok'
TT_H = {'Authorization': f'Bearer {SCAVIO_KEY}', 'Content-Type': 'application/json'}
SEARCH_URL = 'https://api.scavio.dev/api/v1/search'
SEARCH_H = {'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'}
def search_tiktok_products(query: str, count: int = 20) -> list:
"""Search TikTok for product-related videos."""
resp = requests.post(f'{TT_URL}/search/videos', headers=TT_H,
json={'keyword': query, 'count': count, 'cursor': 0})
videos = resp.json().get('data', {}).get('videos', [])
results = []
for v in videos:
stats = v.get('stats', {})
author = v.get('author', {})
results.append({
'description': v.get('desc', '')[:100],
'author': author.get('uniqueId', ''),
'plays': stats.get('playCount', 0),
'likes': stats.get('diggCount', 0),
'comments': stats.get('commentCount', 0),
'shares': stats.get('shareCount', 0),
'created': v.get('createTime', 0),
'video_id': v.get('id', ''),
})
# Sort by plays descending
results.sort(key=lambda x: x['plays'], reverse=True)
return results
videos = search_tiktok_products('TikTok made me buy it')
print(f'Found {len(videos)} product videos')
for v in videos[:5]:
print(f' {v["plays"]:>12,} plays | @{v["author"]:15s} | {v["description"][:40]}')Étape 2: Détecter les catégories de produits tendance
Recherchez plusieurs hashtags et mots-clés liés à des produits pour identifier les catégories qui sont en tendance. Comparez les taux d'engagement entre les catégories.
def detect_trending_categories(categories: list) -> list:
"""Search TikTok for each product category and rank by engagement."""
results = []
for category in categories:
videos = search_tiktok_products(category, count=10)
if not videos:
continue
total_plays = sum(v['plays'] for v in videos)
total_likes = sum(v['likes'] for v in videos)
avg_engagement = total_likes / total_plays if total_plays else 0
results.append({
'category': category,
'videos': len(videos),
'total_plays': total_plays,
'total_likes': total_likes,
'avg_engagement': avg_engagement,
'top_video': videos[0] if videos else None,
})
time.sleep(0.3)
results.sort(key=lambda x: x['total_plays'], reverse=True)
return results
categories = [
'cleaning gadget review',
'kitchen organization hack',
'skincare routine product',
'desk setup accessory',
'pet gadget review',
]
trending = detect_trending_categories(categories)
print('TikTok Product Trend Detection')
print('=' * 60)
for t in trending:
print(f" {t['category']:30s} | {t['total_plays']:>12,} plays | {t['avg_engagement']:.1%} eng")
if t['top_video']:
print(f" Top: {t['top_video']['description'][:50]}")Étape 3: Suivre la vélocité des hashtags pour le timing des tendances
Utilisez l'endpoint de hashtag TikTok pour vérifier la vitesse de croissance d'un hashtag de produit. Un nombre élevé de vues sur le hashtag indique un timing de pointe ou pré-pointe.
def check_hashtag_velocity(hashtag: str) -> dict:
"""Check a hashtag's total views and video volume."""
# Get hashtag info
resp = requests.post(f'{TT_URL}/hashtag', headers=TT_H,
json={'hashtag': hashtag})
hashtag_data = resp.json().get('data', {})
time.sleep(0.3)
# Get recent videos under this hashtag
resp = requests.post(f'{TT_URL}/hashtag/videos', headers=TT_H,
json={'hashtag': hashtag, 'count': 20, 'cursor': 0})
videos = resp.json().get('data', {}).get('videos', [])
recent_plays = sum(v.get('stats', {}).get('playCount', 0) for v in videos)
return {
'hashtag': hashtag,
'total_views': hashtag_data.get('stats', {}).get('videoCount', 0),
'recent_videos': len(videos),
'recent_plays': recent_plays,
'avg_plays_per_video': recent_plays // len(videos) if videos else 0,
}
hashtags = ['cleaninghack', 'kitchengadget', 'desksetup', 'skincareproduct']
print('Hashtag Velocity Check')
print('-' * 60)
for tag in hashtags:
data = check_hashtag_velocity(tag)
print(f' #{data["hashtag"]:20s} | {data["recent_plays"]:>10,} recent plays | '
f'{data["avg_plays_per_video"]:>8,} avg/video')
time.sleep(0.3)Étape 4: Recouper avec les données de recherche Amazon
Un produit qui devient tendance sur TikTok n'est important pour le e-commerce que si les gens l'achètent réellement. Recoupez les tendances TikTok avec les recherches Amazon pour valider la viabilité commerciale.
def validate_trend_commercially(product: str) -> dict:
"""Cross-validate a TikTok trend with Amazon data."""
# TikTok data
tt_videos = search_tiktok_products(product, count=10)
tt_plays = sum(v['plays'] for v in tt_videos)
time.sleep(0.3)
# Amazon data
resp = requests.post(SEARCH_URL, headers=SEARCH_H,
json={'query': f'site:amazon.com {product}',
'country_code': 'us', 'num_results': 5})
amazon_results = resp.json().get('organic_results', [])
# Scoring
tiktok_score = min(tt_plays / 100000, 10) # Normalize to 0-10
amazon_score = len(amazon_results) * 2 # 0-10
combined = (tiktok_score + amazon_score) / 2
return {
'product': product,
'tiktok_videos': len(tt_videos),
'tiktok_plays': tt_plays,
'amazon_listings': len(amazon_results),
'tiktok_score': round(tiktok_score, 1),
'amazon_score': round(amazon_score, 1),
'combined_score': round(combined, 1),
'verdict': 'HOT' if combined > 6 else 'WARM' if combined > 3 else 'COLD',
'cost': 0.010, # 1 TikTok + 1 Amazon search
}
products = ['LED sunset lamp', 'portable blender', 'cloud slides shoes']
print('\nTrend Validation Report')
print('=' * 65)
for p in products:
result = validate_trend_commercially(p)
print(f"[{result['verdict']:4s}] {result['product']:25s} | "
f"TT: {result['tiktok_score']}/10 AMZ: {result['amazon_score']}/10 | "
f"Combined: {result['combined_score']}/10")
time.sleep(0.5)
total_cost = len(products) * 0.010
print(f'\nTotal cost: ${total_cost:.3f}')Exemple Python
import os, requests, time
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
TT_H = {'Authorization': f'Bearer {SCAVIO_KEY}', 'Content-Type': 'application/json'}
S_H = {'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'}
def detect_trend(product):
# TikTok search
resp = requests.post('https://api.scavio.dev/api/v1/tiktok/search/videos', headers=TT_H,
json={'keyword': product, 'count': 10, 'cursor': 0})
videos = resp.json().get('data', {}).get('videos', [])
plays = sum(v.get('stats', {}).get('playCount', 0) for v in videos)
time.sleep(0.3)
# Amazon cross-check
resp2 = requests.post('https://api.scavio.dev/api/v1/search', headers=S_H,
json={'query': f'site:amazon.com {product}', 'country_code': 'us', 'num_results': 5})
amazon = len(resp2.json().get('organic_results', []))
verdict = 'HOT' if plays > 500000 and amazon >= 3 else 'WARM' if plays > 100000 else 'COLD'
print(f'[{verdict}] {product}: {plays:,} TT plays, {amazon} AMZ listings')
for p in ['LED sunset lamp', 'portable blender', 'cloud slides']:
detect_trend(p)
time.sleep(0.3)Exemple JavaScript
const SCAVIO_KEY = process.env.SCAVIO_API_KEY;
async function detectTrend(product) {
const tt = await fetch('https://api.scavio.dev/api/v1/tiktok/search/videos', {
method: 'POST',
headers: { Authorization: `Bearer ${SCAVIO_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ keyword: product, count: 10, cursor: 0 })
}).then(r => r.json());
const plays = (tt.data?.videos || []).reduce((s, v) => s + (v.stats?.playCount || 0), 0);
const amz = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query: `site:amazon.com ${product}`, country_code: 'us', num_results: 5 })
}).then(r => r.json());
const listings = (amz.organic_results || []).length;
const verdict = plays > 500000 && listings >= 3 ? 'HOT' : plays > 100000 ? 'WARM' : 'COLD';
console.log(`[${verdict}] ${product}: ${plays.toLocaleString()} TT plays, ${listings} AMZ listings`);
}
(async () => { for (const p of ['LED sunset lamp', 'portable blender']) await detectTrend(p); })();Sortie attendue
Found 20 product videos
1,234,567 plays | @cleanqueen | This cleaning gadget changed my life
892,345 plays | @organizewithme | Kitchen organization haul from Amazon
TikTok Product Trend Detection
============================================================
skincare routine product | 4,523,000 plays | 8.2% eng
cleaning gadget review | 3,891,000 plays | 6.5% eng
kitchen organization hack | 2,156,000 plays | 7.1% eng
Trend Validation Report
=================================================================
[HOT ] LED sunset lamp | TT: 7.2/10 AMZ: 8.0/10 | Combined: 7.6/10
[WARM] portable blender | TT: 4.5/10 AMZ: 6.0/10 | Combined: 5.3/10
[HOT ] cloud slides shoes | TT: 8.1/10 AMZ: 10.0/10 | Combined: 9.1/10
Total cost: $0.030