YouTube Video, Shorts, Audio & Transcript Downloader
Pricing
from $6.00 / 1,000 video downloadeds
YouTube Video, Shorts, Audio & Transcript Downloader
Download YouTube videos, Shorts, playlists, and channels in any quality (144p–4K) and format. Extract audio as MP3, M4A, or Opus. Download subtitles and transcripts in any language. Transcript-only mode at $0.001/video. Geo-restrictions handled automatically. No monthly fee.
Pricing
from $6.00 / 1,000 video downloadeds
Rating
5.0
(2)
Developer
Ayoub El Haddad
Maintained by CommunityActor stats
2
Bookmarked
4
Total users
2
Monthly active users
5 days ago
Last modified
Categories
Share
YouTube Video, Shorts, Audio & Transcript Downloader — Playlists & Channels
Download YouTube videos, Shorts, playlists, and entire channels in any quality and format. Extracts subtitles and transcripts in any language. Handles geo-restrictions automatically. Age-restricted videos require providing your YouTube cookies.
Features
- Quality selection — 144p through 4K (2160p), or
bestfor highest available - Video and audio formats — MP4, WebM, MKV for video; MP3, M4A, Opus for audio-only
- Playlist and channel downloads — paste any playlist or channel URL; optionally cap with
maxVideosPerPlaylist - Subtitles and captions — SRT, VTT, or ASS format; manual or auto-generated; any language
- Transcript-only mode — returns plain text without downloading or storing the video; at $0.001/video it's the cheapest way to extract text from YouTube at scale
- Rich optional metadata — thumbnail URL, view/like/comment counts, description, channel info, fps/codec/bitrate, tags and categories
- Cookie authentication — unlocks age-restricted content using your YouTube session
- Geo-restriction handling — detects which country the video requires and retries through a matching residential proxy automatically
Who uses this
AI and LLM developers — Batch an entire channel and get a dataset of clean transcripts ready for your RAG pipeline, fine-tuning job, or search index.
Content creators and marketers — Download videos in MP4 for repurposing, or pull subtitles to turn any interview into a blog post without manual transcription.
Course creators and educators — Download your published videos with auto-generated captions to repackage them into offline materials or captioned clips.
SEO professionals and researchers — Extract transcripts at scale to analyse competitor messaging, find keyword gaps, or build text datasets without touching a video file.
Podcast and audio producers — Pull MP3 or M4A audio from any video or playlist in one run — no browser extensions, no manual downloads.
Data scientists and academics — Build NLP corpora from lectures, conference talks, and interviews across multiple languages via the API.
Developers building MCP-integrated AI tools — Connect this actor as an MCP server so Claude, Cursor, or any MCP-compatible client can fetch YouTube content in a single tool call.
Pricing
Pay only for what you download. No monthly fee.
| Event | Price | When it applies |
|---|---|---|
| Video downloaded | $0.006 | Per video successfully downloaded |
| Subtitles | $0.001 | Per video when includeSubtitles or subtitlesOnly is enabled |
These are the actor fees only. Every run also incurs Apify platform costs billed directly by Apify:
- Residential proxy bandwidth — required for YouTube to work reliably; billed by Apify at $8/GB on Free and Starter plans, $7.50/GB on Scale, and $7/GB on Business. A typical 1080p video is 200–600 MB, so proxy cost dominates for video downloads. Transcript-only mode uses negligible bandwidth since only small subtitle files are transferred.
- Compute — CPU and memory while the actor runs; billed by Apify based on memory allocated and runtime.
Examples
| Task | Actor fee | Proxy cost (approx.) |
|---|---|---|
| 100 videos at 360p | $0.60 | ~$32 (4 GB × $8) |
| 100 videos at 1080p | $0.60 | ~$160 (20 GB × $8) |
| 1,000 transcripts only | $1.00 | ~$0.10 |
Transcript-only mode is the most cost-effective option when you only need text — proxy cost is near zero since no video is transferred.
Input
{"videoUrls": ["https://youtu.be/qMquIcJWZag","https://youtube.com/shorts/pRjw_XEwXX4"],"playlistUrls": ["https://www.youtube.com/@Apify/","https://www.youtube.com/playlist?list=PLObrtcm1Kw6Ohp5OC9ymNNBVEgTa2DZuh"],"maxVideosPerPlaylist": 2,"quality": "1080p","format": "mp4"}
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
videoUrls | Array | — | Individual YouTube video or Shorts URLs |
playlistUrls | Array | — | Playlist or channel URLs to expand and download |
maxVideosPerPlaylist | Integer | All | Max videos per playlist or channel |
maxConcurrency | Integer | 5 | Number of videos to download simultaneously (1–10) |
quality | String | 1080p | Max quality: best, 2160p, 1440p, 1080p, 720p, 480p, 360p, 240p, 144p |
format | String | mp4 | Output format: mp4, webm, mkv, mp3, m4a, opus |
cookiesText | String | — | YouTube cookies in Netscape format for age-restricted videos |
includeSubtitles | Boolean | false | Download captions alongside the video |
subtitlesOnly | Boolean | false | Skip video download; return captions only |
subtitleLanguages | String | "auto" | "auto" to detect the video's language, or a specific code like "en", "fr", "ar" |
subtitleFormat | String | srt | Subtitle file format: srt, vtt, ass |
captionOutput | String | "both" | What to store: "both" (subtitle file + transcript), "subtitleFile", or "transcript" |
includeThumbnail | Boolean | false | Add thumbnail URL to output |
includeStats | Boolean | false | Add view count, like count, and comment count |
includeDescription | Boolean | false | Add full video description |
includeChannelInfo | Boolean | false | Add channel name, channel URL, and upload date |
includeTechnicalInfo | Boolean | false | Add codec, fps, and bitrate |
includeTags | Boolean | false | Add tags and categories |
At least one of videoUrls or playlistUrls is required. Both can be provided together and are processed in the same run.
Supported URL formats
Videos and Shorts:
https://www.youtube.com/watch?v=VIDEO_IDhttps://youtu.be/VIDEO_ID(sharing tokens like?si=are handled automatically)https://youtube.com/shorts/pRjw_XEwXX4
Playlists and channels:
https://www.youtube.com/playlist?list=PLAYLIST_IDhttps://www.youtube.com/@Apifyhttps://www.youtube.com/@Apify/videoshttps://www.youtube.com/channel/CHANNEL_ID
Subtitles and transcripts
Use subtitleLanguages: "auto" unless you need a specific language — it detects the video's language, prefers manual tracks, falls back to auto-generated, and never hard-fails when captions are absent. Set a specific code like "en" or "fr" if you need an exact language; if unavailable the record will include captions.subtitleError and the list of languages that are available.
Transcript-only mode
Set subtitlesOnly to true to skip the video download entirely and return only transcript text. No video is stored. At $0.001 per video, this is the cheapest option for transcript extraction.
{"videoUrls": ["https://youtu.be/qMquIcJWZag"],"subtitlesOnly": true,"subtitleLanguages": "auto","captionOutput": "transcript"}
Cookie authentication
Age-restricted videos require YouTube cookies. Export them using the Get cookies.txt LOCALLY extension while logged in, then paste the file contents into cookiesText.
Use a burner account. YouTube can ban the account whose cookies are used. Never use your main account — create a throwaway Google account instead.
Cookies must be in Netscape format. Malformed content will cause the download to fail. Cookies are written to a temp file during the download and deleted immediately after — they are never logged or stored.
| Content type | Result |
|---|---|
| Age-restricted videos | Works with cookies, fails without |
| Geo-restricted videos | Handled automatically via residential proxy — no cookies needed |
| Private or members-only videos | Fails regardless of cookies |
Output
Each successfully downloaded video produces one dataset record:
{"status": "success","videoId": "qMquIcJWZag","title": "Apify in 100 Seconds","sourceUrl": "https://youtu.be/qMquIcJWZag","downloadUrl": "https://api.apify.com/v2/key-value-stores/abc123/records/video_qMquIcJWZag.mp4","format": "mp4","quality": "360p","duration": 995,"durationFormatted": "16:35","fileSize": 21385391,"fileSizeMB": 20.39,"processingTime": 53.25,"timestamp": "2026-05-13 13:07:12"}
For audio-only formats (mp3, m4a, opus), quality is "audio".
In subtitlesOnly mode, downloadUrl, fileSize, and fileSizeMB are omitted.
When captions are enabled, a captions field is added:
{"captions": {"language": "en","isAutoGenerated": false,"subtitleUrl": "https://api.apify.com/v2/key-value-stores/abc123/records/caption_qMquIcJWZag.en.srt","transcriptUrl": "https://api.apify.com/v2/key-value-stores/abc123/records/caption_qMquIcJWZag.en.txt","transcript": "Welcome everyone to the Apify $1 million challenge award ceremony..."}}
If captions are requested in a specific language but unavailable:
{"captions": {"subtitleError": "No 'en' subtitles available","availableSubtitleLanguages": ["ar", "fr"]}}
Failed downloads are recorded too:
{"sourceUrl": "https://www.youtube.com/watch?v=PRIVATE_VIDEO","status": "failed","error": "Video unavailable","errorType": "DownloadError"}
Download links are valid for 7 days on the free plan and 31 days on paid plans. Named storages are retained indefinitely — you can rename a run's storage in Apify Console to prevent it from expiring.
Troubleshooting
Download fails — The video may be private, deleted, or geo-restricted to a region where residential proxies are unavailable. Verify it plays in your browser. Private and members-only videos cannot be downloaded even with cookies.
Quality lower than requested — The actor selects the best available quality up to your maximum. Some older videos top out at 480p or 720p.
Playlist only partially downloaded — Private or region-locked videos fail individually and are recorded with status: "failed". The rest proceed normally.
No captions returned — If using "auto" and the video has no captions at all, the record succeeds with no captions field. YouTube Mix playlists (?list=RD...) are not supported.
Download link expired — Re-run the actor. Links are valid for 7 days (free plan) or 31 days (paid plans). To keep a link permanently, rename the run's storage in Apify Console — named storages never expire.
API integration
You can trigger this actor programmatically from any language or tool that can make HTTP requests. Replace YOUR_API_TOKEN with your Apify API token.
Download videos — Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('datapipe/youtube-video-downloader').call({videoUrls: ['https://youtu.be/qMquIcJWZag',],quality: '1080p',format: 'mp4',});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const item of items) {if (item.status === 'success') {console.log(`${item.title} — ${item.downloadUrl} (${item.fileSizeMB} MB)`);} else {console.log(`Failed: ${item.sourceUrl} — ${item.error}`);}}
Bulk transcript extraction — Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_API_TOKEN')# Transcript-only mode — no video stored, costs $0.001/videorun = client.actor('datapipe/youtube-video-downloader').call(run_input={'playlistUrls': ['https://www.youtube.com/@Apify/'],'maxVideosPerPlaylist': 200,'subtitlesOnly': True,'subtitleLanguages': 'auto','captionOutput': 'transcript',})items = client.dataset(run['defaultDatasetId']).list_items().itemstranscripts = [{'title': item['title'], 'text': item['captions']['transcript']}for item in itemsif item['status'] == 'success' and item.get('captions', {}).get('transcript')]# Feed into your RAG pipeline, fine-tuning job, or search index
cURL
# Start a runcurl -X POST "https://api.apify.com/v2/acts/datapipe~youtube-video-downloader/runs?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"videoUrls": ["https://youtu.be/qMquIcJWZag"],"quality": "1080p","format": "mp4","includeSubtitles": true,"subtitleLanguages": "auto"}'# Fetch results (replace DATASET_ID with defaultDatasetId from the response above)curl "https://api.apify.com/v2/datasets/DATASET_ID/items?token=YOUR_API_TOKEN"
Support
Open a ticket via Apify Console or use the Issues tab on the actor page.