Youtube Video Downloader
Pricing
from $25.00 / 1,000 video downloaded full hd (1080p)s
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
Maintained by CommunityActor stats
0
Bookmarked
83
Total users
42
Monthly active users
17 hours ago
Last modified
Categories
Features
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 quality | From $0.010 to $0.065 per started minute, depending on the delivered quality tier. See the pricing table below. |
| Real MP4 files | Video and audio are merged into a single .mp4 that plays anywhere — no separate audio track to combine. |
| Quality you choose | Cap the download at any height: up to best (any height), 1080p, 720p or 480p. |
| Fast | A small batch typically finishes in a few minutes — not hours. |
| Zero setup | No API keys, no cookies, no third-party services. Just paste links and run. |
| Parallel everything | Up to 5 videos per run, downloaded in parallel. |
| Self-healing | Automatic retries on fresh connections plus a strict last-resort rescue path. |
| Geo-aware | Country-blocked videos are retried from another region — and re-downloaded from an allowed country when possible. |
| Never-fail runs | The run always finishes with one dataset row per video — successes and failures alike. |
| Per-video control | Each 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
- Open the actor and click Add item under YouTube videos.
- 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. - Add up to 5 videos per run (Shorts and YouTube Music links work the same way).
- 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:
| Event | Quality tier | Price / started minute |
|---|---|---|
VIDEO_DOWNLOADED_SD | 480p and below | $0.010 |
VIDEO_DOWNLOADED_720 | 720p | $0.015 |
VIDEO_DOWNLOADED_1080 | 1080p | $0.025 |
VIDEO_DOWNLOADED_1440 | 1440p | $0.040 |
VIDEO_DOWNLOADED_2160 | 2160p 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
maxTotalChargeUsdrun option.
Recommended run options (timeout & memory)
- Keep the actor defaults —
timeoutSecs3600 (one hour) and a 1024 MB run. Runs set totimeoutSecs280 / 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
timeoutSecsat ≥ 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):
| Quality | Approximate 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 above | 0.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:
- Lower the
videoQualityceiling — 720p is roughly half, and 480p about a quarter, of the 1080p size. Standard-definition videos fit comfortably. - 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 downloadUrlpoints 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:
| Field | Values | Default |
|---|---|---|
s3.endpoint | S3 API endpoint URL | — (disabled) |
s3.bucket | Existing bucket name | — |
s3.region | e.g. us-east-1 · R2 needs auto | us-east-1 |
s3.accessKey / s3.secretKey | Credentials with PutObject on the bucket | — |
s3.publicBaseUrl | Public URL prefix for downloadUrl (optional) | path-style endpoint URL |
videos[].s3 | true = deliver this video to the bucket | false (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
| Field | Values | Default |
|---|---|---|
videos[].url | YouTube URL or 11-char video id (required) | — |
videos[].timeframe | MM:SS-MM:SS · HH:MM:SS-HH:MM:SS | global |
videos[].videoQuality | best · high · medium · low | global |
videos[].s3 | true · false — see Optional: deliver to your own S3 bucket | false |
videoQuality | best (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
| Field | Meaning |
|---|---|
title / duration | Video title and duration (the cut window when a timeframe was used). |
qualityTier | Quality bucket the file priced at: 480, 720, 1080, 1440, 2160+ or unknown. |
billedMinutes | Started minutes charged for this video. |
chargedUsd | The pay-per-event amount charged for this video. |
ok | true when the file was delivered. |
method | primary (direct path), fallback (rescue path) or fail. |
filename / downloadUrl / storedVia | Stored file name, direct link, and where it went (kv or s3). |
bytes / seconds / attempt | File size, wall seconds, and the attempt that settled the row. |
error | Failure 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.