**Social Video Downloader & Transcription & Subtitle**
Pricing
from $9.99 / 1,000 megabyte downloadeds
**Social Video Downloader & Transcription & Subtitle**
Downloads & transcription videos or audio from **YouTube**, **TikTok**, **X (Twitter)**, **Facebook**, **Instagram**, and 1000+ other sites. The Actor stores the media files in the key-value store and rich metadata (title, uploader, duration, views, direct download link) in the dataset.
Pricing
from $9.99 / 1,000 megabyte downloadeds
Rating
0.0
(0)
Developer
Tin
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
5
Monthly active users
2 days ago
Last modified
Categories
Share
Social Video Downloader (yt-dlp)
What does Social Video Downloader do?
Social Video Downloader downloads videos or audio from YouTube, TikTok, X (Twitter), Facebook, Instagram, Vimeo, Twitch clips, and 1000+ other sites supported by the popular yt-dlp project. Paste a list of video URLs, pick a quality, and the Actor stores the media files in the key-value store and rich metadata (title, uploader, duration, views, direct download link) in the dataset.
Because it runs on the Apify platform, you get everything a plain yt-dlp script does not: an API for every run, scheduling, integrations (Google Drive, S3, webhooks, Zapier), proxy rotation, run monitoring, and downloadable results in JSON, CSV, or Excel.
Why use Social Video Downloader?
- Archive content — back up your own channels or brand mentions before they disappear.
- Media monitoring — capture videos referenced in news, social listening, or brand-safety workflows.
- Content pipelines — feed downloaded audio/video into transcription, translation, or AI analysis Actors.
- Research — collect video datasets together with structured metadata in one run.
- No infrastructure — no servers, no ffmpeg setup, no IP blocks; everything runs in the cloud.
How to use Social Video Downloader
- Open the Actor and go to the Input tab.
- Paste one or more video URLs (one video per URL).
- Optionally choose video quality, audio only mode, or a proxy.
- Click Start. The run usually takes a few seconds to a few minutes per video.
- Open the Output tab to browse results, or the Storage → Key-value store tab to grab the media files. Each dataset item also contains a ready-to-use
downloadUrl.
Input
The main input fields (see the Input tab for the full list):
| Field | Description |
|---|---|
videoUrls | List of video page URLs to download (required). |
quality | Max resolution: best available, 1080p, 720p (default), 480p, or 360p. |
audioOnly | Download just the audio track instead of the video. |
proxyConfiguration | Proxies for the downloads; defaults to Apify residential proxies for best success rates. |
cookies | Contents of a cookies.txt file for videos that require login (use only your own account). |
s3Bucket, s3AccessKeyId, ... | Optional: upload files to your own S3 bucket (see below). |
maxFileSizeMb | Skip videos larger than this limit (0 = unlimited). |
extraYtDlpArgs | Advanced: extra command-line arguments passed straight to yt-dlp. |
{"videoUrls": [{ "url": "https://www.youtube.com/watch?v=aqz-KE-bpKQ" }, { "url": "https://vimeo.com/76979871" }],"quality": "720","audioOnly": false}
Output
Media files are stored in the run's key-value store (keys like video-Youtube-aqz-KE-bpKQ.mp4). One metadata item per URL is pushed to the dataset. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.
{"sourceUrl": "https://www.youtube.com/watch?v=aqz-KE-bpKQ","status": "SUCCESS","title": "Big Buck Bunny 60fps 4K - Official Blender Foundation Short Film","videoId": "aqz-KE-bpKQ","extractor": "Youtube","uploader": "Blender","uploadDate": "2014-11-10","durationSeconds": 635,"viewCount": 8500000,"width": 1280,"height": 720,"thumbnailUrl": "https://i.ytimg.com/vi/aqz-KE-bpKQ/maxresdefault.jpg","fileName": "video-Youtube-aqz-KE-bpKQ.mp4","fileSizeBytes": 104857600,"fileSizeGb": 0.0977,"contentType": "video/mp4","downloadUrl": "https://api.apify.com/v2/key-value-stores/STORE_ID/records/video-Youtube-aqz-KE-bpKQ.mp4","error": null,"downloadedAt": "2026-08-07T12:00:00.000Z"}
How to transcribe videos with AI
Enable Transcribe audio with AI and provide your OpenAI API key — every downloaded video then gets a transcript field in the dataset, ready for search indexes, LLM pipelines, subtitles drafts, or content repurposing:
{"videoUrls": [{ "url": "https://www.tiktok.com/@apifyoffice/video/7200360993149553925" }],"transcribe": true,"openaiApiKey": "sk-...","transcriptionLanguage": "en"}
- Instead of the input field, you can also provide the key via the
OPENAI_API_KEYenvironment variable (set it in the Actor's Settings → Environment variables as a secret). - The audio track is extracted inside the Actor (mono 16 kHz MP3) and sent to OpenAI's speech-to-text API — videos up to roughly 100 minutes are supported.
- OpenAI usage is billed to your API key: about $0.003 per audio minute with the default
gpt-4o-mini-transcribemodel. - Setting the audio language (ISO code like
enorvi) improves accuracy; leave it empty for auto-detection. - Speech-to-text often mishears words in songs, noisy audio, or heavy accents. Enable Fix transcript wording with AI (
fixTranscript) to post-process each transcript withgpt-5.6-luna(OpenAI's fast low-cost GPT-5.6 tier), which corrects clearly misheard words using the video title as context. The corrected text replaces the raw transcript in the dataset; if the correction step fails, the raw transcript is kept. - Set Translate transcript to (
targetLanguage, e.g.en,vi, orSpanish) to also get an AI translation of the transcript in thetranslatedTranscriptdataset field — and translated burned-in captions whensubtitledVideois enabled. Translation runs ongpt-5.6-lunaand is billed to your OpenAI key (typically well under $0.01 per video). - A failed transcription never loses the video — the item stays
SUCCESSwith atranscriptionErrorfield explaining what happened.
How to create a video with burned-in captions
Enable Create video with burned-in captions (subtitledVideo, requires transcribe: true) and the Actor renders a second MP4 with the transcript drawn onto the frames — TikTok-style captions that stay visible on any player and survive re-uploading to any platform:
{"videoUrls": [{ "url": "https://www.tiktok.com/@apifyoffice/video/7200360993149553925" }],"transcribe": true,"fixTranscript": true,"subtitledVideo": true,"transcriptionLanguage": "en"}
- Captions need timestamps, so transcription automatically uses OpenAI's
whisper-1model ($0.006 per audio minute) — thetranscriptionModelsetting is ignored. - With
fixTranscriptenabled, the AI wording correction is applied to the captions too (timestamps are preserved). - With
targetLanguageset, the captions are burned in the target language — e.g. English captions on a Vietnamese video (thetranscriptfield keeps the original language,translatedTranscriptholds the translation). - The subtitled file is stored next to the original (key
subtitled-...mp4) and linked in the dataset assubtitledDownloadUrl(andsubtitledS3Urlwhen S3 upload is on). - Burning captions re-encodes the video with ffmpeg, so expect runs to take several times longer than a plain download, and the stored megabytes of the subtitled file are charged like the original.
- Not available in
audioOnlymode, and a failure to render never loses the original video.
How to upload the videos to Amazon S3
Fill in the Upload to Amazon S3 section of the input and every downloaded file is also uploaded to your bucket:
{"videoUrls": [{ "url": "https://www.youtube.com/watch?v=aqz-KE-bpKQ" }],"s3Bucket": "my-video-archive","s3Region": "eu-central-1","s3AccessKeyId": "AKIA...","s3SecretAccessKey": "...","s3KeyPrefix": "videos/2026/","s3Only": true}
- The credentials only need the
s3:PutObjectpermission on the bucket (multipart uploads are used for large files). s3Only: trueskips the Apify key-value store entirely and keeps the files only in S3 — useful for large archives, since you avoid double storage costs.- Each dataset item then contains
s3Keyands3Urlwith the object's location. - S3-compatible storage (Cloudflare R2, MinIO, DigitalOcean Spaces, Backblaze B2) works too — set
s3Endpointto your provider's endpoint URL.
Data fields
| Field | Description |
|---|---|
sourceUrl | The input URL. |
status | SUCCESS, FAILED, or SKIPPED (e.g. over the size limit). |
title, uploader, uploadDate | Basic video metadata. |
durationSeconds, viewCount, likeCount | Engagement/technical metadata (when the site provides it). |
width, height | Resolution of the downloaded file. |
fileName | Key of the file in the key-value store. |
fileSizeBytes, fileSizeGb | Size of the stored file in bytes and gigabytes. |
contentType | MIME type of the stored file. |
downloadUrl | Direct URL of the stored media file. |
s3Key, s3Url | Object key and URL in your bucket (when S3 upload is used). |
subtitledDownloadUrl, subtitledS3Url | URLs of the caption-burned MP4 (when subtitledVideo is on). |
transcript, transcriptionError | AI transcript of the audio (when transcription is enabled). |
translatedTranscript | Transcript translated to targetLanguage (when set). |
error | Error or skip reason for unsuccessful items. |
How much does it cost to download videos?
The Actor uses transparent pay-per-event pricing — you pay only for what is actually downloaded:
| Event | When it is charged |
|---|---|
| Video downloaded | Once per successfully downloaded video. |
| Megabyte downloaded | Per started MB of each stored file, so a 25.3 MB video counts as 26 units (the subtitled copy, when enabled, is counted too). |
| Minute transcribed | Per started audio minute, only when AI transcription is enabled. |
Failed or skipped URLs are not charged. The exact rates are listed on the Actor's pricing tab, and you can cap spending with the Maximum cost per run setting — the Actor stops gracefully when the cap is reached and reports what it managed to download. To keep costs down, use quality: "480" or audioOnly: true and set maxFileSizeMb.
Tips and advanced options
- Lower the quality — 480p is usually fine for analysis pipelines and downloads several times faster than 1080p.
- Audio only — for transcription workflows, enable
audioOnlyto skip the video entirely. - Proxies — US residential proxies are used by default, which most social sites do not block, and each video is downloaded through a single sticky IP. Keep a proxy country selected; a random exit country gets 403s from sites that are blocked in some regions. If you only download from sites that tolerate datacenter IPs (e.g. many public YouTube videos), switching the proxy configuration to datacenter or none makes runs cheaper. For geo-restricted videos, set the proxy country to a country where the video is available.
- Login-required videos — export cookies from your own browser session with a "cookies.txt" browser extension and paste the file contents into the
cookiesfield. - Power users — anything yt-dlp can do can be enabled via
extraYtDlpArgs, e.g.["--write-auto-subs"]. - Keeping yt-dlp fresh — sites change their internals often; rebuilding the Actor installs the latest yt-dlp release.
FAQ and disclaimers
Is it legal to download videos? You are responsible for how you use this Actor. Download only content you have the right to download (your own uploads, licensed or public-domain content) and respect each platform's Terms of Service and copyright law. This Actor does not bypass DRM.
Why did a URL fail? The most common reasons are region locks, login walls, removed videos, or IP blocks — the error field contains the exact yt-dlp message. Try proxies or cookies as described above.
Why does TikTok return HTTP 403? TikTok blocks datacenter IPs, non-browser TLS fingerprints, and requests from countries where it is unavailable. The Actor already impersonates a real browser (via yt-dlp's curl_cffi support) — just make sure the proxy configuration is left on the default residential proxies with a country selected. When running locally, install impersonation support with pip install yt-dlp "curl-cffi==0.11.4".
Why do TikTok downloads sometimes fail with "Unable to extract universal data for rehydration"? TikTok intermittently serves an empty page to new visitors. The Actor automatically retries each failed download (see downloadRetries, default 2) with a fresh proxy IP, which usually resolves it. If a URL still fails, simply re-run it — or provide TikTok cookies for the most reliable results.
Does it download whole playlists or channels? No — one video per URL, by design. Pass individual video URLs.
Found a bug or missing feature? Please open an issue in the Actor's Issues tab. If you need a customized version or a full pipeline (download → transcribe → analyze), consider ordering a custom solution on Apify.
Running locally
npm install# yt-dlp and ffmpeg must be on PATH (or set YTDLP_PATH)apify run --purge