Reddit Image & Video Scraper avatar

Reddit Image & Video Scraper

Pricing

$0.40 / 1,000 media row saveds

Go to Apify Store
Reddit Image & Video Scraper

Reddit Image & Video Scraper

Pull every image, GIF, gallery and video out of Reddit as direct, full-resolution URLs. Point it at subreddits, user profiles or post links and get one row per media file — width, height, duration, audio flag, file type — with the parent post title, author, score and link. No account needed.

Pricing

$0.40 / 1,000 media row saveds

Rating

0.0

(0)

Developer

Hamza

Hamza

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

14 days ago

Last modified

Share

Turn any Reddit feed into a clean list of media files. Point this actor at subreddits, user profiles or individual post links and it returns one row per picture, GIF and video — the full-resolution image URL, the Reddit-hosted MP4 with its DASH and HLS streams, plus width, height, duration, audio flag and file extension — attached to the post it came from (title, author, subreddit, score, permalink, date). A 20-image gallery becomes 20 rows, ready to hand straight to a downloader, an image pipeline or a spreadsheet. No Reddit account and no login required.

What you can do with it

  • Build a media dataset — sweep r/pics or any niche community and collect thousands of direct image URLs with dimensions and scores attached.
  • Archive a creator's work — pass a list of usernames and pull every picture and video they have submitted, newest first or highest scoring first.
  • Feed a computer-vision or training pipeline — filter to image and gallery only, set a minimum score, and get a quality-filtered set of full-resolution URLs.
  • Track what visual content performs — every media row carries the parent post's score, upvote ratio and comment count, so you can rank formats, subreddits and creators by engagement.
  • Grab the media from specific threads — paste a handful of post permalinks and get every asset those posts contain, including all gallery pages.
  • Monitor a community's visual output on a schedule — run it daily with sort: new to capture what was posted since yesterday.

What you get

One row per media file (abridged — a real record has more fields):

{
"mediaUrl": "https://preview.redd.it/4u6h07bw2zfh1.jpg?width=4649&format=pjpg&auto=webp&s=3cd11155d6a6aeb2b3b03ba14561ffa1a0e3261a",
"mediaType": "gallery",
"width": 4649,
"height": 6974,
"fileExtension": "jpg",
"mimeType": "image/jpg",
"caption": null,
"galleryIndex": 0,
"mediaIndex": 0,
"mediaCount": 20,
"durationSeconds": null,
"hasAudio": null,
"dashUrl": null,
"hlsUrl": null,
"isPreviewImage": false,
"postId": "1v8yjkt",
"postTitle": "[OC] Some portraits I took recently in Bristol, UK",
"postUrl": "https://www.reddit.com/r/pics/comments/1v8yjkt/oc_some_portraits_i_took_recently_in_bristol_uk/",
"subreddit": "pics",
"author": "slow_gentle_morning",
"score": 11845,
"upvoteRatio": 0.96,
"numComments": 481,
"createdAt": "2026-07-28T13:28:44.000Z",
"over18": false,
"source": "r/pics",
"sourceType": "subreddit"
}

A Reddit-hosted video row looks like this instead:

{
"mediaUrl": "https://v.redd.it/6lfbfgzs2zfh1/CMAF_720.mp4?source=fallback",
"mediaType": "video",
"width": 720,
"height": 1280,
"durationSeconds": 16,
"hasAudio": true,
"bitrateKbps": 2400,
"fileExtension": "mp4",
"dashUrl": "https://v.redd.it/6lfbfgzs2zfh1/DASHPlaylist.mpd?v=1&f=sd",
"hlsUrl": "https://v.redd.it/6lfbfgzs2zfh1/HLSPlaylist.m3u8?v=1&f=sd",
"postTitle": "Cracking open a beer with your bike right after finishing the Tour de France.",
"subreddit": "nextfuckinglevel",
"author": "dannybluey",
"score": 32334
}

Switch One row per media file off and you get one row per post instead, with all of its assets inside a media array and a mediaCount next to it. That row is shaped as a post rather than as a media file, so the post's own fields are named id, title and url (not postId, postTitle and postUrl), and every media field listed below appears inside the media entries instead of at the top level.

Input reference

FieldTypeDefaultWhat it does
subredditslist of textprefilled with pics, awwCommunities to pull media from. Names (pics), handles (r/pics) and full URLs all work.
usernameslist of textemptyProfiles whose submitted posts are scanned for media. Accepts spez, u/spez or a profile URL.
postUrlslist of textemptyIndividual posts to pull media from. Accepts permalinks, redd.it short links or bare post IDs. The per-source post limit does not apply here — every post you list is read.
mediaTypesmulti-selectimage, gallery, video, animatedWhich kinds of media to keep. Add embed to also capture third-party players such as YouTube.
sortselecthotWhich feed to pull: hot, new, top, rising or controversial. Profiles have no rising feed, so it falls back to new for them.
timeselectallTime window for top and controversial: hour, day, week, month, year or all. Other sorts ignore it.
maxPostsPerSourceinteger100How many posts containing matching media to save per subreddit or profile. The run works further back through the feed to find them, but stops digging once it has gone about five times deeper than your target — see Limits. Maximum 1000.
minScoreintegeremptyKeep only posts with at least this many upvotes.
includeNsfwbooleantrueKeep posts marked 18+. Turn off to drop them.
includePostsWithoutMediabooleanfalseAlso save text and link posts that carry no matching media, with empty media fields.
oneRecordPerAssetbooleantrueOn: one row per picture/GIF/video. Off: one row per post, with a media array.
maxConcurrencyinteger4How many of your sources are worked through at the same time. Higher is faster on long lists. 1 to 10.
Browse fromselectusCountry the run should use the view of. Reddit shows the same content everywhere, so most runs can leave this alone.

At least one of subreddits, usernames or postUrls must be filled in.

Output fields

FieldDescription
mediaUrlDirect URL of the picture, GIF or video file.
mediaTypeimage, gallery, video, animated or embed.
width, heightPixel dimensions of the asset, when Reddit reports them.
durationSecondsLength of a video in seconds.
hasAudioWhether the video has an audio track (see the note under Limits).
dashUrl, hlsUrlStreaming manifests for Reddit-hosted video.
bitrateKbpsVideo bitrate reported by Reddit.
fileExtensionjpg, png, gif, mp4 … derived from the URL; null when the URL has none.
mimeTypeContent type reported for gallery pictures.
captionCaption the poster attached to a gallery picture.
galleryIndexPosition of the picture inside its gallery, starting at 0. null for non-gallery assets.
galleryMediaIdReddit's own id for that gallery picture.
mediaIndex, mediaCountPosition of this asset among the post's saved assets, and how many there are.
isPreviewImagetrue when the picture is the preview Reddit generated for a link post rather than an uploaded file.
embedProvider, embedTitle, embedThumbnailDetails of a third-party embed (YouTube, Streamable, …).
postId, postFullIdReddit's id for the parent post.
postTitleTitle of the parent post.
postUrl, permalinkAbsolute and relative links to the post.
subredditCommunity the post is in.
authorUsername of the poster.
score, upvoteRatio, numCommentsEngagement on the parent post.
flairLink flair on the parent post.
createdAtWhen the post was published (ISO 8601, UTC).
over18, spoiler, isOriginalContentPost markers.
domain, linkUrlOutbound domain and link for link posts.
source, sourceTypeWhich of your inputs produced this row, and whether it was a subreddit, a profile or a post URL.
scrapedAtWhen the run collected the data.

Pricing

This actor is pay per event. There is exactly one billable event: apify-default-dataset-item, charged at $0.0004 per row$0.40 per 1,000 rows — once for every row saved to the dataset. Nothing else is billed: everything the run does to find your media is free.

Because the default output is one row per media file, a post with a 20-picture gallery produces 20 billable rows ($0.008). If you would rather pay once per post, switch One row per media file off and every post arrives as a single row with its assets in a media array.

Posts that fail your filters are skipped before anything is saved, so you are never charged for content you filtered out. If a run hits its maximum-charge limit it stops cleanly and keeps everything already collected.

FAQ

Do I need a Reddit account? No. You do not need a Reddit account, a login, or any credentials — just enter what you want and run it.

How fast is it? Results come back in large batches, so a 100-post subreddit is usually finished in seconds and even long watchlists complete in minutes. Transient failures are retried automatically and heavy jobs pace themselves, so big lists keep moving without any configuration from you.

Can I run it on a schedule? Yes. A daily or hourly schedule with sort: new is the usual way to keep a media archive current. The actor holds no memory between runs, so each run returns whatever the feed currently shows — de-duplicate on mediaUrl or postId on your side if you are appending to the same store. The same post can also arrive twice inside one run if you list a subreddit and a profile (or a post link) that both contain it.

How do galleries work? By default each picture in a gallery becomes its own row, numbered with galleryIndex starting at 0, and every row repeats the parent post's details so the rows stand alone. Turn off One row per media file to get the gallery back as a single row with a media array.

Can I get only videos, or only images? Yes — set Media types to keep to just the buckets you want. Excluded types are dropped before anything is saved, so you are not charged for them.

Does it include NSFW content? Yes by default, and it covers 18+ communities without any extra configuration. Turn off Include 18+ posts to drop them.