Skip to content

The Reddit API in 2026: a complete guide for developers

What the Reddit API is in 2026: OAuth, the .json endpoints, Devvit, rate limits, pagination and comment trees, plus real requests for the common jobs.

Piyushh · October 14, 2026 · 12 min read

Yes, Reddit has an API. The official Reddit API, which Reddit calls the Data API, serves posts, comments, subreddits, users and search over OAuth at oauth.reddit.com. Free access is capped at 100 queries per minute per OAuth client id. You need Reddit's approval before you start, and commercial use needs a separate contract with Reddit (Data API Wiki, checked 2026-10-14).

The bigger change in 2026 is that Reddit is moving third-party apps off the public API and onto Devvit, its Developer Platform. This guide covers what the API is today and what data you can pull. It also covers the gotchas that break most first projects (rate limits, after pagination, comment trees, deleted content), how people get the same data without Reddit's API, and working requests for the four jobs most developers start with.

Does Reddit have an API?

Reddit runs several developer surfaces, and most confusion comes from mixing them up. Reddit's own developer overview lists a Developer Platform, a Data API, an Ads API, a researcher program and Reddit Embeds. Three of them matter if you want to read Reddit data from your own code.

The official Data API (OAuth)

When people say "the Reddit API", they mean this one. Endpoints are documented on Reddit's built-in API reference, and every request goes to https://oauth.reddit.com with a bearer token. The Data API Wiki sets the ground rules: "Clients must authenticate with a registered OAuth token," and traffic without OAuth "will be blocked."

You no longer get that token from a self-serve form. It starts with an access request. The Responsible Builder Policy says you must "request access and get explicit approval before accessing any Reddit data." Our guide on how to get a Reddit API key walks through the whole process, including what to put in the request.

Reddit also asks for a descriptive User-Agent in this format:

<platform>:<app ID>:<version string> (by /u/<reddit username>)

The wiki says default agents like Python/urllib are "drastically limited."

The .json endpoints: what still works

For years you could append .json to almost any Reddit URL and get the page back as JSON with no key. Most old tutorials teach this trick, and it has mostly stopped working.

We tested it on 2026-10-14. An unauthenticated GET https://www.reddit.com/r/redditdev/new.json?limit=2 returned HTTP 429 Too Many Requests on the first call, and the same path on old.reddit.com returned a 302 redirect to a login page. Coverage of Reddit's mid-2026 changes on PPC Land reports that unauthenticated .json access was shut around June 2026. Treat the .json route as unavailable for anything you need to run on a schedule.

The JSON shape is still worth learning, because the OAuth API returns the same "Listing" and "thing" objects. Every item has a fullname made of a type prefix and a base-36 id: t1_ for comments, t2_ for accounts, t3_ for posts, t5_ for subreddits (API reference).

Devvit, the Developer Platform

Devvit runs your code on Reddit's infrastructure instead of your own server. Reddit describes it as a toolkit for "interactive games, utilities, or moderation tools," with event triggers, Redis storage and app hosting (developer overview). Apps get installed into communities, which makes Devvit a fit for bots and mod tools. It was not built for pulling Reddit data into an external product.

What changed in 2026

On 2026-08-05 a Reddit admin posted Our Plans for the Future of Reddit's Public Data API and the Developer Platform in r/redditdev. The line that matters: "we'll gradually start restricting all new requests and third-party apps will be required to port and operate through our Developer Platform." The post asked owners to register every API app by September 30, 2026.

On September 30 Reddit followed up with dates. According to PPC Land (we could not load Reddit's original post), new public API access requests stop on October 31, 2026. RSS support ends on November 13, 2026, unregistered apps start losing access on January 12, 2027, and public access closes for the remaining apps in March 2027. Check r/redditdev before you plan around those dates.

Developers in that thread were blunt about the gap. The top comment came from u/emily_in_boots, who writes both kinds of bots: "It's completely impossible to migrate mission critical bots we depend on to devvit" (comment). In an October thread asking what happens to apps outside Devvit, the replies were "Yes. Use Devvit." and "You indeed lose access" (r/redditdev, 2026-10-08).

What data you can get

With approved OAuth access, the read side of the Data API covers five areas. Every endpoint name below comes from Reddit's API reference.

DataOfficial endpointNotes
Posts in a subredditGET /r/{subreddit}/new, /hot, /topListings, limit up to 100
One post plus commentsGET /comments/{article}Returns a tree with "more" stubs
Hidden commentsGET /api/morechildrenUp to 100 per call, one call at a time
Subreddit info and rulesGET /r/{subreddit}/about, /about/rulesSeparate calls
User profile and historyGET /user/{username}/about, /submitted, /commentsHistory is a listing
SearchGET /search, /r/{subreddit}/searchq up to 512 characters, sort, t
Things by fullnameGET /api/info?id=t3_...,t1_...Batch lookup

The search endpoint takes q, sort (relevance, hot, top, new, comments), t (hour through all), restrict_sr to stay inside one subreddit, plus the standard listing parameters. That is the official Reddit search API.

Reddit API limits and gotchas

These problems are what turn a weekend script into a week of work.

Rate limits

From the Data API Wiki, checked 2026-10-14:

  • Free access gets 100 queries per minute per OAuth client id.
  • The limit is "an average over a time window (currently 10 minutes)," so short bursts are fine.
  • Read X-Ratelimit-Used, X-Ratelimit-Remaining and X-Ratelimit-Reset on every response and sleep when remaining hits zero.
  • Requests without OAuth are blocked outright. The default limit does not apply to them.

The Data API Terms (last revised July 20, 2026) add that Reddit may limit "the number of API requests that you may make or the number of App Users you may serve" at its discretion, and that research beyond the rate limits needs a separate agreement.

Pagination with after

Reddit listings have no page numbers. Per the API reference, "Listings do not use page numbers because their content changes so frequently." Each response carries after and before fields holding the fullname of an item. Send after=<that fullname> back to get the next slice. limit defaults to 25 and maxes out at 100.

This has two practical consequences. New posts arriving while you page can shift items between slices, so dedupe on fullname. And when after comes back null, you have reached the end of what Reddit will serve for that listing, which is not always the end of the subreddit.

Comment trees and "load more"

GET /comments/{article} does not return every comment. Reddit picks the most relevant ones and replaces the rest with more objects. The reference explains that "Remaining comments are stubbed out with 'MoreComments' links," and you fetch them with /api/morechildren, "up to 100 at a time." It also warns: "you may only make one request at a time to this API endpoint. Higher concurrency will result in an error being returned."

A 2,000-comment thread therefore means one base request plus a long serial queue of morechildren calls, and each one spends rate limit. Expect partial threads, and check what you got against the post's num_comments.

Deleted and removed content

Deleted posts and comments stay in the tree as placeholders so replies keep their place, but the author and body are gone. In raw Reddit data you will see [deleted] and [removed], as in this r/webscraping thread where the top reply now reads [removed].

Storing data comes with obligations. The Data API Wiki says "You must remove any user content in your possession that has been deleted from Reddit," including author details when an account is deleted, and Reddit "strongly recommend[s] routinely deleting any stored user data and content within 48 hours." Put deletion into your pipeline from day one instead of bolting it on later.

NSFW gating

Posts and subreddits carry an adult-content flag (over_18 in Reddit's JSON). Filter on it explicitly. Most products should exclude adult content by default and include it only behind a deliberate opt-in.

Commercial use

Reddit's developer overview says it plainly: "You cannot use any Reddit developer tools and services for commercial purposes without first getting our permission," and commercial use requires a contract. Its examples include subscription services and "free product features available for upsell." The same page bans using Reddit content for model training without consent. Our Reddit API pricing guide covers fees. In short, the Data API Terms let Reddit "charge fees for future use or access," and commercial deals are negotiated.

Getting a yes is the hard part. One developer who asked about commercial access in February got this reply: "Got no luck! Sending followup emails but no response" (r/redditdev).

How people get Reddit data without Reddit's API

Reddit's approval process is slow and Devvit is built for apps that run inside Reddit, so developers fall back on three routes.

  1. The first is scraping the site. A developer collecting the top 50 posts from 15 subreddits a month listed his options as "the undocumented .json," old.reddit, or "playwright to automate a browser" (r/webscraping). Replies pointed to Selenium and browser extensions. This works until Reddit changes its markup or blocks your IP. The first reply under a new open-source scraper asked: "Do you get rate limited? Do you need residential proxy for this?" (r/webscraping, 2026-10-11).
  2. The second is archives. Historical dumps and archive services answer "what did this account post in the past," and moderators rely on that. A moderator of teen subreddits called one such archive "the ONLY way to know" whether someone had a concerning post history (r/redditdev, 2026-10-09).
  3. The third is a managed third-party API. A vendor runs the collection and you call a normal REST API with their key. ChatterAPI is one of these. It is independent and not affiliated with or endorsed by Reddit.

The case against all of this

The strongest counter-argument came in that same archive thread. u/shiruken replied: "Services like those are literally why Reddit is shutting down the Public API" (comment). Another commenter added that "the admins have been warning devs that this will be coming for literally years" (comment).

That view deserves weight. Reddit's stated reason for the changes is "automated abuse, or commercial scraping," and every route above sits outside the approved path. If your project fits Devvit (a mod tool, a bot that lives in a community, a game), build it there and the question goes away. If you need Reddit data inside your own product, you are choosing between a slow commercial application and a third-party source, and either way you should read Reddit's terms for your use case. Whatever the source, follow the deletion and privacy rules above. The Responsible Builder Policy's ban on inferring "potentially sensitive characteristics about Reddit users" is a rule worth keeping too.

Common jobs: official endpoint vs ChatterAPI

JobReddit official endpointChatterAPI endpointCredits
Search postsGET /search?q=GET /v1/reddit/search2 per page
Search commentsNo dedicated endpointGET /v1/reddit/comments/search2
Get a thread with commentsGET /comments/{article} plus /api/morechildrenGET /v1/reddit/threads/{id}3 per page
Get one postGET /api/info?id=t3_...GET /v1/reddit/posts/{id}2
Subreddit info, rules, mods/about, /about/rules, /about/moderatorsGET /v1/reddit/subreddits/{name}2
Subreddit postsGET /r/{subreddit}/newGET /v1/reddit/subreddits/{name}/posts2
User profileGET /user/{username}/aboutGET /v1/reddit/users/{name}2, or 3 with detail=full
Account status / shadowbanNo endpointGET /v1/reddit/users/{name}/status2
User post and comment history/user/{username}/submitted, /comments/v1/reddit/users/{name}/posts, /comments2 each

The full list is in the Reddit endpoint docs.

Hands-on: the four common jobs with ChatterAPI

ChatterAPI is one REST API for Reddit and X data. You send Authorization: Bearer <key> to https://api.chatterapi.com/v1, and you do not need a Reddit developer account. Setup is in the quickstart.

Every response uses the same envelope: data, a page object (nextCursor, hasMore) on lists, credits (charged, remaining), requestId and cached. Failed calls cost 0 credits.

The responses below were recorded from a test key and trimmed to the useful fields. Test keys return a fixed sample per endpoint, so the inputs match those samples.

1. Search posts

curl "https://api.chatterapi.com/v1/reddit/search?q=best+crm+for+small+business&sort=relevance&time=all" \
  -H "Authorization: Bearer $CHATTERAPI_KEY"
{
  "data": [
    {
      "id": "1wdihhj",
      "fullname": "t3_1wdihhj",
      "title": "What CRM should a small business use?",
      "author": "NotedWhisky",
      "subreddit": "CRM",
      "url": "https://www.reddit.com/r/CRM/comments/1wdihhj/what_crm_should_a_small_business_use/",
      "score": 51,
      "numComments": 186,
      "createdAt": "2026-09-11T14:52:16.000Z",
      "nsfw": false
    },
    {
      "id": "1vmy4xb",
      "title": "If You Had to Pick the Best CRM for Small Business Today, What Would It Be?",
      "subreddit": "CRMSoftware",
      "score": 10,
      "numComments": 56
    }
  ],
  "page": { "nextCursor": "AQx3Lr9dK2vQ...", "hasMore": true },
  "credits": { "charged": 0, "remaining": 771 },
  "cached": true
}

The sample returned 25 posts, which is one Reddit page. subreddit limits the search to one community. sort takes relevance, new, hot, top or comments, and time takes hour through all. Reddit operators work inside q, for example "exact phrase", OR, NOT and author:name. To page, pass page.nextCursor back as cursor until hasMore is false:

import os, requests

BASE = "https://api.chatterapi.com/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['CHATTERAPI_KEY']}"}

params = {"q": "best crm for small business", "sort": "new"}
posts = []
while True:
    r = requests.get(f"{BASE}/reddit/search", headers=HEADERS, params=params).json()
    posts += r["data"]
    if not r["page"]["hasMore"] or len(posts) >= 100:
        break
    params["cursor"] = r["page"]["nextCursor"]

print(len(posts), "posts")

Each page costs 2 credits. You can try it without code in the free Reddit post search tool.

2. Get a thread with comments

curl "https://api.chatterapi.com/v1/reddit/threads/1wdihhj" \
  -H "Authorization: Bearer $CHATTERAPI_KEY"
{
  "data": {
    "post": {
      "id": "1wdihhj",
      "title": "What CRM should a small business use?",
      "score": 52,
      "numComments": 186,
      "upvoteRatio": 0.96,
      "locked": false
    },
    "comments": [
      {
        "id": "p9636y0",
        "parentId": null,
        "author": "OstrichSome3412",
        "body": "Just a FYI, don't buy for the company you imagine having in 5 years. Buy for the next 12 or 18 months...",
        "score": 6,
        "createdAt": "2026-09-11T15:02:24.000Z"
      },
      {
        "id": "p963opq",
        "parentId": "p9636y0",
        "author": "NotedWhisky",
        "body": "Okay that's probably the balance I need tbf...",
        "score": 1
      },
      {
        "id": "p962kyb",
        "parentId": null,
        "author": "",
        "body": "",
        "score": 5
      }
    ],
    "unloadedReplyStubs": 0,
    "reportedCommentCount": 186
  },
  "page": { "nextCursor": null, "hasMore": false }
}

This real response shows three things.

First, comments come back flat. Each comment has a parentId: null means a top-level reply to the post, and anything else is the id of the comment it answers. Rebuilding the tree yourself takes about a dozen lines:

from collections import defaultdict

def print_tree(thread):
    children = defaultdict(list)
    for c in thread["comments"]:
        children[c["parentId"]].append(c)          # None = top level

    def walk(parent_id=None, depth=0):
        for c in sorted(children[parent_id], key=lambda c: -c["score"]):
            author = c["author"] or "[deleted or removed]"
            print("  " * depth + f'{author} ({c["score"]}): {c["body"][:60]}')
            walk(c["id"], depth + 1)

    walk()
    print(len(thread["comments"]), "of", thread["reportedCommentCount"], "comments loaded")

On this sample it prints 71 top-level comments with their reply chains and ends with 101 of 186 comments loaded. Every parentId in the sample points at a comment that is present, so nothing is orphaned.

Second, deleted comments keep their slot. Comment p962kyb has an empty author and body, but it still has an id, and two replies in the sample hang off it. Keep these placeholders when you rebuild, or the replies under them lose their parent. Four of the 101 comments in this sample look like this.

Third, large threads come back partial. The sample loaded 101 of 186 comments. The thread endpoint docs say so directly: no thread API returns every comment on very large threads, so compare comments.length with reportedCommentCount. When hasMore is true, pass cursor for the next page of comments, at 3 credits per page. unloadedReplyStubs counts replies Reddit did not load in that page. The free Reddit comment exporter runs the same call and downloads the result.

3. Look up a subreddit's rules

curl "https://api.chatterapi.com/v1/reddit/subreddits/SaaS" \
  -H "Authorization: Bearer $CHATTERAPI_KEY"
{
  "data": {
    "name": "SaaS",
    "title": "Software as a Service",
    "subscribers": 820451,
    "nsfw": false,
    "rules": [
      {
        "title": "No Vendor Spam on posts or comments",
        "description": "Promotion is allowed occasionally, but accounts focused solely on it will be removed.\n- __Limit:__ Max 1 mention  or 3 links can be shared every 60 days...",
        "appliesTo": "all"
      }
    ],
    "moderators": [
      { "name": "AutoModerator", "since": "2026-04-24T08:36:04.000Z" }
    ],
    "posting": {
      "submissionType": "any",
      "restrictPosting": true,
      "allowImages": true,
      "allowVideos": true,
      "allowPolls": false
    }
  }
}

The sample holds 11 rules and 9 moderators. The official API needs separate calls to /about, /about/rules and /about/moderators for this; here it is one call for 2 credits. If rules is null, the data came from a source that cannot see rules, not from a subreddit that has none. A rule like "Max 1 mention or 3 links can be shared every 60 days" is what you want an agent to read before it drafts anything. See the free subreddit stats tool.

4. Check whether a user is shadowbanned

Reddit's API has no shadowban endpoint. ChatterAPI's status endpoint returns a state for any username:

curl "https://api.chatterapi.com/v1/reddit/users/spez/status" \
  -H "Authorization: Bearer $CHATTERAPI_KEY"
{
  "data": { "username": "spez", "state": "active", "exists": true },
  "credits": { "charged": 0, "remaining": 771 },
  "requestId": "req_01M4WW52TX2MEADREQYB",
  "cached": true
}

state is one of active, suspended, not_found_or_banned or unknown. not_found_or_banned covers deleted, banned and shadowbanned accounts, because from outside all three look the same. You are the tie-breaker: run it on an account you can log into, and if it comes back not_found_or_banned, Reddit has shadowbanned it. Accounts that do not exist return a state, not an error. Each call costs 2 credits, and the free Reddit account checker does the same thing in a browser.

Using it from an agent

The same endpoints are available as tools on the hosted MCP server at https://api.chatterapi.com/mcp, with dots turned into underscores (reddit_search, reddit_thread, and so on). It works in Claude Code, Claude Desktop, Cursor, Codex, Windsurf and VS Code, with the same key and credit balance as REST.

Keys and pricing, briefly

For the official API, you request access, create an OAuth app, and exchange its client id and secret for a token. Approval takes the longest. Our Reddit API key guide covers each step and what to expect.

On pricing, Reddit's free tier is the 100 QPM limit above. Commercial access is a negotiated contract, and the Data API Terms reserve the right to charge fees. ChatterAPI bills in credits: sign up with Google for 100 free credits with no card, and plans start at $19 a month for 25,000 credits. Reddit API pricing has the numbers and the comparison.

Start building

To see whether the data fits your project, run the four calls above against a real thread you care about. Sign up with Google for 100 free credits with no card required, then paste your key into the quickstart. That covers about 50 searches or 33 full thread pulls.

FAQ

Does Reddit have an API?
Yes. Reddit's Data API serves posts, comments, subreddits and users over OAuth at oauth.reddit.com. Access needs Reddit's approval, free use is capped at 100 queries per minute per OAuth client id, and commercial use needs a separate agreement. Reddit is also moving third-party apps to its Developer Platform, Devvit.
What are the Reddit API limits?
Reddit's Data API Wiki lists 100 queries per minute per OAuth client id for free access, averaged over a 10-minute window. Traffic without OAuth is blocked. Listing endpoints return at most 100 items per request, and /api/morechildren loads at most 100 hidden comments per call, one request at a time.
Does the Reddit .json trick still work?
Not reliably. Reddit's docs say traffic not using OAuth is blocked. In our test on 2026-10-14, an unauthenticated request to a subreddit's new.json returned HTTP 429 and the old.reddit.com version redirected to a login page.
Is there a Reddit search API?
Yes. The official endpoint is GET /search (or /r/{subreddit}/search with restrict_sr), with q, sort, t, limit and after parameters. ChatterAPI exposes the same job as GET /v1/reddit/search, which costs 2 credits per page of up to 25 posts.
Can I check if a Reddit account is shadowbanned through the API?
Reddit has no shadowban endpoint. ChatterAPI's GET /v1/reddit/users/{name}/status returns active, suspended, not_found_or_banned or unknown. If an account you can log into comes back not_found_or_banned, Reddit has shadowbanned it.

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.