Reddit APICommentsPythonPRAWTutorial2026

How to Get Reddit Comments via the API: Fetch the Full Comment Tree (2026)

Fetch Reddit comments by permalink, walk the nested tree, expand the more / morechildren nodes, and flatten replies in Python. Copy-paste code and first-party numbers, 2026.

RedditAPI·
How to get Reddit comments via the API guide, an independent third-party tutorial on fetching a post's full comment tree by permalink, expanding more and morechildren nodes, and flattening nested replies in Python

The Reddit comments API returns the discussion under a post as a nested tree of comment objects. You fetch it by the post's permalink, and the response is a list of nodes where each node is either a t1 comment (with its text, author, score, and nested replies) or a more placeholder that stands in for comments Reddit did not send in the first call. Getting every comment means walking that tree and expanding the more nodes. This tutorial hands you copy-paste Python for all of it: the fetch, the recursive walk, the more expansion, and the flatten.

Not affiliated with Reddit Inc. redditapis.com is an independent third-party REST proxy for Reddit's API. This tutorial is vendor-neutral: it shows the native .json endpoint, the PRAW library, and a managed REST option side by side so you can pick what fits your job.


TL;DR: Fetch a post's comments by permalink with one authenticated GET. The response is a tree of t1 comment nodes plus more placeholders. One call returns only the top of the tree: on four 649-to-775-comment threads pulled live on 2026-07-12, a single call returned about 100 comments and left 564 to 701 behind 50 to 70 more nodes, roughly 13 to 15 percent coverage. To get the whole thread, recurse into each comment's replies and expand the more nodes with Reddit's /api/morechildren (or PRAW's replace_more(limit=None)). A managed endpoint like https://api.redditapis.com/api/reddit/comments returns the same tree through a clean IP pool and one bearer token for $0.002 per call (pricing).


What you will build:

  • A working comment fetch by permalink against both .json and /api/reddit/comments
  • A recursive walker that visits every t1 comment in the returned tree
  • An expander that turns more placeholders into real comments
  • A flattener that produces one clean row per comment for analysis or a RAG index

What the Reddit Comments API Returns

The Reddit comments API returns a post's discussion as a nested listing: a comments array where each element is a node with a kind and a data object. A kind of t1 is a real comment carrying its body, author, score, depth, and its own nested replies. A kind of more is a placeholder that Reddit inserts wherever it decided not to send the full set of replies, standing in for comments you have to request separately. Understanding that two-node-type shape is the whole game, because every difficulty with Reddit comments traces back to those more placeholders.

Stat panel: one Reddit comments API call on a 775-comment thread returns about 100 rendered comments, leaves roughly 675 behind 50 to 70 more nodes, about 13 percent coverage in a single request

The numbers above are first-party, pulled live from the API on 2026-07-12, and they set up the single most important fact in this guide: on a large thread, one call is not the whole thread. The response also includes a top-level after cursor and the post object itself, so a single request gives you the submission plus the first slice of its comments. Developers in r/redditdev ask the exact question this shape creates, over and over: how do I get every comment, not just the ones the first call returned. This thread is the canonical version of that question and the number-one organic result for the query.

r/redditdev·u/PrincessYukon

Getting *all* the comments in a post

00
Open on Reddit

That question has a clean answer, and the rest of this tutorial is that answer in code. First the single fetch, then the walk, then the part everyone skips: expanding more.


You fetch comments with a single authenticated GET keyed on the post's permalink. The permalink is the /r/<sub>/comments/<id>/<slug>/ path that rides along on every post object you already have from a search or listing call, so you rarely have to construct it by hand. Here is the managed REST path, live-tested against the production endpoint while writing this tutorial:

import os
import requests

API_KEY = os.environ["REDDITAPI_KEY"]
BASE = "https://api.redditapis.com"

permalink = "/r/redditdev/comments/12f885c/getting_all_the_comments_in_a_post/"

resp = requests.get(
    f"{BASE}/api/reddit/comments",
    params={"permalink": permalink},
    headers={"Authorization": f"Bearer {API_KEY}"},
    timeout=60,
)
resp.raise_for_status()
data = resp.json()

post = data["post"]
comments = data["comments"]
print(f"{post['title']}")
print(f"top-level nodes returned: {len(comments)}")

The response has three top-level keys: post (the submission), comments (the tree of nodes), and after (a cursor). That is the entire contract. The native path returns the same structure with a different envelope: append .json to any Reddit comment URL and you get back a two-element array whose second element is the comment Listing.

Flow diagram: post permalink goes into one GET comments call, which returns a post object plus a comments array of t1 and more nodes plus an after cursor, ready to walk

The native equivalent is worth seeing because it is what most older tutorials show and it explains the nesting you will handle in a moment. You request https://www.reddit.com/<permalink>.json with the requests library and a descriptive User-Agent, then read data[1]["data"]["children"]. The no-PRAW Python tutorial covers the surrounding read and write calls that pair with this one, and the authentication guide explains when you need OAuth versus the public .json route.


The Comment Object: Fields You Actually Use

A t1 comment node holds dozens of fields, but a handful do all the work. The ones you reach for on nearly every job are body (the markdown text), author (the username), score (net votes, with ups and downs broken out separately), depth (0 for a top-level comment, incrementing per reply level), parent_id (the thing this comment replies to), and created_utc (the epoch timestamp). Everything else is moderation, award, and flair metadata you can usually ignore.

List: the Reddit comment fields you actually use, body, author, score, depth, parent_id, created_utc, replies, with a one-line meaning for each

The one field that trips people up is parent_id, because it uses Reddit's type-prefixed fullname scheme. A top-level comment has a parent_id like t3_12f885c, where t3_ marks it as a link (the post itself). A reply has a parent_id like t1_jn24wv6, where t1_ marks it as a comment. That prefix is how you rebuild the hierarchy from a flat list later: match a comment's parent_id against another comment's t1_ plus its id. The replies field is the other structural one. It is either an empty string (this comment has no loaded replies) or a nested Listing object whose data.children array holds the child nodes, which is exactly what makes the tree recursive.

The three node types you will meet map cleanly, and it pays to hold them in your head before writing the walker in the next section:

List of the three node kinds in a Reddit comment listing, t1 the real comment you keep, more the placeholder for hidden replies you expand, and Listing the wrapper you recurse into

In practice you branch on kind on every node you touch: process a t1, expand or skip a more, and treat a Listing as a container you recurse into. That three-way branch is the entire control flow of every comment walker in this guide, and the field names above are stable across the native path and a managed proxy alike. The complete field and endpoint contract lives in the API documentation.


Walking the Nested Comment Tree

To visit every comment the API returned, you recurse. Each t1 node may carry a replies Listing whose children are more t1 nodes, each of which may carry its own replies, and so on down to whatever depth the thread reaches. A depth-first walker is about ten lines of Python and is the backbone of every comment job you will write. Here is the walker against the managed response shape:

def walk(nodes, depth=0):
    for node in nodes:
        if node["kind"] != "t1":
            continue  # skip 'more' placeholders for now
        c = node["data"]
        yield {
            "id": c["id"],
            "author": c.get("author"),
            "score": c.get("score"),
            "depth": c.get("depth", depth),
            "parent_id": c.get("parent_id"),
            "body": c.get("body", ""),
        }
        replies = c.get("replies")
        if isinstance(replies, dict):
            children = replies.get("data", {}).get("children", [])
            yield from walk(children, depth + 1)

for row in walk(comments):
    indent = "  " * row["depth"]
    print(f"{indent}{row['author']} ({row['score']}): {row['body'][:60]}")

The walker checks kind first. When it sees a t1, it yields the fields you care about and then descends into replies.data.children if that Listing exists. When it sees anything else (a more node), it skips for now. Run this against a small thread and you get essentially the whole discussion; run it against a large one and you get the top of the iceberg, because the more nodes you are skipping are hiding the bulk of the comments. That gap is the subject of the next section, and it is the reason threads like this one keep landing in r/redditdev.

r/redditdev·u/jfasi

How do I use the 'more' entries in the json reply to load more comments?

00
Open on Reddit

Notice the walker never hardcodes a depth limit. Reddit's own nesting can run deep: in the four large threads we sampled, the deepest reply chain reached depth 8. Your recursion should follow the tree as far as it goes rather than stopping at an arbitrary level, or you will silently drop the tail of long back-and-forths.


Start building with RedditAPI

Reads $0.002, votes $0.005, writes $0.012, DMs $0.025. $0.50 free credits.

The more Problem: Why One Call Is Not the Whole Thread

Here is the fact that separates a comment fetcher that works in a demo from one that holds up in production: a single comments call does not return the whole thread. Reddit sends the top of the tree and replaces the rest with more placeholder nodes, each carrying a count of how many comments it hides and a children list of their IDs. If you only walk the t1 nodes, you are throwing away most of a busy thread without any error to warn you.

Bar chart: comments hidden behind more nodes on four large threads pulled live, 701, 684, 670, and 564 comments each sitting behind 50 to 70 more placeholders in a single call

We measured it directly. Pulling four r/technology threads of 649 to 775 comments on 2026-07-12, one call returned about 100 rendered comments each and left between 564 and 701 comments behind 50 to 70 more nodes. That is roughly 13 to 15 percent coverage from a single request. The pattern is consistent: the larger the thread, the smaller the fraction one call gives you. By contrast, a 104-comment r/redditdev thread returned 96 of its comments in one call, about 92 percent, because a small thread fits inside the slice Reddit sends by default.

Stat panel: coverage contrast, a small 104-comment thread returns 92 percent in one call while a 775-comment thread returns about 13 percent, the rest hidden behind more nodes

This is not a bug and it is not a rate limit. It is how Reddit paginates deep trees, documented in the Reddit Data API wiki, and adding limit or depth query parameters does not change it: we tested both against the managed endpoint and the count of returned comments stayed put. The only way past it is to expand the more nodes. Developers hit a sharper edge of this when expansion silently returns nothing, which is its own well-known thread:

r/redditdev·u/iamthatis

What causes "Load more comments" to load nothing/0 new comments?

00
Open on Reddit

If your comment counts never match what you see in the browser, this is almost always why. You walked the t1 nodes and skipped the more ones. The fix is a second step, not a bigger first request.


Expanding more and morechildren

Expanding a more node means taking the comment IDs it lists and asking Reddit for those specific comments. On the raw path, that is Reddit's /api/morechildren endpoint: you pass the parent post's fullname and a batch of the children IDs, and it returns those comments so you can splice them back into your tree. On the PRAW path, one method does the whole loop for you. The mechanics are the same underneath; PRAW just hides the bookkeeping.

Flow diagram: collect children IDs from every more node, batch them, call morechildren, splice the returned comments back into the tree, repeat until no more nodes remain

The PRAW route is the shortest to a complete thread. Its replace_more() method walks the tree and replaces every more placeholder with the real comments, and calling it with limit=None tells it to expand all of them rather than stopping early:

import praw

reddit = praw.Reddit(
    client_id="YOUR_CLIENT_ID",
    client_secret="YOUR_CLIENT_SECRET",
    user_agent="reddit-comments-tutorial/1.0 (by u/your_username)",
)

submission = reddit.submission(url="https://www.reddit.com/r/redditdev/comments/12f885c/getting_all_the_comments_in_a_post/")
submission.comments.replace_more(limit=None)   # expand every 'more' node

all_comments = submission.comments.list()       # flat list of every comment
print(f"expanded to {len(all_comments)} comments")

The catch with replace_more(limit=None) is cost: each more expansion is its own request, so a thread with 60 more nodes turns into roughly 60 extra calls, and PRAW paces them against your rate limit. That is exactly why the native /api/morechildren endpoint sees so much confusion in practice, including inconsistent 500s and calls that return less than expected, documented at length in PRAW's comment extraction tutorial and Reddit's official API docs. Whichever route you take, budget for the expansion calls up front. On a managed REST path the comments call returns the same raw tree with the same more nodes, so you apply the identical expansion logic; what the managed pool removes is the OAuth app, the User-Agent tuning, and the datacenter-IP 403s, not the tree structure itself. See the REST versus PRAW breakdown for where each path earns its keep.


Flattening the Tree into a Flat List

Most jobs do not want a tree. They want a flat list: one row per comment, ready to score, index, or export. Flattening is the same depth-first walk you already wrote, except you collect every comment into a single list while carrying its depth and parent_id so the hierarchy is reconstructable later. You lose nothing by flattening as long as you keep the parent pointers.

def flatten(nodes, out=None):
    if out is None:
        out = []
    for node in nodes:
        if node["kind"] == "more":
            continue  # expand these first if you need them
        c = node["data"]
        out.append({
            "id": c["id"],
            "parent_id": c.get("parent_id"),
            "depth": c.get("depth", 0),
            "author": c.get("author"),
            "score": c.get("score"),
            "created_utc": c.get("created_utc"),
            "body": c.get("body", ""),
        })
        replies = c.get("replies")
        if isinstance(replies, dict):
            flatten(replies.get("data", {}).get("children", []), out)
    return out

rows = flatten(comments)
print(f"flattened {len(rows)} comments into rows")
# hand `rows` straight to pandas.DataFrame(rows) or json.dump()

The output is a list of dictionaries you can drop into a dataframe with pandas.DataFrame(rows) or write to disk with json.dump(). Because every row keeps its parent_id, you can rebuild the exact reply hierarchy whenever you need it: group by parent_id, or match each row's parent_id against t1_ plus another row's id. The frustration of hand-assembling this structure is a recurring r/redditdev theme, and it is worth acknowledging that yes, if you want the full tree you do have to walk it yourself, whichever path you choose. The no-PRAW tutorial and the search tutorial both lean on this same flatten step when they turn a listing into rows.


Native vs PRAW vs a Managed REST Path

Three practical paths get you comments: the native .json endpoint, PRAW, and a managed REST proxy. They return the same underlying data and differ in who handles auth, the IP pool, and the expansion plumbing. There is no single best answer, only the best fit for where your code runs.

Comparison grid: native json, PRAW, and managed REST across auth, tree handling, more expansion, IP filtering, rate limit, and cost, with the managed column highlighted as the lowest-maintenance path

A quick read on each. The native .json path is free and needs no library beyond requests, but it caps at 60 requests per minute, gets 403-blocked from cloud IPs, and leaves you to hand-roll the morechildren expansion. PRAW (praw.readthedocs.io) is the most convenient for expansion because replace_more() handles the loop, and it manages OAuth and backoff for you, at the cost of the 100 request-per-minute ceiling and the per-more call fan-out; it is published on PyPI and maintained on GitHub. A managed REST endpoint returns the same tree through a clean pool and one bearer token, which removes the auth setup and the datacenter-IP 403s but still hands you raw more nodes to expand. The demand to get Reddit data without fighting the access layer shows up constantly, and this widely-shared post captures the sentiment:

Tom Dörr

Tom Dörr

@tom_doerr

Scrapes Reddit data without API keys https://t.co/JeyRHIaa9P https://t.co/ntPLzeNHVs

Embedded post media

The honest split: if you are already in PRAW, replace_more(limit=None) is the fastest route to a complete thread. If you are calling from a server where 403s and OAuth upkeep hurt, a managed path removes that class of problem. The data you get out is identical either way. The PRAW versus managed REST comparison walks the tradeoff in more depth.


The cheapest Reddit API. Try it free.

Reads from $0.002 per call. $0.50 free credits. No credit card required.

Coverage in Practice: What the Numbers Say

The reason this all matters is that comment coverage is not intuitive, and getting it wrong corrupts whatever you build downstream. A sentiment score computed over 13 percent of a thread is not a sentiment score of the thread; it is a sentiment score of the earliest and highest-voted comments, which skew systematically. So it is worth internalizing the shape of the coverage before you ship a pipeline on top of it.

Donut chart: composition of a single comments call on a large thread, roughly 65 percent of returned nodes are t1 comments and 35 percent are more placeholders standing in for hundreds of hidden replies

Across the four large threads we pulled, each single call returned around 100 rendered comments alongside 50 to 70 more placeholders. In node terms, a big chunk of what comes back in one request is not comments at all but pointers to comments you still have to fetch. The practical rule of thumb: if a thread has more than a few hundred comments, plan on expansion, and budget the extra calls. If a thread has under about 200 comments, a single call usually gets you most of it. The scale of this problem at volume is exactly what the scraping throughput and error-rate benchmarks measure, and it is why teams pulling comments at scale care about the rate ceiling covered in the rate-limits reference.

The counterintuitive part is that small threads lie to you. If you build and test your fetcher on a 40-comment thread, it will look complete and correct, because a small thread returns whole. The gap only appears when you point the same code at a 700-comment thread in production, which is precisely when a missing 85 percent of the data does the most damage. Test on a big thread on purpose.


Getting Comments Without OAuth

For public posts you can pull comments with no OAuth app at all. Append .json to any Reddit comment URL and request it with a descriptive User-Agent, and Reddit returns the same tree structure at up to 60 requests per minute. This is the zero-setup path, and it is genuinely fine for a notebook, a personal script, or a low-volume job running from your own machine.

The 2026 catch is the IP filter, and it is the single most common reason a correct script fails. Reddit blocks a large share of cloud and datacenter IP ranges, so the exact code that works from your laptop frequently returns 403 from an AWS, GCP, or DigitalOcean box no matter how clean your headers are. That is not a bug in your request; it is Reddit refusing the source IP, and no header fixes it. This short walkthrough covers the same fetch-and-parse flow end to end and is a useful companion to the code above:

The decision is straightforward. From a laptop or a residential connection, the public .json path is the right call: free, no OAuth, and you can paste the walker above and have comments in two minutes. From a server, you either maintain a pool of residential IPs Reddit accepts, or you route through a managed API whose pool is already accepted. The how-to-get-an-API-key guide covers the OAuth-app route if you want to lift the ceiling to 100 requests per minute, though remember that OAuth raises the rate limit without solving the datacenter-IP block.


Comments are rarely the goal on their own; they are the raw material for something else. Four jobs cover most of what teams build on top of a comment fetch, and each one shapes how much of the tree you actually need. Knowing which job you are doing tells you whether the more expansion is optional or mandatory.

List: four things developers build on Reddit comment data, sentiment analysis, RAG ingestion for LLMs, moderation tooling, and thread archiving, with the coverage each one needs

Sentiment and opinion analysis needs high coverage, because a partial thread biases the result toward early, high-scoring comments, so this job demands full more expansion. RAG ingestion feeds comment text into an LLM's retrieval index to ground answers in real community discussion, and here completeness matters less than freshness and clean text, so top-of-tree is often enough. Moderation and monitoring tooling watches for specific authors or phrases and usually cares about new comments as they arrive, so a shallow, frequent poll beats a deep one. Thread archiving wants everything, which means full expansion and careful pagination. The pull toward giving an AI agent direct read access to Reddit discussion is a fast-growing pattern, framed plainly here:

Trending GitHub Repositories

Trending GitHub Repositories

@trending_repos

Trending repository of the month 🏆 Agent-Reach Give your AI agent eyes to see the entire internet. Read &amp; search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees. Last month: 26,239 ⭐ Total: 47,845 ⭐️ https://t.co/BUp2aLe7ve

Match your expansion effort to the job. If you are grounding an LLM on the gist of a discussion, do not pay for 60 morechildren calls per thread. If you are scoring sentiment or archiving, you have no choice but to expand. The Reddit data licensing context explains why comment data specifically became such a contested resource for AI training, and the find-subreddits guide helps you point these jobs at the right communities.


What It Costs at Volume

Comment pulling has two cost axes, and they are different enough that you have to map your real thread sizes before comparing. The native .json path and PRAW are free in dollars but cost engineering time: an IP pool to dodge 403s, OAuth-app upkeep, and the rate-limit backoff you maintain. A managed REST path prices per call instead, at $0.002 per GET (pricing), with no infrastructure to run.

The number that surprises people is the expansion multiplier. A single top-level comments call is one GET, but a large thread with 60 more nodes needs roughly 60 additional expansion requests to reach completeness, so a "read one thread" job is really "read one thread plus expand its sixty more nodes." At low volume this is a rounding error and the free path clearly wins. At production volume, where you are pulling and fully expanding thousands of threads a month, the engineering time to maintain an IP pool and OAuth plumbing costs more than the per-call fee, and a 403 that breaks a customer-facing feature costs more than both. Model your own numbers with the cost calculator and cross-check the per-operation detail on the pricing page and the rate-limits reference before you commit to a path.


Verdict

For a notebook or a low-volume script, the native .json path plus the recursive walker above is the right answer: free, no OAuth, and you can have comments in two minutes from your own machine. The moment you need the whole thread, you owe yourself the expansion step, because on a busy thread a single call is only 13 to 15 percent of the comments and the missing 85 percent will quietly corrupt any analysis you run. If you are in PRAW, replace_more(limit=None) is the shortest route to completeness, at the cost of one call per more node. If your code runs on a server where 403s and OAuth upkeep hurt, a managed REST endpoint like https://api.redditapis.com/api/reddit/comments returns the same tree through a clean pool and one bearer token for $0.002 per call, and you apply the identical walk-and-expand logic on top. Start free, test on a big thread on purpose, and upgrade only when the native limits actually bite. Grab a key and run the code.

Frequently asked questions.

Fetch the post by its permalink, then walk the tree Reddit returns and expand the `more` nodes it leaves behind. One call returns the top slice of the tree plus placeholder `more` objects that stand in for the comments Reddit did not send. To get everything, recurse into each comment's `replies`, collect the comment IDs listed on every `more` node, and re-request those with Reddit's `/api/morechildren` endpoint (PRAW's `replace_more(limit=None)` does this loop for you). On a big thread a single call returns only a fraction of the comments, so the expansion step is mandatory if you need the whole discussion. See the [Python without PRAW tutorial](/blogs/reddit-api-python-tutorial) for the surrounding read calls.

Reddit sends the top of the comment tree and collapses the rest into `more` placeholder objects to keep the payload small. Each `more` node carries a `count` of how many comments it hides and a `children` list of their IDs. We pulled four threads of 649 to 775 comments live on 2026-07-12: a single call returned about 100 rendered comments and left 564 to 701 behind 50 to 70 `more` nodes, roughly 13 to 15 percent coverage. A small 104-comment thread returned 92 percent in one call. The bigger the thread, the more you must expand. The [throughput benchmarks](/blogs/reddit-scraping-benchmarks-throughput-error-rates-2026) show how this behaves at volume.

A `more` object is a placeholder in the comment listing with `kind` set to `more` instead of `t1`. Its `data` holds a `count` (how many comments are hidden below this point), a `children` array of the hidden comment IDs, and a `parent_id`. It is Reddit's way of saying there are more replies here that were not included in this response. You expand it by passing those `children` IDs to Reddit's `/api/morechildren` endpoint, or by letting PRAW's `replace_more()` handle it. Until you expand it, those comments are simply absent from your data. The [REST versus PRAW breakdown](/blogs/reddit-data-api-rest-vs-praw-2026) compares how each path handles it.

Send one authenticated GET with the post's permalink. On a managed REST path that is `GET https://api.redditapis.com/api/reddit/comments?permalink=/r/<sub>/comments/<id>/<slug>/`, which returns a `post` object, a `comments` array of tree nodes, and an `after` cursor. On the native path, append `.json` to any Reddit post URL and request it with a descriptive User-Agent. Both return the same nested structure of `t1` comment nodes and `more` placeholders. The permalink is the stable key: you already have it on every post object returned by a [search](/blogs/reddit-search-api-tutorial-2026) or listing call.

A `t1` comment node carries `id`, `author`, `author_fullname`, `body` (markdown) and `body_html`, `score` with separate `ups` and `downs`, `created_utc`, `edited`, `depth` (0 for top-level), `parent_id` (the post `t3_...` for top-level comments or a comment `t1_...` for replies), `is_submitter`, `distinguished`, `collapsed`, and a `replies` field that is either an empty string or a nested `Listing` of child nodes. For most jobs you use `body`, `author`, `score`, `depth`, and `parent_id`. The full object holds dozens of moderation and award fields you can usually ignore. The [no-PRAW Python tutorial](/blogs/reddit-api-python-tutorial) shows these fields in working code.

Walk the tree depth-first and append each `t1` node to a list, carrying its `depth` and `parent_id` so you can rebuild the hierarchy later if needed. Skip `more` nodes or expand them first. A flat list is what most downstream jobs actually want: a dataframe row per comment for sentiment scoring, a chunk per comment for a RAG index, or a CSV for analysis. The recursion is about ten lines of Python. Keep `parent_id` on every row and you lose nothing by flattening, because the tree is reconstructable from the parent pointers. The [search API tutorial](/blogs/reddit-search-api-tutorial-2026) uses the same flatten step on a listing.

Yes, for public posts. Appending `.json` to any Reddit comment URL returns the same tree without OAuth at up to 60 requests per minute, as long as you send a real User-Agent. The catch in 2026 is the IP filter: unauthenticated calls from AWS, GCP, or other datacenter ranges frequently return 403 no matter how correct your headers are, so the public path works from a laptop but often fails from a server. OAuth lifts the rate ceiling to 100 requests per minute but does not fix the datacenter-IP block. See the [authentication and OAuth guide](/blogs/reddit-api-authentication-oauth-2026).

The native `.json` path and PRAW are free in dollars but cost engineering time in OAuth setup and an IP pool to dodge 403s. A managed REST endpoint prices per call instead, at $0.002 per GET, with the first $0.50 of credit free at [signup](/signup) and no card required. One `comments` call is one GET, so a monitor that reads 10,000 threads a month is about $20 in GETs plus whatever `morechildren` expansion your threads need. Model your real numbers with the [cost calculator](/reddit-api-cost-calculator) before deciding, because at low volume the free path wins.

Keep reading.

Continue exploring related pages.

Get a Reddit API key

Instant bearer token, no waitlist and no enterprise contract.

Reddit API use cases

14 use cases from AI training to brand monitoring and DMs.

Reddit Search API

Search posts, comments, users, and communities over one REST endpoint.

Reddit MCP server

Wrap the REST API as MCP tools for Claude, Cursor, and any MCP client.

Reddit API for AI agents

Live Reddit context for tool calls, MCP servers, and RAG pipelines.

RedditAPI pricing

Endpoint-level costs and quick monthly totals - reads from $0.002 / call.

Reddit API cost calculator

Estimate monthly spend using your request volume.

Reddit API guides and tutorials

Tutorials, walkthroughs, and API deep-dives for developers.

Reddit API alternatives

Evaluate alternatives by cost model, limits, and integration fit.

Official Reddit API vs RedditAPI

Access, setup, rate limits, and pricing, side by side.

Affiliate program

Earn 20% lifetime commissions - capped at $5,000/yr.

Reddit Vote API tutorial

Upvote and downvote a post programmatically via the REST API.

Reddit Data API: REST, no PRAW

REST endpoints for Reddit data with no PRAW and no OAuth dance.

Reddit scraping benchmarks

Real throughput, error rates, and cost benchmarks for Reddit scraping.

Reddit API answers

Direct answers on cost, access, rate limits, endpoints, and auth.

How much the Reddit API costs

Per-call pricing from $0.002 a read, with $0.50 in free credits.

Reddit API in Python

One requests call with a bearer token, no PRAW and no OAuth flow.

Reddit shadowban checker

Check if a Reddit account is shadowbanned in seconds, free and no login.

Similar reads.

More guides on the Reddit API, scraping, pricing, and MCP servers.

Reddit Search API tutorial cover, an independent third-party guide to querying subreddits by keyword in Python with native search.json, PRAW, and a managed REST API
Reddit APISearch

Reddit Search API Tutorial: Query Subreddits by Keyword in Python (2026)

Search Reddit posts by keyword in Python in 2026. Native /search.json, PRAW subreddit.search(), and a managed REST endpoint compared, with copy-paste code, parameters, and the 1,000-result cap explained.

RedditAPI·
Reddit API pagination guide, an independent third-party tutorial on the after cursor, the 100-per-page limit, and getting complete data past the ~1000-item listing ceiling with copy-paste Python
Reddit APIPagination

Reddit API Pagination: The after Cursor and Getting Past the 1000-Item Ceiling (2026)

How Reddit API pagination works: the after cursor, the 100-per-page cap, and getting past the ~1000-item ceiling. Copy-paste Python and first-party numbers, 2026.

RedditAPI·
Independent third-party guide to finding subreddits programmatically via API, discovering communities by keyword and ranking them by activity in Python
Reddit APISubreddit Finder

How to Find Subreddits Programmatically: A Subreddit Finder API Guide (2026)

Find subreddits by keyword at scale in 2026. Discover communities with the search/communities API, rank them by real activity, and compare the native reddit.com/search.json path with copy-paste Python.

RedditAPI·
Reddit API in Python tutorial cover -- no-PRAW, no-OAuth path using plain requests
Reddit APIPython

Reddit API in Python: The Complete No-PRAW Tutorial (2026)

Use the Reddit API in Python without PRAW in 2026. Plain HTTP with requests or httpx, one bearer token. Code examples for posts, comments, search, votes, and DMs from $0.002 per call.

RedditAPI·
Independent third-party guide to building a Reddit MCP server in Python that exposes Reddit search and read tools to Claude, Cursor, and AI agents over the Model Context Protocol
Reddit APIMCP

How to Build a Reddit MCP Server (for Claude, Cursor, and AI Agents) in 2026

Build a Reddit MCP server in Python so Claude, Cursor, and AI agents can search and read Reddit as tools. Copy-paste FastMCP code, client config, and cost math.

RedditAPI·
Webhooks vs polling for Reddit data streams: a 2026 guide to building near-real-time Reddit feeds when the Reddit API has no webhook support. redditapis.com is an independent service, not affiliated with Reddit Inc.
Reddit APIWebhooks

Webhooks vs Polling for Reddit Data Streams (2026)

Does Reddit have webhooks? No. The Reddit Data API has no push, so every real-time Reddit feed is polling. How to poll well, with runnable Python.

RedditAPI·
Independent third-party guide to building a Reddit keyword monitor in Python with a polling loop on a managed REST search endpoint, dedup, and alerting
Reddit APIMonitoring

Build a Reddit Keyword Monitor in Python (2026): No Rate Limits, No SaaS Fee

Build your own Reddit keyword monitor in Python in 2026. A copy-paste polling loop on a managed REST search endpoint, with dedup, email and Slack alerts, scheduling, and why polling beats PRAW streaming on rate limits.

RedditAPI·
An independent developer guide to scheduling Reddit posts: a Python pipeline that computes the best time to post from real subreddit data, checks each community's rules, and publishes on a human cadence
Schedule Reddit PostsReddit API

How to Schedule Reddit Posts Safely (Timing, API, and the Subreddit Rules)

Build your own Reddit scheduling pipeline in Python: authenticate once, compute the best time to post from real subreddit data, vet each community's rules, and publish on a human cadence. Copy-paste code included.

RedditAPI·