The direct answer: unlike our other Data API comparisons, quota is not the argument here. The official uploads-playlist route — channels.list to find the uploads playlist, then playlistItems.listat 1 unit per 50-video page — is genuinely cheap: listing a 10,000-video channel costs about 201 units of the general pool's 10,000 daily units, and Google documents no fees. If you already run a Google Cloud project and want exact integer view counts and ISO timestamps, the official route is excellent, and this page says so. The trade is setup and plumbing: a key, two endpoints, follow-up statistics calls, and your own failure handling. The YouTube Channel Scraper sells the opposite trade — a plain @handle in, one JSON row per video out with view count (one documented collaboration-layout exception aside — disclosed below), duration, and thumbnail attached, unbilled coded rows for bad channels, $0.50 per 1,000 videos, no Google project at all.
Every claim about the Data API below links Google's own documentation, all verified on 2026-07-22. The actor side was run first-hand the same day — the run and its evidence file are below.
The official route, and its real cost profile
Google's documented path has three steps. First, channels.list (1 unit) resolves the channel — it accepts a handle directly via forHandle, with or without the @ — and its contentDetails.relatedPlaylists.uploads field is "the ID of the playlist that contains the channel's uploaded videos." Second, playlistItems.list walks that playlist at 1 unit per page of up to 50 items (maxResults 0–50, default 5). Third — because a playlist item carries IDs, titles, and dates but no statistics part — a follow-up call to videos.batchGetStats (1 unit, its own 10,000-unit daily bucket) or videos.list (1 unit, general pool) attaches view counts and durations to the collected IDs.
Two things Google's docs do not say: whether the uploads playlist includes Shorts and live archives, and in what order items come back. This comparison leaves both unspecified on the Data API side rather than filling them in from observation. snippet.position is a zero-based index, but no ordering semantics are documented. Where this page compares ordering or content scope, the actor side states its own documented behavior and the Data API side is marked not documented.
One route to avoid: search.list with channelId. Google's search.list reference documents that such results "are constrained to a maximum of 500 videos" (with type: videoand no owner filter), and since Google's June 2026 quota revision every such call spends the separate 100-calls-per-day search bucket — our search.list comparison covers that bucket in detail. The uploads-playlist route above is the right official path.
The decision, by dimension
| Dimension | Data API uploads-playlist route | YouTube Channel Scraper |
|---|---|---|
| Setup | Google Cloud project + API key; two endpoints plus a statistics follow-up, with ID plumbing between them. Google documentation. | Apify API token; one call, metadata attached per row. By design — Apify platform auth. |
| Quota / cost of listing one channel | About 201 general-pool units for channel lookup plus the playlist walk on a 10,000-video channel (1 + 10,000 ÷ 50 pages) — before statistics enrichment, which adds videos.batchGetStats calls from its own bucket or videos.list calls from the general pool. No fees documented, quota-governed. Google documentation; arithmetic from documented costs. | $0.50 per 1,000 delivered videos ($5.00 for that same 10,000-video channel); failed channels $0. apihq list pricing. |
| Data precision | Exact integer viewCount, ISO 8601 durations, exact timestamps — the stronger dataset for analytics. Google documentation. | Display strings as YouTube renders them ("55M views", "2 weeks ago") plus duration in seconds; built for pipelines, not precision analytics. apihq documentation. |
| Content scope | The uploads playlist; whether Shorts and live archives are included is not documented. Google documentation (gap noted). | The Videos tab — long-form uploads only, newest first; Shorts have their own actor. apihq documentation. |
| Ordering | Not documented; position is a zero-based index with no stated semantics. Google documentation (gap noted). | Newest first, documented. apihq documentation. |
| Failure handling | HTTP errors to catch and interpret per endpoint. First-party assessment. | Unbilled success: false rows with stable codes (CHANNEL_NOT_FOUND, NO_VIDEOS); the batch continues. apihq documentation; demonstrated in the run below. |
| Channel statistics (subscribers, lifetime views) | Available via channels.list parts. Google documentation. | Out of scope — video rows only. apihq documentation. |
| Terms-of-service posture | Official API under the YouTube API Services Terms of Service. First-party assessment. | Reads public data outside the official API; not affiliated with or endorsed by YouTube. First-party assessment. |
When the Data API is the better choice
- Analytics that need exact numbers: integer view counts, ISO durations, and precise timestamps — the actor's display strings are a real limitation for that job.
- Channel-level statistics — subscriber counts and lifetime views come from
channels.listand are entirely out of the actor's scope. - High-volume listing where you already operate a Google Cloud project: the uploads-playlist walk is quota-cheap at any realistic channel size, with no per-result fee documented.
- Workflows that must stay inside Google's official API surface for compliance reasons.
When the actor is the better choice
- Zero-setup pipelines: no Google Cloud project, no key, no uploads-playlist indirection — an @handle, URL, or UC… ID in, one JSON row per video out, from one HTTP call in n8n, Make, or a scheduled workflow.
- Mixed batches with a failure contract: up to 50 channels per run, and a dead handle costs $0 as a coded
success: falserow instead of an HTTP error that needs try/catch logic — shown first-hand in the run below. - Display-ready metadata in one pass: audience count, duration in seconds, and thumbnail land on each row without follow-up statistics calls or ID plumbing (with one disclosed parsing gap on collaboration videos — see the run below).
- Feeding the sibling actors: channel rows carry the video IDs that transcripts and comments jobs consume.
The first-hand actor run, as evidence
On 2026-07-22 at 13:51 UTC we ran the YouTube Channel Scraper (build 0.1.3) once with two inputs in the same batch: @mkbhd (a channel outside our control) with maxResults: 100, and a deliberately broken handle, @apihq-no-such-handle-2026 (Apify run RgtOGkDnaSajeUno6). The run finished SUCCEEDED in 15 seconds with 101 dataset rows: 100 billed video rows — 100 unique video IDs, each with a duration — and one unbilled success: false row with code CHANNEL_NOT_FOUND for the broken handle, while the batch completed normally. That is the failure contract exercised for real, not quoted from documentation. The run emitted 100 video charge events; at the public list price of $0.0005 per video that is $0.05 (we ran our own actor, so this is a list-price value, not an observed customer charge).
One imperfection the run surfaced, disclosed rather than filtered: 98 of the 100 rows carried a lifetime view-count string, but 2 rows — YouTube collaboration videos — carried a collaborator credit in the view_countfield and an empty publish string, consistent with YouTube replacing that metadata slot on collab videos. It is recorded as a committed known-issue record in the actor's private source repository (found in build 0.1.3, commit 23899a3); the publicly readable disclosures are the actor's documentation and the evidence file below, which names the two affected video IDs.
The sanitized run output — video IDs, URLs, the raw view_count display field (98 view-count strings and the two collaborator credits, retained as delivered), durations, and channel IDs; titles and thumbnails removed — is published with full run metadata (timestamps, build, dataset ID, charge counts, price calculation) at /evidence/youtube-channel-run-2026-07-22.json; any row can be checked against its public YouTube URL. It is one run against one channel on one date — not a reliability or coverage statistic, and no Data API side-by-side was executed.
Methodology and sources
- No first-hand Data API run:Data API rows rest on Google's documentation — linked at every claim and re-checked on the last-verified date above — including two explicitly noted documentation gaps (uploads-playlist content scope and ordering) where this page declines to state undocumented behavior as fact.
- Actor rows: pricing, output fields, and failure behavior come from the actor's documentation, the canonical copy for this site — it currently includes disclosures not yet synced to the Apify listing; the sync is queued. The failure contract and per-row metadata delivery are demonstrated by the first-hand run above; the remaining actor rows are documentation claims, reproducible with one run.
- Corrections:if Google's documented behavior changes or a row is wrong, use the support and corrections route; the page carries its last-verified date at the top.