Skip to content

Python Reddit API wrapper guide: PRAW vs a hosted API

PRAW is the standard Python Reddit API wrapper. A working PRAW example, what Reddit's 2026 access changes mean, and the same jobs with requests and a hosted API.

Piyushh · October 14, 2026 · 6 min read

PRAW is the standard Python Reddit API wrapper, and it still works well in 2026 if you have Reddit API credentials. Getting them is the hard part. Since November 2025 every new Reddit app needs Reddit's approval, Reddit stops accepting new requests on October 31, 2026, and many developers report rejections or no reply at all. This guide gives you a working PRAW example and explains what the access changes mean for your keys. Then it does the same jobs (subreddit posts, search, a thread with comments) in plain Python with requests against a hosted API that needs no Reddit developer account.

For background on Reddit's API itself (endpoints, rate limits, pagination), read our Reddit API guide. This post covers the Python side.

Python Reddit API wrapper options in 2026

OptionWhat it isNeeds Reddit credentialsStars / last commit (Oct 14, 2026)
PRAWThe Python Reddit API Wrapper, synchronousYes4,281 / Oct 13, 2026
Async PRAWThe same API for asyncio codeYes155 / Oct 14, 2026
requests + oauth.reddit.comRaw calls to Reddit's API, OAuth handled by youYesn/a
requests + a hosted APIPlain HTTP calls to a third-party Reddit APINo, the provider's keyn/a

PRAW and Async PRAW share a version number. On October 14, 2026, both sat at 8.0.3 on PyPI (released August 12, 2026), and both need Python 3.10 or newer. Both are BSD-2-Clause licensed.

PRAW: the standard Python Reddit API wrapper

Most of Reddit's developer community uses PRAW, but Reddit doesn't make it. It's an open-source project run by volunteers. It handles OAuth tokens, Reddit's rate limit headers and listing pagination, and it represents posts, comments, subreddits and users as Python objects.

The PRAW quick start says a read-only client needs three values: a client id, a client secret and a user agent. Writing (posting, voting, moderating) with a script app also needs the account's username and password.

What changed for PRAW users

The library stayed the same. Reddit's access rules changed.

Here is how that looks to a developer posting in r/redditdev:

"for 2 days I have been trying to build an app to get the client ID and client secret since it is what required to use PRAW for my project but every time I clicked the create app it just said “in order to create an application or use our API you can read our full policies here:”."

u/riowonist112617, December 2025

The same user later said the rejection arrived by email "around a day or 2" after applying, and stated that the request didn't comply with the Responsible Builder Policy "or lack necessary detail." In August 2026, a post asking "Is it possible to still use PRAW?" got two opposite answers. u/Watchful1 replied "Nope, it's no longer possible. You have to use devvit and typescript." u/NeedAGoodUsername, with more upvotes, replied "That's incorrect. It is still possible because I'm still using PRAW for my own scripts."

Each answer covers a different case. PRAW works if you already have credentials, and if you need new ones, the door is closing. Someone in that thread pointed out that if you made an app years ago and forgot about it, you can check old.reddit.com/prefs/apps, which still lists existing credentials.

Our guide on how to get a Reddit API key walks through the request itself.

A working PRAW example

This PRAW tutorial assumes you already have a client id and secret. As the PRAW docs recommend, keep credentials in praw.ini and out of your code:

[research]
client_id=YOUR_CLIENT_ID
client_secret=YOUR_CLIENT_SECRET
user_agent=script:my-research-app:v1.0 (by /u/your_username)

Reddit's Data API Wiki asks for a descriptive user agent in that platform:app:version (by /u/user) shape. With that set up, here are three common jobs:

import praw

reddit = praw.Reddit("research")  # reads the [research] section of praw.ini
print(reddit.read_only)  # True

# 1. Top posts in a subreddit this week
for post in reddit.subreddit("SaaS").top(time_filter="week", limit=25):
    print(post.score, post.num_comments, post.title)

# 2. Keyword search across Reddit
for post in reddit.subreddit("all").search('"cold email"', sort="new", time_filter="month", limit=25):
    print(post.subreddit.display_name, post.title, post.permalink)

# 3. A thread with every comment PRAW can load
submission = reddit.submission(id="1wdihhj")
submission.comments.replace_more(limit=None)
for comment in submission.comments.list():
    print(comment.parent_id, comment.author, comment.score, comment.body[:80])

Before you run job 3 on a big thread, know two things:

  • replace_more(limit=None) replaces every "load more comments" stub, and the comments tutorial warns that "each replacement requires one network request." A thread with thousands of comments means a lot of requests. The default limit of 32 is often enough.
  • PRAW respects Reddit's rate limit headers. When Reddit asks it to wait, it sleeps if the wait is within ratelimit_seconds (default 5 seconds) and raises an exception if not (rate limits). For long jobs, raise ratelimit_seconds in praw.ini instead of catching errors in a loop.

According to Reddit's Data API Wiki, the free limit is 100 queries per minute per OAuth client id (checked 2026-10-14).

The same jobs with requests and a hosted API

If you can't get credentials, or you'd rather not depend on a key Reddit can revoke, you can do the read jobs with plain requests against a hosted Reddit API. ChatterAPI is one. It's independent and not affiliated with Reddit, and you sign up with Google instead of applying for access. Here are the three jobs above:

import os
import requests

BASE = "https://api.chatterapi.com/v1"
session = requests.Session()
session.headers["Authorization"] = f"Bearer {os.environ['CHATTERAPI_KEY']}"


def get(path, **params):
    r = session.get(f"{BASE}{path}", params=params, timeout=60)
    r.raise_for_status()
    return r.json()


# 1. Top posts in a subreddit this week (2 credits per page)
for post in get("/reddit/subreddits/SaaS/posts", sort="top", time="week")["data"]:
    print(post["score"], post["numComments"], post["title"])

# 2. Keyword search across Reddit (2 credits per page)
for post in get("/reddit/search", q='"cold email"', sort="new", time="month")["data"]:
    print(post["subreddit"], post["title"], post["url"])

# 3. A thread with its comments (3 credits per page)
thread = get("/reddit/threads/1wdihhj")["data"]
for c in thread["comments"]:
    print(c["parentId"], c["author"], c["score"], c["body"][:80])
print(len(thread["comments"]), "of", thread["reportedCommentCount"], "comments loaded")

Job 1 returns this, trimmed to one post. It's a recorded sample from a test key, which returns one real response per endpoint for free:

{
  "data": [
    {
      "id": "1wvjgm2",
      "fullname": "t3_1wvjgm2",
      "title": "I made $7,802 today",
      "author": "OkPositive9373",
      "subreddit": "SaaS",
      "score": 614,
      "numComments": 276,
      "createdAt": "2026-10-02T03:29:02.000Z",
      "url": "https://www.reddit.com/r/SaaS/comments/1wvjgm2/i_made_7802_today/"
    }
  ],
  "page": { "nextCursor": "AdxXcaGWSY8c…", "hasMore": true },
  "credits": { "charged": 0, "remaining": 719 }
}

On the test thread, job 3 printed 101 of 186 comments loaded. The comments come back as a flat list with parentId instead of PRAW's nested CommentForest. Our post on exporting Reddit comments to CSV or JSON shows how to rebuild the tree. To get more pages, pass page.nextCursor back as cursor. The endpoints are subreddit posts, search and threads.

If you want to check your key first, here is the same call with curl:

curl "https://api.chatterapi.com/v1/reddit/subreddits/SaaS/posts?sort=top&time=week" \
  -H "Authorization: Bearer $CHATTERAPI_KEY"

PRAW vs a hosted API

PRAWHosted API with requests
CredentialsReddit app, approved by RedditProvider key; ChatterAPI signs up with Google
CostFree library; Reddit's free tier is 100 QPM, commercial use needs a contractPer call; ChatterAPI from $19/month for 25,000 credits
Write actionsPost, comment, vote, moderateChatterAPI is read-only for Reddit
Comment treesNested CommentForest, replace_moreFlat list with parentId
Comment searchNot in Reddit's public APIGET /v1/reddit/comments/search
AsyncAsync PRAWAny HTTP client: httpx, aiohttp
Account statusNot exposedGET /v1/reddit/users/{name}/status
AI agentsWrap it yourselfHosted MCP server at https://api.chatterapi.com/mcp
Future accessTied to Reddit's API timelineTied to the provider

Our PRAW alternative page has a fuller comparison with sources. Going through a hosted API doesn't change the rules for Reddit content: Reddit's Data API Terms still apply to whatever you build.

The case for staying on PRAW

If you have working credentials, there are good reasons to stay.

The library costs nothing, and the free tier covers a lot of hobby and research use.

It also does things a read-only API can't, like bots that reply, mod tools that remove posts and scripts that manage flair. ChatterAPI doesn't post or vote on Reddit at all, by design.

You talk to Reddit directly. With no middleman, nobody else's outage becomes yours.

People are still shipping on it. "This bot still uses PRAW just fine," u/MarvelSnapCodeBot wrote in August 2026.

The risk is the timeline. Register your app before January 12, 2027, and plan for March 2027, when Reddit closes public API access and pushes apps toward Devvit. Bot developers in r/redditdev doubt big Python bots can make that move. "It's completely impossible to migrate mission critical bots we depend on to devvit," u/emily_in_boots wrote. If your job only reads data, a hosted API is a fallback you can set up in an afternoon. If it writes, Devvit is where Reddit is pointing.

Pick your route

If you have keys and need to write, stay on PRAW and register. If you need to read Reddit from Python without keys, or from an AI agent, use requests and a hosted API. Sign up with Google for 100 free credits with no card. That covers about 50 subreddit pages or 33 threads. Plans start at $19 a month for 25,000 credits.

FAQ

Is PRAW still working in 2026?
Yes, if you have Reddit API credentials. PRAW 8.0.3 was released on August 12, 2026, and the repo had commits on October 13, 2026. Access is what changed. Since November 2025, new credentials need Reddit's approval. Reddit stops taking new public API requests on October 31, 2026, and apps must register before January 12, 2027.
How do I get PRAW credentials?
You need a client id, client secret and user agent from a Reddit app. Since November 2025 you can't create one yourself. You submit an access request under Reddit's Responsible Builder Policy and wait for approval. If you created an app before then, its credentials are still listed at reddit.com/prefs/apps.
What is the best Python Reddit API wrapper?
PRAW is the standard Python Reddit API wrapper, and Async PRAW covers asyncio code. Both need Reddit API credentials. If you can't get credentials, you can call a hosted Reddit API with requests for the read jobs (search, subreddit posts, threads with comments) without a Reddit developer account.
Is PRAW free?
PRAW is free and open source under the BSD-2-Clause license. According to Reddit's Data API Wiki, the free API tier allows 100 queries per minute per OAuth client id for non-commercial use. Commercial use needs a separate agreement with Reddit.

More from the blog

Make your first call on 100 free credits.

Sign up with Google, no card. One key for Reddit and X, over REST or MCP.