Universal Video Downloader and Converter
Pricing
Pay per usage
Universal Video Downloader and Converter
Download videos from 1000s of sites or your own URLs, then convert, compress, trim, resize, extract audio (MP3/M4A), grab thumbnails, or make GIFs — all in one run. Fast, reliable media processing with flexible output. Perfect for content creators, archivers, and automation workflows.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Harish Garg
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
What does Universal Video Downloader and Converter do?
Universal Video Downloader and Converter downloads videos from YouTube, TikTok, Vimeo, X/Twitter, Facebook, Instagram, SoundCloud, podcast feeds, and 1000+ other sites — or from any direct media file URL you already have — and then, in the same run, can convert the format, compress, trim, resize, extract audio (MP3/M4A and more), grab a thumbnail, or turn a segment into a GIF. Give it a list of URLs and it processes them all with the settings you choose, saving every output file to storage with a direct download link.
It's built on FFmpeg for fast, reliable media processing and yt-dlp for broad site coverage. Powered by the Apify platform, you get API access, scheduling, webhook integrations, proxy rotation, and data export — all without managing any infrastructure.
YouTube and TikTok are downloaded through dedicated downloaders. Their anti-bot and login walls make direct extraction unreliable, so YouTube links go through the maintained streamers/youtube-video-downloader Actor and TikTok through clockworks/tiktok-scraper, with a built-in fallback to in-process yt-dlp. This affects pricing for those two sources — see Pricing.
Why use Universal Video Downloader and Converter?
- One tool, whole pipeline — Download and convert/compress/trim/resize/clip in a single run instead of stitching together separate tools.
- Bulk downloading — Hand it a list of URLs and collect every file from one dataset.
- Content repurposing — Pull a clip, make a GIF for social, or extract the audio for a podcast feed.
- Archiving — Save public videos in a consistent format (e.g. everything as MP4 720p) for long-term storage.
- Automation workflows — Call it from the API, run it on a schedule, or chain it after your own scraper via webhooks and feed it the media URLs it produced.
- Storage savings — Compress or downscale on the way in so you only keep what you need.
Supported sources at a glance
| Source | How to pass it | Notes |
|---|---|---|
| YouTube | Watch/Shorts URL | Downloading is delegated to a maintained downloader for reliability; the per-MB download fee is waived (see Pricing). |
| TikTok | Video URL | Delegated downloader returns the no-watermark video, plus full metadata (title, author, views). |
| Vimeo, X/Twitter, SoundCloud, Dailymotion, Reddit, podcast RSS, + 1000+ yt-dlp sites | Public page/episode URL | Must be public — login/age-walled posts can't be fetched anonymously. |
| Facebook / Instagram | The page URL (facebook.com / instagram.com) | Prefer the post page URL so the Actor resolves a fresh stream. A raw fbcdn.net / cdninstagram.com link works only if it's a progressive .mp4 and hasn't expired. |
| Skool lessons | The lesson page URL (skool.com/...?md=...) | Resolves embedded Loom/YouTube/Vimeo players and self-hosted Mux videos. |
| Your own hosted files (S3, Google Drive, Dropbox, your CDN, Apify Key-Value Store) | Direct public file link | mp4, mkv, webm, mov, mp3, m4a, wav, flac, … — downloaded as-is, then processed. |
Rule of thumb: paste a web page URL for a platform, or a direct file link for your own media. You can mix both in one startUrls list.
How to download and convert videos
- Open the Actor and click Try for free.
- Add your URLs to Source URLs — one per line, page URLs or direct file links, in any mix.
- Pick what you want (all optional): a download quality, an output format (or keep the original), and any transforms — resize, compress, trim, extract audio, thumbnail, or GIF.
- Run the Actor and wait for it to finish.
- Download your files from the Storage → Key-value store tab, or get direct links and metadata from the Dataset (Output) tab.
No external API keys required.
Run it via API or on a schedule
Most production usage drives this Actor through the Apify API. Start a run with a single POST:
curl -X POST "https://api.apify.com/v2/acts/hgservices~video-downloader-converter/runs?token=<APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"startUrls": [{ "url": "https://www.youtube.com/watch?v=aqz-KE-bpKQ" }],"format": "mp4","videoQuality": "720p"}'
Or with the Apify client (the Actor slug is hgservices/video-downloader-converter):
run = client.actor("hgservices/video-downloader-converter").call(run_input={"startUrls": [{"url": "https://www.youtube.com/watch?v=aqz-KE-bpKQ"}],"format": "mp4","extractAudio": True,"audioFormat": "mp3",})
To run it unattended, point a Schedule at it, or fire it from your own scraper's success event with webhooks and feed the scraped media URLs into startUrls.
Input
The only required input is startUrls. Everything else is optional and applies to every URL in the run.
| Field | Type | Description |
|---|---|---|
startUrls | array | URLs to download — platform page URLs or direct media file links (any mix) |
videoQuality | enum | Max download resolution for platforms: best (default), 2160p, 1440p, 1080p, 720p, 480p, 360p |
format | enum | Output container: original (default, no re-encode), mp4, mkv, webm, mov, avi |
resize | enum | Re-encode down to a height: none (default), 1440p, 1080p, 720p, 480p, 360p, 240p |
compress | enum | Re-encode smaller: none (default), low, medium, high |
trimStart / trimEnd | string | Keep only this segment (seconds or HH:MM:SS); applies to video + extracted audio |
extractAudio | boolean | Also save an audio-only file (default false) |
audioFormat | enum | mp3 (default), m4a, aac, opus, ogg, wav, flac |
thumbnail | boolean | Also save a still frame as JPEG (default false) |
thumbnailTime | string | When to grab it (seconds or HH:MM:SS); empty = middle of the video |
gif | boolean | Also create a looping GIF (default false) |
gifStart / gifDuration / gifFps / gifWidth | string/int | GIF segment start, length (s), frame rate, and width |
maxDurationMinutes | integer | Skip sources longer than this, before download (default 180; 0 = no limit) |
maxFileSizeMb | integer | Cap on a single direct-file download (default 2048) |
proxyConfiguration | object | Optional Apify Proxy (off by default) |
format: "original" is the fastest and is lossless — use it when you just want the file. Any of format (other than original), resize, compress, or trim causes a re-encode of the video.
Output
Every produced file is stored in the run's key-value store with a direct download URL, and a summary row is pushed to the dataset (the Output tab) for each source URL:
{"url": "https://www.youtube.com/watch?v=aqz-KE-bpKQ","sourceType": "platform","platform": "youtube","videoId": "aqz-KE-bpKQ","title": "Big Buck Bunny","channel": "Blender","uploadDate": "2008-05-20","viewCount": 12345678,"sourceThumbnailUrl": "https://i.ytimg.com/vi/aqz-KE-bpKQ/maxresdefault.jpg","durationSeconds": 635.0,"width": 1280,"height": 720,"videoFormat": "mp4","isAudioOnly": false,"downloadDelegated": true,"status": "ok","videoFileUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/01-big-buck-bunny-video.mp4","audioFileUrl": "https://api.apify.com/v2/key-value-stores/<storeId>/records/01-big-buck-bunny-audio.mp3","thumbnailFileUrl": null,"gifFileUrl": null,"outputs": [{ "type": "video", "key": "01-big-buck-bunny-video.mp4", "format": "mp4", "sizeBytes": 41231234, "url": "https://api.apify.com/v2/..." },{ "type": "audio", "key": "01-big-buck-bunny-audio.mp3", "format": "mp3", "sizeBytes": 10231234, "url": "https://api.apify.com/v2/..." }]}
You can download the dataset in various formats such as JSON, HTML, CSV, or Excel, and the media files individually from the key-value store.
Output data fields
| Field | Type | Description |
|---|---|---|
url | string | The source URL you submitted |
sourceType | string | "platform" (yt-dlp/delegated) or "directUrl" |
platform | string | Coarse platform bucket (youtube, tiktok, vimeo, …) |
videoId, title, channel, channelUrl, uploadDate, viewCount | mixed | Source metadata (null for direct file URLs) |
sourceThumbnailUrl | string | The platform's own thumbnail image (null for direct file URLs) |
durationSeconds | number | Source duration |
width, height, fps | number | Dimensions of the saved video output |
videoFormat | string | Container of the saved video |
isAudioOnly | boolean | True when the source had no video stream (saved as audio) |
downloadDelegated | boolean | True when a YouTube/TikTok downloader Actor was used |
status | string | "ok" or a failure category (see Troubleshooting) |
statusMessage | string | Human-readable note when something needs attention |
videoFileUrl, audioFileUrl, thumbnailFileUrl, gifFileUrl | string | Direct download links to each produced file |
outputs | array | All produced files with key, format, and size in bytes |
Use it as a download/convert step in your pipeline
Already scraping pages with your own Actor or tool? You don't need this one to find the media — hand it the direct media URLs in startUrls and it becomes the download-and-convert stage at the end of your pipeline. Wire it up code-free with Apify task chaining / webhooks: fire it on your scraper's SUCCEEDED event and map the scraped URLs into startUrls.
Operational note for signed CDN links (Facebook, Instagram, X): these expire within hours and are often IP-bound, so download promptly and prefer the original page URL when you can. Pass a freshly minted, broadly fetchable link.
Pricing / cost estimation
This Actor uses pay-per-event pricing — you pay only for what it produces, with no separate compute units or proxy bandwidth to track. Charges scale with how much work each source actually takes: the download is billed by size, and processing is billed by the length of the output it creates.
| Event | Price (USD) | When charged |
|---|---|---|
| Video downloaded | $0.0005 / MB | Per megabyte of source media downloaded, rounded up (min 1 MB). Waived for YouTube and TikTok (see below) |
| Video processed | $0.004 / min | Per minute of the produced video, rounded up (min 1 min), when it's re-encoded. Format conversion, compression, resizing, and trimming are done in one pass and billed once |
| Audio extracted | $0.001 / min | Per minute of extracted audio, rounded up (min 1 min) |
| Thumbnail captured | $0.005 | Once per thumbnail image grabbed |
| GIF created | $0.01 | Once per animated GIF produced |
A plain download in its original format costs only the per-MB download — there's no processing charge unless you ask for a transform. Combining several video transforms (e.g. resize + compress) is a single re-encode and bills once under Video processed; extra outputs like audio, thumbnails, and GIFs each add their own charge on top.
Example costs:
| What you do | Approx. cost |
|---|---|
| Download a 50 MB clip, original format | $0.025 |
| Download 50 MB + convert/compress a 5-min video | $0.025 + $0.020 = $0.045 |
| Download 50 MB + compress + resize a 5-min video (one pass) | $0.025 + $0.020 = $0.045 |
| 5-min video: process + extract 5-min MP3 + thumbnail | $0.020 + $0.005 + $0.005 = $0.030 (+ download) |
| 5-min video: process + MP3 + thumbnail + GIF | $0.020 + $0.005 + $0.005 + $0.010 = $0.040 (+ download) |
YouTube and TikTok sources: the per-MB download fee is waived, but the dedicated downloader Actor (streamers/youtube-video-downloader / clockworks/tiktok-scraper) bills your Apify account directly at its own small rate. Any FFmpeg processing you request on top is still billed at the rates above.
The maxDurationMinutes cap (default 180) skips overly long sources before download so a marathon livestream can't run up a surprise bill. New Apify accounts include free monthly platform credits to try it out.
Tips and advanced options
- Just want the file? Leave
formatasoriginal. It's the fastest path (no re-encode) and cheapest (no processing event). - Smaller downloads: set
videoQualityto720por lower for platform sources — it downloads a smaller stream directly, no re-encode needed. resizevsvideoQuality:videoQualitypicks a smaller source stream (cheap, platforms only);resizere-encodes to an exact height (works on any source, including your own files).- Clip + GIF in one go: set
trimStart/trimEndfor the video and audio, andgifStart/gifDurationindependently for the GIF. - Large files: outputs are buffered in memory before upload — raise the run's Memory if you're processing big 1080p/4K videos, and lower
maxFileSizeMbto guard against runaway direct downloads. - Blocked source? Enable
proxyConfigurationwith theRESIDENTIALgroup and, if needed, a specific country for geo-restricted content.
Troubleshooting: common statuses and what to do
Each source URL gets its own dataset row. A URL that couldn't be delivered still finishes as part of a Succeeded run — its row carries an empty file set, a status category, and a statusMessage explaining the cause and fix.
| Status / message | What it means | What to do |
|---|---|---|
bot_wall — "blocked this request as automated traffic" | YouTube's bot wall (in-process fallback). | Enable Apify proxy or retry later. |
auth_wall — "requires a logged-in account" | Login/age wall (TikTok, Instagram, Facebook, Reddit). | Use publicly accessible content; the Actor downloads anonymously. |
geo_blocked | Not available from the Actor's region. | Enable Apify proxy with a different country. |
rate_limited (HTTP 429) | Too many requests to the platform. | Retry later or enable Apify proxy. |
http_error 403/404 (direct URL) | Link is wrong, expired, private, or IP-bound. | Re-fetch a fresh, public, direct file link and submit promptly. |
not_media_file | The URL served an HTML page, not a file. | Point at the file itself, not a webpage. |
invalid_media | The download was corrupt or truncated. | Retry with a fresh URL. |
processing_failed | An FFmpeg step failed; the original download was delivered when possible. | Check the message; try a different format, or original. |
over_cap | Source is longer than maxDurationMinutes. No charge. | Raise maxDurationMinutes. |
no_media | The post has no video (e.g. a photo/carousel). | Submit a post that contains a video. |
Still stuck? Email the creator directly at harish@harishgarg.com — include the URL and the status message, and we'll help you sort it out.
FAQ, disclaimers, and support
Which sites are supported? Any of the 1000+ sites yt-dlp supports, plus any direct public link to a media file.
Can I download multiple videos at once? Yes — put as many URLs in startUrls as you like. They're processed one after another, each with its own dataset row and files.
Can I download private or unlisted content? Only if you can provide a direct, publicly reachable file URL (e.g. an S3 presigned link). The Actor downloads anonymously and can't sign in to platforms.
Why is the file WebM/MKV instead of MP4? With format: "original" you get exactly what the source provides, which on YouTube is often VP9/WebM. Set format: "mp4" to convert.
Is this Actor legal to use? You are responsible for complying with the Terms of Service of any source platform and with applicable copyright law. Only download content you have the rights to, or that is available for your intended use.
For issues, feature requests, or feedback, use the Issues tab on this Actor's page. For custom solutions or enterprise needs, contact Apify support.