~ / guides / How to Scrape Reddit in 2026

How to Scrape Reddit in 2026

BS
Ben Shaw
Reddit data engineer · about the author
the short version
  • The easy route is shut. The public https://www.reddit.com/r/<sub>.json view returns an HTTP 403 from a datacenter IP, so a plain requests.get never reaches the data. A browser User-Agent does not change it.
  • The official route is the OAuth Data API, wrapped by PRAW in Python. It is free for non-commercial use but capped at 100 queries per minute per client, and as of 2025 every app needs pre-approval.
  • What you can pull is the whole site: subreddit listings, full threads (post plus comment tree), individual comments, search results, and images. Each surface has its own quirks, covered in its own guide.
  • A managed scraper API returns the data as JSON in one request with no app registration. I tested one against r/Python in June 2026 and got real post scores back.

I have scraped Reddit for years, and the question I get most is the simplest one: how do you actually pull the data out? The honest answer is that Reddit went from one of the easiest sites to scrape to one that blocks you on the first request if you do it the obvious way. The public .json views that used to just work now return a 403 from any datacenter IP. The official API is gated behind OAuth and a per-minute rate limit. Managed scraper APIs fill the gap.

This guide on how to scrape Reddit maps the whole landscape. I will cover why Reddit is hard to scrape now, what data you can pull from each surface, the official API and PRAW route in Python, the no-API routes (residential proxies and a managed scraper API), and where the legal line sits. Each surface has a deep-dive guide of its own, linked at the right place, so this is the hub that ties them together. Everything here is what I ran and confirmed in June 2026.

Why is Reddit hard to scrape?

Reddit is hard to scrape because it blocks unauthenticated automated traffic at the IP and request-fingerprint level, before any content is served. When I sent a plain request to a subreddit’s .json view from a cloud server in June 2026, Reddit answered with an HTTP 403 and a 189,908-byte HTML page served by snooserv, its web edge. The status was the same whether I sent no User-Agent, a full Chrome desktop string, or a descriptive one. The IP reputation, not the User-Agent, is what gets you refused.

A request to Reddit's public .json view from a datacenter IP returns HTTP 403 from snooserv.

That changed after Reddit’s 2023 API pricing decision, when it began charging commercial clients and clamped down on the free unauthenticated traffic that scrapers had relied on. Reddit set the paid rate at $0.24 per 1,000 API calls, effective July 1, 2023, according to TechTarget’s breakdown of the Reddit pricing change. The block decision now happens at the edge, so the fix has to change where the request comes from or which door it uses.

There is a second, sneakier failure mode: the soft block. Reddit can return a 200 status with stripped-down HTML containing roughly 3 posts where 25 are expected, so a script reports success while the data is gutted and no error is raised. The truncation bites hardest on comment threads, where the deepest replies sit behind load more comments links, which is why pulling a full comment thread cleanly is a problem of its own.

What can you scrape from Reddit?

Reddit is not one target but several surfaces, each returning a different shape of data: a subreddit’s ranked feed of posts, the comments on a post, search results across the site, the images a post links to, and a full thread, which is a post and its entire nested comment tree captured as one unit. Which surface you need decides the method and the fields you collect, so the sections below take the main routes in turn.

How do you scrape Reddit with Python?

The most reliable way to scrape Reddit with Python is the official Data API through OAuth, because it sidesteps the 403 entirely, and PRAW (the Python Reddit API Wrapper) is the standard way to drive it. PRAW handles the OAuth token, the pagination, and the comment-tree objects, so the scraping code stays short and you work with Python objects instead of raw JSON.

First, register a script app at https://www.reddit.com/prefs/apps to get a client_id and a client_secret. A read-only instance needs those two values plus a descriptive user_agent:

import praw

reddit = praw.Reddit(
    client_id="YOUR_ID",
    client_secret="YOUR_SECRET",
    user_agent="reddit-scraper/1.0 by u/yourname",
)
print(reddit.read_only)  # -> True

# A subreddit listing: top posts with their scores.
for post in reddit.subreddit("python").hot(limit=10):
    print(post.score, post.num_comments, "-", post.title)

# A single thread: the post body plus its comments.
submission = reddit.submission(id="1uf89x0")
print(submission.title, "-", submission.selftext[:120])
for comment in submission.comments:
    print(comment.score, comment.author, "-", comment.body[:80])

reddit.subreddit("name") is the entry point for a community feed, where the sort orders and how far the pagination runs before Reddit stops it decide how much of the listing you can reach. reddit.submission(id=...) opens one thread. The post fields worth collecting are title, score, num_comments, created_utc, and permalink; per comment you get body, score, author, and parent_id, which is what lets you rebuild the reply tree later.

The constraint is the rate limit and the gating. Reddit’s free tier allows 100 queries per minute per client, averaged over a 10-minute window, and as of 2025 every app needs pre-approval before it can use the Data API, including personal and academic projects. The OAuth access token also expires after one hour, so a long-running job has to refresh it. PRAW does not lift any of this, because it is the official API underneath. That is the trade: clean, structured data within a ceiling you have to respect.

How do you scrape Reddit without the API?

You scrape Reddit without the official API by reaching the public pages through a clean IP, either with your own residential proxies or with a managed scraper API that runs them for you.

Residential proxies route requests through ordinary home connections instead of a datacenter IP, which is what clears the 403. The catch is the upkeep: you buy and rotate the pool, pace the requests, retry soft blocks, and patch your parser every time Reddit changes its Shreddit markup, all of which turns into a real project past a few thousand records.

A managed scraper API removes that work, taking a subreddit or Reddit URL and returning parsed JSON with the proxies, retries, and soft-block handling on the server side. ChocoData is one such unrelated third-party tool, and in my June 2026 testing a single GET to its Reddit subreddit endpoint returned r/Python’s top posts as clean JSON, with no app registration and no proxy pool.

The request is a plain GET with the subreddit, sort, limit, and your api key:

curl "https://api.chocodata.com/api/v1/reddit/subreddit?subreddit=python&sort=top&limit=25&api_key=YOUR_CHOCO_API_KEY"

The Python version is the same shape and loads straight into pandas:

import requests
import pandas as pd

resp = requests.get(
    "https://api.chocodata.com/api/v1/reddit/subreddit",
    params={"subreddit": "python", "sort": "top", "limit": 25, "api_key": "YOUR_CHOCO_API_KEY"},
    timeout=30,
)
data = resp.json()
print(data["total_results"], "posts from r/" + data["subreddit"])

df = pd.DataFrame(data["posts"])[["title", "score", "num_comments", "upvote_ratio", "author", "permalink"]]
df.to_csv("python_subreddit.csv", index=False)
print(df.head())

When I ran that against r/Python in June 2026, the response carried subreddit, sort, total_results, and an after_cursor for pagination, with a posts array where each post had id, title, score, num_comments, upvote_ratio, awards, author, author_id, subreddit, permalink, external_url, domain, and created, plus a _source field. The scores were real, matching the live subreddit. You can get an API key on the ChocoData sign-up page and swap it into the snippet above.

The reddit subreddit endpoint returns the listing as clean JSON with real scores.

This route trades the free official tier for a managed one, so it pays off once your volume or the maintenance cost of proxies outweighs the subscription. For a one-off pull, the official API within the free tier is fine; for many subreddits on a schedule, offloading the rotation and parsing is usually the cheaper path once you price in your own time.

The subreddit endpoint is one of several on the same pattern. The search surface returns a ranked result list for any query, which is how you track every mention of a keyword across Reddit on a schedule instead of polling each community by hand.

A separate route covers the images, where reading the URL a post points to and downloading the file are the two steps the managed call folds into one response.

Scraping publicly visible Reddit pages is generally treated as lawful in the United States, on the same footing as scraping other public pages. The Ninth Circuit’s ruling in hiQ v. LinkedIn held that scraping public data likely does not violate the Computer Fraud and Abuse Act, reasoning that a public site has “erected no gates” to bypass, as the EFF’s summary of the hiQ decision lays out.

That is the baseline, not the whole picture. Reddit’s User Agreement prohibits automated access without permission, which makes large-scale scraping a breach-of-contract question separate from the CFAA, and it is the theory behind Reddit’s 2025 suits against Anthropic and Perplexity. Personal data carries its own obligations under the GDPR and CCPA even when it is public, and logged-in or private content is a different matter entirely.

I walk through robots.txt, the User Agreement, the CFAA, and the live lawsuits in is scraping Reddit legal, which is the place to settle the question before you collect at scale.

Which Reddit scraper should you use?

The right method comes down to three things: how much volume you need, whether you can register and get an app approved, and how much engineering time you want to spend. The official OAuth API is the cleanest route when your volume fits the free tier and you can wait for app approval. Residential proxies fit public, no-credentials collection at modest volume if you are willing to maintain the pool. A managed scraper API fits scale across many surfaces when you would rather not run proxies and OAuth refresh at all.

FAQ

How do you scrape Reddit?

There are three working routes. The official Data API through OAuth (or PRAW in Python) returns clean JSON but is rate-limited to 100 queries per minute and needs a pre-approved app. Residential proxies plus your own parser get the public pages but mean maintaining a proxy pool. A managed scraper API returns parsed JSON for a single request with one api_key and no app registration. The one route that does not work is a plain request to the public .json view, which returns a 403 from a datacenter IP.

Can you scrape Reddit without the API?

Yes, but not the lazy way. The public .json endpoints return an HTTP 403 from datacenter IPs, so a bare requests.get fails. The working no-API options are residential proxies with your own parser, or a managed scraper API that handles the proxy rotation and parsing for you and returns the data as JSON.

Is it legal to scrape Reddit?

Scraping publicly visible Reddit pages is generally treated as lawful in the US after hiQ v. LinkedIn, which held that scraping public data likely does not violate the CFAA. Reddit's User Agreement still restricts automated access without permission, so large-scale scraping is a contract question, and personal data carries its own obligations under the GDPR and CCPA. Logged-in or private content is a separate matter.

What is the best way to scrape Reddit with Python?

The standard way is PRAW, the Python Reddit API Wrapper, on top of the official API. You register a script app for a client_id and client_secret, create a praw.Reddit instance, and read posts and comments through it. PRAW handles the OAuth token and pagination, but it is the official API underneath, so it obeys the same 100-queries-per-minute ceiling. For volume past the free tier, a managed scraper API is the usual next step.

How many requests can you make to the Reddit API?

Reddit's Data API allows free, non-commercial OAuth clients up to 100 queries per minute per client ID, averaged over a 10-minute window. As of 2025 every app including personal projects needs pre-approval. Commercial access is charged: Reddit set the paid rate at $0.24 per 1,000 API calls, effective July 1, 2023.

Can you scrape an entire subreddit?

Yes. You page through a subreddit's listing endpoint by its sort (hot, new, top, rising) and follow the after cursor to walk past the first page. The official API caps each listing at 100 items per request and 1,000 items per listing, so very deep history is the hard part, not the first few hundred posts. A managed subreddit endpoint paginates the same way and returns the posts as JSON.

BS
Ben Shaw
I've built Reddit data pipelines for years. On redditscraperapi.com I run Reddit scraping methods against live pages and publish what actually holds up.