🔥YouTube Video & Comment Scraper (SEO, Titles) - ALMOST FREE
Pricing
from $0.30 / 1,000 results
🔥YouTube Video & Comment Scraper (SEO, Titles) - ALMOST FREE
Scrape YouTube videos, titles, descriptions, views, likes, comments, and channel data. Ideal for YouTube SEO research, competitor analysis, trend discovery, and automation workflows. Free plan available – no credit card required.
Pricing
from $0.30 / 1,000 results
Rating
0.0
(0)
Developer
Ani Björkström
Maintained by CommunityActor stats
1
Bookmarked
49
Total users
0
Monthly active users
a few seconds ago
Last modified
Categories
Share
YouTube Channel & Video Scraper – Search, Playlists & Stats
YouTube Channel Scraper, YouTube Video Scraper and YouTube Search Scraper in one actor. Paste channel URLs, playlist URLs, video URLs or plain search terms and get flat, spreadsheet-ready rows: title, views, likes, duration, upload date, subscriber count, description links, hashtags and more.
- No API key, no quota. Reads public YouTube pages directly, so the YouTube Data API's 10,000-unit daily limit never gets in your way.
- Pay per result, from $1 per 1,000 rows. No subscription, no minimum. Failed requests produce no rows and cost nothing.
- Four sources, one schema. Search terms, channels, playlists and single videos all land in the same dataset with the same field names, ready for Google Sheets, n8n, Make or an LLM.
What you get
Every row is one video. Listing rows (from search, a channel's Videos tab or a playlist) are fast and cheap; turn on Fetch full video details to visit each watch page and add engagement data.
| Field | Listing row | Full details | Description |
|---|---|---|---|
id, url, title | ✓ | ✓ | Video ID, canonical watch URL, title |
channelName, channelUrl | ✓ | ✓ | Uploader name and handle URL |
channelId | ✓ | UC… channel ID | |
viewCount | ✓ | ✓ | Integer view count |
duration | ✓ | ✓ | mm:ss or h:mm:ss |
date | ✓ | ✓ | Relative text on listing rows ("3 weeks ago"), ISO 8601 on full-detail rows |
thumbnailUrl | ✓ | ✓ | Max-resolution thumbnail |
isShort, isLive | ✓ | ✓ | Shorts and live-stream flags |
description, descriptionLinks, hashtags | ✓ | Full description, every link in it, hashtags | |
likes, commentsCount, commentsTurnedOff | ✓ | Engagement numbers (comment count is null when YouTube hides it) | |
numberOfSubscribers, isMonetized, category | ✓ | Channel size, monetization signal, YouTube category | |
searchTerm, fromYTUrl | ✓ | ✓ | Which search term or URL produced the row |
Channel rows also carry numberOfSubscribers, channelTotalVideos, channelDescription, channelDescriptionLinks, isMonetized and inputChannelUrl (plus channelJoinedDate, channelLocation, channelTotalViews when YouTube exposes them on the page). Playlist rows add playlistTitle, playlistVideoCount and playlistIndex. Shorts rows from search carry isShort: true and a /shorts/ URL.
Input
Run it with no input at all and it scrapes the default search term, so a scheduled run never comes back empty. Realistic inputs:
Scrape a YouTube channel
{"directUrls": ["https://www.youtube.com/@veritasium"],"maxVideosPerSearch": 30}
Search YouTube with filters
{"searchTerms": ["n8n automation", "make.com tutorial"],"maxVideosPerSearch": 20,"maxShortsPerSearch": 5,"sortingOrder": "viewCount","dateFilter": "month","lengthFilter": "long"}
Playlist plus single videos, with full watch-page details
{"directUrls": ["https://www.youtube.com/playlist?list=PLFs4vir_WsTwEd-nJgVJCZPNL3HALHHpF","https://www.youtube.com/watch?v=dQw4w9WgXcQ"],"maxVideosPerSearch": 50,"fetchVideoDetails": true}
| Option | Default | What it does |
|---|---|---|
searchTerms | ["n8n"] | One YouTube search per term. Set to [] when you only use URLs. |
directUrls | [] | Video, Shorts, channel (@handle or /channel/UC…) and playlist URLs |
maxVideosPerSearch | 2 | Cap per search term, channel or playlist |
maxShortsPerSearch, maxStreamsPerSearch | 0 | Also collect Shorts / live streams from search results |
fetchVideoDetails | false | Open every watch page for likes, description, hashtags, comment count, subscribers, category |
sortingOrder, dateFilter, lengthFilter | relevance / any / any | YouTube's own search filters (search terms only) |
proxyConfiguration | Apify Proxy | Residential proxies are used by default; YouTube throttles datacenter IPs |
How many rows per source? The actor reads the first page of each source: roughly 20 videos per search term, the newest ~30 videos of a channel and up to 100 videos of a playlist. Add more search terms, channels or playlists to scale out; there is no limit on the number of inputs in one run.
Output example
A full-detail row (direct video URL, or any listing with fetchVideoDetails: true):
{"id": "dQw4w9WgXcQ","url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)","description": "The official video for “Never Gonna Give You Up” by Rick Astley...","thumbnailUrl": "https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg","channelName": "Rick Astley","channelUrl": "https://www.youtube.com/@RickAstleyYT","channelId": "UCuAXFkgsw1L7xaCfnd5JJOw","duration": "3:33","viewCount": 1818740821,"likes": 19404502,"date": "2009-10-24T23:57:33-07:00","commentsCount": null,"numberOfSubscribers": 4540000,"isMonetized": true,"commentsTurnedOff": false,"descriptionLinks": [{ "url": "https://linktr.ee/rickastleynever", "text": "https://linktr.ee/rickastleynever" }],"hashtags": [],"category": "Music","isLive": false,"isShort": false,"fromYTUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"}
A channel listing row:
{"id": "JsBZOcqZerk","url": "https://www.youtube.com/watch?v=JsBZOcqZerk","title": "This Machine Made Wartime Germany (Almost) Impossible to Defeat","duration": "47:42","viewCount": 2500000,"date": "1 day ago","channelName": "Veritasium","channelUrl": "http://www.youtube.com/@veritasium","numberOfSubscribers": 21300000,"channelTotalVideos": 535,"inputChannelUrl": "https://www.youtube.com/@veritasium"}
Use cases
- YouTube SEO and content research – SEO agencies and creators pull the top videos for a keyword with
sortingOrder: "viewCount"to study titles, lengths, hashtags and description links that already rank. - Competitor channel monitoring – growth and marketing teams schedule a daily run over competitor channel URLs and get every new upload with its view count in Google Sheets or Slack.
- Influencer discovery – agencies scan search results and channel pages for subscriber counts, monetization status and the social links creators put in their descriptions.
- Trend tracking – researchers combine
dateFilter: "week"with a list of search terms to watch what is being published on a topic right now. - Datasets for AI and RAG – builders collect titles, descriptions and hashtags for whole playlists or channels as clean JSON, then pair the rows with the YouTube Transcript Scraper for the spoken content.
- Brand and campaign tracking – find every video mentioning a product name and track its views over time.
- Academic and media studies – build reproducible samples of videos per query, channel or playlist with stable field names.
Pricing
Pay per result. Every row written to the dataset costs from $1 per 1,000 (cheaper on higher Apify plans) plus a negligible start fee; a run with no results costs nothing beyond that start fee. A quick sizing guide:
| Job | Rows | Cost on the free plan |
|---|---|---|
| Newest 30 videos from 10 channels | ~300 | ~$0.30 |
| 50 search terms × 20 results | ~1,000 | ~$1.00 |
| 100 playlists × 100 videos | ~10,000 | ~$10.00 |
Turning on fetchVideoDetails does not change the per-row price; it just makes each row richer and the run a little slower.
Integrations
Run the YouTube scraper from the Console, on a schedule, or from anywhere with the Apify API. Results are available as JSON, CSV, Excel, XML or RSS.
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("nourishing_courier/youtube-scraper").call(run_input={"directUrls": ["https://www.youtube.com/@veritasium"],"maxVideosPerSearch": 30,})for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["title"], row["viewCount"])
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('nourishing_courier/youtube-scraper').call({searchTerms: ['n8n automation'],maxVideosPerSearch: 20,sortingOrder: 'viewCount',});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
curl
curl -X POST "https://api.apify.com/v2/acts/nourishing_courier~youtube-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"directUrls":["https://www.youtube.com/playlist?list=PLFs4vir_WsTwEd-nJgVJCZPNL3HALHHpF"],"maxVideosPerSearch":50}'
n8n, Make, Zapier – use the Apify node/module, pick this actor, paste the JSON input above and map the dataset items to Google Sheets, Airtable, Notion or Slack. LangChain / LlamaIndex / MCP – the flat rows work as-is as documents or as tool output through the Apify MCP server.
Limits and fair use
The actor reads the first page of each search, channel or playlist and does not log in, so it only ever sees what an anonymous visitor sees: no private videos, no unlisted playlists, no comments and no subtitle downloads (use the dedicated YouTube Transcript Scraper for captions). Relative dates on listing rows come from YouTube's own text. You are responsible for using the data in line with YouTube's Terms of Service and applicable law; this scraper collects public metadata only and stores no personal data beyond what YouTube shows publicly.
FAQ
Can I scrape a YouTube channel without an API key?
Yes. Paste the channel URL (https://www.youtube.com/@handle or /channel/UC…) into Direct URLs and you get the channel's newest videos with view counts, plus numberOfSubscribers and channelTotalVideos on every row. No Google Cloud project, no API key, no quota.
How many videos per channel or search does it return?
One page per source: about 20 videos per search term, the newest ~30 videos of a channel and up to 100 videos of a playlist. maxVideosPerSearch caps each of them. To go wider, add more channels, playlists or search terms in the same run.
Does it scrape YouTube Shorts?
Yes. Set maxShortsPerSearch above 0 to collect Shorts from search results (rows are flagged isShort: true), or paste a Shorts URL directly.
What is the difference between listing rows and full details?
Listing rows come straight from the search, channel or playlist page and contain title, views, duration, date and channel. fetchVideoDetails: true also opens each watch page and adds likes, the full description with links, hashtags, comment count, subscriber count, category and monetization status. Direct video URLs always get full details.
Can it get YouTube comments or transcripts?
Not this actor: it returns the comment count and commentsTurnedOff, not the comments themselves, and it does not download subtitles. For captions in plain text, SRT or VTT use the YouTube Transcript Scraper.
Does it work with n8n, Make or Zapier?
Yes. All three have Apify integrations; choose this actor, pass the JSON input and consume the dataset. Because every row is flat, it maps straight onto spreadsheet columns.
Why does a search return fewer videos than I asked for?
YouTube returns about 20 results per page and the actor reads only that page. Sorting by view count or applying a date filter also narrows the list. Use several search terms for more coverage.
Do I need proxies?
Apify residential proxy is on by default because YouTube throttles datacenter IPs. You can switch to your own proxies in Proxy configuration.
How is a scheduled run billed if YouTube changes something?
Per result. If a page cannot be parsed you get no row for it and are not charged for it.