Youtube Video Downloader
Pricing
Pay per usage
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
Pay per usage
Rating
0.0
(0)
Developer
Oliver Queen
Maintained by CommunityActor stats
0
Bookmarked
40
Total users
10
Monthly active users
8 hours ago
Last modified
Categories
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.
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). |
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? Only download content you have the right to use. Respect YouTube's Terms of Service and copyright law; the actor is a technical tool and you are responsible for how you use it.
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.