← Blog

How to Use the Reddit API in Python (PRAW & Beyond)

By Nikhil Kumar. Last updated September 2026.

You install PRAW, write ten lines of Python, and then hit the part the tutorials skip: your brand-new Reddit app is sitting in an approval queue, and the free tier says non-commercial only.

To use the Reddit API in Python you install PRAW, register a script app for a client id and secret, and pull posts and comments in a few lines. PRAW is the official, endorsed wrapper, and for personal or research use it is free within 100 queries a minute. The catch in 2026 is that every app now needs manual approval, commercial use needs a paid agreement, and listings cap at 1,000 posts. This guide covers the setup and the walls you will hit past it.

How to use the Reddit API in Python with PRAW: install, register an app, authenticate, and pull posts, plus the 2026 walls.

How do you use the Reddit API in Python?

You use PRAW, the Python Reddit API Wrapper, which is Reddit’s endorsed library and handles auth, rate-limit backoff, and pagination for you. You install it, register an app on Reddit for a client id and secret, create a Reddit instance with those credentials, and then read any public subreddit’s posts and comments. The whole read path is a few lines, and for non-commercial use it is free within Reddit’s rate limit.

PRAW is the default for a reason: it turns the API into Python objects.

Instead of building OAuth headers and parsing raw JSON listings by hand, you get a Submission with .title, .score, and .author, and a Comment tree you can walk. It is the friendliest on-ramp to the official API, and it is what almost every Reddit-in-Python tutorial uses.

What it does not do is change any of Reddit’s rules. PRAW is a wrapper, so the rate limit, the approval requirement, and the commercial restriction all still apply. It just makes them easier to live within.

You can skip PRAW and call the endpoints with plain requests and a bearer token, and some people do to avoid a dependency. But then you are hand-rolling OAuth, pagination, and rate-limit backoff yourself, which is exactly the boilerplate PRAW exists to remove. For a read-only Reddit job in Python, there is little reason not to use it.

How do you set up PRAW and get API credentials?

Install PRAW with pip, then register a script app at reddit.com/prefs/apps to get a client id and secret. You pass those plus a descriptive user_agent into praw.Reddit(), and for read-only work that is all you need, no username or password. Keep the secret out of your code with a praw.ini file or environment variables. As of late 2025, the app registration itself now goes through Reddit’s manual approval queue.

Here is the read-only setup.

import praw
reddit = praw.Reddit(
client_id="YOUR_CLIENT_ID",
client_secret="YOUR_CLIENT_SECRET",
user_agent="script:my-research-tool:v1.0 (by u/yourname)",
)

The user_agent matters more than people expect. Reddit uses it to identify your app, and a vague or missing one is a fast way to get throttled, so give it a real name and your username.

The approval step is the new friction. Under Reddit’s Responsible Builder Policy, you no longer get instant credentials; you file a request and wait, and the queue is slow and opaque, with a real chance of silent rejection. Plan for it rather than assuming you will have a key in five minutes.

On the security side, do the boring thing. A client secret sitting in a committed file is a leaked credential, so load it from an environment variable or a praw.ini that stays out of version control. Reddit rotates secrets on apps that leak, and re-approval is the same slow queue you already waited through once, so a careless commit costs you weeks, not minutes.

How do you pull posts and comments with PRAW?

Select a subreddit and iterate its listings. reddit.subreddit("python").new(limit=100) gives the newest posts, and .hot(), .top(), and .controversial() give the other sorts. Each submission carries the title, author, score, comment count, and timestamp, and submission.comments walks the comment tree. It is clean and Pythonic, which is why PRAW is the default, but every one of those calls counts against your rate limit.

for post in reddit.subreddit("python").new(limit=100):
print(post.title, post.score, post.num_comments)
post.comments.replace_more(limit=0)
for comment in post.comments.list():
print(" ", comment.body[:80])

That is the whole read loop. Posts on the outside, comments on the inside.

The replace_more(limit=0) line is the one that trips beginners. Reddit returns comment trees with collapsed “load more” nodes, and without that call you silently miss comments. It also fires extra requests, so a deep comment scrape burns your rate budget faster than a post scrape.

Which sort you pull shapes what you learn. .new() is the honest firehose for monitoring, .top(time_filter="year") surfaces a subreddit’s best-of for research, and .hot() mirrors what members actually see right now. For most analysis jobs, people pull .new() on a schedule and store post ids, so they build a complete record over time instead of re-reading the same top posts on every run.

One field habit saves pain later: store the post id as your key, not the URL or the title. Reddit ids are stable, but titles get edited and a deleted-then-reposted thread looks brand new. Dedupe on the id and your dataset stays clean even when the same story cycles through a subreddit twice in a week.

What are the Reddit API’s rate limits and rules in 2026?

The free tier allows 100 queries per minute per OAuth client, averaged over a 10-minute window, and unauthenticated traffic is now blocked outright. The bigger change is access itself: under Reddit’s Responsible Builder Policy, self-service registration closed in late 2025, so every new app, free or paid, waits in a manual approval queue that can reject you silently. Free use is also strictly non-commercial.

Three rules govern everything you build.

First, the 100 QPM ceiling. PRAW backs off when you hit it, returning after the Retry-After window, but that means a large crawl runs slowly by design, not quickly with occasional pauses.

Second, the approval gate. Reddit closed instant signup, so the first step of any Reddit project is now a waiting game, and there is no SLA on the answer.

Third, the non-commercial line. The free tier is for personal, research, and moderator use. The moment your project makes money, you are supposed to be on a commercial agreement, which is a different process entirely.

Handling the limit in practice is less about clever code and more about accepting the pace. PRAW’s automatic backoff means your script will not crash on a 429; it just quietly slows down. The mistake is designing a job that assumes bursts, then watching it stretch across hours because the 100 QPM ceiling is a hard average over ten minutes, not a peak you can briefly blow past.

What does the Reddit API cost for commercial use?

Commercial use is not free and not self-serve. It requires Reddit’s written approval and a paid agreement, widely reported at $0.24 per 1,000 calls with a minimum around $12,000 a month, though Reddit does not publish a live commercial price and your quote may differ. Approval runs roughly two to four weeks. The $0.24 figure traces back to Reddit’s June 2023 announcement, so treat it as context, not a current rate card.

The gap between the free and commercial tiers is the whole story.

There is no cheap middle. You are either a non-commercial project inside 100 QPM, or you are negotiating an enterprise agreement, with very little in between. For a startup that just needs a few hundred thousand posts a month for a product feature, neither tier fits well.

Put a number on it. A product feature pulling 300,000 posts a month is 300,000 calls, far past any non-commercial reading of the free tier, yet a rounding error against a $12,000 commercial minimum. That mismatch, too big to be free and too small to justify enterprise, is the single most common reason teams route Reddit through a per-item data API instead.

For the full breakdown of what Reddit charges, what counts as commercial, and how the numbers scale, our Reddit API pricing post covers it in depth.

What can’t PRAW get past?

PRAW is a wrapper, so it inherits Reddit’s hard limits. Every listing caps at 1,000 items no matter how you paginate, so you cannot pull a subreddit’s full history through the API. Pushshift, the archive that used to solve this, was cut to moderators only in 2023. And the 100 QPM ceiling plus the approval queue make large or commercial collection slow to start and slow to run.

The 1,000-post cap surprises people the most.

You can paginate a listing with after tokens, but the API simply stops handing out results after the thousandth, and there is no parameter that reaches older content. For a busy subreddit that is a few days of posts, not its history.

Historical Reddit is its own problem now. With Pushshift restricted, the public successors are archive readers like PullPush and a handful of third-party indexes, none of them the live official API. If your project needs years of a subreddit, PRAW is not the tool, and no amount of clever pagination makes it one.

The successors are worth knowing if history is your project. PullPush reads from an archive rather than the live API, so it sails past the 1,000-post cap, and Arctic Shift and Academic Torrents cover bulk historical dumps. None of them is Reddit’s official API and none carries an SLA, so treat them as research tools rather than production dependencies you would lean a business on.

How do you get Reddit data without the official API?

You call a data API that reads public Reddit, with no OAuth app and no approval queue. It returns posts and comments as JSON from a single API key, so it sidesteps the registration wall and the non-commercial restriction. On ScraperSocial you GET /v1/reddit/subreddit with a subreddit name, or /v1/reddit/search with a query, billed 2 credits per item.

import requests
r = requests.get(
"https://api.scrapersocial.com/v1/reddit/subreddit",
params={"handle": "python", "limit": 100},
headers={"Authorization": "Bearer sk_live_..."},
)
for post in r.json()["data"]:
print(post["title"], post["likes"], post["comments"])

One key in a header, no app registration, no approval wait.

Each post comes back with the title, body text, subreddit, score, comment count, upvote ratio, timestamp, author, and any images or videos, and the post-comments endpoint returns the thread. It is the route for commercial or at-scale work, precisely because it carries none of the official API’s non-commercial or approval friction. For the wider set of ways to collect Reddit, including the raw .json trick and headless browsers, the Reddit scraper post lays them out.

Teams reach for this for the jobs the free tier cannot cover: monitoring a set of subreddits for brand or product mentions, mining pain points for product research, or building a labeled dataset for a model. All three are either commercial or larger than a thousand posts, which is exactly where the official tiers stop. One compliance note carries over regardless of method: Reddit posts are public, but they are still people’s words, so keep a retention window and do not rebuild a resold archive of personal data. The scraper post above covers the legal side in full.

Which should you use?

Match the tool to the use. For a personal project, a bot, or academic research that fits inside 100 QPM and can wait for approval, PRAW and the official API are free and the right call. For commercial work, for more than a thousand posts, or when you do not want to run an OAuth app at all, a data API is simpler and carries no non-commercial restriction. Most production pipelines end up on the second.

Official API + PRAWData API
SetupRegister app, wait for approvalOne API key
AuthOAuth client id + secretKey in a header
Rate limit100 QPM per clientPer-item credits
Commercial usePaid agreement requiredAllowed on public data
Depth1,000 posts per listingReads public listings
Best forBots, research, personalProducts, scale, commercial

The honest split is about permission and scale, not code quality. PRAW is a genuinely nice library, and if you are non-commercial and patient, it is the obvious choice. The data API exists for the projects Reddit’s tiers were not designed to serve.

Pull one subreddit to compare

Take a subreddit you care about. Read it once with PRAW and once with the subreddit endpoint, and see which fits your project’s rules and timeline. You can grab a key on the quickstart with no approval ticket, check the 2-credit-per-item cost on the pricing page, and let 100 free credits cover a real pull before you commit. To search across Reddit by keyword instead, the Reddit search post covers that path.

Frequently asked questions

How do I use the Reddit API in Python?

Install PRAW, the Python Reddit API Wrapper, register a script app at reddit.com/prefs/apps for a client id and secret, and create a Reddit instance with those credentials. Then you iterate a subreddit’s listings, like reddit.subreddit(‘python’).new(limit=100), to read posts and comments. PRAW handles authentication, pagination, and rate-limit backoff. For non-commercial use it is free within 100 queries per minute, but every new app now needs Reddit’s manual approval.

Is the Reddit API free in 2026?

For non-commercial use, yes. Personal projects, bots, moderator tools, and academic research pay nothing, within a limit of 100 queries per minute per OAuth client. Commercial use is not free: it needs Reddit’s written approval and a paid agreement, widely reported around $0.24 per 1,000 calls with a high monthly minimum. Since late 2025, even the free tier requires a manual approval ticket rather than instant signup.

What is PRAW?

PRAW stands for Python Reddit API Wrapper. It is the maintained, Reddit-endorsed Python library for the official API, and it wraps authentication, pagination, and rate-limit handling so you work with Python objects instead of raw HTTP. You install it with pip install praw and authenticate with a client id, client secret, and user agent. It does not change Reddit’s underlying limits, only makes them easier to work within.

What is the Reddit API rate limit?

100 queries per minute per registered OAuth client, averaged over a 10-minute window. Unauthenticated traffic is now blocked, so the old 10-QPM anonymous path is gone. Exceeding the limit returns an HTTP 429 with a Retry-After header telling you how long to wait. PRAW backs off automatically, but the ceiling still throttles any large collection into a slow, scheduled crawl.

How do I get more than 1,000 posts from a subreddit?

Not through the official API. Every listing endpoint caps at 1,000 items no matter how you paginate, and there is no way to reach older posts past that. Pushshift, which used to solve this, was restricted to moderators in 2023. To go deeper you use an archive successor like PullPush or a third-party data API that maintains its own index, rather than the live Reddit API.

How do I get Reddit data without OAuth or app approval?

Use a data API that reads public Reddit and returns JSON from a single API key, with no OAuth app and no approval queue. On ScraperSocial you GET /v1/reddit/subreddit with a subreddit name or /v1/reddit/search with a query, 2 credits per item. It sidesteps the registration wall and the non-commercial restriction, which is why commercial and at-scale projects use it instead of PRAW.

Keep reading

Try it on your own URLs

100 trial credits on signup, no card. Enough to run a real batch before you decide.