Product research that only checks one platform misses the full picture. A product might be trending on TikTok but have terrible reviews on Google, or be highly rated online but unknown on social media. This tutorial builds a multi-platform research agent that combines web search, TikTok data, and YouTube coverage into a unified product intelligence report. Total cost per product: 3 searches + 1 TikTok query = $0.020.
Prerequisites
- Python 3.9+ installed
- requests library installed
- A Scavio API key from scavio.dev
Walkthrough
Step 1: Build platform-specific search functions
Create separate search functions for web, TikTok, and YouTube. Each returns normalized results with platform-specific metadata.
import requests, os, time
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
SEARCH_URL = 'https://api.scavio.dev/api/v1/search'
TT_URL = 'https://api.scavio.dev/api/v1/tiktok'
def search_web(query: str) -> list:
resp = requests.post(SEARCH_URL,
headers={'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'},
json={'query': query, 'country_code': 'us', 'num_results': 10})
return [{'title': r['title'], 'url': r['link'], 'snippet': r.get('snippet', ''),
'platform': 'web'} for r in resp.json().get('organic_results', [])]
def search_youtube(query: str) -> list:
resp = requests.post(SEARCH_URL,
headers={'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'},
json={'query': f'site:youtube.com {query} review',
'country_code': 'us', 'num_results': 5})
return [{'title': r['title'].replace(' - YouTube', ''), 'url': r['link'],
'snippet': r.get('snippet', ''), 'platform': 'youtube'}
for r in resp.json().get('organic_results', [])
if 'youtube.com' in r.get('link', '')]
def search_tiktok(query: str) -> list:
resp = requests.post(f'{TT_URL}/search/videos',
headers={'Authorization': f'Bearer {SCAVIO_KEY}',
'Content-Type': 'application/json'},
json={'keyword': query, 'count': 10, 'cursor': 0})
videos = resp.json().get('data', {}).get('videos', [])
return [{'title': v.get('desc', '')[:80], 'author': v.get('author', {}).get('uniqueId', ''),
'plays': v.get('stats', {}).get('playCount', 0),
'likes': v.get('stats', {}).get('diggCount', 0),
'platform': 'tiktok'} for v in videos]
print('Platform search functions ready')Step 2: Build the multi-platform research pipeline
Search all three platforms for a product and compile the results into a unified report.
def research_product(product_name: str) -> dict:
print(f'Researching: {product_name}\n')
# Web search: reviews and pricing
web_results = search_web(f'{product_name} review 2026')
time.sleep(0.3)
# YouTube: video reviews
yt_results = search_youtube(product_name)
time.sleep(0.3)
# TikTok: social buzz
tt_results = search_tiktok(product_name)
# Analyze web sentiment
web_text = ' '.join(r['snippet'] for r in web_results).lower()
positive_signals = sum(1 for w in ['best', 'excellent', 'recommend', 'love', 'great']
if w in web_text)
negative_signals = sum(1 for w in ['worst', 'avoid', 'terrible', 'scam', 'overpriced']
if w in web_text)
# Analyze TikTok engagement
tt_total_plays = sum(v.get('plays', 0) for v in tt_results)
tt_total_likes = sum(v.get('likes', 0) for v in tt_results)
tt_creators = len(set(v.get('author', '') for v in tt_results))
return {
'product': product_name,
'web': {'results': len(web_results), 'positive': positive_signals,
'negative': negative_signals, 'top_result': web_results[0]['title'] if web_results else ''},
'youtube': {'videos': len(yt_results),
'top_video': yt_results[0]['title'] if yt_results else ''},
'tiktok': {'videos': len(tt_results), 'total_plays': tt_total_plays,
'total_likes': tt_total_likes, 'unique_creators': tt_creators},
'credits_used': 3, # 1 web + 1 youtube + 1 tiktok
'cost': 0.015
}Step 3: Generate the product intelligence report
Format the multi-platform data into a human-readable report with platform-specific insights.
def product_report(data: dict):
print(f'Product Intelligence Report: {data["product"]}')
print('=' * 50)
# Web presence
web = data['web']
sentiment = 'positive' if web['positive'] > web['negative'] else 'negative' if web['negative'] > web['positive'] else 'neutral'
print(f'\nWeb Search ({web["results"]} results):')
print(f' Sentiment: {sentiment} ({web["positive"]} positive, {web["negative"]} negative)')
if web['top_result']:
print(f' Top result: {web["top_result"][:50]}')
# YouTube coverage
yt = data['youtube']
print(f'\nYouTube ({yt["videos"]} videos found):')
if yt['top_video']:
print(f' Top review: {yt["top_video"][:50]}')
# TikTok buzz
tt = data['tiktok']
print(f'\nTikTok ({tt["videos"]} videos):')
print(f' Total plays: {tt["total_plays"]:,}')
print(f' Total likes: {tt["total_likes"]:,}')
print(f' Unique creators: {tt["unique_creators"]}')
# Overall assessment
tiktok_buzz = 'high' if tt['total_plays'] > 100000 else 'medium' if tt['total_plays'] > 10000 else 'low'
print(f'\nOverall:')
print(f' Web sentiment: {sentiment}')
print(f' TikTok buzz: {tiktok_buzz}')
print(f' YouTube coverage: {"good" if yt["videos"] >= 3 else "limited"}')
print(f' Cost: ${data["cost"]:.3f} ({data["credits_used"]} API calls)')
# Research a product
data = research_product('Stanley Quencher tumbler')
product_report(data)Python Example
import requests, os, time
SCAVIO_KEY = os.environ['SCAVIO_API_KEY']
SEARCH = 'https://api.scavio.dev/api/v1/search'
TT = 'https://api.scavio.dev/api/v1/tiktok'
def research(product):
# Web
web = requests.post(SEARCH, headers={'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'},
json={'query': f'{product} review 2026', 'country_code': 'us', 'num_results': 5}).json()
# YouTube
yt = requests.post(SEARCH, headers={'x-api-key': SCAVIO_KEY, 'Content-Type': 'application/json'},
json={'query': f'site:youtube.com {product} review', 'country_code': 'us', 'num_results': 3}).json()
# TikTok
tt = requests.post(f'{TT}/search/videos', headers={'Authorization': f'Bearer {SCAVIO_KEY}',
'Content-Type': 'application/json'}, json={'keyword': product, 'count': 10, 'cursor': 0}).json()
web_count = len(web.get('organic_results', []))
yt_count = len([r for r in yt.get('organic_results', []) if 'youtube' in r.get('link', '')])
tt_plays = sum(v.get('stats', {}).get('playCount', 0) for v in tt.get('data', {}).get('videos', []))
print(f'{product}: web={web_count}, youtube={yt_count}, tiktok_plays={tt_plays:,}')
research('Stanley Quencher tumbler')JavaScript Example
const SCAVIO_KEY = process.env.SCAVIO_API_KEY;
async function research(product) {
const web = 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: `${product} review 2026`, country_code: 'us', num_results: 5 })
}).then(r => r.json());
const yt = 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:youtube.com ${product} review`, country_code: 'us', num_results: 3 })
}).then(r => r.json());
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);
console.log(`${product}: web=${(web.organic_results||[]).length}, tiktok_plays=${plays.toLocaleString()}`);
}
research('Stanley Quencher tumbler');Expected Output
Researching: Stanley Quencher tumbler
Product Intelligence Report: Stanley Quencher tumbler
==================================================
Web Search (10 results):
Sentiment: positive (3 positive, 0 negative)
Top result: Stanley Quencher H2.0 Review 2026 - Best Tumb
YouTube (4 videos found):
Top review: Stanley Quencher vs YETI Rambler - Honest Rev
TikTok (10 videos):
Total plays: 2,450,000
Total likes: 185,000
Unique creators: 8
Overall:
Web sentiment: positive
TikTok buzz: high
YouTube coverage: good
Cost: $0.015 (3 API calls)