Youtube Scraper
Pricing
from $4.99 / 1,000 results
Youtube Scraper
🎥 YouTube Scraper extracts structured data from videos, channels & playlists — titles, tags, views, likes, comments, captions, thumbnails & publish dates. 🔎 Perfect for SEO, competitor analysis, research & reporting. 🚀 Export-ready for CSV/JSON pipelines.
Pricing
from $4.99 / 1,000 results
Rating
0.0
(0)
Developer
Scraper Engine
Maintained by CommunityActor stats
0
Bookmarked
18
Total users
6
Monthly active users
4 days ago
Last modified
Categories
Share
YouTube Video Scraper — Extract Views, Likes and Transcripts
The Scraper-Engine YouTube Scraper extracts video title, view count, like count, channel subscriber count, publish date, and full transcripts from YouTube search results, channels, playlists, and direct video URLs — without the official YouTube Data API or an API key. Every run returns structured JSON with a consistent field set across videos, Shorts, and live streams, ready to load straight into a database or LLM pipeline. Run it now on Apify to start pulling YouTube video data.
What is YouTube Scraper?
YouTube Scraper is an Apify Actor that scrapes YouTube video, Shorts, and live-stream data from keyword search, direct video URLs, channel URLs, playlist URLs, and YouTube results-page URLs, returning one structured JSON row per video. No YouTube account, Google login, or API key is required — every request runs as an anonymous, logged-out browser session. It's built for developers, content marketers, and AI engineers who need YouTube video metadata, engagement metrics, and transcripts without maintaining their own scraper or a Data API quota.
What YouTube video data is publicly available to scrape?
Anyone who opens youtube.com logged out can see a video's title, view count, likes, duration, description, channel name, and subscriber count — YouTube Scraper reads that same surface.
| Data Category | Publicly Available | Restricted behind YouTube login |
|---|---|---|
| Title, description, duration, publish date | Yes | — |
| View count, likes, comment count | Yes | — |
| Channel name, subscribers, channel ID | Yes | Studio analytics — account login |
| Captions/subtitles (if published) | Yes | — |
| Creative Commons license flag | Yes | — |
| Age-restricted videos | No | Signed-in Google account |
| Private/unlisted videos | No | Owner/invite access |
| Purchased content details | Rarely exposed | Purchase + login |
YouTube Scraper only returns what a logged-out visitor sees — nothing behind a sign-in wall.
What data can I extract with YouTube Scraper?
YouTube Scraper returns video metadata, engagement metrics, channel identity, and optional transcripts in every dataset row.
| Field Name | Description |
|---|---|
title | Video title |
type | video or shorts |
id | YouTube video ID |
url | Canonical watch/Shorts URL |
thumbnailUrl | Best available thumbnail image URL |
date | Publish date (ISO 8601) |
duration | Video length as HH:MM:SS |
text | Full video description |
hashtags | Hashtags extracted from the title and description |
descriptionLinks | URLs and hashtag links found in the description |
order | Position within this run's results |
fromYTUrl | The search URL or direct URL this row was scraped from |
Engagement & audience metrics
| Field Name | Description |
|---|---|
viewCount | View count |
likes | Like count |
commentsCount | Approximate comment count, parsed from the video's comment panel header |
commentsTurnedOff | true when YouTube's own "Comments are turned off" state was detected |
Channel, technical & transcript fields
| Field Name | Description |
|---|---|
channelName | Channel display name |
channelUrl | Channel URL |
channelUsername | Channel handle — populated for search-result rows, null for direct-URL/channel/playlist rows |
channelId | Channel ID (UC...) |
numberOfSubscribers | Channel subscriber count |
location | Location metadata, only when the uploader attached one (rare) |
isCreativeCommons | Whether the video is Creative Commons licensed |
isPurchased | Best-effort flag for purchased/paid content (low coverage; YouTube rarely exposes this) |
subtitles | List of available caption language codes |
transcript | Full transcript text/SRT/JSON — only present when downloadSubtitles is on |
transcriptLanguage | Language code of the downloaded transcript |
transcriptFormat | srt, text, or timestamp |
🤖 Add-on: Need additional YouTube data?
Pair this actor with ../youtube-channel-finder to discover channels by keyword or URL before you scrape their videos, ../youtube-comments-scraper-ai-sentiment-analytics to pull comment text with sentiment and spam scoring that this video-level actor doesn't collect, or ../youtube-transcript-scraper-merged-transcript-export for bulk, channel-wide transcript exports in a single run.
How does YouTube Scraper differ from the official YouTube API?
YouTube Data API v3 requires a registered Google Cloud project and an API key, and it runs against a default daily quota (commonly 10,000 units, where a single search.list call costs 100 units), while YouTube Scraper runs on Apify with no key and no per-call unit accounting.
| Feature | YouTube Data API v3 | YouTube Scraper |
|---|---|---|
| Setup | Google Cloud project + API key/OAuth | Run directly on Apify, no key |
| Daily quota | Default 10,000 units/day; search.list costs 100 units | No API-style unit quota; bounded by your maxVideos/maxShorts/maxStreams input |
| Engagement + channel data in one call | Separate videos.list / channels.list calls needed | A single row returns view count, likes, comments, and channel info together |
| Transcripts | captions.download needs the video owner's OAuth for most videos | downloadSubtitles fetches public captions directly, no ownership required |
| Channel/playlist bulk pull | Manual pagination across channels.list/playlistItems.list | A channel or playlist URL in startUrls auto-expands to member videos |
| UI-style search filters (HD, 4K, HDR, 360°, Creative Commons, etc.) | Not exposed as API parameters | Native boolean filters matching YouTube's own search UI |
Use the official API when you need access under Google's own terms and already have quota to spare. Use YouTube Scraper when you need channel/playlist bulk pulls, transcripts, or UI-style filters the API doesn't expose in one call.
How to use YouTube Scraper
YouTube Scraper runs on Apify Console like any other Actor — no separate signup or YouTube credentials needed.
- Open YouTube Scraper on Apify Console (or call it via the Apify API or CLI).
- Add one or more
searchTermskeywords, or paste video, channel, playlist, or results-page URLs intostartUrls— leave both empty and the Actor falls back to a default"Crawlee"search. - Set
maxVideos,maxShorts, andmaxStreams, and toggle any filters (date, length, HD/4K/HDR, Creative Commons, etc.) you need. - Turn on
downloadSubtitlesif you want transcripts, and pick a language and format. - Start the run and open the Dataset tab to view, filter, and export results as JSON, CSV, Excel, or XML.
How to scale to bulk YouTube video extraction
searchTerms and startUrls are both arrays, so one run can process many keywords and many direct URLs together — each is handled independently and pushed to the same dataset. A single channel or playlist URL in startUrls also expands automatically to up to maxVideos + maxShorts member videos within that same run, so bulk channel or playlist extraction doesn't require looping separate runs per channel.
What can you do with YouTube video data?
- A content strategist researching a niche uses
viewCountandlikesacross search results for a keyword to identify which video angles are already performing well. - A channel-growth analyst uses
numberOfSubscribersanddatefrom repeated runs against the same channel URL to track upload cadence and audience growth over time. - A competitive researcher uses
hashtagsanddescriptionLinksto see how competitor videos structure metadata and where they drive outbound traffic. - An accessibility or localization team uses
subtitlesandtranscript(withdownloadSubtitleson) to audit caption coverage and language availability across a channel. - An AI engineer builds a YouTube research assistant that indexes
transcriptandtextinto a vector store, then usestitle,channelName, anddateas retrieval metadata so a RAG agent can answer questions and cite the source video.
How does YouTube Scraper handle rate limits and blocking?
Every request starts with no proxy and automatically escalates to Apify datacenter proxy, then residential proxy, if YouTube responds with a block (HTTP 403/429) — the Actor retries up to 3 times on residential before giving up, and once a tier works it stays on that tier for the rest of the run. Separately, if a video page loads with HTTP 200 but YouTube served a "thin" player response (missing view count or duration — a known degraded-response pattern), the Actor retries that single video fetch over a fresh residential connection. Parsing failures are isolated per item: one malformed search result doesn't drop the videos already collected on that page, and an error on one search term or one direct URL is logged and skipped without stopping the rest of the run. Search pagination is capped at 50 pages per query as a safety limit against infinite loops.
⬇️ Input
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
searchTerms | No | array | YouTube search keywords; the Actor runs a full scrape for each term. | ["Crawlee"] |
maxVideos | No | integer | Max regular (non-Shorts, non-live) videos to scrape per search term. 0 skips long-form videos. | 10 |
maxShorts | No | integer | Max YouTube Shorts to collect per keyword. 0 skips Shorts. | 0 |
maxStreams | No | integer | Max live/upcoming streams to scrape per search term. 0 ignores live content. | 0 |
startUrls | No | array | Direct video/Shorts, channel, playlist, or results?search_query= URLs; channels/playlists expand to member videos. | [] |
downloadSubtitles | No | boolean | Download video subtitles/transcripts when available. | false |
saveSubtitlesToKvs | No | boolean | Also store each transcript in the key-value store under transcript-<videoId>. | false |
subtitlesLanguage | No | string | Preferred caption/transcript language code. | "en" |
preferAutoGenerated | No | boolean | Prefer auto-generated captions over manually uploaded ones. | false |
subtitlesFormat | No | string | Transcript output format: srt, text, or timestamp. | "srt" |
sortingOrder | No | string | Sort the final dataset by relevance, date, viewCount, or rating (post-processing). | "" |
dateFilter | No | string | YouTube's "Upload date" filter: hour, today, week, month, year. | "" |
videoTypeFilter | No | string | video restricts search results to standard long-form videos only. | "" |
lengthFilter | No | string | YouTube's length preset: short (<4 min), medium (4–20 min), long (>20 min). | "" |
isHD | No | boolean | Only include HD videos (720p or higher). | false |
hasCC | No | boolean | Only include videos with at least one proper closed-caption track. | false |
isCreativeCommons | No | boolean | Only include videos marked Creative Commons licensed. | false |
is3D | No | boolean | Only include stereoscopic 3D videos. | false |
isLive | No | boolean | Restrict results to live or live-style content. | false |
isPurchased | No | boolean | Best-effort filter for purchased/paid content. | false |
is4K | No | boolean | Only include videos with at least one 2160p (4K) stream. | false |
is360 | No | boolean | Only include immersive 360° videos. | false |
hasLocation | No | boolean | Only include videos with explicit location metadata. | false |
isHDR | No | boolean | Only include High Dynamic Range (HDR) videos. | false |
isVR180 | No | boolean | Only include VR180 immersive videos. | false |
publishedAfter | No | string | Only include videos published after this absolute date (YYYY-MM-DD). | "" |
sortBy | No | string | Post-processing sort field: date, viewCount, or likes. | "" |
proxyConfiguration | No | object | Starting proxy setup; the Actor auto-escalates to datacenter then residential proxy on blocks. | {"useApifyProxy": false} |
Example input
{"searchTerms": ["Crawlee", "web scraping tutorial"],"maxVideos": 15,"maxShorts": 5,"maxStreams": 0,"startUrls": ["https://www.youtube.com/@Crawlee"],"downloadSubtitles": true,"saveSubtitlesToKvs": false,"subtitlesLanguage": "en","preferAutoGenerated": false,"subtitlesFormat": "srt","sortingOrder": "viewCount","dateFilter": "month","videoTypeFilter": "","lengthFilter": "medium","isHD": true,"hasCC": false,"isCreativeCommons": false,"is3D": false,"isLive": false,"isPurchased": false,"is4K": false,"is360": false,"hasLocation": false,"isHDR": false,"isVR180": false,"publishedAfter": "2025-01-01","sortBy": "viewCount","proxyConfiguration": { "useApifyProxy": false }}
⬆️ Output
Each video, Short, or stream is pushed as one typed JSON row to the Apify dataset, with a consistent schema across runs. The default dataset view shows 24 summary columns, but every pushed row can carry up to 28 fields — including location and the three transcript fields — depending on your input. Results export as JSON, CSV, Excel, or XML from the Dataset tab or the Apify API. Billing uses Apify's Pay Per Event model: each row pushed to the dataset charges one row_result event, with no separate unbilled accounting rows mixed into the dataset.
Example output
{"title": "Crawlee Tutorial: Build Your First Web Scraper in Node.js","type": "video","id": "aBcDeFgHiJk","url": "https://www.youtube.com/watch?v=aBcDeFgHiJk","thumbnailUrl": "https://i.ytimg.com/vi/aBcDeFgHiJk/hq720.jpg","viewCount": 48213,"date": "2025-03-14T09:00:00.000Z","likes": 1872,"location": null,"channelName": "Crawlee","channelUrl": "https://www.youtube.com/channel/UCRK2h2WV5NgHmoO2HXsxSww","channelUsername": "Crawlee","channelId": "UCRK2h2WV5NgHmoO2HXsxSww","numberOfSubscribers": 12400,"duration": "00:14:22","commentsCount": 96,"commentsTurnedOff": false,"text": "Learn how to build your first web scraper with Crawlee in this step-by-step tutorial...","descriptionLinks": [{ "url": "https://crawlee.dev", "text": "https://crawlee.dev" }],"subtitles": ["en", "es"],"order": 0,"fromYTUrl": "https://www.youtube.com/results?search_query=Crawlee","hashtags": ["#webscraping", "#nodejs"],"isCreativeCommons": false,"isPurchased": false,"transcript": "1\n00:00:00,000 --> 00:00:03,500\nWelcome back to another tutorial...","transcriptLanguage": "en","transcriptFormat": "srt"}
How does it work?
YouTube Scraper sends requests through the impit HTTP client, which mimics real Chrome browser traffic instead of calling YouTube's official Data API. For search, it calls YouTube's own internal youtubei/v1/search endpoint and paginates through continuation tokens; for channels and playlists, it calls the internal /v1/browse endpoint; for per-video enrichment, it parses the public watch page's ytInitialData and ytInitialPlayerResponse payloads for likes, comments, subscriber counts, and captions. If YouTube blocks or degrades a response, requests automatically escalate through no proxy, then Apify datacenter proxy, then residential proxy. Only publicly reachable YouTube pages and endpoints are read — nothing requires sign-in. The output schema stays fixed regardless of changes to YouTube's page layout or internal payload structure.
Integrations
YouTube Scraper runs on Apify, so it works anywhere you can call an HTTP API or an Apify client library — no proprietary SDK required.
Calling YouTube Scraper programmatically
from apify_client import ApifyClientclient = ApifyClient("<APIFY_API_TOKEN>")run = client.actor("scraper-engine/youtube-scraper").call(run_input={"searchTerms": ["Crawlee"],"maxVideos": 15,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], item["viewCount"])
Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.
MCP integration for AI agents
YouTube Scraper is reachable through Apify's Actors MCP Server, which exposes Actors on Apify Store as callable tools for MCP-compatible clients such as Claude Desktop and Claude Code. Register it by connecting from this Actor's page in Apify Console, or by running npx @apify/actors-mcp-server configured with this Actor's store ID.
No-code tools (n8n, Make, LangChain)
In n8n, use the HTTP Request node (or the community Apify node) pointed at this Actor's run endpoint, with your Apify API token in the Authorization header. In Make, use the Apify app's "Run Actor and get dataset items" module and map searchTerms or startUrls from earlier scenario steps. In LangChain, call the same Apify API endpoint from a custom Tool, or load results with the community Apify dataset loader, so an agent can pull YouTube video data mid-conversation.
Is it legal to scrape YouTube videos?
Scraping publicly available YouTube video and channel metadata is generally legal — it's the same data any logged-out visitor can view on youtube.com. YouTube Scraper returns only publicly visible data: no private videos, no sign-in-only content, and no individual comment text or commenter identities. Video and channel metadata here is largely business/content data (titles, view counts, channel names, descriptions), though a channel name or handle can identify an individual creator, so treat channel-identifying fields with the same care you would any personal data if you store them in bulk. This is not legal advice — consult legal counsel if your use case involves bulk storage of personal data or falls under YouTube's Terms of Service.
Frequently asked questions
What YouTube video fields does YouTube Scraper return?
title, viewCount, likes, duration, channelName, and numberOfSubscribers are among the 25+ fields returned per video — see What data can I extract with YouTube Scraper? above for the full list.
Does YouTube Scraper require a YouTube account or login?
No. Every request runs as an anonymous, logged-out session, so no YouTube account, cookies, or API key are needed to run this Actor.
How many videos can I extract in one run?
There's no fixed dataset cap — maxVideos, maxShorts, and maxStreams each accept up to 9999 per search term or URL, and you can combine multiple search terms and direct URLs in a single run.
What happens if a video is private, deleted, or age-restricted?
The Actor skips it rather than fabricating data. If the video page can't be fetched at all, that URL is logged as failed and produces no row; if the page loads but YouTube's own player data is thin or missing (common for restricted videos), the row falls back to whatever partial metadata is available and unavailable fields are left null.
Can I scrape multiple YouTube videos, channels, or playlists at once?
Yes. searchTerms and startUrls are both arrays — mix keyword searches with direct video, channel, playlist, and results-page URLs in the same run, and every match is pushed to the same dataset.
Does YouTube Scraper work with Claude, ChatGPT, and other AI agent tools?
Yes. It's callable as a plain HTTP endpoint through the Apify API from any agent framework, and it's reachable through Apify's Actors MCP Server for MCP-compatible clients like Claude Desktop and Claude Code.
How does YouTube Scraper compare to building your own YouTube scraper?
It already handles the parts a self-built scraper has to maintain: proxy escalation when YouTube blocks a request, retrying degraded "thin" responses, and parsing YouTube's internal search and browse payloads, which change without notice. Building and maintaining that yourself means tracking YouTube's endpoint and payload changes on an ongoing basis instead of consuming a stable JSON schema.
Does YouTube Scraper return data in a format LLMs can use directly?
Yes. Output is typed, normalized JSON with consistent field names across every run — no HTML to parse, no CSS selectors to write. Pass it directly into an LLM prompt, index it into a vector store, or feed it to an agent tool.
What happens when YouTube changes its layout or anti-bot system?
The Actor is maintained against YouTube's current search, browse, and watch-page payloads, and the output schema stays stable even when YouTube changes its internal structure, so downstream integrations don't need to change when the scrape logic is updated.
Can I use YouTube Scraper without managing proxies or browser infrastructure?
Yes. The Actor starts with no proxy and automatically escalates to Apify datacenter proxy and then residential proxy (with up to 3 retries) if YouTube blocks the request, so you don't need to configure or rotate proxies yourself unless you want to supply your own proxyConfiguration.
Which YouTube video fields work best for AI training data and RAG indexing?
For RAG, index transcript and text (the full description) as retrievable content, with title, channelName, and date as metadata for citations and filtering. For training or analytics data, viewCount, likes, commentsCount, and duration are typed numeric fields with consistent structure across every record.
Related scrapers
| Scraper | What it extracts |
|---|---|
| YouTube Channel Finder | Channel name, handle, ID, subscriber count, and description from a keyword or channel URL |
| YouTube Comments Scraper: AI Sentiment Analytics | Comment text with optional AI sentiment/toxicity scoring and spam heuristics |
| YouTube Transcript Scraper: Merged Transcript Export | Bulk transcript discovery and export across a channel, playlist, or search |
| TikTok Trending Videos Scraper With Author Profile | Trending TikTok videos with author profile data |
| Instagram Reels Scraper | Instagram Reels video metadata and engagement |
Your feedback
Found a bug or missing a field in YouTube Scraper? Let us know through the Issues tab on this Actor's Apify Console page. Reports like this are what keep the field mappings accurate as YouTube's site changes.