Youtube Video Downloader avatar

Youtube Video Downloader

Pricing

from $25.00 / 1,000 video downloaded full hd (1080p)s

Go to Apify Store
Youtube Video Downloader

Youtube Video Downloader

Download YouTube videos in multiple resolutions (up to 4K) and formats. Built with smart fallback strategies and proxy rotation for reliable extraction as YouTube's detection evolves. Batch processing, custom quality selection, fast turnaround. Actively maintained.

Pricing

from $25.00 / 1,000 video downloaded full hd (1080p)s

Rating

5.0

(4)

Developer

Oliver Queen

Oliver Queen

Maintained by Community

Actor stats

0

Bookmarked

83

Total users

42

Monthly active users

17 hours ago

Last modified

Features

Limited permissions

Share

Turn any list of YouTube links into ready-to-download MP4 video files with sound included — a 30-second clip, a music video, a 2-hour documentary — fully automatic, no login, no cookies, no API key. A YouTube video downloader built for both people and pipelines.

Per-minute pricing by qualityFrom $0.010 to $0.065 per started minute, depending on the delivered quality tier. See the pricing table below.
Real MP4 filesVideo and audio are merged into a single .mp4 that plays anywhere — no separate audio track to combine.
Quality you chooseCap the download at any height: up to best (any height), 1080p, 720p or 480p.
FastA small batch typically finishes in a few minutes — not hours.
Zero setupNo API keys, no cookies, no third-party services. Just paste links and run.
Parallel everythingUp to 5 videos per run, downloaded in parallel.
Self-healingAutomatic retries on fresh connections plus a strict last-resort rescue path.
Geo-awareCountry-blocked videos are retried from another region — and re-downloaded from an allowed country when possible.
Never-fail runsThe run always finishes with one dataset row per video — successes and failures alike.
Per-video controlEach link can have its own timeframe cut and quality ceiling.
Bring your own S3 (optional)Deliver files straight to your own S3-compatible bucket (AWS S3, Cloudflare R2, MinIO, B2) — the key-value store stays the main store and is always the fallback.

How to download video from YouTube

  1. Open the actor and click Add item under YouTube videos.
  2. Paste a YouTube URL (full watch URL or the 11-char video id). Optionally set Timeframe (1:30-2:45) and Video Quality per video.
  3. Add up to 5 videos per run (Shorts and YouTube Music links work the same way).
  4. Hit Run. When it finishes, grab the files from the Output ▸ Download column — or take them straight from the API.

Timeframe cuts are done by stream copy (no re-encode), so cutting a long video down to a short clip is instant and lossless.

Quality is a ceiling, not a promise of an exact height: pick Best (any height) to take whatever the source offers, or 1080p / 720p / 480p to cap the download. The delivered file is never higher than the ceiling and may be lower when the source has nothing higher.

How much does it cost to download YouTube video?

Pricing is per started minute, and the per-minute price depends on the quality tier of the delivered file. Each tier is a separate event, charged at most once per run:

EventQuality tierPrice / started minute
VIDEO_DOWNLOADED_SD480p and below$0.010
VIDEO_DOWNLOADED_720720p$0.015
VIDEO_DOWNLOADED_10801080p$0.025
VIDEO_DOWNLOADED_14401440p$0.040
VIDEO_DOWNLOADED_21602160p and above$0.065
  • Started minutes = max(1, ceil(duration / 60)). A 3.5-minute video bills 4 started minutes; a 30-second clip bills 1.
  • The tier is read from the delivered file. If the height cannot be determined, the 720p tier (the middle) is used.

Examples:

  • A 3.5-minute 1080p video → 4 started minutes × $0.025 = $0.10
  • A 3-minute 1080p video → 3 × $0.025 = $0.075
  • A 10-minute 720p video → 10 × $0.015 = $0.15
  • A 30-second 480p clip → 1 × $0.010 = $0.01

When am I charged?

  • Each requested video is charged at most once per run — retries and rescue rounds are free, and a video can never be billed twice in one run.
  • Invalid / non-YouTube URLs are rejected before any attempt → $0.
  • Live or upcoming streams are rejected before any download → $0.
  • No start fee; platform usage is billed as normal Apify compute units on top of the per-minute price.
  • Cap spending with the standard maxTotalChargeUsd run option.
  • Keep the actor defaults — timeoutSecs 3600 (one hour) and a 1024 MB run. Runs set to timeoutSecs 280 / 512 MB measurably lose results: in one measured 24-hour window of real-world traffic (2026-10-26 → 2026-10-27), at least one video failed in 25.4% of those runs (29/114 runs), while every other configuration measured came in at ≤ 4.8% (240 s and 3600 s runs: 1.2% and 0%).
  • A video that was attempted still bills the per-minute price for its quality tier even when it fails — that video's dataset row reports an error, but no file is delivered.
  • Tight deadline? Keep timeoutSecs at ≥ 400 s so the automatic retries and rescue rounds have room to settle every video, and keep memory at the default 1024 MB — less memory also shrinks the run's scratch space (see Storage below).
  • These figures are an observation from one measurement window of real traffic — not a guarantee.

Storage & very long / HD videos

Every run works on a limited scratch space of about 2 GB — the platform sizes a run's working disk at roughly twice its memory setting, and this actor runs with 1 GB. The download is written there, processed there, and only then uploaded to the key-value store (or to your s3 bucket). Video files are far larger than audio, so this limit is what very long or high-definition downloads meet first.

Sizes to plan for (final file; the real number depends on what the source offers):

QualityApproximate size per hour
480p and below~0.1 GB (100 MB)
720p~0.15–0.3 GB
1080p~0.4–0.5 GB
1440p and above0.8 GB and up

While a video is being processed, peak working space can reach about twice the final file size (the incoming streams and the finished file exist side by side until the file is assembled). A 2.5-hour 1080p video therefore needs roughly 2 GB at its peak — as much as a whole run has.

What happens when a video cannot fit. Before each download, the run checks how much working space is still free and refuses a video that cannot fit immediately: you get a normal dataset row (ok: false) with a plain-language error saying the video is too large for the run's storage, no download time is wasted — and that video is not charged (nothing was attempted for it). Nothing is kept behind on disk: media is removed as soon as the run is done with it, so the remaining videos of the same run still have the space free.

Two ways to download videos that do not fit:

  1. Lower the videoQuality ceiling — 720p is roughly half, and 480p about a quarter, of the 1080p size. Standard-definition videos fit comfortably.
  2. Deliver to your own storage — fill the optional S3 delivery section below and switch it on for those videos: the file goes straight to your bucket, which is the recommended setup for very long or HD material.

YouTube video API for automation and AI agents

Everything the UI does is available through the JSON input API, so the actor drops straight into scripts, CI jobs, schedulers, and AI agents (Apify MCP server, webhooks, Zapier/Make):

{
"videos": [
{ "url": "https://www.youtube.com/watch?v=VIDEO_ID" },
{ "url": "https://www.youtube.com/watch?v=OTHER_ID",
"timeframe": "1:30-2:45",
"videoQuality": "medium" }
],
"videoQuality": "high"
}

Only url is required — empty fields fall back to the global defaults (Video Quality, Timeframe). Start a run with POST https://api.apify.com/v2/acts/<username>~youtube-video-downloader/runs and poll it, or use run webhooks and the scheduler for recurring jobs.

Each run produces:

  • Dataset — one item per video: url, title, duration, qualityTier, billedMinutes, ok, method, filename, downloadUrl, seconds, bytes, attempt, chargedUsd, error
  • Key-value store — the video files themselves (.mp4); the main store, always used unless you opt into S3 below
  • downloadUrl points at the stored file; the Output tab shows a ready-made table

Optional: deliver to your own S3 bucket

The key-value store is the main store and works with zero setup. If your pipeline reads from your own object storage instead, fill the optional S3 delivery section (any S3-compatible service: AWS S3, Cloudflare R2, MinIO, Backblaze B2, ...) and switch the S3 delivery toggle on for the videos you want there:

FieldValuesDefault
s3.endpointS3 API endpoint URL— (disabled)
s3.bucketExisting bucket name—
s3.regione.g. us-east-1 · R2 needs autous-east-1
s3.accessKey / s3.secretKeyCredentials with PutObject on the bucket—
s3.publicBaseUrlPublic URL prefix for downloadUrl (optional)path-style endpoint URL
videos[].s3true = deliver this video to the bucketfalse (key-value store)
  • Optional by design — leave the section empty and nothing changes; toggles default to OFF.
  • Never fails the run — missing/invalid credentials or a failed upload automatically fall back to the key-value store.
  • Free tiers work fine (e.g. Cloudflare R2: 10GB + zero egress fees; MinIO self-hosted: unlimited).

Input reference

FieldValuesDefault
videos[].urlYouTube URL or 11-char video id (required)—
videos[].timeframeMM:SS-MM:SS · HH:MM:SS-HH:MM:SSglobal
videos[].videoQualitybest · high · medium · lowglobal
videos[].s3true · false — see Optional: deliver to your own S3 bucketfalse
videoQualitybest (any height) · high (≤1080p) · medium (≤720p) · low (≤480p)best

Global settings act as defaults for every video that leaves a field empty.

Output row reference

FieldMeaning
title / durationVideo title and duration (the cut window when a timeframe was used).
qualityTierQuality bucket the file priced at: 480, 720, 1080, 1440, 2160+ or unknown.
billedMinutesStarted minutes charged for this video.
chargedUsdThe pay-per-event amount charged for this video.
oktrue when the file was delivered.
methodprimary (direct path), fallback (rescue path) or fail.
filename / downloadUrl / storedViaStored file name, direct link, and where it went (kv or s3).
bytes / seconds / attemptFile size, wall seconds, and the attempt that settled the row.
errorFailure reason (failed rows only).

Disclaimer

This actor is a technical tool provided for legitimate purposes only: research, study, and personal offline viewing of content you have the right to access. It does not encourage or support redistributing or re-publishing downloaded content in any way that violates YouTube's Terms of Service or copyright law. You are solely responsible for how you use it — download only content you own or have explicit permission or a license for, and do not use this actor to circumvent paywalls, DRM, or access controls on content you are not entitled to. The actor is provided "as is", without warranties of any kind, to the extent permitted by law.

FAQ

What if a video fails? The engine already retried it through multiple connections, then tried a last-resort rescue path. Anything still failing at the end is reported in the dataset with the exact error; just re-run it (invalid URLs are rejected before any attempt and cost nothing, and a failed video is never charged twice).

Is there a video limit? Up to 5 links per run (each may be a timeframe cut). Need more? Chain runs via API — each run is independent and resumable.

Do I get audio too? Yes — the delivered .mp4 contains both video and audio, merged. If you only need the audio track, use the companion YouTube audio downloader instead.

Can I download just a part of a video? Yes. Set a Timeframe (1:30-2:45 or 00:01:30-00:02:45) globally or per video; the cut is a lossless stream copy, and billing follows the delivered window.

Do I need login, cookies, or an API key? No. The actor runs without a YouTube account, browser cookies, or any third-party API key.

Can files go to my own S3/R2 bucket? Yes — optionally. Fill the S3 delivery section with your bucket's endpoint + credentials and turn the per-video toggle on; the file lands in your bucket and downloadUrl points there. The key-value store remains the main store, and any S3 problem (missing config, bad credentials, network) silently falls back to it — the run never fails because of S3.

What about country-restricted videos? The engine detects the country block, retries other regions, then re-downloads the video from an allowed country when that country is supported. Videos blocked in every supported region are reported in the dataset as a geo failure.

What about live streams? Ongoing live/premiere streams are rejected instantly (fast-fail, no endless download, no charge); ended live streams download as regular videos.

Is downloading YouTube video legal? For legitimate purposes, yes — see the Disclaimer section above for the full terms.

Why does a run sometimes take a couple of minutes for one video? Container start plus YouTube's anti-bot checks dominate single-video runs; batching several links into one run amortizes the startup and is cheaper per video.