**Social Video Downloader & Transcription & Subtitle** avatar

**Social Video Downloader & Transcription & Subtitle**

Pricing

from $9.99 / 1,000 megabyte downloadeds

Go to Apify Store
**Social Video Downloader & Transcription & Subtitle**

**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

Tin

Maintained by Community

Actor stats

0

Bookmarked

7

Total users

5

Monthly active users

2 days ago

Last modified

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

  1. Open the Actor and go to the Input tab.
  2. Paste one or more video URLs (one video per URL).
  3. Optionally choose video quality, audio only mode, or a proxy.
  4. Click Start. The run usually takes a few seconds to a few minutes per video.
  5. 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):

FieldDescription
videoUrlsList of video page URLs to download (required).
qualityMax resolution: best available, 1080p, 720p (default), 480p, or 360p.
audioOnlyDownload just the audio track instead of the video.
proxyConfigurationProxies for the downloads; defaults to Apify residential proxies for best success rates.
cookiesContents 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).
maxFileSizeMbSkip videos larger than this limit (0 = unlimited).
extraYtDlpArgsAdvanced: 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_KEY environment 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-transcribe model.
  • Setting the audio language (ISO code like en or vi) 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 with gpt-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, or Spanish) to also get an AI translation of the transcript in the translatedTranscript dataset field — and translated burned-in captions when subtitledVideo is enabled. Translation runs on gpt-5.6-luna and is billed to your OpenAI key (typically well under $0.01 per video).
  • A failed transcription never loses the video — the item stays SUCCESS with a transcriptionError field 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-1 model ($0.006 per audio minute) — the transcriptionModel setting is ignored.
  • With fixTranscript enabled, the AI wording correction is applied to the captions too (timestamps are preserved).
  • With targetLanguage set, the captions are burned in the target language — e.g. English captions on a Vietnamese video (the transcript field keeps the original language, translatedTranscript holds the translation).
  • The subtitled file is stored next to the original (key subtitled-...mp4) and linked in the dataset as subtitledDownloadUrl (and subtitledS3Url when 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 audioOnly mode, 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:PutObject permission on the bucket (multipart uploads are used for large files).
  • s3Only: true skips 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 s3Key and s3Url with the object's location.
  • S3-compatible storage (Cloudflare R2, MinIO, DigitalOcean Spaces, Backblaze B2) works too — set s3Endpoint to your provider's endpoint URL.

Data fields

FieldDescription
sourceUrlThe input URL.
statusSUCCESS, FAILED, or SKIPPED (e.g. over the size limit).
title, uploader, uploadDateBasic video metadata.
durationSeconds, viewCount, likeCountEngagement/technical metadata (when the site provides it).
width, heightResolution of the downloaded file.
fileNameKey of the file in the key-value store.
fileSizeBytes, fileSizeGbSize of the stored file in bytes and gigabytes.
contentTypeMIME type of the stored file.
downloadUrlDirect URL of the stored media file.
s3Key, s3UrlObject key and URL in your bucket (when S3 upload is used).
subtitledDownloadUrl, subtitledS3UrlURLs of the caption-burned MP4 (when subtitledVideo is on).
transcript, transcriptionErrorAI transcript of the audio (when transcription is enabled).
translatedTranscriptTranscript translated to targetLanguage (when set).
errorError 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:

EventWhen it is charged
Video downloadedOnce per successfully downloaded video.
Megabyte downloadedPer 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 transcribedPer 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 audioOnly to 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 cookies field.
  • 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