YouTube Scraper avatar

YouTube Scraper

Pricing

from $0.50 / 1,000 results

Go to Apify Store
YouTube Scraper

YouTube Scraper

Extract YouTube videos, shorts, channels, and playlists from search queries, URLs, or channel handles. Returns titles, view counts, publish dates, channel info, thumbnails, durations across 42 countries and 19 languages. Video and Shorts URLs also return exact like counts.

Pricing

from $0.50 / 1,000 results

Rating

5.0

(1)

Developer

SolidCode

SolidCode

Maintained by Community

Actor stats

2

Bookmarked

111

Total users

23

Monthly active users

8 days ago

Last modified

Share

Extract YouTube videos, shorts, channels, and playlists at scale. Feed the actor search queries, YouTube URLs (video, channel, playlist, shorts, or search pages), or channel handles like @mkbhd — mix and match in a single run. Each result comes back as a clean, structured row with titles, view counts, publish dates, channel info, thumbnails, and durations. Built for media analysts, agencies, and researchers who need reliable YouTube data in a spreadsheet the same afternoon they think of the question.

Why This Scraper?

  • One input surface, three input types — search queries, URLs, and @handles can all run in the same job, and every row is tagged with recordType (video, short, channel, or playlist) so you always know what you're looking at.
  • Nine video-feature filters and four sort orders — combine HD, 4K, HDR, Subtitles, Creative Commons, Live, 360°, VR180, and 3D, then narrow by upload date and duration and sort by relevance, upload date, view count, or rating.
  • Exact like counts, not rounded badges — pass a video or Shorts URL and you get the precise figure (19358151), not the "19M" YouTube prints on the page, in all 19 interface languages.
  • 42 countries, 19 interface languages — pick both from friendly dropdowns (no raw locale codes), and publishedAt still resolves to a clean ISO timestamp in every one of them, so a German or Japanese run sorts by date exactly like an English one.
  • Shorts on your terms — one dropdown exports a channel's Shorts only, its regular videos only, or both, and youtube.com/@handle/shorts, /videos, and /streams links are honoured exactly as written. Keyword searches take the same switch, so you never pay for Shorts you didn't ask for.
  • Sorted across the whole dataset, not page by page — "Upload date" puts the newest video in row 1 and the oldest in the last row of the entire export, and "View count" does the same for the most-viewed.
  • Channel enrichment — add fetchChannelInfo: true and every channel input emits a row with subscribers, total views, video count, description, country, and creation date.
  • A cap that is really a capmaxResults is a hard ceiling per source, and Shorts, the channel-details row, and a playlist's summary row all count inside it. Ask for 30 and you are billed for 30 rows, never 31.

Use Cases

Market Research

  • Track share of voice on a topic or keyword over time
  • Measure how a new product, album, or announcement is performing across creators
  • Benchmark total view counts and publish cadence across a category

Lead Generation

  • Build creator lists in any niche by searching keywords and collecting channel handles
  • Enrich channel rosters with subscriber counts, contact info hints (channel description), and country targeting
  • Find rising channels before they're discovered by competitors

Content Strategy

  • See which titles, thumbnails, and durations are winning in your niche
  • Identify trending formats (shorts vs. long-form) per category
  • Study upload cadence and posting times of top performers

Competitive Analysis

  • Monitor competitor channels — their full Videos tab plus Shorts
  • Track competitor view counts and publish cadence week-over-week
  • Spot when a competitor pivots topics or picks up a new trend

Academic Research

  • Gather large, reproducible video datasets for media studies
  • Study engagement patterns across countries and languages
  • Sample trending content for cultural and political research

Trend Monitoring

  • Run the same keyword across several countries to compare what each region is watching
  • Detect breakout topics by sorting a topic search by view count within the last 24 hours
  • Track recurring trends across time windows using the upload date filter

Getting Started

The fastest way to start — one search query and a result cap.

{
"searchQueries": ["mkbhd"],
"maxResults": 20
}

Narrow results with upload date, duration, sort order, features, and localization.

{
"searchQueries": ["electric vehicle review"],
"uploadDate": "month",
"duration": "medium",
"sortBy": "viewCount",
"features": ["hd", "subtitles"],
"country": "us",
"language": "en",
"maxResults": 100
}

URL-Based Input

Paste any mix of YouTube URLs — video, channel, playlist, shorts, or search URLs. Toggle fetchChannelInfo to also get full channel stats for every channel URL.

{
"startUrls": [
"https://www.youtube.com/watch?v=c347oYQO57A",
"https://www.youtube.com/@mkbhd",
"https://www.youtube.com/playlist?list=PLpjK416fmKwQ4Jb2vE2lK7K3vzoD9E5nQ"
],
"fetchChannelInfo": true,
"maxResults": 25
}

Channel Handles with Shorts

Scrape multiple channels by handle and also collect their Shorts tab. Swap channelContent to "shorts" for a Shorts-only export, or "videos" to keep Shorts out entirely.

{
"youtubeHandles": ["@mkbhd", "@veritasium", "@LinusTechTips"],
"includeShorts": true,
"channelContent": "default",
"fetchChannelInfo": true,
"maxResults": 30
}

Input Reference

What to Scrape

ParameterTypeDefaultDescription
searchQueriesstring[][]Keywords to search on YouTube. Each query runs independently.
startUrlsstring[][]YouTube URLs — accepts video, channel (/@handle, /channel/UC..., /c/..., /user/...), playlist, shorts, and search result URLs in the same list. A channel link can name a tab and that tab is what you get: /@handle/shorts returns only Shorts, /@handle/videos only regular videos, /@handle/streams only past live streams.
youtubeHandlesstring[][]Channel handles like @mkbhd or mkbhd (the leading @ is optional). Each handle resolves to that channel's Videos tab, or to its Shorts alone when channelContent is set to "shorts".

Results

ParameterTypeDefaultDescription
maxResultsinteger50Maximum rows per query, URL, or handle (0–500). A hard ceiling on what that source bills: Shorts, the channel-details row, and a playlist's summary row all count inside it. Set to 0 for as many as YouTube will serve.
includeShortsbooleanfalseInclude YouTube Shorts. Off, a keyword search returns long-form videos only. On, a search also returns the Shorts YouTube shows for it, and a channel URL or handle also pulls the channel's Shorts tab. Shorts count toward the same maxResults cap, shared evenly between the two tabs; whichever tab runs out first passes its unused slots to the other.
channelContentstring"default"Which part of a channel to export, for handles and channel URLs. default = videos, plus Shorts when includeShorts is on. videos = regular videos only, even with includeShorts on. shorts = that channel's Shorts and nothing else, so you are never billed for videos you didn't ask for (a channel that posts no Shorts returns no rows rather than its videos). A link that already names a tab wins for that one link.

Filters (Search Only)

These apply to keyword searches. URL, handle, and playlist inputs ignore them.

ParameterTypeDefaultDescription
uploadDatestring"any"Upload recency: Any time / Last hour / Today / This week / This month / This year.
durationstring"any"Video length: Any length / Short (under 4 min) / Medium (4–20 min) / Long (over 20 min).
sortBystring"relevance"Sort order: Relevance / Upload date / View count / Rating. Upload date returns the newest video first and View count the most-viewed first, ordered top to bottom across the whole dataset; Relevance and Rating come back in YouTube's own ranking.
featuresstring[][]Multi-select video features: HD, Subtitles / CC, Creative Commons, Live, 4K, 360°, VR180, 3D, HDR. Combine as needed.

Localization

ParameterTypeDefaultDescription
countrystring"us"Country for result localization — it shifts which videos YouTube surfaces for a search. Supports United States, United Kingdom, Canada, Australia, New Zealand, Ireland, France, Germany, Spain, Italy, Netherlands, Belgium, Portugal, Switzerland, Austria, Sweden, Norway, Denmark, Finland, Poland, Japan, South Korea, Hong Kong, Taiwan, Singapore, Malaysia, Thailand, Indonesia, Philippines, Vietnam, India, Brazil, Mexico, Argentina, Chile, Colombia, United Arab Emirates, Saudi Arabia, Turkey, Israel, South Africa, and Egypt.
languagestring"en"Interface language for titles and metadata. English, French, German, Spanish, Italian, Portuguese, Dutch, Polish, Turkish, Russian, Japanese, Korean, Chinese (Simplified), Chinese (Traditional), Arabic, Hebrew, Thai, Vietnamese, Indonesian.

Enrichment

ParameterTypeDefaultDescription
fetchChannelInfobooleanfalseFor channel URLs and handles, emit one row per channel with subscriber count, description, country, and creation date. Counts toward maxResults, so a cap of 30 returns 29 videos plus the channel row.

Output

Every row carries a recordType field so you can tell videos, shorts, channels, and playlists apart at a glance. Below is one example per type.

Video

{
"recordType": "video",
"id": "qzGxK6Uiu04",
"url": "https://www.youtube.com/watch?v=qzGxK6Uiu04",
"title": "Incredible Wildlife in Stunning 16K HDR 120fps Dolby Vision",
"description": "Experience the incredible wildlife in stunning 16K HDR 120fps Dolby Vision...",
"duration": 4952,
"durationText": "1:22:32",
"viewCount": 19552604,
"likeCount": null,
"publishedText": "1 year ago",
"publishedAt": "2025-04-24T17:46:41+00:00",
"isLive": false,
"isShort": false,
"thumbnails": [
{"url": "https://i.ytimg.com/vi/qzGxK6Uiu04/hq720.jpg", "width": 720, "height": 404}
],
"channel": {
"id": "UChB3UnDddahXU7FKZXmpzMA",
"name": "8K Earth",
"handle": "@8kEarth",
"url": "https://www.youtube.com/@8kEarth"
},
"sourceInput": "8k hdr nature",
"scrapedAt": "2026-04-24T17:46:41+00:00"
}

This row came from a search query, so likeCount is null — YouTube doesn't publish like counts on search results. Pass the video's own URL in startUrls and the exact count comes back, as in the Short example below.

Short

Illustrative example — individual YouTube video IDs can be deleted or set to private by their creator at any time, so don't rely on any specific ID in this document for live data.

{
"recordType": "short",
"id": "s3DrGkDvgNw",
"url": "https://www.youtube.com/shorts/s3DrGkDvgNw",
"title": "You won't believe this camera trick",
"description": null,
"duration": 49,
"durationText": "0:49",
"viewCount": 1824300,
"likeCount": 96420,
"publishedText": null,
"publishedAt": "2026-03-11T15:22:04+00:00",
"isLive": false,
"isShort": true,
"thumbnails": [
{"url": "https://i.ytimg.com/vi/s3DrGkDvgNw/hq720.jpg", "width": 720, "height": 1280}
],
"channel": {
"id": "UCBJycsmduvYEL83R_U4JriQ",
"name": "Marques Brownlee",
"handle": "@mkbhd",
"url": "https://www.youtube.com/@mkbhd"
},
"sourceInput": "https://www.youtube.com/shorts/s3DrGkDvgNw",
"scrapedAt": "2026-04-24T17:46:41+00:00"
}

Channel

Emitted only when fetchChannelInfo: true and the input is a channel URL or handle.

{
"recordType": "channel",
"id": "UCBJycsmduvYEL83R_U4JriQ",
"url": "https://www.youtube.com/@mkbhd",
"title": "Marques Brownlee",
"handle": "@mkbhd",
"subscriberCount": 20900000,
"subscriberCountText": "20.9M subscribers",
"videoCount": 1816,
"viewCount": 5361395937,
"description": "MKBHD: Quality Tech Videos | YouTuber | Geek | Consumer Electronics...",
"country": "United States",
"joinedAt": "2008-03-21",
"joinedText": "Joined 21 Mar 2008",
"thumbnail": "https://yt3.googleusercontent.com/ytc/mkbhd_avatar.jpg",
"banner": "https://yt3.googleusercontent.com/ytc/mkbhd_banner.jpg",
"sourceInput": "@mkbhd",
"scrapedAt": "2026-04-24T17:46:41+00:00"
}

Playlist

Emitted once per playlist URL, alongside the videos it contains. It counts toward maxResults like any other row, so a playlist capped at 30 returns this row plus 29 videos.

{
"recordType": "playlist",
"id": "PLpjK416fmKwQ4Jb2vE2lK7K3vzoD9E5nQ",
"url": "https://www.youtube.com/playlist?list=PLpjK416fmKwQ4Jb2vE2lK7K3vzoD9E5nQ",
"title": "Retro Tech",
"description": "Revisiting the best tech of decades past.",
"videoCount": 42,
"channel": {
"id": "UCBJycsmduvYEL83R_U4JriQ",
"name": "Marques Brownlee",
"handle": "@mkbhd",
"url": "https://www.youtube.com/@mkbhd"
},
"thumbnails": [
{"url": "https://i.ytimg.com/vi/retrothumb/hqdefault.jpg", "width": 480, "height": 360}
],
"sourceInput": "https://www.youtube.com/playlist?list=PLpjK416fmKwQ4Jb2vE2lK7K3vzoD9E5nQ",
"scrapedAt": "2026-04-24T17:46:41+00:00"
}

Fields by Record Type

Common fields (every row)

FieldTypeDescription
recordTypestringOne of video, short, channel, playlist.
idstringCanonical YouTube ID (videoId, channelId, or playlistId).
urlstringPublic YouTube URL.
titlestringVideo title, channel name, or playlist name.
sourceInputstringThe original query, URL, or handle that produced this row.
scrapedAtstringISO 8601 timestamp of when the row was captured.

Video & Short fields

FieldTypeDescription
descriptionstring | nullVideo description (snippet on search results, full text on direct video URLs).
durationinteger | nullLength in seconds. null for live streams.
durationTextstring | nullHuman-readable duration (e.g. "12:34").
viewCountinteger | nullTotal views.
likeCountinteger | nullExact like count. Populated on direct video and Shorts URLs; null on search, channel, and playlist rows (YouTube omits likes from those listings) and on the occasional video YouTube serves without its like button.
publishedTextstring | nullHuman-readable publish label (e.g. "2 weeks ago", "vor 3 Monaten").
publishedAtstring | nullResolved ISO-8601 UTC timestamp, in all 19 interface languages. Always UTC (+00:00).
isLivebooleantrue if the video is currently live.
isShortbooleantrue for YouTube Shorts.
thumbnailsobject[]Thumbnail renditions with url, width, height.
channel.idstringParent channel ID.
channel.namestringParent channel name.
channel.handlestring | nullChannel handle (@handle).
channel.urlstringChannel URL.

Channel fields (recordType: "channel")

FieldTypeDescription
handlestring | nullChannel handle in @handle form.
subscriberCountinteger | nullNumeric subscriber count.
subscriberCountTextstring | nullOriginal label (e.g. "20.9M subscribers").
videoCountinteger | nullTotal videos uploaded.
viewCountinteger | nullAll-time channel views.
descriptionstring | nullChannel description.
countrystring | nullListed channel country.
joinedAtstring | nullChannel creation date (ISO format).
joinedTextstring | nullOriginal "Joined" label from the About tab.
thumbnailstring | nullChannel avatar URL.
bannerstring | nullChannel banner URL.

Playlist fields (recordType: "playlist")

FieldTypeDescription
descriptionstring | nullPlaylist description if present.
videoCountinteger | nullNumber of videos in the playlist.
channelobject{id, name, handle, url} of the playlist owner.
thumbnailsobject[]Playlist thumbnail renditions.

Tips for Best Results

  • Use exact phrases in quotes ("\"galaxy s25 review\"") for narrower search results.
  • maxResults: 0 pulls everything YouTube will serve — typically 500–700 rows per search query and up to several thousand per channel. Set a concrete cap when you need a predictable run.
  • Pass a video's own URL when you want the full record — a /watch?v=<id> or /shorts/<id> link returns the exact like count, the full description, and a Short's view count and publish date. Rows gathered from searches, channel tabs, and playlists come back with likeCount: null, and Shorts taken from a channel's Shorts tab carry no duration or publish date, because YouTube doesn't publish those on its listing pages. URL input is forgiving: youtu.be/abc123 short links, long watch?v= URLs with extra parameters, and mobile URLs all work.
  • Country and language matter — they shift which videos YouTube surfaces for the same words. Upload dates land in publishedAt as clean ISO timestamps in every one of the 19 languages, so a German or Japanese run sorts and filters by date exactly like an English one.
  • Mix inputs freely — one run can combine search queries, direct video URLs, and channel handles. Every row keeps a sourceInput field so you can group results by origin in your downstream pipeline.
  • Search filters are keyword-only — applying uploadDate or duration to a URL or handle input has no effect. To narrow channel uploads, post-filter on publishedAt and duration after extraction.
  • Want what is popular right now? YouTube retired its Trending page in 2025 and no longer publishes one anywhere. Search a topic with sortBy: "viewCount" and uploadDate: "today" (or "week") instead — that is the closest thing YouTube still serves, and you can run it per country.
  • Know what is out of scope before you plan a pipeline — comments and replies (use a dedicated YouTube comments actor), age-restricted and members-only videos (YouTube serves those only to signed-in viewers), and playback or caption files are not returned.

Pricing

From $0.50 per 1,000 results — and that is the rate on every Apify discount tier, so a free-plan run costs exactly what a Gold-tier run costs.

ResultsNo discountBronzeSilverGold
100$0.05$0.05$0.05$0.05
1,000$0.50$0.50$0.50$0.50
10,000$5.00$5.00$5.00$5.00
100,000$50.00$50.00$50.00$50.00

Every row in your dataset counts as one result, regardless of record type. No compute or time-based charges — you pay per result, plus a small fixed per-run start fee.

Integrations

Export your data or plug it into your existing stack:

  • API — Pull results programmatically via the Apify API
  • Webhooks — Trigger downstream workflows when a run completes
  • Google Sheets — One-click export to spreadsheets
  • Zapier / Make / n8n — Automate with 1,000+ app connectors
  • Datasets — Download as JSON, CSV, Excel, XML, or RSS

This actor is designed for legitimate market research, content strategy, competitive analysis, and academic research. You are responsible for complying with YouTube's Terms of Service, applicable laws, and data protection regulations in your jurisdiction. The actor only collects publicly visible data — no login, no paywalled or age-gated content, no personal data beyond what YouTube surfaces on public pages. Do not use extracted data for spam, harassment, impersonation, or any unlawful purpose.