YouTube Channel Scraper
Scrape videos from any YouTube channel, no login or API key. Rows carry titles, views, dates, duration, thumbnails.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
channelUrls,maxItems,notionConnector(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0004 per video = $0.4 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Video returned | Charged once per video returned. Failed/empty runs are not charged. | $0.0004 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-19, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
channelUrls | Channel URLs, @handles, or UC ids. | array |
maxItems | Max videos to collect. Charged per video. | integer |
notionConnector | Optional. Deliver results to your connected Notion via Apify MCP connectors. | string |
notionParentId | Optional Notion database/data-source id. | string |
What you get
A structured dataset — each result includes fields like:
titlechannelNameviewCountTextpublishedTimeTexturlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in YouTube & Creator Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
YouTube Comments Scraper
Scrape YouTube comments with no login or key. Get text, likes, reply counts, author handle, verified badge and timestamp. $0.40 per 1,000.
YouTube Playlist Scraper
Export every video in a YouTube playlist. Get title, watch URL, views, age, runtime and thumbnail. No API key or OAuth. $0.40 per 1,000 videos.
YouTube Transcript Scraper
YouTube transcripts from links or a keyword search: text, timed segments, SRT, VTT and video details. No API key. $0.80 per 1,000.
YouTube Trending Scraper
Get the most-viewed YouTube videos for any topic, no login or key. Rows carry views, titles, channels, duration, thumbnails. $0.40 per 1,000 videos.
YouTube Channel Email Scraper
Find the business emails creators publish in their YouTube channel description, plus their linked site's contact pages. $1.50 per 1,000 channels.
YouTube Scraper
Search YouTube or scrape a channel: title, channel, views, publish date, length and thumbnail. No API key or quota. $0.135 per 1,000 videos.
Where this tool sits
- Categories
- YouTube & Creator Tools
- Platforms
- YouTube
YouTube Channel Scraper: a channel's uploads as rows, no API key
A channel answers to three names: an @handle, a channel link and a UC id. 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 |
| Ceiling | 2,000 videos per run |
| Account needed | None from you |
| Price | $0.40 per 1,000 videos, flat on every plan |
📺 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, no OAuth screen, no Cloud project, and nothing that spends a Data API quota.
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 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. 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. |
Start it with channelUrls empty and the run fails rather than returning a polite row, so send at least one channel.
📤 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 | What it is |
|---|---|
videoId, url | The 11 character id and the canonical watch link. Use videoId as your key across runs. |
channelName, channelId | The channel's title and its stable UC id. Join on channelId. |
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. |
thumbnail | The largest one YouTube offers for that video. |
mode | Always channel here, so rows merge cleanly with the other YouTube scrapers. |
🧾 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. BAD_INPUT and NOT_FOUND mean that channel could not be resolved, BLOCKED and RATE_LIMITED mean YouTube pushed back on the request, SERVER_ERROR is a 5xx, NETWORK means it could not be reached, and a run-level NO_RESULTS row appears when the whole run found nothing. None of them are charged, and the run moves on to the next channel.
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.
▶️ How to run it
1. Open YouTube Channel Scraper and click Try for free. 2. Paste channels into Channels, one per line. 3. Set Max videos. Start at 50 while you look at the shape. 4. Click Start. 5. Download the dataset as JSON, CSV or Excel, or read it over the Apify API.
💰 How much does it cost?
$0.40 per 1,000 videos. Flat on every Apify plan, no volume tiers.
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 video run is 80 cents.
💡 What people use it for
- Building a channel's back catalogue as rows, then enriching only the videos worth the extra call.
- Checking how often a competitor actually ships, by reading
publishedTimeTextdown the list. - Collecting video ids to feed the comments or transcript actors, which want ids rather than names.
- Keeping a weekly snapshot of a channel and diffing the view-count strings between runs.
🚧 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. There is a Shorts actor below for that.
- 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 maxItems every 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.
🧭 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 as well as channels | YouTube Scraper |
| That channel's Shorts, with exact view and like counts | YouTube Shorts Scraper |
| Only the new uploads since last time | YouTube Upload Monitor |
| Every video in a playlist | YouTube Playlist Scraper |
❓ Questions people ask
Do I need a YouTube or Google account? No. Nothing here is signed in, and there is no quota.
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.
Is scraping YouTube 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.
Can I run it on a schedule? Yes. Apify's scheduler, or start it from the API and read the dataset when it finishes.
🆘 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.