Reddit Media Downloader avatar

Reddit Media Downloader

Pricing

from $1.75 / 1,000 media links

Go to Apify Store
Reddit Media Downloader

Reddit Media Downloader

Get source-hosted video, image, GIF, gallery, and external-media links from public Reddit URLs. Choose media types and return available media details and post context without storing the files.

Pricing

from $1.75 / 1,000 media links

Rating

0.0

(0)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Built for developers, researchers, and content teams, this Actor takes public Reddit post URLs, profile-post URLs, or direct Reddit media URLs and returns source-hosted links for video, image, GIF, gallery, and available external media. It also returns media details and basic post context, so you can open or download the source without storing the files here.

📦 Reddit media results

Each successful dataset row contains one media link. It can include the submitted URL, a main download URL, media type, source host, format, dimensions, duration, quality, codec, bitrate, frame rate, file size, thumbnail, post context, classification, gallery position, external provider details, and video streams. The output also has an errors field for submitted sources that could not be found or loaded.

What the rows give you

The Actor returns source-hosted URLs. It does not download, mirror, or store the media files. A gallery item gets its own row, and a video can include several video variants, separate audio streams, and subtitle streams when the source provides them.

▶️ Run from a URL list

Choose the target that matches every URL in the run. Add one or more public Reddit URLs, select the media types to return, and decide whether post targets may include external media. You can also set a media result limit. Start the run, then open the dataset link in the output.

Run steps

  1. Set target to postUrls, profilePostUrls, or mediaUrls.
  2. Add one or more public URLs under sourceUrls.
  3. Choose mediaTypes and, for post or profile-post targets, whether to include external media.
  4. Optionally set maxItems, then run the Actor.

⚙️ Input

Input fields

FieldTypeWhat it does
targetstringChooses the URL kind for this run: postUrls, profilePostUrls, or mediaUrls. Every source URL must match it.
sourceUrlsarray of objectsAdds one or more public Reddit URL objects to process.
sourceUrls[].urlstringThe public Reddit post, profile-post, or direct media URL to process.
mediaTypesarray of stringsChooses video, image, gif, or gallery media. If you omit it, the Actor returns all four types when they are available.
includeExternalMediabooleanFor post and profile-post URLs, includes usable links and provider details for media hosted outside Reddit when set to true. It has no effect for direct Reddit media URLs. If false or omitted, only Reddit-hosted media is returned.
maxItemsintegerOptionally stops after this many media results. Leave it empty to return all available results until the sources are exhausted.

Input example

This is the public input from a successful current-beta run using the default example URL.

{
"target": "postUrls",
"sourceUrls": [
{
"url": "https://www.reddit.com/r/aww/comments/9x5mvy/14_years_young_a_little_older_a_little_wiser_but/"
}
],
"mediaTypes": [
"video",
"image",
"gif",
"gallery"
],
"includeExternalMedia": false,
"maxItems": 10
}

🧾 Output

Run output

FieldTypeWhat it does
datasetstringLinks to the dataset with successful source-hosted media links.
errorsstringContains a JSON list of submitted sources that could not be found or loaded. Those sources are not in the dataset.

Complete dataset fields

Every successful dataset row uses this field set. Nested fields use dotted paths in the table, while JSON examples keep their real nested objects.

FieldTypeWhat it does
sourceUrlstringThe submitted public URL that led to this media link.
downloadUrlstringThe main source-hosted URL for opening or downloading the media.
mediaTypestringThe media category: video, image, gif, gallery, or external.
formatstringThe available file format, such as mp4, jpeg, or gif, when provided.
dimensionsobjectGroups the media width and height in pixels, when available.
dimensions.widthintegerMedia width in pixels, when available.
dimensions.heightintegerMedia height in pixels, when available.
durationSecondsnumberMedia duration in seconds, when available.
qualitystringThe source quality label, when available.
codecstringThe media codec, when available.
bitrateKbpsnumberMedia bitrate in kilobits per second, when available.
frameRateFpsnumberVideo frame rate in frames per second, when available.
fileSizeBytesintegerMedia file size in bytes when the source provides it.
thumbnailUrlstringA preview image URL for the media, when available.
sourceHoststringThe host that serves the main media URL.
postobjectGroups available context for the Reddit post linked to the media.
post.titlestringThe Reddit post title, when post context is available.
post.authorstringThe Reddit account that made the post, when available.
post.subredditstringThe subreddit where the post was published, when available.
post.permalinkstringThe canonical Reddit URL for the post, when available.
post.createdAtstringThe post creation time, when available.
post.scoreintegerThe Reddit post score, when available.
post.commentCountintegerThe number of comments on the post, when available.
post.thumbnailUrlstringA thumbnail URL supplied for the post, when available.
classificationobjectGroups post and media labels supplied by the source.
classification.isNsfwbooleanWhether the source marks the post as not safe for work.
classification.isSpoilerbooleanWhether the source marks the post as a spoiler.
classification.flairstringThe Reddit post flair, when available.
galleryobjectGroups the position of a result in a Reddit gallery.
gallery.itemIndexintegerThe one-based position of this item in a gallery, when available.
gallery.itemCountintegerThe number of items in the gallery, when available.
externalobjectGroups provider details for media hosted outside Reddit.
external.providerstringThe external media provider name, when available.
external.pageUrlstringA public provider page for the external media, when available.
videoobjectGroups video renditions and related streams.
video.variantsarray of objectsAvailable progressive or adaptive video renditions.
video.variants[]objectOne downloadable video rendition.
video.variants[].urlstringThe source URL for a video rendition.
video.variants[].streamTypestringWhether the rendition is progressive or adaptive.
video.variants[].qualitystringThe rendition quality label, when available.
video.variants[].widthintegerRendition width in pixels, when available.
video.variants[].heightintegerRendition height in pixels, when available.
video.variants[].formatstringRendition file format, when available.
video.variants[].codecstringRendition codec, when available.
video.variants[].bitrateKbpsnumberRendition bitrate in kilobits per second, when available.
video.variants[].frameRateFpsnumberRendition frame rate in frames per second, when available.
video.audioStreamsarray of objectsSeparate source audio files for a video, when available.
video.audioStreams[]objectOne downloadable audio stream.
video.audioStreams[].urlstringThe source URL for an audio stream.
video.audioStreams[].formatstringAudio file format, when available.
video.audioStreams[].codecstringAudio codec, when available.
video.audioStreams[].bitrateKbpsnumberAudio bitrate in kilobits per second, when available.
video.audioStreams[].sampleRateHzintegerAudio sample rate in hertz, when available.
video.audioStreams[].channelsintegerNumber of audio channels, when available.
video.audioStreams[].languagestringAudio language, when available.
video.subtitleStreamsarray of objectsSeparate source subtitle or caption files for a video, when available.
video.subtitleStreams[]objectOne downloadable subtitle stream.
video.subtitleStreams[].urlstringThe source URL for a subtitle stream.
video.subtitleStreams[].languagestringSubtitle language, when available.
video.subtitleStreams[].formatstringSubtitle file format, when available.
video.subtitleStreams[].labelstringThe source label for a subtitle stream, when available.

Genuine default-input row

{
"post": {
"title": "14 Years Young. A little older, a little wiser but still a puppy at heart. Say hi to Sevo",
"author": "vahep",
"subreddit": "aww",
"permalink": "https://www.reddit.com/r/aww/comments/9x5mvy/14_years_young_a_little_older_a_little_wiser_but/",
"createdAt": "2018-11-14T23:50:54.000Z",
"score": 6848,
"commentCount": 43,
"thumbnailUrl": "https://b.thumbs.redditmedia.com/I6vqj_81jDnFc5Sr2AadJGcOQAxlELyTaIGw6SVAuQs.jpg"
},
"classification": {
"isNsfw": false,
"isSpoiler": false
},
"thumbnailUrl": "https://b.thumbs.redditmedia.com/I6vqj_81jDnFc5Sr2AadJGcOQAxlELyTaIGw6SVAuQs.jpg",
"sourceUrl": "https://www.reddit.com/r/aww/comments/9x5mvy/14_years_young_a_little_older_a_little_wiser_but/",
"downloadUrl": "https://i.redd.it/quq0aq26wdy11.jpg",
"mediaType": "image",
"format": "jpeg",
"dimensions": {
"width": 1768,
"height": 2048
},
"fileSizeBytes": 501569,
"sourceHost": "i.redd.it"
}

Direct media fields

Direct image and GIF URLs return the common media fields below. Optional fields appear when the source provides them.

FieldTypeWhat it does
sourceUrlstringThe direct Reddit media URL submitted for the run.
downloadUrlstringThe source-hosted URL for opening or downloading the media.
mediaTypestringIdentifies the media as image or gif in these examples.
formatstringIdentifies the file format.
dimensions.width and dimensions.heightintegersGive the media size in pixels when available.
fileSizeBytesintegerGives the file size when the source provides it.
sourceHoststringNames the host serving the media URL.
{
"sourceUrl": "https://i.redd.it/tse4kv1cb7hh1.gif",
"downloadUrl": "https://i.redd.it/tse4kv1cb7hh1.gif",
"mediaType": "gif",
"format": "gif",
"fileSizeBytes": 765681,
"sourceHost": "i.redd.it"
}

Post context fields

Post and profile-post URLs can add the post and classification objects to a media row. The complete nested field definitions are in the dataset table above.

FieldTypeWhat it does
postobjectGroups the Reddit title, author, subreddit, permalink, creation time, score, comment count, and post thumbnail.
classificationobjectGroups NSFW, spoiler, and flair labels supplied by the source.
thumbnailUrlstringGives a preview image for the media when available.
{
"post": {
"title": "14 Years Young. A little older, a little wiser but still a puppy at heart. Say hi to Sevo",
"author": "vahep",
"subreddit": "aww",
"permalink": "https://www.reddit.com/r/aww/comments/9x5mvy/14_years_young_a_little_older_a_little_wiser_but/",
"createdAt": "2018-11-14T23:50:54.000Z",
"score": 6848,
"commentCount": 43,
"thumbnailUrl": "https://b.thumbs.redditmedia.com/I6vqj_81jDnFc5Sr2AadJGcOQAxlELyTaIGw6SVAuQs.jpg"
},
"classification": {
"isNsfw": false,
"isSpoiler": false
},
"thumbnailUrl": "https://b.thumbs.redditmedia.com/I6vqj_81jDnFc5Sr2AadJGcOQAxlELyTaIGw6SVAuQs.jpg",
"sourceUrl": "https://www.reddit.com/r/aww/comments/9x5mvy/14_years_young_a_little_older_a_little_wiser_but/",
"downloadUrl": "https://i.redd.it/quq0aq26wdy11.jpg",
"mediaType": "image",
"format": "jpeg",
"dimensions": {
"width": 1768,
"height": 2048
},
"fileSizeBytes": 501569,
"sourceHost": "i.redd.it"
}

Gallery fields

Gallery media uses the common media fields plus the position of the saved item in the source gallery.

FieldTypeWhat it does
gallery.itemIndexintegerGives the one-based position of this gallery item.
gallery.itemCountintegerGives the number of items in the gallery.
{
"post": {
"title": "I found an awesome print and I cannot read the signature!",
"author": "mehhgb",
"subreddit": "Whatisthis",
"permalink": "https://www.reddit.com/r/Whatisthis/comments/1g95lsd/i_found_an_awesome_print_and_i_cannot_read_the/",
"createdAt": "2024-10-22T00:41:54.000Z",
"score": 2,
"commentCount": 1,
"thumbnailUrl": "https://b.thumbs.redditmedia.com/ehVlWb-ee2qFWFp1CvlIASzoU2_-msPLuPlnevV3RUg.jpg"
},
"classification": {
"isNsfw": false,
"isSpoiler": false,
"flair": "Open"
},
"thumbnailUrl": "https://b.thumbs.redditmedia.com/ehVlWb-ee2qFWFp1CvlIASzoU2_-msPLuPlnevV3RUg.jpg",
"sourceUrl": "https://www.reddit.com/r/Whatisthis/comments/1g95lsd/i_found_an_awesome_print_and_i_cannot_read_the/",
"downloadUrl": "https://i.redd.it/ml29wpa2f7wd1.jpg",
"mediaType": "gallery",
"format": "jpeg",
"dimensions": {
"width": 2798,
"height": 1730
},
"fileSizeBytes": 416241,
"sourceHost": "i.redd.it",
"gallery": {
"itemIndex": 1,
"itemCount": 2
}
}

External media fields

When external media is included for a post or profile-post target, the row can include the provider name and its public page URL.

FieldTypeWhat it does
external.providerstringNames the external media provider.
external.pageUrlstringLinks to the public provider page for the media.
{
"post": {
"title": "Blanche now meeting Epstein survivors while trying to get confirmed is 'insulting': Oversight Rep.",
"author": "AdSpecialist6598",
"subreddit": "videos",
"permalink": "https://www.reddit.com/r/videos/comments/1uz8vst/blanche_now_meeting_epstein_survivors_while/",
"createdAt": "2026-07-17T19:01:36.000Z",
"score": 874,
"commentCount": 24,
"thumbnailUrl": "https://external-preview.redd.it/lYJyOpM_ziu6qiYbXyzDug7iU7merYRJ2aUZWCw1uNM.jpeg?width=140&height=105&auto=webp&s=4a693618346467d90d2432c584b84e4c3d41aa14"
},
"classification": {
"isNsfw": false,
"isSpoiler": false
},
"thumbnailUrl": "https://external-preview.redd.it/lYJyOpM_ziu6qiYbXyzDug7iU7merYRJ2aUZWCw1uNM.jpeg?width=140&height=105&auto=webp&s=4a693618346467d90d2432c584b84e4c3d41aa14",
"sourceUrl": "https://www.reddit.com/r/videos/comments/1uz8vst/blanche_now_meeting_epstein_survivors_while/",
"downloadUrl": "https://www.youtube.com/watch?v=AMGdYH9IIGY&pp=ygUGbXMgbm93",
"mediaType": "external",
"sourceHost": "www.youtube.com",
"external": {
"provider": "www.youtube.com",
"pageUrl": "https://www.youtube.com/watch?v=AMGdYH9IIGY&pp=ygUGbXMgbm93"
}
}

Video stream fields

Video rows can include the main media details plus progressive or adaptive variants, separate audio, and subtitle streams.

FieldTypeWhat it does
video.variantsarray of objectsLists available video renditions.
video.variants[].urlstringLinks to one video rendition.
video.variants[].streamTypestringShows progressive or adaptive.
video.variants[].qualitystringGives the rendition quality label.
video.variants[].width and video.variants[].heightintegersGive the rendition size in pixels.
video.variants[].formatstringGives the rendition file format.
video.variants[].codecstringGives the rendition codec when available.
video.variants[].bitrateKbpsnumberGives the rendition bitrate when available.
video.variants[].frameRateFpsnumberGives the rendition frame rate when available.
video.audioStreamsarray of objectsLists separate audio files when available.
video.audioStreams[].urlstringLinks to one audio stream.
video.audioStreams[].formatstringGives the audio format when available.
video.audioStreams[].codecstringGives the audio codec when available.
video.audioStreams[].bitrateKbpsnumberGives the audio bitrate when available.
video.audioStreams[].sampleRateHzintegerGives the audio sample rate when available.
video.audioStreams[].channelsintegerGives the number of audio channels when available.
video.audioStreams[].languagestringGives the audio language when available.
video.subtitleStreamsarray of objectsLists subtitle or caption files when available.
video.subtitleStreams[].urlstringLinks to one subtitle stream.
video.subtitleStreams[].languagestringGives the subtitle language when available.
video.subtitleStreams[].formatstringGives the subtitle format when available.
video.subtitleStreams[].labelstringGives the source label when available.
{
"sourceUrl": "https://v.redd.it/u5pu7ad5rcdh1",
"downloadUrl": "https://v.redd.it/u5pu7ad5rcdh1/CMAF_720.mp4",
"mediaType": "video",
"format": "mp4",
"dimensions": {
"width": 720,
"height": 1280
},
"durationSeconds": 13,
"quality": "1280p",
"codec": "avc1.4d401f",
"bitrateKbps": 2083.898,
"frameRateFps": 30,
"fileSizeBytes": 3260125,
"sourceHost": "v.redd.it",
"video": {
"variants": [
{
"url": "https://v.redd.it/u5pu7ad5rcdh1/CMAF_220.mp4",
"streamType": "adaptive",
"quality": "392p",
"height": 392,
"width": 220,
"format": "mp4",
"codec": "avc1.4d401e",
"bitrateKbps": 184.218,
"frameRateFps": 30
},
{
"url": "https://v.redd.it/u5pu7ad5rcdh1/CMAF_270.mp4",
"streamType": "adaptive",
"quality": "480p",
"height": 480,
"width": 270,
"format": "mp4",
"codec": "avc1.4d401e",
"bitrateKbps": 359.506,
"frameRateFps": 30
},
{
"url": "https://v.redd.it/u5pu7ad5rcdh1/CMAF_360.mp4",
"streamType": "adaptive",
"quality": "640p",
"height": 640,
"width": 360,
"format": "mp4",
"codec": "avc1.4d401e",
"bitrateKbps": 763.1,
"frameRateFps": 30
},
{
"url": "https://v.redd.it/u5pu7ad5rcdh1/CMAF_480.mp4",
"streamType": "adaptive",
"quality": "854p",
"height": 854,
"width": 480,
"format": "mp4",
"codec": "avc1.4d401f",
"bitrateKbps": 1097.942,
"frameRateFps": 30
},
{
"url": "https://v.redd.it/u5pu7ad5rcdh1/CMAF_720.mp4",
"streamType": "adaptive",
"quality": "1280p",
"height": 1280,
"width": 720,
"format": "mp4",
"codec": "avc1.4d401f",
"bitrateKbps": 2083.898,
"frameRateFps": 30
}
],
"audioStreams": [
{
"url": "https://v.redd.it/u5pu7ad5rcdh1/CMAF_AUDIO_64.mp4",
"format": "mp4",
"codec": "mp4a.40.2",
"bitrateKbps": 66.1,
"sampleRateHz": 48000,
"channels": 2
},
{
"url": "https://v.redd.it/u5pu7ad5rcdh1/CMAF_AUDIO_128.mp4",
"format": "mp4",
"codec": "mp4a.40.2",
"bitrateKbps": 129.825,
"sampleRateHz": 48000,
"channels": 2
}
],
"subtitleStreams": []
}
}

💳 Pricing

This Actor uses pay-per-event pricing. Each successful media link saved to the dataset uses one charged event. Check the Apify Console for the current price for your account and tier.

Charged event

EventWhat it covers
Media linkOne successful source-hosted media link with available details is saved.

🔌 Integrations

Use the Apify API to start runs, read dataset results, and connect this Actor to your own workflow. You can also use Apify schedules and webhooks for repeat runs and follow-up actions.

❓ FAQ

What can I submit?

Set target to match the URLs you submit. You can use public Reddit post URLs, profile-post URLs, or direct Reddit media URLs.

Can I use a profile-post URL?

Yes. Set target to profilePostUrls and add public profile-post URLs under sourceUrls.

Can I use a direct Reddit media URL?

Yes. Set target to mediaUrls for a direct URL from a Reddit media host. The row can contain media details without post context.

How do I include media hosted outside Reddit?

Set includeExternalMedia to true for post or profile-post targets. This option has no effect for direct Reddit media URLs. When it is off, the Actor returns Reddit-hosted media only.

Each available gallery item is saved as its own media row. Use gallery.itemIndex and gallery.itemCount to place it in the source gallery.

Do video rows include sound and subtitles?

When the source provides them, a video row can include several video variants, separate audio streams, and subtitle or caption streams.

What happens when a source cannot be loaded?

The source is listed in the errors output field instead of being added as a successful dataset row.

How does maxItems work?

It stops the run after the chosen number of media results. Leave it empty to return all available results until the sources are exhausted.

Do I need a Reddit login?

No. The Actor processes publicly accessible Reddit sources without requiring a Reddit login.

Does this Actor download the media files?

No. It returns source-hosted URLs that you can open or download. It does not mirror or store the media files.

📝 Changelog

0.0: Initial release

🆘 Support

For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡

Made with ❤️ by Maxime Dupré