Reddit has no download button for native videos. This script exploits Reddit’s own public JSON API to pull the direct MP4 link — no re-encoding, no waiting, no third-party services required.
Reddit hosts native video through its own CDN, v.redd.it. Every video you watch on reddit.com is served from this infrastructure, and Reddit never exposes a “Save Video” button. The workaround people normally reach for — third-party downloader sites — requires you to paste a URL, wait for a server-side process, and hand over your browsing context to an unknown service.
This script takes a different path entirely. Reddit has a documented (and very much intentional) backdoor built into every post URL: append .json to any post address and you get the full post metadata as a machine-readable JSON response. That metadata includes the raw CDN link for the video. The script fetches it, extracts the URL, and triggers a direct download — all in one step from the browser console.
Using it on Desktop
Step 1 — Navigate to the Reddit post
Open the specific Reddit post that contains the video you want to save. The URL should look like:
https://www.reddit.com/r/subredditname/comments/abc123/post_title/
The script requires you to be on an individual post page — not the subreddit feed.
Step 2 — Open the Browser Console
Windows / Linux: Press F12 or Ctrl + Shift + I, then click the Console tab.
Direct shortcut: Ctrl + Shift + J (Chrome) jumps straight to the Console.
Mac: Press Cmd + Option + I, then click the Console tab.
Direct shortcut: Cmd + Option + J (Chrome) jumps straight to the Console.
Step 3 — Paste and Run the Script
Paste the following code into the console and press Enter:
javascript:(async function() {
console.log("🚀 Initializing Reddit JSON Sniper...");
/* 1. Sanitize the Current URL */
let url = window.location.href.split('?')[0].split('#')[0];
if (!url.includes('reddit.com/r/')) {
return alert("Please run this on a specific Reddit post page!");
}
if (url.endsWith('/')) url = url.slice(0, -1);
try {
/* 2. The Backdoor: Fetch the raw JSON representation */
console.log(`Fetching: ${url}.json`);
const response = await fetch(url + '.json');
const json = await response.json();
/* 3. Traverse the JSON Tree */
// Reddit's JSON returns an array. [0] is the post, [1] are the comments.
const post = json[0].data.children[0].data;
/* Check if it's a native v.redd.it video */
if (!post.secure_media || !post.secure_media.reddit_video) {
return alert("No native Reddit video found. It might be a YouTube link or an image.");
}
/* 4. Extract the Target */
let fallbackUrl = post.secure_media.reddit_video.fallback_url;
// Clean up any trailing query parameters Reddit adds for tracking
fallbackUrl = fallbackUrl.split('?')[0];
console.log("✅ Fallback URL Extracted:", fallbackUrl);
/* 5. Trigger the Download Bypass */
const a = document.createElement('a');
a.href = fallbackUrl;
a.target = '_blank';
a.download = `Reddit_Post_${post.id}.mp4`;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
} catch (err) {
console.error("Sniper Error:", err);
alert("Fetch failed. See console for details.");
}
})();
Your browser will open a new tab or trigger a download prompt for the .mp4 file directly from Reddit’s CDN.
How the Code Works
This script takes a fundamentally different approach from the Instagram Reel Sniper or YouTube Shorts Sniper, which use captureStream and MediaRecorder to re-record the video as it plays. The Reddit approach is a direct URL extraction — no re-encoding, just retrieving the link that Reddit already knows about.
Step 1: Sanitizing the URL
let url = window.location.href.split('?')[0].split('#')[0];
if (!url.includes('reddit.com/r/')) {
return alert("Please run this on a specific Reddit post page!");
}
if (url.endsWith('/')) url = url.slice(0, -1);
Reddit post URLs often contain query parameters (like ?utm_source=share) and anchor fragments (#comment123). These would break the .json request. The script strips everything after ? and # first, validates that you’re on a post in a subreddit (the reddit.com/r/ check), and removes any trailing slash. A clean base URL is essential for the next step.
Step 2: Reddit’s JSON Backdoor
const response = await fetch(url + '.json');
const json = await response.json();
This is the core insight. Reddit’s backend exposes the complete data for any post by appending .json to its URL. For example:
https://www.reddit.com/r/videos/comments/abc123/title/.json
This is not a hack — it’s a documented, intentional API endpoint that Reddit uses for its own mobile apps and third-party clients. The response is a JSON array containing all post metadata, including media information.
Because this is a same-origin fetch call made from within the reddit.com page itself, it inherits your existing session cookie. Reddit’s CORS policy permits this without any special headers.
Step 3: Traversing the JSON Tree
const post = json[0].data.children[0].data;
Reddit’s JSON response is an array of two elements:
json[0]— the post listing (contains the main post as its first child)json[1]— the comment tree
Drilling down: json[0].data is the listing wrapper, .children is the array of posts (there’s only one, the post itself), [0].data is the actual post object with all its properties.
Step 4: Finding the Native Video
if (!post.secure_media || !post.secure_media.reddit_video) {
return alert("No native Reddit video found. It might be a YouTube link or an image.");
}
let fallbackUrl = post.secure_media.reddit_video.fallback_url;
fallbackUrl = fallbackUrl.split('?')[0];
Reddit’s post object uses secure_media.reddit_video specifically for native v.redd.it videos. Posts that embed a YouTube video, a GIF, or an image will not have this field. The script checks for its presence and exits early with a clear message if it’s missing.
The fallback_url property is a direct link to the highest-resolution DASH_xxx.mp4 version available. Reddit appends tracking query parameters to this URL; stripping them with .split('?')[0] produces a clean, stable CDN link.
Step 5: Triggering the Download
const a = document.createElement('a');
a.href = fallbackUrl;
a.target = '_blank';
a.download = `Reddit_Post_${post.id}.mp4`;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
This is the standard browser download pattern: create a temporary <a> element with a download attribute (which tells the browser to save the file rather than navigate to it), briefly attach it to the DOM, programmatically click it, then remove it. The filename uses the post’s unique id property so you can identify the source later. The link is opened in _blank as a fallback for browsers that do not honour the download attribute for cross-origin URLs.
fallback_url contains only the video track. The audio lives at a parallel URL (typically the same path with DASH_audio.mp4). Most casual downloads won't need the audio, but if you do, you would need to download both tracks and merge them with a tool like ffmpeg.
Comparison with Other Video Downloaders
This script’s approach is architecturally distinct from the recorder-based scripts used on other platforms:
| Reddit Video Sniper | Instagram / YouTube Shorts / Twitter Sniper | |
|---|---|---|
| Method | JSON API extraction — fetches the direct CDN URL | captureStream + MediaRecorder — re-records as the video plays |
| Speed | Near-instant — no playback required | Real-time — must play through the full video |
| Output quality | Original upload quality | Re-encoded at 5 Mbps (may differ from source) |
| Output format | .mp4 (Reddit’s native format) |
.webm (browser recording format) |
| Audio | Video-only (DASH separation) | Audio included (stream is already merged) |
| Why different | Reddit publicly exposes metadata via .json API |
Other platforms do not expose direct CDN links |
The Twitter/X Video Sniper has a Method 2 (High-Res Scraper) that also extracts a direct URL via React internals — that’s the closest conceptual equivalent. The Reddit approach is simpler because the metadata is available through an official public endpoint rather than internal component state.
Troubleshooting
| Symptom | Likely Cause | Fix |
|---|---|---|
| Alert: “Please run this on a specific Reddit post page!” | Script was run from the subreddit feed or the Reddit home page | Navigate to the individual post (click the post title to open it), then run the script |
| Alert: “No native Reddit video found” | The post contains a YouTube embed, a GIF, or only images | This script only works on native v.redd.it videos; YouTube embeds have no reddit_video field |
| Fetch failed — network error in console | Ad blocker or browser extension is blocking the .json request |
Temporarily disable your ad blocker for reddit.com, or add an exception for reddit.com/*.json |
| New tab opens but video has no sound | Expected — Reddit uses DASH with separate audio/video tracks | Download the audio track separately and merge with ffmpeg if needed |
File saves as Reddit_Post_abc123.mp4 but won’t play |
Incomplete download or corrupt file | Re-run the script; if the issue persists, the CDN URL may have changed |
| Download doesn’t start | Browser blocked the <a>.click() |
Allow pop-ups / automatic downloads for reddit.com in browser settings |
Using the same browser-only approach, you can also download Instagram Reels, download Instagram Stories, download YouTube Shorts, download Twitter/X videos, and save Instagram photos.
Disclaimer: This script is provided for educational purposes only. It uses Reddit’s own public
.jsonAPI endpoint — the same interface Reddit’s official apps and authorised third-party clients use — to read post metadata. Downloading content from Reddit may be against Reddit’s User Agreement. Only use this on content you own, have explicit permission to download, or that is explicitly licensed for offline use. Respect copyright and the work of content creators.