Reddit Media Downloader
Pricing
from $5.00 / 1,000 media extracteds
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
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
| Field | Type | Purpose |
|---|---|---|
urls | array of strings | Public Reddit post URLs to process. Required. |
maxMediaItems | integer | Hard cap on billable media rows across all URLs. |
downloadMedia | boolean | Saves media bytes to the default key-value store. |
downloadAudio | boolean | Saves a separate Reddit video audio stream when available. |
maxFileSizeMb | integer | Caps the size of each saved media or audio file. |
includeVideoVariants | boolean | Includes dashUrl, hlsUrl, scrubberMediaUrl, and audioUrl when available. |
includeNsfw | boolean | Includes posts marked NSFW by Reddit when enabled. |
proxyConfiguration | object | Routes metadata and downloads through Apify Proxy. |
redditClientId | string | Optional Reddit app client ID for OAuth metadata. |
redditClientSecret | string | Optional 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.
| Field | Type | Purpose |
|---|---|---|
recordType | string | Always media for successful rows. |
sourceUrl | string | Original Reddit post URL from input. |
canonicalPostUrl | string | Canonical Reddit post URL resolved from metadata. |
postId | string | Short Reddit post ID. |
fullId | string | Full Reddit thing ID, usually t3_<id>. |
subreddit | string | Subreddit with r/ prefix. |
subredditName | string | Subreddit name without r/. |
title | string | Reddit post title. |
author | string | Reddit author with u/ prefix when available. |
score | integer | Reddit score. |
upvoteRatio | number | Reddit upvote ratio. |
numComments | integer | Reddit comment count. |
createdAt | string | Post creation timestamp in ISO 8601 UTC. |
isNsfw | boolean | Whether Reddit marks the post NSFW. |
isSpoiler | boolean | Whether Reddit marks the post as spoiler. |
mediaType | string | image, gif, video, audio, or manifest. |
mediaUrl | string | Direct media URL from Reddit or Reddit CDN. |
mediaHost | string | Hostname of the media URL. |
assetIndex | integer | Zero-based index of the asset within the post. |
assetCount | integer | Total assets found for the post. |
assetSource | string | Source such as reddit_video, gallery, post_url, or preview. |
thumbnailUrl | string | Thumbnail or preview URL when available. |
width | integer | Media width in pixels when available. |
height | integer | Media height in pixels when available. |
durationSeconds | number | Video duration in seconds when available. |
isGif | boolean | Whether Reddit marks the video as GIF-like media. |
audioUrl | string | Separate audio URL when available. |
dashUrl | string | DASH manifest URL when available. |
hlsUrl | string | HLS manifest URL when available. |
scrubberMediaUrl | string | Scrubber media URL when available. |
downloadStatus | string | saved, skipped_disabled, skipped_too_large, source_error, or save_error. |
fileKey | string | Key-value store key for the saved media file. |
fileApiUrl | string | API URL for the saved media file. |
fileContentType | string | Content type used when saving the media file. |
fileSizeBytes | integer | Saved media file size in bytes. |
audioDownloadStatus | string | Audio save status. |
audioFileKey | string | Key-value store key for the saved audio file. |
audioFileApiUrl | string | API URL for the saved audio file. |
audioFileContentType | string | Content type used when saving the audio file. |
audioFileSizeBytes | integer | Saved audio file size in bytes. |
provider | string | Metadata resolver such as reddit-oauth, scrapecreators, or sociavault. |
scrapedAt | string | Timestamp 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 osfrom apify_client import ApifyClientclient = 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).itemsfor 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
- Then use Reddit Posts, Comments & Subreddit Analytics Scraper to collect Reddit record context for media identified with Reddit Media Downloader.
- Then use Reddit Scraper – Posts, Comments & Subreddits to collect Reddit record context for media identified with Reddit Media Downloader.
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.
