The Problem
Google Trends does not offer a public API. Teams that need trend data programmatically rely on unofficial libraries (pytrends) that break frequently as Google changes their frontend. Pytrends has been broken or rate-limited repeatedly throughout 2025-2026. Paid alternatives like Exploding Topics charge $39/mo+ for curated trend lists but do not give raw query-level data.
The Scavio Solution
Search Google for trend-related queries and extract trend signals from organic results, AI Overviews, and related searches. While this does not replicate the exact Google Trends index, it captures directional trend signals: whether a topic is rising, what related terms are trending, and what the current search landscape looks like. For most use cases (content planning, market research, competitive monitoring), directional signals are sufficient.
Before
Before the switch, a content team used pytrends to pull weekly trend data for 50 keywords. Pytrends broke 3 times in 4 months, each time requiring a library update or workaround. During outages, the team had no programmatic trend signal and reverted to manual Google Trends checks.
After
After switching to SERP-based trend extraction, 50 keyword checks run daily without breakage. Each search returns related searches, People Also Ask questions, and AI Overview trend signals. Cost: $0.25/day for 50 queries. The data is directional rather than indexed, but sufficient for content planning and competitive monitoring.
Who It Is For
Content strategists, market researchers, and growth teams who need programmatic trend data without relying on unofficial Google Trends scrapers that break regularly.
Key Benefits
- No reliance on pytrends or unofficial Google Trends scrapers
- 50 daily trend checks for $0.25
- Related searches and PAA provide directional trend signals
- Zero breakage compared to pytrends' frequent failures
- AI Overview text captures Google's own trend synthesis
Python Example
import requests, os, json
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def trend_signals(keyword: str) -> dict:
r = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': f'{keyword} trend 2026',
'ai_overview': True}, timeout=10).json()
return {
'keyword': keyword,
'related_searches': [s.get('query', '') for s in r.get('related_searches', [])[:5]],
'paa': [q.get('question', '') for q in r.get('people_also_ask', [])[:5]],
'ai_overview': bool(r.get('ai_overview')),
'ai_trend_text': (r.get('ai_overview', {}) or {}).get('text', '')[:200],
'top_result_freshness': r.get('organic', [{}])[0].get('date', ''),
}
keywords = ['vibe coding', 'mcp protocol', 'ai agents']
for kw in keywords:
signals = trend_signals(kw)
print(f'\n{kw}:')
print(f' Related: {", ".join(signals["related_searches"][:3])}')
if signals['paa']:
print(f' PAA: {signals["paa"][0]}')
if signals['ai_trend_text']:
print(f' AIO: {signals["ai_trend_text"][:100]}')JavaScript Example
const H = { 'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json' };
async function trendSignals(keyword) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: H,
body: JSON.stringify({ platform: 'google', query: `${keyword} trend 2026`, ai_overview: true })
}).then(r => r.json());
return {
keyword,
relatedSearches: (r.related_searches || []).slice(0, 5).map(s => s.query || ''),
paa: (r.people_also_ask || []).slice(0, 5).map(q => q.question || ''),
aiOverview: Boolean(r.ai_overview),
aiTrendText: ((r.ai_overview || {}).text || '').slice(0, 200),
};
}
const signals = await trendSignals('vibe coding');
console.log(`${signals.keyword}:`);
console.log(` Related: ${signals.relatedSearches.slice(0, 3).join(', ')}`);
if (signals.paa.length) console.log(` PAA: ${signals.paa[0]}`);Platforms Used
Web search with knowledge graph, PAA, and AI overviews