YouTube Channel Scraper - Videos
Pricing
from $0.38 / 1,000 videos
YouTube Channel Scraper - Videos
Scrape the videos from any YouTube channel, given as an @handle, channel URL or UC id. Each row has the title, videoId, watch URL, channel, views, age, runtime and thumbnail, newest first, up to 2,000 per run. $0.40 per 1,000 videos.
Pricing
from $0.38 / 1,000 videos
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
5
Monthly active users
4 days ago
Last modified
Categories
Share
Scrape a YouTube channel's uploads as rows, without an API key: a channel answers to three names,
an @handle, a channel link and a UC id, and all three work here, mixed however they came out of
your spreadsheet. Each upload comes back as one flat row with the title, video id, watch link,
channel, view count, age, runtime and thumbnail.
The thing to plan around: the counts and dates are the strings YouTube prints on the channel page.
You get "90M views" and "8 days ago", never 90,041,233 and never a real timestamp, because the
listing itself does not carry them.
| Input | Channel links, @handles or UC ids |
| Output | One row per video: id, title, watch link, channel name and id, views, age and runtime as YouTube prints them, thumbnail |
| Ceiling | 2,000 videos per run |
| Account needed | None |
| Price | $0.40 per 1,000 videos on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 12,500 |
🔍 What YouTube Channel Scraper does
It resolves each channel you pass, opens its Videos tab, and walks the grid newest first until it has
collected maxItems videos. No Google API key, and no OAuth screen or Cloud project.
maxItems is the budget for the whole run, and it is spent in the order you listed the channels.
Three channels at 100 does not give you 100 each. If the first channel has enough uploads it takes
the lot, so run one channel at a time when you want a fair split.
Videos are deduplicated by videoId across every channel in the run, so a video that appears twice
is returned once and billed once.
📋 What data you get from each YouTube channel video
| What you get | Field |
|---|---|
| The 11 character video id and the watch link | videoId, url |
| Title | title |
The channel's title and its stable UC id | channelName, channelId |
| Views, as YouTube prints them | viewCountText |
| How long ago it went up | publishedTimeText |
| Runtime | lengthText |
| The largest thumbnail on offer | thumbnail |
Always channel here, so rows merge with the other YouTube scrapers | mode |
▶️ How to scrape a YouTube channel's videos
- Open YouTube Channel Scraper and click Try for free.
- Paste channels into Channels, one per line.
- Set Max videos. Start at 50 while you look at the output.
- Click Start.
- Download the dataset as JSON, CSV or Excel, or read it over the Apify API.
Send at least one channel. A run with Channels empty fails rather than returning a polite row.
💰 How much does it cost to scrape a YouTube channel's videos?
$0.40 per 1,000 videos on the Free plan. Paid plans pay a little less: $0.395 on Starter, $0.39 on Scale and $0.385 on Business. On the free plan, the $5 Apify gives you each month covers about 12,500 videos.
You pay per video row delivered. Diagnostic rows and duplicates inside a run are never billed, so pointing it at a dead handle delivers no charged rows. A full 2,000 videos come to 80 cents.
📥 What you give it
{"channelUrls": ["@MrBeast", "https://www.youtube.com/@mkbhd", "UCX6OQ3DkcsbYNE6H8uQQuVA"],"maxItems": 500}
| Field | Default | What it is |
|---|---|---|
channelUrls | none | Channel links, @handles or bare UC ids, mixed freely. The form opens with @MrBeast as an example. If a handle will not resolve, pass the full link or the UC id. |
maxItems | 50 | Total videos across the whole run, 1 to 2,000. This is also your spend cap. |
notionConnector, notionParentId | none | Optional. Write each video into a Notion database as well as the dataset. |
proxyConfiguration | Apify default | Leave it alone unless you have your own servers you want the run to go out through. |
📤 What you get back
A real row from a real run, with the thumbnail link cut short:
{"ok": true,"videoId": "gTKS8SAwUzE","title": "I Survived The Most Extreme Places On Earth","url": "https://www.youtube.com/watch?v=gTKS8SAwUzE","channelName": "MrBeast","channelId": "UCX6OQ3DkcsbYNE6H8uQQuVA","viewCountText": "90M views","publishedTimeText": "8 days ago","lengthText": "23:28","thumbnail": "https://i.ytimg.com/vi/gTKS8SAwUzE/hq720_custom_2.jpg?sqp=...","mode": "channel"}
| Field | How to read it |
|---|---|
videoId | Use it as your key across runs. |
channelId | Join on this rather than the name. |
viewCountText | "90M views" as the page renders it. Rounded by YouTube, not by us. |
publishedTimeText | "8 days ago". Relative, and relative to when the run read the page. |
lengthText | "23:28". Empty on a live stream or a premiere, which has no duration yet. |
🧾 Reading the output
Two kinds of row land in your dataset.
| Row | How to spot it | Billed |
|---|---|---|
| A video | ok: true | yes |
| A diagnostic | ok: false and an errorCode | no |
Filter on ok == true and you have your data. A channel that fails gets its own row, and the run
moves on to the next channel.
| Code | What it means |
|---|---|
BAD_INPUT, NOT_FOUND | That channel could not be resolved. |
RATE_LIMITED, SERVER_ERROR, NETWORK | That channel would not answer this run. Re-running usually clears it. |
NOT_SERVED | This video was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED. |
NO_RESULTS | The whole run found nothing. |
TIME_LIMIT | The run got close to its time limit and stopped on its own. The videos delivered before that are in the dataset and charged as usual. Give the run more time, or ask for fewer videos, to get the rest. |
A run ends as failed only when the time limit stopped it before any video came back.
One quirk of the Overview table: it shows the video columns only, so a diagnostic row reads as a
blank line there. Open the row or download the JSON to see the errorCode.
💡 What people use it for
- Listing a channel's recent uploads as rows, then digging into only the videos worth the extra call.
- Checking how often a rival channel actually ships, by reading
publishedTimeTextdown the list. - Collecting video links for the comments or transcript actors.
- Keeping a weekly snapshot of a channel and comparing the view-count strings between runs.
From a list of channels to the active ones and their audience, in three runs:
- Run this on the channels you are considering, one at a time, and read
publishedTimeTextdown each list to see who still posts. - Put the active ones into YouTube Upload Monitor to hear about each new upload.
- Run YouTube Comments Scraper on their newest videos to read what viewers say.
🚧 What it does not do
- No exact view counts and no real dates.
"90M views"cannot be turned back into the real figure. Parsing it into an approximate number is a one-liner; recovering the exact one is not possible from this page. - The Videos tab only. Shorts and live streams that the channel files elsewhere are not read here. YouTube Shorts Scraper covers Shorts.
- No descriptions, likes, comments, transcripts or subscriber counts. Those are separate actors.
- Newest first, with no resume. There is no offset, so a channel with 10,000 uploads gives you
its latest
maxItemsevery run, not the next page. - The budget is spent in input order. A busy first channel can leave nothing for the last one.
- A channel it could not read looks like a channel with no uploads. Both give you zero rows and no per channel diagnostic, so check the run log if a channel you expected comes back empty.
- An empty
channelUrlsfails the run rather than returning an explanatory row. - It is not an official YouTube tool. Dami's Studio is independent and is not affiliated with or endorsed by YouTube or Google, or by any other company named on this page.
🧭 Which YouTube scraper do you need?
| If you want | Use |
|---|---|
| A channel's uploads, up to 2,000 per run | This one |
| Keyword search results, or a channel's newest uploads | YouTube Scraper |
| Shorts from a channel or a keyword, with exact view and like counts | YouTube Shorts Scraper |
| Only the new uploads since your last check | YouTube Upload Monitor |
| Every video in a playlist | YouTube Playlist Scraper |
| Transcripts for a whole channel or playlist in one run | YouTube Transcript Bulk Scraper |
| Comments under a video | YouTube Comments Scraper |
❓ Questions people ask
Do I need a YouTube or Google account?
No. Nothing here is signed in.
Is maxItems per channel?
No, per run, and it is spent in the order you listed them. One channel per run is the clean way to get a fixed number from each.
Can I page through a channel's whole history?
Not past 2,000 in one run, and there is no offset to resume from. You always get the newest
maxItems.
How do I spot Shorts in the results?
lengthText is the practical signal, though the Videos tab normally holds no Shorts at all.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has ready-made
code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/youtube-channel-scraper. Either way
the run happens on your Apify account at the same price.
Is scraping a YouTube channel legal?
This reads public channel pages, nothing signed in. Results can still contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Include the channel you used and the run ID, and the log is enough for us to see what happened.