YouTube Videos Scraper: Channels, Playlists, Search
Pricing
from $2.16 / 1,000 videos
YouTube Videos Scraper: Channels, Playlists, Search
YouTube videos and Shorts (title, channel, exact date, duration, views, likes, description) from channels, playlists, searches or links; $3.60 per 1,000 videos. Fast listing mode $1.17 per 1,000. No date-filter surcharge, free error rows.
Pricing
from $2.16 / 1,000 videos
Rating
0.0
(0)
Developer
Arcadium Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
YouTube Videos Scraper: Channels, Playlists, Search
Give it YouTube channels, playlists, search terms, hashtags or video links and it returns one JSON row per video or Short: title, channel, exact publish date, duration, views, likes, category, Shorts and live flags, tags, hashtags, description, thumbnail and caption languages. Shorts also get comment count and sound. $3.60 per 1,000 videos, or $1.17 in fast listing mode; you pay only for rows you get.
Why this actor
- No extra charge for date ranges (the leading actor adds $1.30 per 1,000 on the free plan).
- Input names of the leading YouTube actors are accepted (
searchQueries,startUrls,maxResults,oldestPostDateand more). - Private, age-restricted, members-only and missing videos come back as free error rows that say why.
Built by Arcadium Data: public data, dated and agent-ready, never personal data.
Use with AI agents
The actor takes plain JSON and returns one flat row per video, so an AI agent or MCP client (for example through mcp.apify.com) can call arcadium/youtube-videos directly. Input example for "The last 10 videos of a channel with views and likes":
{ "urls": ["https://www.youtube.com/@kurzgesagt"], "maxResults": 10 }
"Top 20 search results, cheap and fast":
{ "searchQueries": ["web scraping tutorial"], "maxResults": 20, "listingOnly": true }
"Most viewed search results in Germany this month":
{ "searchQueries": ["e-auto test"], "searchCountry": "DE", "sortingOrder": "views", "dateFilter": "month", "maxResults": 50 }
"Everything a channel published in the last 30 days":
{ "urls": ["@veritasium"], "publishedAfter": "30 days", "maxResults": 500 }
"The newest Shorts of a channel, and Shorts for a hashtag and a search term":
{ "urls": ["https://www.youtube.com/@MrBeast/shorts"], "hashtags": ["#cooking"], "searchQueries": ["life hacks"], "contentType": "shorts", "maxResults": 20 }
Read title, publishDate, viewCount, likeCount and durationSeconds (Shorts also commentCount, soundTitle, soundArtist); position is the search rank or playlist index. 100 videos cost $0.36 ($0.12 in fast mode). A private, age-restricted or members-only video, or an unknown channel, comes back as a free row with rowType: "error", a code (not_found, unavailable, no_match, blocked, invalid_input) and a message, never as a failed run, so an agent can tell "does not exist" from "try again later".
What you get
| Field | What it holds |
|---|---|
videoId, url, title | The video. Shorts are returned the same way. |
channelName, channelId, channelHandle, channelUrl | The channel that published it. |
publishDate, publishDateIsApprox, publishedText | Exact ISO 8601 date with YouTube's offset (full rows), or a date estimated from "3 months ago" in fast mode. |
durationSeconds, viewCount, likeCount, category | Length and stats at the time of the run. |
commentCount | Exact comment count. Always on Shorts; on regular videos with includeCommentCount. |
soundTitle, soundArtist | Shorts: the sound or song the Short uses, as YouTube's sound link shows it (null when the Short has none). |
isShort, isLive, isLiveContent, isUpcoming, isUnlisted, isFamilySafe | Format and status flags. |
keywords, hashtags, description | Tags, the #hashtags of the title and description, and the description (full or short); emails and phone numbers removed. |
thumbnailUrl, thumbnailMaxUrl | 480x360 thumbnail (always), and the largest one when the upload has it. |
captionLanguages, hasCaptions | Every caption track: code, name, isAutoGenerated. Pair it with our YouTube Transcripts actor to get the text. |
detailLevel | full or listing (fast mode). |
source, sourceType, position | Which channel tab, playlist, search term or hashtag the video came from, and its place in that list. |
scrapedAt | When the row was read. |
Output example:
{"rowType": "video","platform": "youtube","videoId": "dQw4w9WgXcQ","url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)","channelName": "Rick Astley","channelId": "UCuAXFkgsw1L7xaCfnd5JJOw","channelHandle": "@RickAstleyYT","channelUrl": "https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw","publishDate": "2009-10-24T23:57:33-07:00","publishDateIsApprox": false,"publishedText": null,"durationSeconds": 213,"viewCount": 1829080503,"likeCount": 19491607,"commentCount": null,"category": "Music","isShort": false,"isLive": false,"isLiveContent": false,"isUpcoming": false,"isUnlisted": false,"isFamilySafe": true,"keywords": ["rick astley", "Never Gonna Give You Up", "nggyu"],"hashtags": ["rickastley"],"soundTitle": null,"soundArtist": null,"description": "The official video for “Never Gonna Give You Up” by Rick Astley. ...","thumbnailUrl": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg","thumbnailMaxUrl": "https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/maxresdefault.webp","captionLanguages": [{ "code": "en", "name": "English", "isAutoGenerated": false },{ "code": "en", "name": "English", "isAutoGenerated": true },{ "code": "de-DE", "name": "German (Germany)", "isAutoGenerated": false }],"hasCaptions": true,"detailLevel": "full","source": null,"sourceType": "video","position": null,"scrapedAt": "2026-10-22T08:00:00.000Z"}
Input
{"urls": ["https://www.youtube.com/@kurzgesagt","https://www.youtube.com/playlist?list=PLRqwX-V7Uu6ZiZxtDDRCi6uhfTH4FilpH","https://www.youtube.com/watch?v=dQw4w9WgXcQ"],"searchQueries": ["iphone 17 review"],"maxResults": 10}
| Field | What it does |
|---|---|
urls | Channel links (/@handle, @handle, /channel/UC..., /c/..., /user/...; add /shorts or /streams for those tabs), playlist links, video links (watch?v=, youtu.be, /shorts/, /live/), bare video IDs, hashtag pages (/hashtag/cooking, /hashtag/cooking/shorts) and search page URLs. |
searchQueries | Search terms; each gives up to maxResults videos in YouTube's order. |
hashtags | Hashtags (#cooking or cooking); each gives up to maxResults videos from the hashtag page. |
contentType | videos (default) or shorts: with shorts, search terms return Shorts only and hashtags read their Shorts tab. |
maxResults | Videos per channel videos tab, playlist or search term (default 50, up to 10,000). |
maxResultsShorts, maxResultStreams | Also read each channel's Shorts and Live tabs, up to this many (default 0 = skip). |
maxItems | Stop after this many videos in total. A cost cap. |
publishedAfter, publishedBefore | Date range, YYYY-MM-DD or relative ("30 days"). Skipped videos are free; a channel listed newest first stops at the first older videos. |
sortVideosBy | Channel order: NEWEST (default), POPULAR, OLDEST. |
listingOnly | Fast mode: listing data only, no per-video request, lower price (see below). |
includeCaptionLanguages | Caption track list per video (on by default). |
includeCommentCount | Comment count for regular videos too (Shorts always have it). One more small request per video. |
description | full (default), short or none. |
sortingOrder, dateFilter, lengthFilter, isHD, hasSubtitles, hasCC, isLive, is4K | YouTube's own search filters. |
searchCountry | Two-letter country YouTube ranks search results for, e.g. DE (default US). |
includeErrorRows | A free row for every input or video without data (on by default). |
Input names of the most used YouTube scrapers are accepted as they are (startUrls with { "url": ... } objects, channelUrls, youtubeHandles, channelHandle, channelId, videoUrls, keywords, oldestPostDate, sortOrder, maxVideos, maxVideosPerChannel, maxTotalResults, start_date, end_date, hashtag, onlyShorts, videoType, the Shorts scraper's channels and sortChannelShortsBy, and the search actors' q, query, order, sortBy, videoDuration, duration, uploadDate, type, regionCode and geo), so an existing input can be pasted in.
Full rows and fast mode
A full row reads the video's own page data: exact publish date, exact views, likes, category, tags, description and caption languages (one or two small requests per video; Shorts one more for the comment count and the sound). Fast mode (listingOnly: true) returns what the channel, playlist or search page already shows, about 30 videos per request: title, rounded views ("3.5M"), duration, channel and a date estimated from "3 months ago". With a date range, fast mode still checks the exact date of videos close to the range edge, so the range stays exact.
Use it from code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("arcadium/youtube-videos").call(run_input={"urls": ["https://www.youtube.com/@kurzgesagt"],"maxResults": 20,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():if item["rowType"] == "video":print(item["publishDate"][:10], item["viewCount"], item["title"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('arcadium/youtube-videos').call({searchQueries: ['formula 1 highlights'],maxResults: 50,listingOnly: true,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.filter((i) => i.rowType === 'video').length, 'videos');
Pricing
You pay per video or Short delivered, at the price of your Apify plan. Error rows, repeats and videos outside your date range are free.
| Apify plan | Per 1,000 videos | Per 1,000 Shorts | Per 1,000 videos or Shorts in fast mode |
|---|---|---|---|
| Free | $3.60 | $3.60 | $1.17 |
| Starter (Bronze) | $2.70 | $2.70 | $0.90 |
| Scale (Silver) | $2.34 | $2.34 | $0.72 |
| Business (Gold) | $2.16 | $2.16 | $0.45 |
| Platinum | $1.35 | $1.35 | $0.27 |
| Diamond | $0.90 | $0.72 | $0.18 |
Plus a one-off $0.001 per GB of memory when a run starts. No extra fee for date filters.
Set a maximum cost per run in the Apify run options and the actor stops before it goes over.
Related actors and data
- YouTube Transcripts Scraper: Text, Timed Segments, SRT
- Google Trends Scraper: Interest, Related Queries, Trending
- Google News Scraper: Real Article URLs, Full Text
Use cases
- Channel tracking: every new video of your competitors' channels each day, with views and likes.
- Influencer research: recent output, average views and posting rhythm of a list of channels.
- Search monitoring: who ranks for your keywords on YouTube (
position), and how that changes. - Content analytics: categories, lengths, Shorts versus long videos, live streams.
- Shorts trends: which Shorts take off for a hashtag or a search term, and which sounds they use.
- Agents: "list the last N videos" before picking which ones to summarise (then use our YouTube Transcripts actor).
Limitations
- Public videos only. Private, age-restricted and members-only videos need a signed-in account and are skipped (free error row).
- Views and likes are read at run time; YouTube updates them with some delay. Likes are null when the creator hides them.
- Fast-mode dates are estimates ("2 years ago" can be off by up to a year); full rows have the exact date.
- YouTube's search filters (upload date, sort by date) are loose; use
publishedAfterfor an exact range. - Fast mode on a hashtag's Shorts tab gives only the video id and rounded views (YouTube shows no title there); full rows have everything.
- The sound is what YouTube's sound link shows ("Song · Artist"); Shorts with their original audio and no sound link have
soundTitlenull. - Comment counts only, no comment text; no video or audio download, no subscriber lists.
Privacy
Public data only, read the way an anonymous visitor's browser and the YouTube app read it. No login, no cookies, no account. Comments and viewer data are never collected. Emails and phone numbers in titles and descriptions are replaced with [email] and [phone]. The channel name is the publisher of the video.
FAQ
Why are some dates marked approximate? In fast mode the listing only says "3 weeks ago". Turn fast mode off (the default) for exact ISO dates.
A channel returned nothing. Why?
Look at its error row: not_found means the handle or playlist does not exist; a date range that matches no video gives no_match. These rows are free.
How fast is it? Full rows: about 2 to 4 videos per second. Fast mode: about 30 videos per request, a few hundred videos in under 10 seconds.
Something looks wrong in the output. Who do I tell? Open an issue on the actor page with the run link. We read them all.