Youtube Shorts Scraper Pro avatar

Youtube Shorts Scraper Pro

Pricing

from $2.40 / 1,000 results

Go to Apify Store
Youtube Shorts Scraper Pro

Youtube Shorts Scraper Pro

Fast and reliable YouTube Shorts data extractor powered by Supadata API and YouTube Data API v3. Extract complete Shorts metadata with 100% field population and guaranteed reliability for short-form vertical content.

Pricing

from $2.40 / 1,000 results

Rating

0.0

(0)

Developer

Delowar Munna

Delowar Munna

Maintained by Community

Actor stats

1

Bookmarked

85

Total users

4

Monthly active users

2 days ago

Last modified

Share

YouTube Shorts Scraper Pro 🎬

Fast, API-only YouTube Shorts finder & metadata extractor powered by TikHub search and the official YouTube Data API v3. Discover Shorts by keyword, hashtag, channel, or direct URL and export clean metadata — with optional transcript enrichment — for short-form vertical content.

YouTube Shorts Scraper Pro


🚀 Key Features

  • 🔍 Discovery-first, one box: Find Shorts by keyword/hashtag, channel, playlist, or seed video (a video → its channel's Shorts) — all auto-detected in a single input. Plus a separate direct URLs input for one-off videos.
  • API-only architecture: No browser automation, no proxies, no bot-detection fragility
  • 📊 23 clean, flat fields: Metadata, engagement metrics, source attribution, and optional transcripts — ready for Sheets/Excel/BI
  • 📝 Optional transcript enrichment: Full captions/transcripts via TikHub for content and AI workflows
  • 🌍 Localization: Country and language targeting for regional Shorts
  • 🧭 Source tracking: Every row records which input (sourceType / sourceInput) surfaced it
  • 📅 Date filtering & sorting: Publish-date range + newest / oldest / popular

Best for: short-form content research, viral trend monitoring, influencer/channel discovery, mobile-first SEO, and transcript-based NLP/AI datasets.


🎯 At a Glance

FeatureValue
ArchitectureAPI-only (TikHub search + YouTube Data API v3)
Discovery modesKeyword/hashtag, channel, playlist, seed video, direct URL
Fields23 flat fields (high reliability for core metadata)
Transcript supportOptional enrichment (~60–80% availability)
Max duration180 seconds (YouTube Shorts max)
ProxyNot required

💡 Why This Scraper?

Unlike channel-only Shorts scrapers, this actor is discovery-first and API-only:

CapabilityYouTube Shorts Scraper ProChannel-only / browser scrapers
Keyword & hashtag discovery✅ via TikHub search❌ usually channel-only
Transcript enrichment✅ optional❌ rare
Localization (region/language)
Proxy requirement❌ noneOften yes
Bot-detection riskNone (API-only)High (browser-based)
Shorts filteringAutomatic (≤180s)Manual/unreliable

Architecture benefits: predictable performance, no browser fingerprinting, clean flat output, and quota-efficient discovery (keyword search runs on TikHub, so it never burns YouTube's expensive search.list quota).


🔑 Setup: Environment Variables

This actor calls two APIs and reads their keys from Apify Console environment variables (Actor → Settings → Environment variables). Set these before running:

Env variableUsed forRequired
YOUTUBE_API_KEYVideo metadata + channel/playlist expansion (YouTube Data API v3)✅ Yes
TIKHUB_API_KEYKeyword/hashtag search, channel-ID resolution, transcript extraction (TikHub)✅ for keyword/hashtag/transcripts

Notes:

  • Set these directly as Console environment variables — not via apify secrets add.
  • YouTube issues one key per project, so there is no key rotation. The key draws on a shared 10,000-unit/day quota (resets at midnight Pacific); heavy/concurrent usage can exhaust it.
  • If YOUTUBE_API_KEY is missing, metadata calls fail with a clear error. If TIKHUB_API_KEY is missing, keyword/hashtag search and transcript extraction are skipped (channel + direct-URL discovery still work with just the YouTube key).

💵 Pricing

This actor uses pay-per-event pricing on the Apify platform — see the live pricing on the actor's store page for current rates (configured in the Apify Console, not hardcoded).

What you're charged for:

  • Per Short delivered — one charge for each Short returned to your dataset.
  • Per transcript — an additional charge only when you enable includeTranscript and a transcript is actually returned.

No surprises:

  • Failed/empty lookups and type: "error" rows are not charged.
  • Runs honor the maximum cost per run you set on Apify — the actor stops once your limit is reached.
  • Metadata runs on YouTube's free quota and discovery/transcripts run on TikHub, but you're billed only by the two events above — never by underlying API calls.

📋 Input Parameters

The actor has two discovery inputs:

FieldKeyTypeDefaultDescription
Search, Channels, Playlists & VideossearchQueriesArray<string>[]The merged discovery box. Each entry is auto-detected as a keyword/#hashtag (TikHub search — a bare #tag or a youtube.com/hashtag/<tag> URL both work, attributed sourceType: "hashtag"), a channel (URL/@handle/UC…/c//user), a playlist (…list=… or PL…/UU…), or a video URL/ID (a seed — its owning channel's Shorts are returned). Results are filtered to Shorts (≤180s).
Direct Shorts URLsshortsUrlsArray<{url}>[]One record per entry, for that video only — returned as-is (no channel expansion, exempt from the filters below). Accepts video URLs or 11-char IDs; supports manual entry, text-file upload, or a remote list.

Plus these settings:

FieldKeyTypeDefaultDescription
Max Shorts per sourcemaxResultsPerQueryinteger50Max videos to scan from EACH discovery source before filtering to Shorts. Does not affect Direct Shorts URLs.
Max Total ResultsmaxTotalResultsinteger0Global cap on candidates across all sources (before metadata). 0 = unlimited
CountryregionCodestring"US"ISO country code (US, GB, IN, BR, …)
Languagelanguagestring"en"Language code (en, es, pt, hi, …)
From DatefromDatestring""Only Shorts published on/after this date (ISO 8601: YYYY-MM-DD)
To DatetoDatestring""Only Shorts published on/before this date (ISO 8601: YYYY-MM-DD)
Sort Shorts BysortShortsstring"newest""newest", "oldest", or "popular" (view count)
Min ViewsminViewsinteger0Only include discovered Shorts with at least this many views (0 = no filter)
Min LikesminLikesinteger0Only include discovered Shorts with at least this many likes (0 = no filter)
Min CommentsminCommentsinteger0Only include discovered Shorts with at least this many comments (0 = no filter)
Include TranscriptincludeTranscriptbooleanfalseOptional transcript enrichment (adds ~1–2s per video)
Transcript LanguagetranscriptLanguagestring""Preferred transcript language (e.g., "en"). Auto-detect if empty

Notes:

  • 📱 Shorts-only for discovery: searchQueries results are filtered to vertical short-form videos (≤180s). maxResultsPerQuery is a candidate scan budget — non-Shorts are dropped, so the final count can be lower (raise it to scan deeper).
  • 🎯 Direct URLs are exempt: entries in shortsUrls are explicit requests and are returned as-is (even if >180s), bypassing the Shorts / date / engagement filters. The type field shows shorts vs video. Entries that can't be fetched produce a type: "error" row.
  • 📅 Date/engagement filters apply to discovered results only; keyword/hashtag search returns TikHub relevance order, so date filters have limited effect there.
  • 🔄 Sorting: newest, oldest, or most popular (view count).

📤 Output Schema

23 flat fields

Core metadata comes from the YouTube Data API v3; transcripts and search discovery come from TikHub.

#FieldTypeDescriptionSource
1typeStringshorts (or live for live content)YouTube API + duration
2videoIdStringYouTube video IDYouTube API
3videoUrlStringFull Shorts URL (youtube.com/shorts/{ID})Constructed
4titleStringShorts titleYouTube API
5shortDescriptionString | nullFirst 200 characters of descriptionYouTube API
6thumbnailUrlString | nullThumbnail URLYouTube API
7durationString | nullDuration HH:MM:SS (≤ 00:03:00)YouTube API
8durationSecondsInteger | nullDuration in seconds (easy filtering/BI)YouTube API
9isLiveContentBooleanWhether the Short is/was a live streamYouTube API
10viewCountInteger | nullTotal view countYouTube API
11likeCountInteger | nullTotal like countYouTube API
12commentCountInteger | nullTotal comment countYouTube API
13publishDateString | nullPublish date (YYYY-MM-DD)YouTube API
14publishDateTimeString | nullFull publish timestamp (ISO 8601)YouTube API
15hashtagsArray<string>Hashtags found in the title + descriptionExtracted
16transcriptString | nullTranscript text (when includeTranscript: true)TikHub
17channelIdString | nullChannel ID (UC…)YouTube API
18channelNameString | nullChannel display nameYouTube API
19channelHandleString | nullChannel @handle / custom URLYouTube API
20channelUrlString | nullFull channel URLConstructed
21subscriberCountInteger | nullChannel subscriber count (null if the channel hides it)YouTube API
22sourceTypeString | nullWhich input surfaced this Short: keyword, hashtag, channel, playlist, seed, or directActor
23sourceInputString | nullThe exact keyword, #hashtag, channel, playlist, seed video, or direct URL it came fromActor

Reliability note: core metadata fields are populated from the official YouTube API and are highly reliable. Transcript availability is ~60–80% (many Shorts have no captions), so transcript may be null.


📊 Output Examples

Overview Table View

YouTube Shorts Scraper - Overview Table

All Fields Table View

YouTube Shorts Scraper - All Fields View

Example: Short with transcript (includeTranscript: true)

{
"type": "shorts",
"videoId": "0yPgljFcTR4",
"videoUrl": "https://www.youtube.com/shorts/0yPgljFcTR4",
"title": "Subscribe to Win $50,000",
"shortDescription": "Thanks to Jack Link's Jerky for helping me give away $500,000!",
"thumbnailUrl": "https://i.ytimg.com/vi/0yPgljFcTR4/maxresdefault.jpg",
"duration": "00:00:15",
"durationSeconds": 15,
"isLiveContent": false,
"viewCount": 85035753,
"likeCount": 4168976,
"commentCount": 147835,
"publishDate": "2025-05-07",
"publishDateTime": "2025-05-07T16:00:00Z",
"hashtags": [],
"transcript": "It's my birthday and thanks to Jack Link's, I'm giving away $500,000...",
"channelId": "UCX6OQ3DkcsbYNE6H8uQQuVA",
"channelName": "MrBeast",
"channelHandle": "@mrbeast",
"channelUrl": "https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA",
"subscriberCount": 507000000,
"sourceType": "channel",
"sourceInput": "@mrbeast"
}

Example: Short from a keyword search (no transcript)

{
"type": "shorts",
"videoId": "V6In4tmd-w8",
"videoUrl": "https://www.youtube.com/shorts/V6In4tmd-w8",
"title": "$1 vs $25,000 VFX",
"shortDescription": "Huge thanks to every VFX artist that made this happen!",
"thumbnailUrl": "https://i.ytimg.com/vi/V6In4tmd-w8/maxresdefault.jpg",
"duration": "00:00:23",
"durationSeconds": 23,
"isLiveContent": false,
"viewCount": 89459140,
"likeCount": 2254166,
"commentCount": 12332,
"publishDate": "2025-06-19",
"publishDateTime": "2025-06-19T21:00:00Z",
"hashtags": ["#vfx"],
"transcript": null,
"channelId": "UCX6OQ3DkcsbYNE6H8uQQuVA",
"channelName": "MrBeast",
"channelHandle": "@mrbeast",
"channelUrl": "https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVA",
"subscriberCount": 507000000,
"sourceType": "keyword",
"sourceInput": "vfx"
}

🎬 Quick Start

Example 1: Mixed discovery (keywords + channels + playlist)

{
"searchQueries": [
"cooking tips",
"#viral",
"https://www.youtube.com/hashtag/gaming",
"@mrbeast",
"https://www.youtube.com/playlist?list=PLxxxxxxxxxxxxxxxx"
],
"maxResultsPerQuery": 100,
"regionCode": "US"
}

Every entry is auto-detected: "cooking tips" is a keyword; "#viral" and the youtube.com/hashtag/gaming URL are both hashtags (labelled sourceType: "hashtag"); @mrbeast expands the channel's Shorts; the playlist URL expands the playlist. All results are filtered to Shorts (≤180s).

{
"searchQueries": ["@mrbeast", "@markrober"],
"maxResultsPerQuery": 100,
"fromDate": "2025-10-01",
"sortShorts": "popular"
}

Example 3: Seed video → that creator's Shorts

{
"searchQueries": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
"maxResultsPerQuery": 50
}

A video in searchQueries is a seed: its owning channel is found and that channel's Shorts are returned (not just the one video).

Example 4: Direct Shorts (one record each, returned as-is)

{
"shortsUrls": [
{ "url": "https://www.youtube.com/shorts/0yPgljFcTR4" },
{ "url": "https://www.youtube.com/shorts/V6In4tmd-w8" }
]
}

Each entry is fetched exactly as given (no expansion, no ≤180s filter). You can also upload a text file of URLs/IDs.

Example 5: Viral-only Shorts with a cost cap

{
"searchQueries": ["@mrbeast", "@markrober", "fitness"],
"maxResultsPerQuery": 200,
"maxTotalResults": 100,
"minViews": 1000000,
"minLikes": 50000,
"sortShorts": "popular"
}

maxTotalResults caps how many candidates are fetched (bounding cost); minViews/minLikes/minComments keep only high-engagement discovered Shorts.

Example 6: Shorts with transcripts

{
"searchQueries": ["cooking tutorial", "@mrbeast"],
"maxResultsPerQuery": 50,
"includeTranscript": true,
"transcriptLanguage": "en"
}

Enabling includeTranscript adds ~1–2 seconds per video and a small TikHub pay-as-you-go cost, but yields spoken text for SEO, keyword extraction, and sentiment/NLP analysis.


💪 How It Works

API-only architecture (v2.2):

  • Discovery (searchQueries, auto-detected per entry)
    • Keyword & hashtag → TikHub get_shorts_searchShorts-only results (paid per page, no YouTube quota). Works for single keywords, #hashtags, and multi-word phrases; falls back to get_general_search (filtered to Shorts) if a term returns nothing.
    • Channel → resolve channel ID → TikHub get_channel_shorts (returns the channel's Shorts directly). Falls back to scanning the uploads playlist via the YouTube API if TikHub is unavailable.
    • Playlist → expand via playlistItems.list (free), then filter to Shorts.
    • Seed videovideos.list finds the owning channel, whose Shorts are returned.
  • Direct (shortsUrls) → each video ID used as-is, one record per entry (no expansion, no filters).
  • Metadata → YouTube Data API v3 videos.list (batched 50 IDs/call = 1 quota unit); a ≤180s Shorts filter runs as a safety net on discovered results.
  • Transcripts (optional) → TikHub get_video_captions_v2.

Data flow:

Inputs (keywords / hashtags / channels / direct URLs)
Discovery: TikHub search + YouTube channel expansion → candidate video IDs (deduped, source-tagged)
Metadata: YouTube Data API v3 (videos.list, 50/call) → filter to Shorts (≤180s)
Optional: transcript enrichment via TikHub
Date filter (optional) → Sort (newest / oldest / popular)
Output: 23 flat fields per Short

📚 Use Cases

  • Topic & keyword discovery — find viral Shorts by keyword/hashtag across YouTube
  • Channel & influencer research — pull a creator's recent Shorts and engagement
  • Trend monitoring — track view/like/comment metrics and publish patterns
  • Mobile-first SEO — analyze titles, descriptions, and (with transcripts) spoken keywords
  • NLP/AI datasets — build training data from transcript-enriched Shorts
  • Regional research — target Shorts by country/language

❓ FAQ

Q: How do I set it up? A: Add YOUTUBE_API_KEY (and TIKHUB_API_KEY for keyword/hashtag search and transcripts) as environment variables in the Apify Console (Actor → Settings → Environment variables). See Setup above.

Q: Which discovery modes need TikHub? A: Keyword search, hashtag search, and transcript extraction use TikHub. Channel and direct-URL discovery work with just the YouTube key.

Q: How do you identify Shorts vs regular videos? A: The YouTube Data API has no explicit Shorts flag, so results are filtered by duration (≤180 seconds — YouTube's current Shorts max). Shorts use the /shorts/ URL path in videoUrl.

Q: How does #hashtag search work? A: Enter a bare #tag (e.g. #viral) or a youtube.com/hashtag/<tag> URL in the Search & Discovery box. It's routed through the same TikHub Shorts search as keywords and labelled sourceType: "hashtag". Note: results are YouTube's search results for that tag (filtered to Shorts), not the exact curated hashtag feed — no public API exposes that.

Q: Why might a channel return fewer Shorts than my limit? A: maxResultsPerQuery is a per-source cap; playlists mix long-form + Shorts so some get dropped by the ≤180s Shorts filter. Channels use get_channel_shorts (Shorts directly), so they return the full cap. (Direct URLs in shortsUrls bypass all of this — returned as-is.)

Q: Can I get transcripts for any Short? A: Transcripts are extracted via TikHub for public Shorts that have captions (~60–80%). Set includeTranscript: true and optionally transcriptLanguage. When no captions exist, transcript is null.

Q: Can I extract individual comments? A: No — commentCount (the total) is included, but individual comment text/threads are not extracted.

Q: Does this work for private/unlisted Shorts? A: No, only public Shorts are accessible via API.

Q: Can I export to CSV/Excel/Sheets? A: Yes. The output is flat (no nested objects), so Apify's JSON/CSV/Excel exports and Google Sheets integration work cleanly.


⚠️ Known Limitations

  • No dislike counts. YouTube removed public dislikes from its Data API in 2021, so dislikes cannot be provided. (Scrapers that show dislikes rely on third-party estimate APIs.)
  • No individual comments. Only the total commentCount is returned — comment text and threads are not extracted.
  • Keyword coverage depends on TikHub's index. Discovery uses TikHub's raw get_shorts_search, with a fallback to get_general_search (filtered to Shorts) when a term returns nothing. Single keywords, #hashtags, and multi-word phrases all work; only extremely niche terms may be sparse.
  • Playlist is a scan budget. Playlists mix long-form and Shorts, so maxResultsPerQuery bounds videos scanned, not Shorts returned. (Channels now use get_channel_shorts, which returns Shorts directly.)
  • Direct URLs are returned as-is. Entries in shortsUrls are explicit requests, so a non-Short (>180s) is still returned (with type: "video"); an unfetchable entry produces a type: "error" row.
  • subscriberCount can be null. Some channels hide their subscriber count; the field is null in that case.
  • Transcripts ~60–80% coverage. Many Shorts have no captions, so transcript is often null.
  • Public content only. Private/unlisted Shorts are not accessible via the API.

🔌 Integrations

Because the output is a clean, flat Apify dataset, it plugs into Apify's native integrations with no transformation: Make, Zapier, Slack, Google Drive/Sheets, Airbyte, webhooks, and the Apify API/SDKs (JS & Python). Push results straight into your spreadsheet, database, or automation flow.


🛠️ Technologies

  • TikHub API — keyword/hashtag search, channel-ID resolution, transcript extraction
  • YouTube Data API v3 — official metadata + channel/playlist expansion
  • Node.js 18+ — native fetch, async processing
  • Apify SDK — actor runtime and dataset management

Why API-only? No browser automation (no bot detection), predictable cost/performance, clean flat output, and zero maintenance for YouTube UI changes.


📜 Changelog

v2.2 (Current)

  • 🎯 Real Shorts discovery: keyword/hashtag uses TikHub raw get_shorts_search (Shorts-only, with a get_general_search fallback) and channels use get_channel_shorts (Shorts directly) instead of general search + uploads scan — far higher Shorts yield, no long-form noise.
  • #️⃣ First-class #hashtag search: a bare #tag or a youtube.com/hashtag/<tag> URL is now auto-detected, routed through the Shorts search, and attributed sourceType: "hashtag" (previously a bare #tag worked but was mislabelled keyword, and a hashtag URL was silently dropped).

v2.1

  • 🧩 Consolidated inputs to two boxes: searchQueries (auto-detects keyword/hashtag, channel, playlist, or seed-video) + shortsUrls (direct videos, one record each, returned as-is with text-file upload support).
  • New discovery modes: playlists and seed-video → channel expansion.
  • 🎚️ Single maxResultsPerQuery cap replaces the separate per-search / per-channel caps.
  • 🧾 Direct entries that can't be fetched now emit a type: "error" row.

v2.0

  • 🔁 Re-architected to API-only (TikHub + YouTube Data API v3) — removed the previous Supadata dependency.
  • 🔎 Working keyword & hashtag discovery via TikHub get_general_search_v2 (avoids YouTube's 100-unit search.list).
  • 📝 Transcripts now via TikHub get_video_captions_v2 (optional enrichment).
  • 🆕 Richer output — 23 flat fields: added subscriberCount, channelHandle, hashtags, durationSeconds, publishDateTime, and source-tracking (sourceType, sourceInput).
  • ✏️ Normalized field names to lowerCamelCase (VideoId→videoId, PageURL→videoUrl, ChannelID→channelId, ChannelName→channelName, ChannelURL→channelUrl).
  • 🎛️ New controls: maxTotalResults global cap and minViews/minLikes/minComments engagement filters.
  • 🔐 Keys moved to Console environment variables (YOUTUBE_API_KEY, TIKHUB_API_KEY) — no secrets in source.
  • 🧹 Honest docs: clarified reliability, Shorts scan-budget behavior, pricing, and known limitations.

v1.0

  • Initial release (Supadata + YouTube Data API v3), channel & direct-URL discovery, optional transcripts, date filtering, and sorting.

🤝 Compliance

  • Intended for legitimate research & business intelligence.
  • Uses official/public APIs (TikHub, YouTube Data API v3); collects only public Shorts data.
  • Respects YouTube's Terms of Service and API usage policies.
  • Users are responsible for compliance with applicable laws (GDPR, CCPA, etc.).

💬 Support


Built with ❤️ for short-form content research.