Browser extensions export a YouTube channel's videos from the page you have open; an API does it from a server, on a schedule, without you scrolling. There are two API routes in 2026, and the tradeoff is real. The official YouTube Data API v3 is free but gives you 10,000 quota units a day, and search.list costs 100 units per call, so you get roughly 100 searches a day before you are rate-limited and filling out a Google quota-increase form. A data API like Scavio skips the quota ceiling: search returns video lists and metadata returns per-video stats, billed per request. This tutorial shows the Scavio route and explains exactly when the free official API is the better call.
Prerequisites
- Python 3.9+ with requests, or Node 18+
- A Scavio API key (50 free credits)
- A channel name or search term
Walkthrough
Step 1: Set your key
Scavio REST endpoints use Authorization: Bearer.
export SCAVIO_API_KEY=sk_your_key_hereStep 2: Search for a channel's videos
Note the field name: YouTube search uses search, while Google uses query and Amazon uses query for the ASIN. Each video comes back with a video_id.
import os, requests
H = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}", "Content-Type": "application/json"}
# YouTube search takes the term in "search", not "query"
r = requests.post("https://api.scavio.dev/api/v1/youtube/search",
headers=H, json={"search": "mkbhd"}).json()["data"]
for v in r[:10]:
print(v["video_id"], v["title"], v.get("view_count"))Step 3: Pull full stats per video
The metadata endpoint takes a video_id and returns view, like, and comment counts. One credit per call, no daily quota wall.
meta = requests.post("https://api.scavio.dev/api/v1/youtube/metadata",
headers=H, json={"video_id": "dQw4w9WgXcQ"}).json()["data"]
print(meta["title"], meta["view_count"], meta["like_count"], meta["comment_count"])Step 4: Decide: Scavio or the free official API
Be honest about volume. Under ~100 searches a day, the official free API is the cheaper answer and worth the OAuth setup. Past that, the quota ceiling and increase-request process cost more time than the API fees save.
# Official YouTube Data API v3: free, but
# - 10,000 quota units/day
# - search.list = 100 units -> ~100 searches/day
# - videos.list = 1 unit
# If you do < ~100 searches/day and can manage OAuth + quota, it is free.
# If you need volume, scheduled runs, or no quota paperwork, use Scavio:
# 1 credit/request flat, $0.005 each, no daily ceiling.Python Example
import os, requests
H = {"Authorization": f"Bearer {os.environ['SCAVIO_API_KEY']}",
"Content-Type": "application/json"}
# YouTube search takes the term in "search" (not "query")
r = requests.post("https://api.scavio.dev/api/v1/youtube/search",
headers=H, json={"search": "mkbhd channel"})
for v in r.json()["data"][:10]:
print(v["title"], v["channel"], v.get("view_count"), v["video_id"])
# Full stats for one video id
meta = requests.post("https://api.scavio.dev/api/v1/youtube/metadata",
headers=H, json={"video_id": "dQw4w9WgXcQ"}).json()["data"]
print(meta["like_count"], meta["comment_count"])JavaScript Example
const H = { Authorization: `Bearer ${process.env.SCAVIO_API_KEY}`,
"Content-Type": "application/json" };
const r = await fetch("https://api.scavio.dev/api/v1/youtube/search", {
method: "POST", headers: H, body: JSON.stringify({ search: "mkbhd channel" })
}).then(r => r.json());
for (const v of r.data.slice(0, 10)) {
console.log(v.title, v.channel, v.view_count, v.video_id);
}Expected Output
{
"video_id": "dQw4w9WgXcQ",
"title": "Channel Trailer 2026",
"view_count": 1840221,
"like_count": 92044,
"comment_count": 4117
}