The Problem
YouTube creators and marketers cannot programmatically track how their videos' search visibility changes over time. YouTube Studio shows impressions but not search position for specific queries. Without position tracking, creators cannot measure whether their SEO efforts are working or which videos are losing visibility.
The Scavio Solution
Build a scheduled pipeline that queries Scavio's YouTube search endpoint for target keywords, records which position each video appears at, and tracks changes over time. Store results in a database or spreadsheet to visualize impression decay curves and identify videos that need SEO updates.
Before
Before automated tracking, a creator manually searched YouTube for their target keywords weekly, scrolling through results to find their videos. They noticed a video had dropped from page 1 only after 3 weeks of decline.
After
After implementing API-based tracking, the system checks 30 keywords daily and alerts when any video drops more than 3 positions. The creator caught a declining video within 24 hours and updated the title/description to recover its position within a week.
Who It Is For
YouTube creators, video marketers, and agencies tracking search visibility and impression decay for their video content.
Key Benefits
- Daily YouTube search position tracking for any keyword
- Automated alerts for position drops
- Historical data reveals impression decay patterns
- Identifies videos needing title/description updates
- Costs $0.15/day for 30 keyword checks
Python Example
import requests, os, json
from datetime import date
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
CHANNEL = 'your-channel-name'
KEYWORDS = ['search api tutorial', 'web scraping python', 'serp api comparison']
def track_youtube_positions(keywords: list[str], channel: str) -> list[dict]:
results = []
for kw in keywords:
r = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'youtube', 'query': kw}, timeout=10).json()
organic = r.get('organic', [])
position = None
for i, video in enumerate(organic):
if channel.lower() in (video.get('channel', '') or '').lower():
position = i + 1
break
results.append({
'keyword': kw, 'date': str(date.today()),
'position': position, 'total_results': len(organic)
})
return results
for r in track_youtube_positions(KEYWORDS, CHANNEL):
print(json.dumps(r))JavaScript Example
async function trackYouTubePositions(keywords, channel) {
const results = [];
for (const kw of keywords) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ platform: 'youtube', query: kw })
}).then(r => r.json());
const pos = (r.organic || []).findIndex(v =>
v.channel?.toLowerCase().includes(channel.toLowerCase())) + 1;
results.push({ keyword: kw, date: new Date().toISOString().slice(0, 10), position: pos || null });
}
return results;
}Platforms Used
YouTube
Video search with transcripts and metadata