What it does
YouTube Studio only exports your own channel, and the youtube.com page for someone else's channel loads videos a screen at a time. This actor lists a channel's uploads through the official YouTube Data API v3 instead, using a free API key you create yourself, so you get a complete, structured list without scrolling or copying.
For each channel you get one channel row (title, @handle, description, country, subscriber count, total views, video count, created date, uploads playlist ID, avatar and topic categories), followed by one row per upload with title, description, published date, duration, views, likes, comment count, tags, category, thumbnails, live status and made-for-kids flag. Input can be youtube.com/@handle, /channel/UC… or /user/name URLs, bare @handles or channel IDs.
It is built for influencer vetting, competitor channel tracking, content audits and YouTube analytics dashboards. Channel rows cost $0.50 per 1,000 and video rows $0.40 per 1,000, and one free key covers about 250,000 channel-mode video rows a day.
How it works
- Each channel input is resolved to a channel ID with
channels.list, which also returns the channel's stats and uploads playlist. - The uploads playlist is paged with
playlistItems.list, newest first, untilmaxVideosPerChannelis reached or an upload is older thanpublishedAfter. - Video IDs are enriched with
videos.listin batches of 50, so every upload row carries duration, tags and engagement counts. - With
includeShortsoff, videos of 3 minutes or less that are not live are dropped, because the API itself does not flag Shorts. - Channels that are not found produce a free error row, and a channel with no public uploads still returns its channel row.
Input example
A typical run input (JSON). Every field is also available as a form in the Apify console.
{
"apiKey": "AIzaSy...your-own-key",
"mode": "channel",
"channels": [
"https://www.youtube.com/@googledevelopers",
"@YouTube"
],
"maxVideosPerChannel": 200,
"publishedAfter": "2026-01-01",
"includeShorts": false
}All input fields
| Field | Type | Required | Default | What it does |
|---|---|---|---|---|
apiKey | string | no | Required. Your own free YouTube Data API v3 key (starts with AIza). Get one in about a minute: console.cloud.google.com → create a project → APIs & Services → Library → enable "YouTube Data API v3" → Credentials →… | |
mode | string | no | "channel" | videos: details and stats for video URLs/IDs (1 quota unit per 50 videos). search: YouTube search results, enriched with full video details (100 units per page of 50). channel: channel stats plus every upload (about 2… |
channels | array | no | [] | Channel URLs (youtube.com/@handle, /channel/UC…, /user/name), @handles or channel IDs (UC…), for channel mode. Each gives one channel row plus its uploads. |
maxVideosPerChannel | integer | no | 100 | Newest uploads per channel (channel mode). 0 = channel row only. Every 50 videos cost about 2 quota units. |
publishedAfter | string | no | "" | Optional date (YYYY-MM-DD). In search mode, filters results; in channel mode, only uploads on or after it (and paging stops at older videos, saving quota). |
includeShorts | boolean | no | true | Channel mode. The API does not flag Shorts, so this uses a heuristic (3 minutes or less, not live): turning it off also drops regular videos that short. |
videoUrls | array | no | Videos for the videos and comments modes: watch URLs, youtu.be links, Shorts, embed or live URLs, or bare 11-character IDs. Duplicates are removed. videos.list takes 50 IDs per call. | |
searchQueries | array | no | [] | One or more search terms (search mode). Each page of up to 50 results costs 100 of your 10,000 daily quota units, so a full key's day is about 100 pages (5,000 results). |
maxResultsPerQuery | integer | no | 50 | Search results per query (search mode). YouTube returns at most about 500 per query. Each 50 = one search page (100 quota units). |
order | string | no | "relevance" | search.list order (search mode). |
searchType | string | no | "video" | video: video rows with full details. channel: channel rows with subscriber, video and view counts (search mode). |
publishedBefore | string | no | "" | Optional date (YYYY-MM-DD) for search mode. |
regionCode | string | no | "" | Optional 2-letter country code (US, GB, DE …): search results available in that country (search mode). |
relevanceLanguage | string | no | "" | Optional ISO 639-1 language code (en, es, de …): results most relevant to that language (search mode). |
videoDuration | string | no | "any" | Filter search results by duration (search mode, videos only). short < 4 min, medium 4–20 min, long > 20 min. |
maxCommentsPerVideo | integer | no | 100 | Top-level comments per video (comments mode). Replies are not counted here; they are capped separately by Max replies per comment. 100 top-level comments per quota unit. |
includeReplies | boolean | no | false | Also return replies (comments mode), up to Max replies per comment per thread. Each reply is its own comment-result row, linked by parentId. |
maxRepliesPerComment | integer | no | 20 | With Include replies on: at most this many replies per top-level comment (comments mode), so one huge thread cannot eat the run. 0 = no replies. Up to 5 replies come free with the thread call; more cost 1 quota unit… |
commentOrder | string | no | "time" | time: newest first. relevance: YouTube's top comments. |
searchTerms | string | no | "" | Optional keyword filter applied by YouTube to the comments (comments mode). |
Output example
A run returns one channel row with the channel totals, then one row per upload, as in this sample from a developer channel:
| type | title | handle | country | subscriberCount | videoCount | viewCount | publishedAt | channelTitle | durationSec | likeCount | commentCount | isShort |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| channel | Google for Developers | @googledevelopers | US | 2680000 | 6118 | 362848729 | 2007-08-23T00:34:43Z | |||||
| video | 🧰 Builders building with Gemini Audio | 3118 | 2026-10-16T21:00:00Z | Google for Developers | 64 | 111 | 5 | true | ||||
| video | 🎵 Turning motion into music with Gemini | 7754 | 2026-10-16T16:00:00Z | Google for Developers | 32 | 138 | 3 | true |
Pricing
Pay per event: you are charged only for the results you receive, with no subscription. Set a maximum total charge on any run and it stops cleanly at the cap.
| Charged for | When | Price | Per 1,000 | Worked example |
|---|---|---|---|---|
| Video result | Charged per video row delivered (full details and stats) | $0.0004 | $0.40 | 1,000 videos = $0.40 (streamers/youtube-scraper: $4.00 per 1,000) |
| Channel result | Charged per channel row delivered (stats, country, uploads playlist) | $0.0005 | $0.50 | 100 channels = $0.05; their videos are video-result rows |
| Comment result | Charged per comment or reply row delivered (author fields stripped) | $0.0005 | $0.50 | 10,000 comments = $5.00 (streamers/youtube-comments-scraper: $20) |
| Search page | Charged per search page of up to 50 results that returned rows (search mode; it costs 100 of your quota units) | $0.002 | $2 | 50 search results = $0.002 + 50 × $0.0004 = $0.022 |
| Actor Start (platform start fee) | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). | $0.00005 | — | One run at 256 MB = $0.0000125 |
Prices are read from the live Apify Store listing when this page is built. The listing is always authoritative.
Try YouTube Channel Scraper (Official API) on Apify. Pay only for the results you get.
Run on Apify →Use cases
Vet an influencer before a deal
Pull a creator's last 100 or 200 uploads and look at views, likes and comments per video rather than the headline subscriber number. Upload frequency and recent performance are visible straight from the published dates and stats.
Track competitor channels
Schedule a run over a list of competitor @handles with publishedAfter set to last week, so each run only pages through new uploads. Paging stops at older videos, which keeps quota use low.
Audit your own back catalogue
Export every public upload with tags, category, duration and engagement into one table to find old videos worth updating, tag gaps, or formats that consistently underperform.
Channel stats only, at scale
Set maxVideosPerChannel to 0 to get just the channel row: subscribers, total views, video count, country and created date. That is a cheap way to size a long list of channels before deciding which to dig into.
How it compares
| ActorForge Channel Scraper | YouTube Studio export | Scrolling the channel page | |
|---|---|---|---|
| Works for any public channel | Yes | Only channels you own | Yes |
| Watch time, revenue, traffic sources | No | Yes | No |
| Per-video views, likes, comments | Yes | Yes | Views only, by hand |
| Full upload list in one table | Yes, newest first | Yes | Manual copy |
| Only uploads after a date | Yes (publishedAfter) | Date filters | No |
| Needs a YouTube API key | Yes (free) | No | No |
| Cost | $0.40 per 1,000 videos | Free | Free, but slow |
For your own channel, YouTube Studio is the better source: it has watch time, revenue and traffic data that the public API never returns. This actor is for public channels you do not own, or for pulling many channels into one consistent table.
Limits and honest notes
- You need your own free YouTube Data API v3 key (see the 4-step guide above). Without one the run stops at once with instructions, and nothing is charged.
- Quota is per Google Cloud project: 10,000 units/day for free. Unit costs: videos.list, channels.list, playlistItems.list, commentThreads.list and comments.list cost 1 unit each, and search.list costs 100. A
quotaExceedederror stops the run cleanly; rows already delivered are kept, and the failed call is free. - Only public data the API returns for an API key: no private or unlisted-by-ID-only details, no dislike counts (removed by YouTube), no revenue, no watch time, and no subscriber lists. Channels that hide their subscriber count give
subscriberCount: null. - Like counts that the creator hides come back as null. Counts are YouTube's own; subscriber counts are rounded by YouTube to 3 significant figures.
- Free rows (type error) cover invalid inputs, videos and channels that are not found, private or deleted, and videos with comments disabled.
- You must refresh or delete stored API data within 30 days (YouTube Developer Policies III.E.4). We keep nothing after the run.
- The run's spend limit is respected: each page of rows is charged before it is delivered, and the run stops cleanly at the cap.
- The uploads list contains public videos only. A channel with no public uploads gives the channel row and no videos. Custom
/c/nameURLs are resolved as the @handle with the same name; if that fails, paste the @handle or channel ID instead. isShortis a heuristic (3 minutes or less and not live), because the API does not flag Shorts. TurningincludeShortsoff also drops regular videos of 3 minutes or less.
FAQ
How do I download a list of all videos from a YouTube channel?
Paste the channel's @handle, URL or ID into channels, set maxVideosPerChannel high enough to cover the catalogue, and run. You get a channel row and then one row per public upload, newest first, which you can download as CSV, JSON or Excel from the dataset.
Can I get only recent uploads from a channel?
Yes. Set publishedAfter to a date such as 2026-01-01. The actor stops paging once it reaches older uploads, which also saves quota.
Does it include unlisted or private videos?
No. The uploads list contains public videos only. A channel with no public uploads gives the channel row and no video rows.
Why is the subscriber count rounded or empty?
YouTube rounds subscriber counts to 3 significant figures in the API, and channels that hide their subscriber count return subscriberCount: null. These are YouTube's own figures.
Do custom /c/ channel URLs work?
Custom /c/name URLs are resolved as the @handle with the same name. If that does not find the right channel, paste the @handle or the UC… channel ID instead.
Use it from code
Run the actor through the Apify API with the input above.
cURL
curl -X POST "https://api.apify.com/v2/acts/actor-forge~youtube-channel-api/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"apiKey": "AIzaSy...your-own-key", "mode": "channel", "channels": ["https://www.youtube.com/@googledevelopers", "@YouTube"], "maxVideosPerChannel": 200, "publishedAfter": "2026-01-01", "includeShorts": false}'JavaScript (Node.js)
// Node.js 18+ (built-in fetch). Set APIFY_TOKEN in your environment.
const input = {
"apiKey": "AIzaSy...your-own-key",
"mode": "channel",
"channels": [
"https://www.youtube.com/@googledevelopers",
"@YouTube"
],
"maxVideosPerChannel": 200,
"publishedAfter": "2026-01-01",
"includeShorts": false
};
const res = await fetch(
"https://api.apify.com/v2/acts/actor-forge~youtube-channel-api/run-sync-get-dataset-items",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.APIFY_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify(input),
}
);
const items = await res.json();
console.log(items.length, items[0]);Python
# pip install apify-client (set APIFY_TOKEN in your environment)
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = {
"apiKey": "AIzaSy...your-own-key",
"mode": "channel",
"channels": [
"https://www.youtube.com/@googledevelopers",
"@YouTube"
],
"maxVideosPerChannel": 200,
"publishedAfter": "2026-01-01",
"includeShorts": False
}
run = client.actor("actor-forge/youtube-channel-api").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)The run-sync-get-dataset-items endpoint waits for the run (up to 5 minutes) and returns the dataset rows directly. For longer runs, start the run asynchronously and read the dataset when it finishes, as the Python example does. Replace APIFY_TOKEN with your own token from the Apify console.
Step-by-step guides
How to Get YouTube Data With the Official API (Free Key, No Code)
Create a free YouTube Data API v3 key in Google Cloud (no billing account), paste it into an ActorForge YouTube actor, and get video, channel…
Related actors
YouTube Scraper (Official API) — Videos, Search & Stats
Bring your own free YouTube API key. Get video details and stats (views, likes, comments, duration, tags), YouTube search results, channel uploads…
$0.40 per 1,000 · video resultYouTube Search Scraper (Official API) — Videos by Keyword
Bring your own free YouTube API key. YouTube search by keyword with sort, date, region, language and length filters — every result enriched with…
$0.30 per 1,000 · video resultYouTube Comments Scraper (Official API) — No Usernames
Bring your own free YouTube API key. Export YouTube comments and replies (text, likes, reply count, dates) for any video via the official YouTube…
$0.50 per 1,000 · comment resultTry YouTube Channel Scraper (Official API) on Apify. Pay only for the results you get.
Run on Apify →