Skip to content

Latest commit

Β 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ“Ί YouTube Scraper Pro β€” channels, videos, Shorts & transcripts

Scrape YouTube two ways in one Actor: find channels by keyword with audience metrics and public contact links, or pull videos from any channel, playlist, Short, live stream, podcast, course or hashtag with full metadata and optional transcripts.

No YouTube API key, no quota, no sign-in. Export to JSON, CSV, Excel, XML or HTML, or pull the results straight from the Apify API.

πŸ” What you can do

  • Build a YouTube creator list β€” search a niche and get every channel behind the results, with subscribers, total views, country and links.
  • Influencer and lead research β€” channel rows carry a business-email flag, any e-mail written in the description, and social profiles split by platform (Instagram, X, TikTok, Facebook, LinkedIn, Patreon, Linktree…).
  • Competitor and market research β€” compare audience size, upload volume, join date and country across a whole niche.
  • Content and SEO analysis β€” scrape a channel's videos with views, duration, keywords, hashtags and description.
  • Transcripts for AI/NLP β€” add transcripts as plain text, SRT or WebVTT for summarising, translation or RAG pipelines.
  • Shorts, live streams, podcasts and courses β€” each channel tab is scrapeable on its own.
  • Monitoring β€” schedule a keyword or channel and watch new videos or new channels appear.

πŸ“¦ Two kinds of result

Every row carries a type field, so a mixed run is easy to split.

πŸ‘€ Channel row (type: "channel")

{
  "type": "channel",
  "channel": {
    "id": "UCMb0O2CdPBNi-QqPk5T3gsQ",
    "handle": "@jameshoffmann",
    "title": "James Hoffmann",
    "url": "https://www.youtube.com/@jameshoffmann",
    "description": "Hi! My name is James, and I make videos about anything and everything to do with coffee…",
    "isVerified": true,
    "isFamilySafe": true,
    "isUnlisted": false,
    "isNoindex": false
  },
  "metrics": {
    "subscribers": 2560000,
    "subscriberText": "2.56M subscribers",
    "subscriberCountIsExact": false,
    "videos": 409,
    "videoText": "409 videos",
    "totalViews": 394118287,
    "totalViewText": "394,118,287 views"
  },
  "profile": {
    "country": "United Kingdom",
    "joinedDate": "2014-12-08",
    "joinedText": "Joined Dec 8, 2014",
    "keywords": ["coffee", "james hoffmann", "jimseven"],
    "rssUrl": "https://www.youtube.com/feeds/videos.xml?channel_id=UCMb0O2CdPBNi-QqPk5T3gsQ",
    "tabs": [{ "title": "Videos", "url": "https://www.youtube.com/@jameshoffmann/videos" }],
    "availableCountryCodes": ["US", "GB", "…"]
  },
  "contacts": {
    "hasBusinessEmail": true,
    "emails": [],
    "socialLinks": { "instagram": "https://www.instagram.com/jimseven", "twitter": "https://twitter.com/jimseven" },
    "links": [{ "title": "Linktree", "url": "http://linktree.com/jimseven", "platform": "linktree" }],
    "externalLinks": ["http://linktree.com/jimseven", "https://www.jameshoffmann.co.uk/contact-me"]
  },
  "images": {
    "avatarUrl": "https://yt3.googleusercontent.com/…=s160-c-k-c0x00ffffff-no-rj",
    "bannerUrl": null,
    "avatarImages": [{ "url": "…", "width": 160, "height": 160 }]
  },
  "discoverySource": {
    "sourceKind": "keyword",
    "value": "coffee roasting",
    "discoverySurface": "video_results",
    "rank": 1,
    "sourceUrl": "https://www.youtube.com/results?search_query=coffee+roasting&hl=en&gl=US"
  },
  "sourceVideo": {
    "videoId": "N6BJVM5tvnw",
    "title": "Coffee Roasting Explained",
    "url": "https://www.youtube.com/watch?v=N6BJVM5tvnw",
    "publishedText": "3 years ago",
    "viewText": "2,108,385 views",
    "viewCount": 2108385
  }
}

discoverySource records how the channel was found and at which rank; sourceVideo is the video that led to it, or null when the channel came from channel results or from a URL you supplied. Each channel is saved once per run, on its first match.

🎬 Video row (type: "video")

{
  "type": "video",
  "videoId": "Iy8m7AbZVm0",
  "VideoURL": "https://www.youtube.com/watch?v=Iy8m7AbZVm0",
  "category": "Videos",
  "Video_title": "Taste Coffee With Me For The Last Time",
  "Channel_Id": "UCMb0O2CdPBNi-QqPk5T3gsQ",
  "Channel_Name": "James Hoffmann",
  "Description": "Buy A Tasting Kit: …",
  "Views": "468911 views",
  "viewCount": 468911,
  "Runtime": "4:39",
  "durationSeconds": 279,
  "published_Date": "2026-09-04T07:54:44-07:00",
  "thumbnail": "https://i.ytimg.com/vi_webp/Iy8m7AbZVm0/maxresdefault.webp",
  "isLive": false,
  "keywords": ["james hoffmann", "coffee"],
  "hashtags": ["#coffee"],
  "mentions": [],
  "youtubeCategory": "Entertainment",
  "hasTranscript": true,
  "transcript": {
    "formattedContent": "1\n00:00:01,000 --> 00:00:03,000\nyou know that feeling whenever you walk…",
    "format": "srt",
    "language": "en",
    "isAutoGenerated": false,
    "segmentCount": 172,
    "timestamps": [{ "time": "0:01", "text": "you know that feeling whenever you walk" }]
  }
}

▢️ How to run it

  1. Search by keyword β€” put your topics in Keywords to search on YouTube and pick what to save: channel profiles, videos, or videos plus their channels.
  2. Or scrape by URL β€” paste channels, @handles, videos, Shorts, playlists, #hashtags or saved YouTube search pages into YouTube URLs.
  3. Choose channel tabs (Videos, Shorts, Live, Podcasts, Playlists, Courses) and the order to read them in.
  4. Set the limits β€” a cap per input and a cap for the whole run.
  5. Optionally add transcripts in plain text, SRT or WebVTT.
  6. Run it and open the Channels or Videos tab of the dataset.

βš™οΈ Input

Field Type What it does
searchKeywords string array Topics to search on YouTube, one per line (up to 500).
resultsType string What a keyword returns: channels, videos, or both (a video row plus its channel's profile).
channelsFrom string Where channels are collected: both surfaces, videoResults, or channelSearch.
startUrls string array Channels, @handles, videos, Shorts, playlists, #hashtags, or youtube.com/results search pages. Channel URLs may name a tab, e.g. /@handle/shorts.
includeChannelProfile boolean Also save a profile row for every channel URL you supplied.
channelTabs string array Which tabs to read for a plain channel URL. Default ["Videos"].
sortVideosBy string Latest, Popular or Oldest while reading a channel tab.
maxResults integer Cap for each keyword, each URL and each channel tab. 0 skips videos (pair with includeChannelProfile for profiles only). Empty = keep paging.
maxTotalResults integer Stop the whole run after this many rows.
includeTranscript boolean Add transcripts to video rows.
transcriptLanguage string 2-letter language code, e.g. en, es, ar. YouTube's translation is used when needed.
transcriptFormat string text, srt or vtt. Timestamped segments are always included.
onlyWithTranscript boolean Skip videos that have no transcript.

Example input

{
  "searchKeywords": ["coffee roasting"],
  "resultsType": "channels",
  "channelsFrom": "both",
  "maxResults": 100
}

πŸ’³ What you pay for

This Actor charges per result:

  • channel-scraped β€” one unique channel profile saved to your dataset.
  • video-scraped β€” one video saved to your dataset.

Nothing is charged for results the filters skip, for pages that return nothing, or for a channel that was already saved earlier in the run. Set Max results for the whole run (or the run's max cost) to cap spend exactly.

Transcripts are produced by the separate YouTube Transcript & Metadata Extractor, which bills its own usage when includeTranscript is on.

πŸ“Œ Good to know

  • Channels are deduplicated per run β€” the first match wins and keeps its discovery evidence.
  • Playlists return up to 200 videos, which is YouTube's own limit for playlist pages. To go through a channel's full catalogue, scrape its Videos tab instead.
  • Hashtags are read through YouTube search, because YouTube's own hashtag page stops after roughly a dozen videos.
  • Some channels hide their subscriber count β€” those rows carry subscribers: null and still include everything else.
  • Business e-mails are never exposed by YouTube without a sign-in, so hasBusinessEmail tells you whether the channel has one; emails holds addresses written in the description.
  • Transcripts don't exist for every video, and auto-generated ones can be imperfect. Use onlyWithTranscript when you need guaranteed text.

❓ FAQ

Is scraping YouTube legal? This Actor reads only public pages, with no sign-in. Public data scraping is broadly lawful, but what you do with the data (personal data, copyright) is your responsibility. Ask a lawyer for your specific case.

Do I need a YouTube API key? No. There is no Google Cloud project, no API key and no daily quota.

Can I get every video of a channel? Yes β€” give the channel URL, leave Max results per input empty, and the Videos tab is read page by page.

Can I search several keywords at once? Yes, up to 500 keywords per run, each with its own result cap.

Can I re-run a search I built on YouTube? Yes. Copy the youtube.com/results?... URL β€” its filters (upload date, duration, sorting) are kept.

How do I get subtitles as files? Set Transcript format to SRT or WebVTT; transcript.formattedContent is a valid subtitle file you can save directly.

Does it work for non-English channels? Yes, any language. Transcripts can be requested in a specific language, translated by YouTube when available.

🧰 More YouTube Actors

Already signed in? These open straight in your Console, ready to run:

Actor What it does
πŸ“ YouTube Transcript & Metadata Extractor Transcripts and metadata for videos, channels and playlists.
πŸ’¬ YouTube Comments Scraper Comments and replies, with likes and authors.
⚑ YouTube Shorts Trend Finder Shorts by keyword, ranked by views with date filters.
🎬 YouTube Playlist Extractor Every video in a playlist.
🌍 YouTube Subtitle Translator Translate subtitles into another language.
#️⃣ YouTube Hashtag Extractor Videos behind a hashtag β€” free to use.

πŸ“ Feedback

Found a bug or need a field that isn't here? Open an issue on the Actor's page in Apify Console and it gets looked at quickly.

Support

🌐 Website flowextractapi.com Β· πŸ“§ [email protected] Β· πŸ’¬ GitHub FlowExtractAPI Β· πŸ’Ό LinkedIn flowextract-api Β· 🐦 X @FlowExtractAPI Β· πŸ“± Facebook flowextractapi Β· 🎡 TikTok @flowextractapi

Legal & compliance

Public data only Β· respects source rate limits and terms Β· no storage of personal information Β· suitable for commercial use Β· No affiliation with or endorsement by YouTube is implied.

YouTube Scraper Pro β€” by FlowExtract API. Turn any website into structured data.

About

Extracts metadata and scripts from all YT content, identifying smart keywords like #hashtags and @channelnames. It supports playlists, shorts, live, podcasts, courses, channels, videos, and batch requests.

Topics

Resources

Stars

3 stars

Watchers

2 watching

Forks

Contributors