Reddit Media Downloader avatar

Reddit Media Downloader

Pricing

from $5.00 / 1,000 media extracteds

Go to Apify Store
Reddit Media Downloader

Reddit Media Downloader

Download Reddit-hosted images, galleries, GIFs, and video/audio streams from public post URLs. Saves media files to KV and returns clean MCP-ready rows.

Pricing

from $5.00 / 1,000 media extracteds

Rating

0.0

(0)

Developer

Khadin Akbar

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Reddit Media Downloader accepts public Reddit post URLs and turns each supported media asset into one dataset record. It extracts Reddit-hosted images, galleries, GIFs, video streams, and optional audio streams, and it can save media files to the default key-value store. The output includes useful fields such as mediaUrl, mediaType, title, subreddit, author, score, upvoteRatio, numComments, dashUrl, hlsUrl, audioUrl, and file store references such as fileKey, fileApiUrl, audioFileKey, and audioFileApiUrl. Each row represents one media asset from one source post, which makes the Actor practical for file-oriented automation, research pipelines, and AI workflows.

Best fit and connected workflows

This Actor fits workflows that begin with a known Reddit post URL and end with downloadable media files or direct media links. It is a strong match for:

  • media archives that collect Reddit-hosted assets from post URLs
  • research and analysis flows that need post metadata alongside asset URLs
  • automation steps that save Reddit images or videos into Apify key-value store records
  • AI-agent pipelines that want clean, per-asset dataset rows
  • downstream media processing that uses dashUrl, hlsUrl, or separate audio assets

If your next step is broader Reddit engagement analysis, pair this Actor with Reddit Posts, Comments & Subreddit Analytics Scraper. That workflow works well when one process collects media and another process handles comments, subreddit context, and engagement-oriented analysis.

Practical scenario

Maya, a content operations specialist, has three public Reddit post URLs from r/pics and r/ChatGPT. She needs the original media files, a clean list of asset URLs, and enough metadata to sort the items for review. She runs this Actor with downloadMedia enabled and includeVideoVariants enabled. The dataset returns rows with mediaUrl, mediaType, title, subreddit, assetIndex, downloadStatus, and, for a video post, audioUrl and dashUrl. Maya sees that one record is video and another is image, then sends the saved file links to a downstream editor and the manifest links to a processing step that prepares delivery files.

Input fields

FieldTypePurpose
urlsarray of stringsPublic Reddit post URLs to process. Required.
maxMediaItemsintegerHard cap on billable media rows across all URLs.
downloadMediabooleanSaves media bytes to the default key-value store.
downloadAudiobooleanSaves a separate Reddit video audio stream when available.
maxFileSizeMbintegerCaps the size of each saved media or audio file.
includeVideoVariantsbooleanIncludes dashUrl, hlsUrl, scrubberMediaUrl, and audioUrl when available.
includeNsfwbooleanIncludes posts marked NSFW by Reddit when enabled.
proxyConfigurationobjectRoutes metadata and downloads through Apify Proxy.
redditClientIdstringOptional Reddit app client ID for OAuth metadata.
redditClientSecretstringOptional Reddit app client secret for OAuth metadata.

Input example

{
"urls": [
"https://www.reddit.com/r/ChatGPT/comments/1iic23b/who_said_ai_videos_cant_do_physics/"
],
"maxMediaItems": 25,
"downloadMedia": true,
"downloadAudio": true,
"maxFileSizeMb": 250,
"includeVideoVariants": true,
"includeNsfw": false,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

Output fields

Each successful dataset row describes one Reddit media asset.

FieldTypePurpose
recordTypestringAlways media for successful rows.
sourceUrlstringOriginal Reddit post URL from input.
canonicalPostUrlstringCanonical Reddit post URL resolved from metadata.
postIdstringShort Reddit post ID.
fullIdstringFull Reddit thing ID, usually t3_<id>.
subredditstringSubreddit with r/ prefix.
subredditNamestringSubreddit name without r/.
titlestringReddit post title.
authorstringReddit author with u/ prefix when available.
scoreintegerReddit score.
upvoteRationumberReddit upvote ratio.
numCommentsintegerReddit comment count.
createdAtstringPost creation timestamp in ISO 8601 UTC.
isNsfwbooleanWhether Reddit marks the post NSFW.
isSpoilerbooleanWhether Reddit marks the post as spoiler.
mediaTypestringimage, gif, video, audio, or manifest.
mediaUrlstringDirect media URL from Reddit or Reddit CDN.
mediaHoststringHostname of the media URL.
assetIndexintegerZero-based index of the asset within the post.
assetCountintegerTotal assets found for the post.
assetSourcestringSource such as reddit_video, gallery, post_url, or preview.
thumbnailUrlstringThumbnail or preview URL when available.
widthintegerMedia width in pixels when available.
heightintegerMedia height in pixels when available.
durationSecondsnumberVideo duration in seconds when available.
isGifbooleanWhether Reddit marks the video as GIF-like media.
audioUrlstringSeparate audio URL when available.
dashUrlstringDASH manifest URL when available.
hlsUrlstringHLS manifest URL when available.
scrubberMediaUrlstringScrubber media URL when available.
downloadStatusstringsaved, skipped_disabled, skipped_too_large, source_error, or save_error.
fileKeystringKey-value store key for the saved media file.
fileApiUrlstringAPI URL for the saved media file.
fileContentTypestringContent type used when saving the media file.
fileSizeBytesintegerSaved media file size in bytes.
audioDownloadStatusstringAudio save status.
audioFileKeystringKey-value store key for the saved audio file.
audioFileApiUrlstringAPI URL for the saved audio file.
audioFileContentTypestringContent type used when saving the audio file.
audioFileSizeBytesintegerSaved audio file size in bytes.
providerstringMetadata resolver such as reddit-oauth, scrapecreators, or sociavault.
scrapedAtstringTimestamp when the row was produced.

Output example

{
"recordType": "media",
"sourceUrl": "https://www.reddit.com/r/example/comments/abc123/example/",
"canonicalPostUrl": "https://www.reddit.com/r/example/comments/abc123/example/",
"postId": "abc123",
"fullId": "t3_abc123",
"subreddit": "r/example",
"subredditName": "example",
"title": "Example Reddit video",
"author": "u/example_user",
"score": 1234,
"upvoteRatio": 0.97,
"numComments": 56,
"createdAt": "2026-07-08T00:00:00.000Z",
"isNsfw": false,
"isSpoiler": false,
"mediaType": "video",
"mediaUrl": "https://v.redd.it/example/DASH_720.mp4",
"mediaHost": "v.redd.it",
"assetIndex": 0,
"assetCount": 1,
"assetSource": "reddit_video",
"thumbnailUrl": "https://preview.redd.it/example.jpg",
"width": 1280,
"height": 720,
"durationSeconds": 12.5,
"isGif": false,
"audioUrl": "https://v.redd.it/example/DASH_audio.mp4",
"dashUrl": "https://v.redd.it/example/DASHPlaylist.mpd",
"hlsUrl": "https://v.redd.it/example/HLSPlaylist.m3u8",
"scrubberMediaUrl": "https://v.redd.it/example/DASH_96.mp4",
"downloadStatus": "saved",
"fileKey": "MEDIA_abc123_000_media.mp4",
"fileApiUrl": "https://api.apify.com/v2/key-value-stores/STORE/records/MEDIA_abc123_000_media.mp4",
"fileContentType": "video/mp4",
"fileSizeBytes": 1048576,
"audioDownloadStatus": "saved",
"audioFileKey": "MEDIA_abc123_000_audio.mp4",
"audioFileApiUrl": "https://api.apify.com/v2/key-value-stores/STORE/records/MEDIA_abc123_000_audio.mp4",
"audioFileContentType": "audio/mp4",
"audioFileSizeBytes": 131072,
"provider": "reddit-oauth",
"scrapedAt": "2026-07-08T00:00:00.000Z"
}

How it works

The Actor resolves Reddit post metadata and then extracts each supported media asset from the supplied post URLs. The live contract shows three metadata resolver paths: Reddit OAuth first, then ScrapeCreators, then SociaVault. Media files are downloaded from Reddit-hosted URLs such as i.redd.it, preview.redd.it, and v.redd.it when file saving is enabled. When downloadAudio is enabled, the Actor also captures a separate video audio stream when Reddit exposes one. The run returns one dataset row per media asset and writes a summary to the default key-value store.

Pricing

This Actor uses pay per event pricing plus standard Apify platform usage.

The charged events are:

  • Actor start
  • Media extracted

The main billable event is Media extracted, which is charged once per Reddit media asset returned in the dataset. For example, maxMediaItems = one hundred sets a cap of one hundred media rows, which means the primary event can be charged up to one hundred times. Check the live Pricing tab in the Apify console for the current pricing details before each run.

Use with AI agents (MCP)

This Actor is usable through Apify MCP as a tool for turning Reddit post URLs into structured media records and saved file links. The exact Actor identity is khadinakbar/reddit-media-downloader.

Extract media assets from these public Reddit post URLs, keep the result as one dataset row per asset, and summarize the saved file links and media metadata for downstream use.

When an AI agent calls this Actor, the dataset rows provide provenance through sourceUrl, canonicalPostUrl, postId, provider, and scrapedAt. mediaUrl points to the source media, while fileApiUrl and audioFileApiUrl point to files saved in the default key-value store when download settings are enabled. The assetIndex and assetCount fields help agents preserve ordering across galleries or multi-asset posts. If you need to keep spending bounded, set maxMediaItems to a specific ceiling before the run starts; the Actor stops when that cap is reached.

API example

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("khadinakbar/reddit-media-downloader").call(run_input={
"urls": [
"https://www.reddit.com/r/ChatGPT/comments/1iic23b/who_said_ai_videos_cant_do_physics/"
],
"maxMediaItems": 10,
"downloadMedia": True,
"downloadAudio": True
})
dataset_id = run["defaultDatasetId"]
items = client.dataset(dataset_id).list_items(clean=True).items
for item in items:
print(item["mediaType"], item["mediaUrl"], item.get("fileApiUrl"))

Best results and outcome guidance

Use a list of direct public Reddit post URLs as input. Keep downloadMedia enabled when you need saved files in key-value store, and turn on downloadAudio when the workflow needs separate Reddit video audio. Leave includeVideoVariants enabled when your downstream media pipeline uses manifests or alternate stream URLs. For large batches, set maxMediaItems to the largest row count you actually need so the event cap stays aligned with the work you expect. The default residential proxy configuration is a practical choice for Reddit web endpoints.

Continue the workflow

Design note

I found that the dataset contract clearly separates source media access from saved-file access: mediaUrl is always present, while fileApiUrl and audioFileApiUrl appear only when saving is enabled and the save succeeds.

FAQ

Can I use this Actor for Reddit posts that contain multiple images?

Yes. The Actor returns one row per media asset, so a gallery can produce several dataset items with the same sourceUrl and different assetIndex values.

What happens when a post has video and separate audio?

When Reddit exposes a separate audio stream and downloadAudio is enabled, the Actor stores the audio file in the key-value store and includes audioFileKey and audioFileApiUrl on the row.

Which fields help me identify the original Reddit post?

sourceUrl, canonicalPostUrl, postId, fullId, subreddit, subredditName, title, and author are the main provenance and attribution fields.

How should I route a workflow that needs comments as well as media?

Use this Actor for media extraction, then connect the output to Reddit Posts, Comments & Subreddit Analytics Scraper when the next step needs engagement and comment data.

How does the Actor relate to AI-agent pipelines?

It returns compact dataset rows and file links that are easy for agents to read, quote, and pass to downstream tools. The MCP integration is a natural fit when the agent starts from known public Reddit post URLs.

Responsible use

Use this Actor with public Reddit post URLs and handle the resulting media in line with Reddit user expectations, subreddit rules, copyright, privacy rights, platform terms, and applicable laws. The Actor provides technical extraction and file storage for public media assets; the way you store, share, transform, or reuse those assets is part of your own workflow and compliance process.