🔥YouTube Video & Comment Scraper (SEO, Titles) - ALMOST FREE avatar

🔥YouTube Video & Comment Scraper (SEO, Titles) - ALMOST FREE

Pricing

from $0.30 / 1,000 results

Go to Apify Store
🔥YouTube Video & Comment Scraper (SEO, Titles) - ALMOST FREE

🔥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

Ani Björkström

Maintained by Community

Actor stats

1

Bookmarked

49

Total users

0

Monthly active users

a few seconds ago

Last modified

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.

FieldListing rowFull detailsDescription
id, url, titleVideo ID, canonical watch URL, title
channelName, channelUrlUploader name and handle URL
channelIdUC… channel ID
viewCountInteger view count
durationmm:ss or h:mm:ss
dateRelative text on listing rows ("3 weeks ago"), ISO 8601 on full-detail rows
thumbnailUrlMax-resolution thumbnail
isShort, isLiveShorts and live-stream flags
description, descriptionLinks, hashtagsFull description, every link in it, hashtags
likes, commentsCount, commentsTurnedOffEngagement numbers (comment count is null when YouTube hides it)
numberOfSubscribers, isMonetized, categoryChannel size, monetization signal, YouTube category
searchTerm, fromYTUrlWhich 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
}
OptionDefaultWhat 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
maxVideosPerSearch2Cap per search term, channel or playlist
maxShortsPerSearch, maxStreamsPerSearch0Also collect Shorts / live streams from search results
fetchVideoDetailsfalseOpen every watch page for likes, description, hashtags, comment count, subscribers, category
sortingOrder, dateFilter, lengthFilterrelevance / any / anyYouTube's own search filters (search terms only)
proxyConfigurationApify ProxyResidential 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:

JobRowsCost 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 ApifyClient
client = 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.