YouTube Channel Videos Scraper (bulk, lightweight)
Pricing
from $0.65 / 1,000 video listeds
YouTube Channel Videos Scraper (bulk, lightweight)
List every video of a YouTube channel: title, video id, duration, view count, publish date and thumbnail, plus channel name, handle and subscriber count. Paste channel URLs, @handles or channel ids. Only delivered videos are charged.
Pricing
from $0.65 / 1,000 video listeds
Rating
0.0
(0)
Developer
Steadydata Team
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Get the full video list of any YouTube channel: title, video id, duration, view
count, publish date and thumbnail, with the channel's name, handle and subscriber
count on every row. Paste channel URLs, @handles or channel ids, up to 100 channels
per run. You only pay for videos that are actually delivered.
Why this scraper
- Built on a lightweight route. Loading a channel page costs about 1.5 MB for the first 30 videos. This actor asks YouTube's own internal API instead and needs about 2.3 KB per video, which is where the low price comes from.
- Only delivered videos are charged. A channel that does not exist, has no public videos, or is temporarily blocked comes back as a clear error record at no cost.
- A hard cost ceiling you control.
maxVideosPerChannelis the cap: one delivered video is one charged event, so you always know the maximum before you press start. - Agent-ready output. One flat row per video with a stable schema and explicit error codes, so it drops straight into a pipeline or an LLM tool.
- Every input format works.
@mkbhd,https://www.youtube.com/@mkbhd,/channel/UC...,/c/Name,/user/Nameor a bare channel id.
Who this is for
Content researchers mapping what a channel publishes, competitor and market analysts tracking output and view counts, and teams that need a channel's back catalogue as input for further processing, for example to fetch transcripts afterwards.
Who this is not for
If you want one channel's latest video once, the YouTube website is faster and free. This actor earns its place from the tenth channel onwards, or when you need the whole back catalogue in one table.
It returns public video and channel metadata only. It does not collect comments, commenter names, subscriber lists or any other personal data.
Input fields
| Field | Type | Required or default | What it does |
|---|---|---|---|
channels | list of text | required | Channel URLs, @handles or channel ids. All of these work: https://www.youtube.com/@mkbhd, @mkbhd, https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ, UCBJycsmduvYEL83R_U4JriQ. |
maxVideosPerChannel | number | 100 | Stop after this many videos per channel, newest first. This is your cost ceiling: one delivered video is one charged event. |
language | text | en | Interface language for the texts YouTube returns, e.g. en, nl, de. Affects wording such as the publish date. |
country | text | US | ISO country code used for the request, e.g. US, NL, DE. |
Input example
{"channels": ["@mkbhd","https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ","UCBJycsmduvYEL83R_U4JriQ"],"maxVideosPerChannel": 100,"language": "en","country": "US"}
Output example
| Field | Type | What it holds | Example |
|---|---|---|---|
channelId | text | The channel id (UC...), stable where the channel name can change. | UCBJycsmduvYEL83R_U4JriQ |
channelName | text | The channel that published the video. | Marques Brownlee |
channelHandle | text | The channel's @handle, the name in its short link. | @mkbhd |
channelUrl | text | The channel page on YouTube. | https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ |
channelSubscribers | number | The channel's subscribers, rounded the way YouTube publishes them. | 21300000 |
channelVideoCount | number | How many public videos the channel has. | 1800 |
videoId | text | The eleven-character YouTube id of the video, the key to join other data on. | rayrrXot17M |
url | text | The watch page of the video. | https://www.youtube.com/watch?v=rayrrXot17M |
title | text | The title as the uploader set it. | Nothing Headphone 1 Pro: They Copied the Wrong Thing! |
duration | text | The length as YouTube prints it on the thumbnail, for example 12:04. | 14:20 |
durationSeconds | number | The length of the video in seconds. | 860 |
viewCount | number | Views as YouTube reports them at the moment of the run. | 4110949 |
publishedText | text | How long ago YouTube says it appeared, for example "3 weeks ago"; YouTube gives no exact date here. | 1 day ago |
thumbnailUrl | text | The largest thumbnail YouTube offers for the video. | https://i.ytimg.com/vi/rayrrXot17M/sddefault_custom_2.jpg... |
{"channelId": "UCBJycsmduvYEL83R_U4JriQ","channelName": "Marques Brownlee","channelHandle": "@mkbhd","channelUrl": "https://www.youtube.com/channel/UCBJycsmduvYEL83R_U4JriQ","channelSubscribers": 21200000,"channelVideoCount": 1800,"videoId": "Od6M0AXpcxQ","url": "https://www.youtube.com/watch?v=Od6M0AXpcxQ","title": "iPhone 18 Pro/Duo Impressions: Mogged","duration": "17:14","durationSeconds": 1034,"viewCount": 14290382,"publishedText": "1 day ago","thumbnailUrl": "https://i.ytimg.com/vi/Od6M0AXpcxQ/maxresdefault.jpg","status": "ok"}
A channel that cannot be delivered produces an error record instead, and is not charged:
{"input": "@thischanneldoesnotexist12345","status": "error","errorCode": "CHANNEL_NOT_FOUND","error": "YouTube does not know this channel"}
Error codes: INVALID_CHANNEL, CHANNEL_NOT_FOUND, NO_VIDEOS, BLOCKED. INPUT_TRUNCATED appears once when your input is longer than this actor accepts.
Related actors from steadydata
- youtube-channel-details: the channel profile: subscribers, total views, country
- youtube-video-details: full metadata per video from this list
- youtube-shorts: the Shorts of the same channel, which this actor leaves out
- Used together with youtube-video-details and youtube-transcript-bulk in a recipe: YouTube metadata in bulk without the API quota.
Pricing
Pay per event: one video-listed event per delivered video. No charge for channels
that fail, no charge for channels without public videos, no separate platform-usage
surcharge.
Free Apify plan: this actor delivers up to 25 rows per run for accounts on the Apify free plan, and then stops with a message. That limit is set by us, not by Apify. It exists so the actor keeps paying for itself for the people who do pay. Any paid Apify plan runs it at full size, billed per delivered row, with failed rows never charged.
Reviews: if this actor saves you time, a short review on this page is the one thing that helps most. Ratings are what other buyers look at first, and we have no other way to ask.
FAQ
How far back does it go?
As far as you ask. Set maxVideosPerChannel and the actor pages through the channel,
newest first, until it reaches your limit or runs out of videos.
Why is the publish date a text like "1 day ago"?
That is what YouTube returns on this route. It is kept exactly as given rather than
converted into a date that would be a guess. Set language if you want that text in
another language.
Does it include Shorts and live streams? Not in this version. It returns the channel's Videos tab, which is the regular uploads. Shorts and past live streams sit behind separate tabs and are a candidate for a later version.
Is personal data collected? No. Public video and channel metadata only. No comments, no commenter names, no subscriber lists.
What happens when YouTube changes something? Internal routes shift from time to time; that is the nature of this work. The difference here is the response: the actor is monitored daily and fixed fast, and while it is broken you are not charged, because only delivered videos cost anything.
Can I combine this with transcripts? Yes, and that is a common pattern: run this actor to get a channel's video ids, then feed those ids into the YouTube Transcript Scraper from the same publisher.