Media Downloader - All-in-One Video, Audio and Metadata avatar

Media Downloader - All-in-One Video, Audio and Metadata

Pricing

from $15.00 / 1,000 media downloadeds

Go to Apify Store
Media Downloader - All-in-One Video, Audio and Metadata

Media Downloader - All-in-One Video, Audio and Metadata

Download permitted public videos or audio from many supported media sites, save the files to Apify key-value storage and return clean metadata rows. Each run reports complete, partial, empty or failed downloads clearly.

Pricing

from $15.00 / 1,000 media downloadeds

Rating

0.0

(0)

Developer

Khadin Akbar

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

11

Total users

3

Monthly active users

3 days ago

Last modified

Share

What is Media Downloader - All-in-One Video, Audio and Metadata?

Media Downloader is an Apify Actor for creators, marketing teams, archivists, and AI-agent builders who need to save media they own or are permitted to use. Paste public media page URLs from platforms such as YouTube, Vimeo, TikTok, Instagram, Reddit, SoundCloud, Dailymotion, Pinterest, or X, and the Actor saves a playable video or audio file to Apify key-value storage. It also writes one clean dataset row per item with title, creator, duration, quality, file key, and a download link. It is usable through Apify MCP, so an agent can fetch a permitted clip and hand the file link to the next step.

Best fit and connected workflows

This Actor fits well when you want to:

  • archive your own published videos or podcasts from several platforms into one storage location
  • collect licensed or permitted clips for an editing, captioning, or review pipeline
  • save audio-only copies for transcription or accessibility work
  • read media metadata (title, creator, duration, format, thumbnail) without downloading the file, using metadataOnly
  • give an AI agent a bounded, permission-confirmed way to fetch a media file by URL

Each row records the source URL, the saved file key, and a status, so downstream steps know exactly which files exist.

Practical scenario

Priya manages a training team that publishes product walkthroughs on YouTube and Vimeo. Before a platform migration, she pastes the twenty walkthrough URLs, confirms she owns the content, and runs the Actor in video mode at 720p. The dataset lists each walkthrough with its title, duration, file size, and a key-value store link. She downloads the files from the store, checks the durations against her content plan, and uploads them to the new learning platform.

Input fields

FieldUse it for
startUrlsMedia page URLs to process. Required.
authorizationConfirmedConfirms you own the media or have permission to download it. Required and must be true.
downloadModevideo, audio, or metadataOnly.
preferredQualityMaximum video height: 360p, 480p, 720p, 1080p, or best.
preferredContainermp4, webm, or any for video files.
audioFormatm4a, mp3, or best in audio mode.
includePlaylistsExpand playlist URLs into individual items, up to maxItems.
maxItemsCap on URLs or playlist entries per run.
maxDurationMinutesSkip media longer than this.
maxFileSizeMbSkip files larger than this.
includeMetadataJsonSave the full extractor metadata JSON for each item.
cookiesTxtOptional cookies for media you are allowed to access with your own session.
proxyConfigurationApify Proxy settings; residential proxies are the default.

Focused JSON input example

{
"startUrls": [{ "url": "https://www.youtube.com/watch?v=abc123XYZ00" }],
"authorizationConfirmed": true,
"downloadMode": "video",
"preferredQuality": "720p",
"preferredContainer": "mp4",
"maxItems": 5,
"maxFileSizeMb": 200
}

Output fields

FieldMeaning
sourceUrl, parentUrl, canonicalUrlThe URL you supplied, the playlist it came from, and the canonical page.
platform, extractor, mediaIdDetected platform and media identifier.
title, creator, creatorUrlPublic title and creator.
durationSeconds, viewCount, uploadDate, thumbnailUrlPublic media metadata when the platform exposes it.
mediaType, downloadMode, preferredQualityWhat was requested and saved.
formatId, formatExtension, qualityLabel, width, heightThe selected media format.
directMediaUrlAn expiring direct media URL in metadata mode, when available.
fileKey, fileUrl, fileName, fileExtension, fileSizeBytes, contentTypeThe saved file in the key-value store.
metadataKey, metadataUrlThe saved metadata JSON record.
status, warningsPer-URL result and notes; a diagnostic message is included when an item is skipped.
scrapedAtProcessing time.

Illustrative dataset record

{
"sourceUrl": "https://www.youtube.com/watch?v=abc123XYZ00",
"canonicalUrl": "https://www.youtube.com/watch?v=abc123XYZ00",
"platform": "youtube",
"mediaId": "abc123XYZ00",
"title": "Product walkthrough: getting started",
"creator": "Example Studio",
"durationSeconds": 214,
"uploadDate": "20250205",
"mediaType": "video",
"downloadMode": "video",
"preferredQuality": "720p",
"formatExtension": "mp4",
"qualityLabel": "1280x720",
"width": 1280,
"height": 720,
"fileKey": "video-abc123XYZ00-product-walkthrough.mp4",
"fileName": "product-walkthrough.mp4",
"fileSizeBytes": 18734120,
"contentType": "video/mp4",
"metadataKey": "metadata-abc123XYZ00.json",
"status": "success",
"warnings": [],
"scrapedAt": "2026-10-01T12:56:02Z"
}

The values above are illustrative. Real rows also include fileUrl and metadataUrl links into the run's key-value store.

How it works

The Actor checks that authorizationConfirmed is true, then probes each URL with the open-source yt-dlp extractor. It applies your duration limit, picks the best format within your quality and container preferences, downloads the file, and checks it against maxFileSizeMb. Video and audio files are saved to the run's key-value store with predictable keys such as video-{mediaId}-{slug}.mp4, and the dataset row links to them. In metadataOnly mode the Actor stops after the probe and returns the metadata plus an expiring direct media URL when the platform provides one.

The key-value store also holds OUTPUT and RUN_SUMMARY records with the run outcome: COMPLETE, PARTIAL, VALID_EMPTY, INVALID_INPUT, UPSTREAM_FAILED, or CONFIG_ERROR.

Pricing

This Actor uses Pay per event plus Apify platform usage.

  • apify-actor-start: charged when the run starts.
  • media-downloaded: charged for each video or audio file saved to the key-value store.
  • metadata-extracted: charged for each URL successfully probed in metadataOnly mode.

Only saved files and successful metadata probes are charged, and maxItems caps the number of billable items. Larger files and higher quality settings use more platform storage and transfer, so start at 720p unless you need more. Check the live Pricing tab for current event prices.

Use with AI agents (MCP)

The Actor is available through Apify MCP as khadinakbar/all-in-one-media-downloader. A typical agent request:

I own this video: https://www.youtube.com/watch?v=abc123XYZ00. Save it as an mp4 at 720p with authorization confirmed, then give me the file link, title, and duration from the dataset row and the run outcome from OUTPUT.

The agent reads fileUrl for the saved file, title and durationSeconds for context, and status for the per-item result. sourceUrl and scrapedAt provide provenance, and maxItems keeps playlist runs bounded in size and cost.

Run with the Apify API

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('khadinakbar/all-in-one-media-downloader').call({
startUrls: [{ url: 'https://www.youtube.com/watch?v=abc123XYZ00' }],
authorizationConfirmed: true,
downloadMode: 'audio',
audioFormat: 'm4a',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) {
console.log(item.status, item.title, item.fileUrl);
}
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("khadinakbar/all-in-one-media-downloader").call(
run_input={
"startUrls": [{"url": "https://www.youtube.com/watch?v=abc123XYZ00"}],
"authorizationConfirmed": True,
"downloadMode": "metadataOnly",
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item["durationSeconds"], item["directMediaUrl"])

Best results and outcome guidance

Start with one URL in metadataOnly mode to confirm the platform is recognised, then switch to video or audio. Keep preferredQuality at 720p and set maxFileSizeMb for agent workflows that pass files onward. Use includePlaylists only when you expect several files, with a focused maxItems. Residential proxies are the default because media platforms rate-limit datacenter traffic. For media you can open only with your own login, provide your own cookiesTxt. A PARTIAL outcome means some files were saved and others were skipped; each row's status shows which.

Continue the workflow

Design note

I designed the Actor to ask for an explicit authorization flag and to default it to false, so an accidental run saves nothing. I also found that predictable storage keys matter more than file names for agents, which is why every row carries the exact fileKey of the saved file.

FAQ

Which sites are supported?

Most public media pages that the yt-dlp extractor recognises, including YouTube, Vimeo, TikTok, Instagram, Reddit, SoundCloud, Dailymotion, Pinterest, and X.

Where do the files go?

Into the run's key-value store. Each dataset row has the fileKey and a fileUrl link to download it.

Can I get only metadata?

Yes. Set downloadMode to metadataOnly to get metadata and, when available, an expiring direct media URL.

Can I download a whole playlist?

Yes. Turn on includePlaylists and set maxItems to the number of entries you want.

Responsible use

Download only media you own, have the rights holder's permission to use, or are otherwise legally allowed to save. This Actor respects copyright, paywalls, DRM, and private-account boundaries, and it is intended for permitted public media under applicable law and each platform's site terms.