Back to Blog
Tutorial

YouTube Shorts Analytics: Find Trending Shorts & Track Creator Performance

April 22, 2026
7 min read
S
By SociaVault Team
YouTubeYouTube ShortsAnalyticsShort-Form VideoAPI

YouTube Shorts Analytics: Find Trending Shorts & Track Creator Performance

YouTube Shorts now gets over 70 billion daily views — but YouTube Studio barely shows you competitor Shorts data. If you want to find trending Shorts before they blow up, or benchmark your content against other creators, you need external data.

Here's how to use SociaVault's API to discover trending Shorts, track creator performance, and figure out what's actually working on the platform.


Pull the latest trending Shorts to see what's gaining traction:

const API_KEY = process.env.SOCIAVAULT_API_KEY;
const BASE = 'https://api.sociavault.com/v1/scrape';
const headers = { 'X-API-Key': API_KEY };

async function getTrendingShorts() {
  const res = await fetch(
    `${BASE}/youtube/shorts/trending`,
    { headers }
  );
  const shorts = (await res.json()).data || [];

  console.log(`\nTrending YouTube Shorts: ${shorts.length} found\n`);

  shorts.slice(0, 15).forEach((s, i) => {
    const views = s.viewCount || s.views || 0;
    const likes = s.likeCount || s.likes || 0;
    const channel = s.channelTitle || s.channel || 'Unknown';

    console.log(`${i + 1}. "${(s.title || '').substring(0, 60)}"`);
    console.log(`   Channel: ${channel}`);
    console.log(`   Views: ${Number(views).toLocaleString()}`);
    console.log(`   Likes: ${Number(likes).toLocaleString()}`);
    console.log('');
  });

  return shorts;
}

getTrendingShorts();

Python version:

import os
import requests

API_KEY = os.environ["SOCIAVAULT_API_KEY"]
BASE = "https://api.sociavault.com/v1/scrape"
HEADERS = {"X-API-Key": API_KEY}

def get_trending_shorts():
    r = requests.get(f"{BASE}/youtube/shorts/trending", headers=HEADERS)
    shorts = r.json().get("data", [])

    print(f"\nTrending YouTube Shorts: {len(shorts)} found\n")

    for i, s in enumerate(shorts[:15]):
        views = s.get("viewCount") or s.get("views", 0)
        likes = s.get("likeCount") or s.get("likes", 0)
        channel = s.get("channelTitle") or s.get("channel", "Unknown")

        print(f"{i+1}. \"{s.get('title', '')[:60]}\"")
        print(f"   Channel: {channel}")
        print(f"   Views: {int(views):,}  |  Likes: {int(likes):,}")
        print()

    return shorts

get_trending_shorts()

Get a Creator's Shorts

Pull all Shorts from a specific channel:

async function getCreatorShorts(channelId) {
  // Get channel profile
  const profileRes = await fetch(
    `${BASE}/youtube/channel?channelId=${encodeURIComponent(channelId)}`,
    { headers }
  );
  const profile = (await profileRes.json()).data;

  console.log(`\nChannel: ${profile?.snippet?.title || channelId}`);
  console.log(`  Subscribers: ${Number(profile?.statistics?.subscriberCount || 0).toLocaleString()}`);
  console.log(`  Total views: ${Number(profile?.statistics?.viewCount || 0).toLocaleString()}`);

  // Get Shorts
  const shortsRes = await fetch(
    `${BASE}/youtube/channel/shorts?channelId=${encodeURIComponent(channelId)}`,
    { headers }
  );
  const shorts = (await shortsRes.json()).data || [];

  if (shorts.length === 0) {
    console.log('No Shorts found for this channel');
    return;
  }

  // Engagement metrics
  const totalViews = shorts.reduce((s, v) => s + Number(v.viewCount || v.views || 0), 0);
  const totalLikes = shorts.reduce((s, v) => s + Number(v.likeCount || v.likes || 0), 0);
  const avgViews = Math.round(totalViews / shorts.length);
  const avgLikes = Math.round(totalLikes / shorts.length);
  const likeRate = totalViews > 0 ? ((totalLikes / totalViews) * 100).toFixed(2) : '0';

  console.log(`\n  Shorts Performance:`);
  console.log(`    Shorts analyzed: ${shorts.length}`);
  console.log(`    Total views: ${totalViews.toLocaleString()}`);
  console.log(`    Avg views per Short: ${avgViews.toLocaleString()}`);
  console.log(`    Avg likes per Short: ${avgLikes.toLocaleString()}`);
  console.log(`    Like rate: ${likeRate}%`);

  // Top 5 Shorts
  const sorted = [...shorts].sort(
    (a, b) => Number(b.viewCount || b.views || 0) - Number(a.viewCount || a.views || 0)
  );

  console.log(`\n  Top 5 Shorts:`);
  sorted.slice(0, 5).forEach((s, i) => {
    console.log(`    ${i + 1}. "${(s.title || '').substring(0, 50)}" — ${Number(s.viewCount || s.views || 0).toLocaleString()} views`);
  });

  return { profile, shorts, avgViews, avgLikes };
}

getCreatorShorts('UCX6OQ3DkcsbYNE6H8uQQuVA'); // MrBeast

Shorts vs Long-Form Comparison

Comparing how the same creator performs on Shorts vs regular videos is key for content strategy:

async function compareShortsVsLongForm(channelId) {
  // Get regular videos
  const videosRes = await fetch(
    `${BASE}/youtube/channel/videos?channelId=${encodeURIComponent(channelId)}`,
    { headers }
  );
  const videos = (await videosRes.json()).data || [];

  // Get Shorts
  const shortsRes = await fetch(
    `${BASE}/youtube/channel/shorts?channelId=${encodeURIComponent(channelId)}`,
    { headers }
  );
  const shorts = (await shortsRes.json()).data || [];

  const calcAvg = (items, field) => {
    if (items.length === 0) return 0;
    const total = items.reduce((s, v) => s + Number(v[field] || v.views || 0), 0);
    return Math.round(total / items.length);
  };

  const avgVideoViews = calcAvg(videos, 'viewCount');
  const avgShortViews = calcAvg(shorts, 'viewCount');
  const avgVideoLikes = calcAvg(videos, 'likeCount');
  const avgShortLikes = calcAvg(shorts, 'likeCount');

  const videoLikeRate = avgVideoViews > 0 ? ((avgVideoLikes / avgVideoViews) * 100).toFixed(2) : '0';
  const shortLikeRate = avgShortViews > 0 ? ((avgShortLikes / avgShortViews) * 100).toFixed(2) : '0';

  console.log('\nShorts vs Long-Form Comparison');
  console.log('═'.repeat(50));
  console.log(`  Metric            Long-Form       Shorts`);
  console.log(`  ${'─'.repeat(46)}`);
  console.log(`  Count             ${videos.length.toString().padEnd(16)}${shorts.length}`);
  console.log(`  Avg Views         ${avgVideoViews.toLocaleString().padEnd(16)}${avgShortViews.toLocaleString()}`);
  console.log(`  Avg Likes         ${avgVideoLikes.toLocaleString().padEnd(16)}${avgShortLikes.toLocaleString()}`);
  console.log(`  Like Rate         ${videoLikeRate.padEnd(16)}${shortLikeRate}%`);

  const viewRatio = avgVideoViews > 0 ? (avgShortViews / avgVideoViews).toFixed(2) : 'N/A';
  console.log(`\n  Shorts get ${viewRatio}x the views of long-form (per video)`);

  return { videos, shorts, avgVideoViews, avgShortViews };
}

compareShortsVsLongForm('UCX6OQ3DkcsbYNE6H8uQQuVA');

Find Shorts Creators in Your Niche

Search for creators in a specific topic and analyze their Shorts performance:

async function findShortsCreators(keyword, minSubscribers = 10000) {
  const res = await fetch(
    `${BASE}/youtube/search?query=${encodeURIComponent(keyword + ' shorts')}&type=channel`,
    { headers }
  );
  const channels = (await res.json()).data || [];

  const results = [];

  for (const ch of channels.slice(0, 10)) {
    const channelId = ch.channelId || ch.id;
    if (!channelId) continue;

    // Get channel details
    const profileRes = await fetch(
      `${BASE}/youtube/channel?channelId=${encodeURIComponent(channelId)}`,
      { headers }
    );
    const profile = (await profileRes.json()).data;
    const subs = Number(profile?.statistics?.subscriberCount || 0);

    if (subs < minSubscribers) continue;

    // Get their Shorts
    const shortsRes = await fetch(
      `${BASE}/youtube/channel/shorts?channelId=${encodeURIComponent(channelId)}`,
      { headers }
    );
    const shorts = (await shortsRes.json()).data || [];

    const avgViews = shorts.length > 0
      ? Math.round(shorts.reduce((s, v) => s + Number(v.viewCount || v.views || 0), 0) / shorts.length)
      : 0;

    results.push({
      name: profile?.snippet?.title || channelId,
      subscribers: subs,
      shortsCount: shorts.length,
      avgShortsViews: avgViews,
      viewsPerSub: subs > 0 ? (avgViews / subs).toFixed(2) : '0'
    });

    await new Promise(r => setTimeout(r, 2000));
  }

  results.sort((a, b) => b.avgShortsViews - a.avgShortsViews);

  console.log(`\nTop Shorts Creators for "${keyword}":`);
  console.table(results.map(r => ({
    Creator: r.name,
    Subscribers: r.subscribers.toLocaleString(),
    'Shorts': r.shortsCount,
    'Avg Views': r.avgShortsViews.toLocaleString(),
    'Views/Sub': r.viewsPerSub
  })));

  return results;
}

findShortsCreators('cooking recipes');

Shorts Trend Analysis

Monitor which topics are trending by analyzing trending Shorts content:

import os
import re
import requests
from collections import Counter

API_KEY = os.environ["SOCIAVAULT_API_KEY"]
BASE = "https://api.sociavault.com/v1/scrape"
HEADERS = {"X-API-Key": API_KEY}

def analyze_shorts_trends():
    """Analyze what topics and keywords are trending in Shorts"""
    r = requests.get(f"{BASE}/youtube/shorts/trending", headers=HEADERS)
    shorts = r.json().get("data", [])

    # Extract keywords from titles
    stop_words = {"the", "a", "an", "in", "on", "at", "to", "for", "of", "is", "it", 
                  "and", "or", "but", "this", "that", "with", "you", "i", "my", "your"}
    
    words = []
    hashtags = []
    
    for s in shorts:
        title = (s.get("title") or "").lower()
        # Extract words
        title_words = re.findall(r"[a-z]+", title)
        words.extend([w for w in title_words if w not in stop_words and len(w) > 2])
        # Extract hashtags
        tags = re.findall(r"#(\w+)", title)
        hashtags.extend([t.lower() for t in tags])

    print("\nTrending Keywords in YouTube Shorts:")
    print("─" * 40)
    for word, count in Counter(words).most_common(20):
        print(f"  {word.ljust(20)} {count} occurrences")

    if hashtags:
        print("\nTrending Hashtags:")
        print("─" * 40)
        for tag, count in Counter(hashtags).most_common(10):
            print(f"  #{tag.ljust(20)} {count}")

analyze_shorts_trends()

YouTube Shorts Benchmarks

MetricBelow AverageAverageGoodViral
Views (first 48h)<1K1K-10K10K-100K1M+
Like rate<2%2-4%4-8%8%+
Comment rate<0.05%0.05-0.2%0.2-0.5%0.5%+
Views per subscriber<0.3x0.3-1x1-5x5x+
Share rate<0.01%0.01-0.05%0.05-0.2%0.2%+

The "Views per subscriber" ratio is the most useful metric. A Short that gets 5x the channel's subscribers is genuinely viral — the algorithm is pushing it well beyond the existing audience.


What Kind of Shorts Get the Most Views?

Based on our analysis across thousands of trending Shorts:

  1. Hook in first 2 seconds — Shorts with text overlays or questions in the first frame get 40% more retention
  2. 15-30 seconds sweet spot — Under 15 is too short for engagement, over 45 loses viewers
  3. Trending audio — Shorts using popular sounds get 3-5x more distribution
  4. End loops — Shorts where the ending flows into the beginning get replayed more
  5. Reply bait comments — Controversial or question-based captions drive comment velocity

Get Started

Sign up free — start tracking YouTube Shorts trends and creator performance today.


Found this helpful?

Share it with others who might benefit

Ready to Try SociaVault?

Start extracting social media data with our powerful API. No credit card required.