No. Nothing is published on PyPI, and there is no pip install redditapis. The API is plain REST with a bearer token, so requests is the client. The trade is honest: you write about fifteen lines of session setup once, and you never wait on a wrapper to catch up when an endpoint changes.
Reddit API in Python
One bearer token, the requests library, and six examples that run against endpoints this API actually serves. No package to install from us, and nothing to register with Reddit.
Is there a Python SDK for the Reddit API?
There is no Redditapis package on PyPI, and this page does not pretend otherwise. The API is plain REST over HTTPS with one bearer token, so the Python client is the requests library you already have. Install requests, send Authorization: Bearer YOUR_API_KEY, and read JSON. Reads cost $0.002 per call and every account starts with $0.50 in free credits.
What we ship, stated plainly
A page titled Python SDK that quietly has no package behind it wastes your afternoon. Here is the whole inventory.
No PyPI package
There is no pip install for a Redditapis client. If you find one, it is not ours. The examples on this page are the supported way in from Python.
One published package, and it is not a client
redditapis-mcp on npm is a Model Context Protocol server for agent tools, not a client library, and it is Node rather than Python.
A stable REST surface
52 endpoints behind one bearer token, with a published OpenAPI document you can point a generator at if you want typed stubs.
Six calls, start to finish
Each block continues from the one above it, so the session object created in the first call is the one every later call uses. Field names are the ones the endpoints return, not a generic shape.
# The only dependency. There is no redditapis package on PyPI.
pip install requests
# Keep the key out of your source tree.
export REDDITAPIS_KEY="rk_live_your_key_here"requests is the only thing to install. Nothing here registers a Reddit developer app or exchanges an OAuth token.
import os
import requests
BASE_URL = "https://api.redditapis.com"
session = requests.Session()
session.headers["Authorization"] = f"Bearer {os.environ['REDDITAPIS_KEY']}"
# One connection pool, one header, reused by every call below.
res = session.get(
f"{BASE_URL}/api/reddit/posts",
params={"subreddit": "webdev", "sort": "top", "t": "week", "limit": 25},
timeout=30,
)
res.raise_for_status()
for post in res.json()["posts"]:
print(post["upvotes"], post["title"], post["permalink"])GET /api/reddit/posts returns up to 100 posts for one $0.002 read. The unit is the call, not the row.
# Site-wide post search. Drop the subreddit param and it searches all of Reddit.
# min_score and is_self are applied to the returned page, and the response
# carries a meta block saying how many rows the filters removed.
res = session.get(
f"{BASE_URL}/api/reddit/search",
params={
"q": "postgres connection pooling",
"subreddit": "devops",
"sort": "relevance",
"t": "month",
"limit": 50,
"min_score": 20,
"is_self": "true",
},
timeout=30,
)
res.raise_for_status()
posts = res.json()["posts"]
for p in posts:
print(p["subreddit"], p["author"], p["title"], p["url"])Unknown values for sort or t are rejected with a 400 rather than passed upstream, so a typo fails loudly instead of quietly returning the wrong sort.
def iter_posts(subreddit, max_pages=5):
"""Walk a subreddit listing with the cursor the API hands back.
Pass the `after` value straight back on the next request. Stop when it
comes back null, which means there is no next page to ask for.
That is NOT the same as having every post: Reddit often stops serving a
busy listing early. The final response carries `listing_status`, and only
"complete" means nothing is missing.
"""
cursor = None
for _ in range(max_pages):
params = {"subreddit": subreddit, "sort": "new", "limit": 100}
if cursor:
params["after"] = cursor
res = session.get(f"{BASE_URL}/api/reddit/posts", params=params, timeout=30)
res.raise_for_status()
body = res.json()
yield from body["posts"]
cursor = body.get("after")
if not cursor:
return
count = sum(1 for _ in iter_posts("rust"))
print(count, "posts across at most 5 pages, 5 reads, $0.010")The after value is an opaque cursor. Send it back verbatim and stop when it is null.
# Deep comment search reads the comment TREES behind the matching threads, so
# it returns the actual comment bodies rather than the parent posts. One call
# fans out into a search plus several tree reads, which is why it is priced at
# $0.02 instead of $0.002.
res = session.get(
f"{BASE_URL}/api/reddit/search/comments/deep",
params={"q": "vector database", "limit": 10, "max_comments": 50},
timeout=60,
)
res.raise_for_status()
body = res.json()
for c in body["comments"]:
print(c["score"], c["author"], c["permalink"])
print(" thread:", c["parent_post"]["title"])
print(body["meta"]["comments_matched"], "matched,", body["meta"]["comments_returned"], "returned")The only read priced above $0.002. It costs $0.02 because one call performs a search plus up to ten comment-tree reads.
import time
class RedditapisError(RuntimeError):
def __init__(self, status, detail):
self.status = status
self.detail = detail
super().__init__(f"{status} {detail}")
# 402 and 403 are terminal: no amount of retrying buys credits or fixes a bad
# key. 429 and 503 are transient and safe to retry.
TERMINAL = {400, 401, 402, 403, 404}
RETRYABLE = {429, 500, 502, 503, 504}
def call(path, params=None, attempts=4, timeout=30):
delay = 1.0
last = None
for _ in range(attempts):
res = session.get(f"{BASE_URL}{path}", params=params, timeout=timeout)
if res.ok:
return res.json()
detail = res.json().get("error", res.text[:200])
if res.status_code in TERMINAL:
raise RedditapisError(res.status_code, detail)
if res.status_code not in RETRYABLE:
raise RedditapisError(res.status_code, detail)
last = RedditapisError(res.status_code, detail)
# The 429 carries Retry-After in seconds. Honour it before backing off.
time.sleep(float(res.headers.get("Retry-After", delay)))
delay *= 2
raise lastSplit terminal from transient before you write a retry loop. Retrying a 402 just burns wall-clock.
# GET /account/me is free and never consumes credits. Poll it from a scheduled
# job so a long run never dies halfway through on an empty balance.
res = session.get(f"{BASE_URL}/account/me", timeout=30)
res.raise_for_status()
account = res.json()
print(account["credits_remaining"], "left")
print(account["credits_used"], "spent over", account["total_requests"], "requests")
# Every billed response also carries the balance in a header, so a worker can
# watch it without a second request.
posts = session.get(
f"{BASE_URL}/api/reddit/posts",
params={"subreddit": "python", "limit": 5},
timeout=30,
)
print(posts.headers["X-Credits-Remaining"])The account endpoint is free. The header rides along on calls you were making anyway.
Every status code you will see
Errors come back as JSON with a single error key. The body text below is what the API sends, not a paraphrase.
| Status | Response body | What it means | Retry |
|---|---|---|---|
| 400 | {"error": "q is required"} | A required parameter is missing, or sort, t or a numeric filter carries a value the endpoint does not accept. The message names the field and lists the allowed values. | No. Fix the request. |
| 401 | {"error": "Missing Bearer token"} | No Authorization header, or the header did not start with Bearer. | No. |
| 402 | {"error": "Insufficient credits"} | The key is valid but the balance does not cover this call. | No. Top up first. |
| 403 | {"error": "Invalid token"} | The key was not recognised. | No. |
| 503 | {"error": "upstream_unavailable"} | The request could not be completed and never reached Reddit. Returned instead of a 404 so a temporary problem on our side is never reported as your content being missing. | Yes, with backoff. Not billed. |
| 429 | {"error": "rate_limited"} | Sent with a Retry-After header. On this API the enforced burst limiter counts requests that match no route, so a 429 usually means a client is hammering a URL that does not exist. | Yes, after Retry-After seconds. Not billed. |
Limits and what a call costs
There is no queries-per-minute gate on the data endpoints. What bounds a Python job is the credit balance, so the useful habit is watching that rather than counting requests.
| Tier | Per call | What is in it |
|---|---|---|
| Reads | $0.002 | 52 endpoints total, most of them reads. One call returns up to 100 rows. |
| Deep comment search | $0.02 | GET /api/reddit/search/comments/deep, the one read that fans out into many upstream reads. |
| Votes | $0.005 | POST /api/reddit/vote. |
| Writes | $0.012 | Comments, login and the profile endpoints. |
| Direct messages | $0.025 | Sending a DM and reading threads or messages. |
| Account reads | Free | GET /account/me and GET /account/payments never consume credits. |
Reddit throttling is handled server side
Proxy rotation, upstream retries and per-account cooldowns run on our side. A Python script deals with HTTP status codes, not a shared quota.
The 429 you can actually trigger
The enforced burst limiter counts requests that match no route, 60 per minute per key. It returns Retry-After and is not billed, so a URL typo in a loop costs nothing.
The account endpoint has its own limit
GET /account/me is free but capped at 30 requests per minute, which is far more than a balance poll needs.
If you want managed keyword alerts instead of your own polling loop, the monitoring endpoints deliver webhooks on a fixed cadence. Post-level monitors are available from the Starter plan; comment-level monitors start at Growth. Full rates are on the pricing page and the JavaScript version of this guide is at Reddit API in JavaScript.
By the numbers
Python access to Reddit data, by the numbers
Every Redditapis figure resolves to our published per-call rates; every external figure is a primary source.
Redditapis bills reads at $0.002 per call, deep comment search at $0.02, votes at $0.005, writes at $0.012, and DMs at $0.025, with no minimum spend. (Redditapis pricing, 2026)
Every new account starts with $0.50 in free credits and no card on file, roughly 250 reads before any charge. (Redditapis, 2026)
The REST surface is 52 endpoints behind a single bearer token, and a listing read returns up to 100 rows for one $0.002 call. (Redditapis docs, 2026)
Reddit's free Data API tier is capped at 100 queries per minute per OAuth client, and 10 queries per minute without OAuth. (Reddit Data API Wiki, 2026)
Reddit's own commercial Data API is priced at $0.24 per 1,000 API calls, the rate that ended third-party apps like Apollo in 2023. (The Verge, 2023)
Frequently asked questions
Set one header. Authorization: Bearer YOUR_API_KEY on every request to api.redditapis.com. There is no client id and secret pair, no token exchange, no refresh rotation, and no Reddit developer app to register. Put the key in an environment variable and attach it to a requests.Session so you set it once.
PRAW talks to Reddit directly, so it needs a registered Reddit developer app, OAuth credentials, and it inherits Reddit's own rate limits and approval process. This is a hosted REST API in front of Reddit, so the connection, proxy rotation and retries happen server side and you send one bearer token. PRAW is a richer object model; this is a smaller surface you can call from any language.
A read is $0.002 per call regardless of how many rows come back, so a 100-post page and a 3-post page cost the same. Deep comment search is $0.02. Every new account starts with $0.50 in free credits, which is about 250 reads before any charge.
No. Proxy rotation, upstream retries and per-account cooldowns run on the server side, so a Python script deals with ordinary HTTP status codes rather than a shared quota budget. Handle 429 by honouring Retry-After, and handle 503 upstream_unavailable with a backoff, because neither is billed.
Yes, two ways. Poll GET /api/reddit/sub/{name}/comments or the search endpoints on your own schedule, or register a managed monitor through the monitoring endpoints and receive webhooks. Post-level monitoring is available from the Starter plan; comment-level monitoring starts at Growth, because comment volume is far higher than post volume.
Yes. Nothing about the API is requests-specific. httpx or aiohttp work the same way as long as you send the same Authorization header, and concurrency is bounded by your own credit budget rather than by a queries-per-minute gate.
Keep reading.
Continue exploring related pages.
Reddit API documentation
The complete 2026 reference: auth, all 52 endpoints, and code.
Get a Reddit API key
Instant bearer token, no waitlist and no enterprise contract.
Reddit Responsible Builder Policy
Why Reddit denies API applications, and the managed REST bypass.
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.
Redditapis 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.
Cheap Reddit API
The cheapest way to get Reddit data: $0.002 per call, no contract, no minimum.
Official Reddit API vs Redditapis
Access, setup, rate limits, and pricing, side by side.
PRAW alternative
A hosted Reddit REST API for any language, no app registration or OAuth.
Reddapi alternative
A maintained Reddit REST API with published pricing and write endpoints.
Reddit comment scraper alternative
The raw comment API: search and filter comments, historical and live, clean JSON.
Reddit scraper API
Hosted scraper API vs building your own: managed proxies, clean JSON.
RapidAPI Reddit alternative
A direct, maintained Reddit API with published pricing and write endpoints.
Bright Data Reddit alternative
A purpose-built Reddit API vs a general scraping platform: structured JSON, plus writes.
ScraperAPI Reddit alternative
A Reddit-native API vs a generic HTML fetcher: auth and pagination handled, typed JSON.
TikHub alternative
TikHub's Reddit surface is read-only; get comment, vote, and DM endpoints too.
EnsembleData alternative
No $100/month floor: pay per call from $0.002, plus write, vote, and DM endpoints.
Scrape Creators alternative
7 read-only Reddit endpoints vs a dedicated API with real write, vote, and DM paths.
FetchLayer alternative
Posts, comments, and search only; add vote, comment, and DM over the same REST auth.
Reddit monitoring API
Build your own keyword and brand-mention monitor: search, comment search, and subreddit streams over REST.
F5Bot vs Redditapis
F5Bot's Slack and Discord delivery needs its $49.99/mo Gold tier; Redditapis includes it from $19/mo.
Syften vs Redditapis
Syften caps you at 100 to 500 results a day; Redditapis allows 10,000 a day per monitor at the entry plan.
Octolens vs Redditapis
Octolens meters by mention with overage fees; Redditapis is flat-priced by subreddit slot from $19/mo.
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.
Paste the first snippet and run it.
$0.50 in free credits, no card required. The key is issued the moment you sign up.

Comment rows carry body, author, subreddit and upvotes. This is the endpoint a keyword watcher polls.