YouTube Channel Videos Scraper avatar

YouTube Channel Videos Scraper

Pricing

Pay per event

Go to Apify Store
YouTube Channel Videos Scraper

YouTube Channel Videos Scraper

Export every uploaded video from any public YouTube channel into clean, structured dataset rows — video ID, title, view count, published time, duration, thumbnail. Devil Scrapes walks the channel's own paginated video grid so your pipeline doesn't break when YouTube reshuffles its layout.

Pricing

Pay per event

Rating

0.0

(0)

Developer

DevilScrapes

DevilScrapes

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share


🎯 What this scrapes

A YouTube channel's /videos tab ships its first ~30 uploads inline in a ytInitialData blob, then hides the rest behind a continuation token buried in the page — the same token shape that moves every few WEB-client releases. We find that token wherever YouTube nests it this month with a generic recursive search, page through /youtubei/v1/browse for the rest, and turn every upload into one clean dataset row with title, views, duration, publish time, and the highest-resolution thumbnail.

🔥 What we handle for you

  • 🛡️ Browser fingerprint rotationcurl-cffi impersonates real Chrome / Firefox / Safari TLS handshakes so the target sees a browser, not Python.
  • 🌐 Residential proxy rotation via Apify Proxy — fresh session and exit IP on every block.
  • 🔁 Retries with exponential backoff on 408 / 429 / 5xx — up to 5 attempts per page, Retry-After honoured.
  • 🧱 Rate-limit-aware pacing — when the target pushes back, we slow down instead of getting banned.
  • 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, stable IDs, JSON / CSV / Excel export straight from the Apify Console.
  • 💰 Pay-Per-Event pricing — you only pay for results that hit your dataset. No data, no charge.

💡 Use cases

  • Competitor/content research — pull a competitor channel's full upload history to study cadence, titling, and view performance over time.
  • Creator analytics — build per-channel dashboards of view counts and publish cadence without babysitting the YouTube UI.
  • Video-inventory pipelines — feed a downstream catalog, recommender, or archive with a channel's canonical video list, IDs, and thumbnails.
  • Trend tracking — snapshot a set of channels on a schedule to watch view-count growth and publishing frequency shift over time.

⚙️ How to use it

  1. Click Try for free at the top of the page.
  2. Fill in the input form — most fields have sensible defaults.
  3. Click Start. Output streams into the run's dataset.
  4. Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.

📥 Input

FieldTypeRequiredDefaultNotes
channelsarrayyes['@mkbhd']YouTube channel handles, bare handles, or full channel URLs (e.g. @mkbhd, mkbhd,…
maxVideosintegerno30Stop paging once this many videos have been emitted for a single channel (1–5000). Set above ~30 to force a second…
hlstringno'en'YouTube UI language passthrough — affects relative-timestamp text like "3 days ago". Example: en.
glstringno'US'YouTube UI country/region passthrough. Example: US.
proxyConfigurationobjectno{'useApifyProxy': True}Apify Proxy configuration. Recon confirmed byte-identical channel-page payloads across datacenter and residential exits…

Example input

{
"channels": [
"@mkbhd",
"@veritasium"
],
"maxVideos": 45,
"hl": "en",
"gl": "US",
"proxyConfiguration": {
"useApifyProxy": true
}
}

📤 Output

Every row is one dataset item.

FieldTypeNotes
channel_handlestringNormalised @handle of the channel this video belongs to.
video_idstring11-character YouTube video ID.
titlestringVideo title at scrape time.
view_countintegerParsed view count. 0 when absent or unparseable.
published_timestringYouTube's relative publish string (e.g. '3 days ago'), verbatim — no absolute-timestamp resolution.
duration_textstringVerbatim duration text (e.g. '12:34'). Null for live streams/premieres.
duration_secondsintegerDuration parsed to seconds. Null alongside duration_text for live/premiere videos.
thumbnail_urlstringHighest-resolution thumbnail URL available.

Example output

{
"channel_handle": "@mkbhd",
"video_id": "dQw4w9WgXcQ",
"title": "This Changes Everything",
"view_count": 4213098,
"published_time": "3 days ago",
"duration_text": "12:34",
"duration_seconds": 754,
"thumbnail_url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg"
}

💰 Pricing

Pay-Per-Event — you pay only when these events fire:

EventUSDWhat it is
actor-start$0.2One-off warm-up charge per run
video-scraped$0.005PPE event

Example: 1 000 results at the rates above ≈ $5.20. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.

🚧 Limitations

Public channels only — the /videos tab, not Shorts or Live. No channel-metadata row (subscribers, banner, description) — video rows only. No absolute-timestamp resolution for publish dates. YouTube's internal payload shape can shift between web-client releases; we walk it with a generic recursive search rather than a fixed path, but a structural change may still need a same-day patch.

❓ FAQ

Does this scrape Shorts or Live tabs?

No — v1 covers the standard /videos tab only (regular uploads). Shorts and Live listings are out of scope for this release.

Does it return channel-level metadata like subscriber count?

No — this Actor returns video rows only, not a channel-metadata row (subscribers, banner, description).

Why is published_time a string like '3 days ago' instead of a date?

That's what YouTube's own channel page returns — it does not expose an absolute timestamp here. We pass it through verbatim rather than guessing at a conversion.

What happens if a channel has zero videos?

The run still succeeds — a legitimately empty channel returns zero rows for that channel and the final status message reports it separately from a failed/degraded fetch.

What happens if a channel handle is invalid or the channel is private?

That single channel is skipped and counted as failed in the run summary; every other channel in the same run still completes.

💬 Your feedback

Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.