apihq/youtube-channel-scraper · YouTube
YouTube Channel Scraper
Export a YouTube channel's videos to JSON from a URL, @handle, or channel ID. One record per video with title, views, duration, and thumbnail.
$0.0005/video · failed items $0.0000 — on your existing Apify account, a one-item first run costs under a cent.
What does YouTube Channel Scraper do?
Export a YouTube channel's long-form videos to JSON by URL, @handle, or channel ID. No YouTube Data API key or quota. One record per video with views, date, duration, and thumbnail. Pay-per-video: a channel that can't be resolved returns a success:false row and is not charged.
Use it to build creator databases, watch competitor channels, enrich content pipelines, or collect video IDs to feed transcript and comment jobs. The billing matters most when the extraction runs unattended inside a larger pipeline.
It reads the Videos tab, so long-form uploads only. Use the YouTube Shorts Scraper for Shorts.
Example run
{ "channelUrls": ["@MrBeast", "@totally-wrong-handle"], "maxResults": 5 }outcome
- 5 success: true video rows from @MrBeast — billed
- 1 success: false row, code: CHANNEL_NOT_FOUND, for the bad handle — not billed
- Run status: SUCCEEDED
- Charged: 5 videos = $0.0025
Good input returns billed rows. Bad input returns free error rows in the same dataset, and the run still succeeds.
Why pipelines pick it
A bad channel never breaks the batch
Misspell a handle or paste a video URL by mistake and you get a success:false row back. The rest of the batch keeps going.
You pay only for videos
The charge fires per video delivered, not per dataset write. There is no start fee, so a run that hits ten dead handles and returns nothing costs $0.
Every failure is machine-readable
Stable codes like CHANNEL_NOT_FOUND and NO_VIDEOS let your pipeline branch on the error type instead of parsing error text.
No YouTube Data API key or quota
The official Data API needs a Google key and rations daily quota. This actor reads public data from a plain channel URL, @handle, or UC… ID.
Best for: Use it to build creator databases, watch competitor channels, enrich content pipelines, or collect video IDs to feed transcript and comment jobs. The billing matters most when the extraction runs unattended inside a larger pipeline.
Input & output
{
"channelUrls": [
"https://www.youtube.com/@MrBeast",
"@mkbhd",
"UCX6OQ3DkcsbYNE6H8uQQuVA"
],
"maxResults": 100
}{
"success": true,
"channel_id": "UCX6OQ3DkcsbYNE6H8uQQuVA",
"channel_title": "MrBeast",
"video_id": "iYlODtkyw_I",
"title": "Spend 30 Days Handcuffed To A Stranger",
"url": "https://www.youtube.com/watch?v=iYlODtkyw_I",
"published": "2 weeks ago",
"view_count": "55M views",
"duration": 2105,
"thumbnail_url": "https://i.ytimg.com/vi/iYlODtkyw_I/hqdefault.jpg",
"author": "MrBeast"
}{
"success": false,
"channel_url": "@totally-wrong-handle",
"code": "CHANNEL_NOT_FOUND",
"error": "Could not resolve YouTube channel: @totally-wrong-handle",
"request_id": "req_911f37d2e55644ff9d9e4a3f",
"status_code": 404
}Branch on the success field to split hits from misses. Quote the request_id in any support issue and we can trace the exact request.
output fields
| field | type | what it is |
|---|---|---|
| success | boolean | true for a video (billed), false for a channel that could not be listed (free). |
| channel_id | string | The UC… channel ID the video belongs to. Copied onto every row so each row stands alone. |
| channel_title | string | The channel's display name. |
| video_id | string | The 11-character YouTube video ID. |
| title | string | Video title. |
| url | string | Canonical watch URL. |
| published | string | Relative publish string YouTube shows (e.g. "2 weeks ago"). |
| view_count | string | View count as a display string. |
| duration | integer | Video length in seconds. Absent for live streams and unparseable lengths. |
| thumbnail_url | string | URL of the largest available thumbnail. |
| author | string | Channel author name. |
Error codes, stable across releases
Every failure record carries one of these machine-readable codes. None of them are ever charged.
| code | billed | meaning |
|---|---|---|
| CHANNEL_NOT_FOUND | $0.0000 | The URL, @handle, or ID could not be resolved to a channel. |
| NO_VIDEOS | $0.0000 | The channel exists but has no long-form uploads. |
| VALIDATION_FAILED | $0.0000 | The input was not a valid channel URL, @handle, or UC… ID. |
| RESOLVE_TIMEOUT | $0.0000 | Resolving the channel identity timed out. |
| CHANNEL_VIDEOS_TIMEOUT | $0.0000 | Listing the channel's videos timed out. |
| DEADLINE_EXCEEDED | $0.0000 | The per-channel deadline was hit. No charge. |
What a run costs
The charge fires only when a result is delivered, and platform compute is included in the per-result price. To cap the spend of a run, set a limit in Apify's Run Limits panel. The actor stops at the cap and reports how far it got.
What this actor doesn't do
- It reads the Videos tab, so long-form uploads only. Use the YouTube Shorts Scraper for Shorts.
- It returns videos newest first. There is no sort by popularity or oldest.
- It returns the channel's id and name, not channel statistics. Subscriber counts and lifetime views are out of scope.
Frequently asked questions
- What input formats are accepted?
- A full channel URL, an @handle, or a UC… channel ID, mixed freely in the same batch. channelUrl and channelUrls are merged and de-duplicated; up to 50 unique channels run per job.
- How many videos does it return per channel?
- Each channel is walked newest-first up to maxResults videos (default 50). Set maxResults higher to walk deeper.
- Do I need a YouTube Data API key?
- No. The Actor reads YouTube's public data directly. You don't provision a Google key and there is no daily Data API quota to ration.
- What does a misspelled handle cost?
- $0. You get one success:false row with code CHANNEL_NOT_FOUND and the run continues. There is no start fee, so an empty run costs nothing.
- Can I cap the spend of a run?
- Yes. Set a limit in Apify's Run Limits panel. The Actor stops cleanly at the cap and reports how far it got.
Automation templates
Pairs with
YouTube Transcript Scraper
Scrape YouTube transcripts, captions, and subtitles as timestamped JSON. One video or a batch of 50. No YouTube Data API key or quota, no browser.
YouTube Shorts Scraper
Export a YouTube channel's Shorts to JSON from a URL, @handle, or channel ID. One record per Short with title, views, and thumbnail.
Run it on the Apify account you already have
Paste one input into the actor's console and check the dataset it returns. A one-item first run costs under a cent — no new subscription, pay only for delivered results.
List a channel's videos