Reddit Subreddit Scraper API
Name a subreddit and our Reddit subreddit scraper returns its post listing, hot, new, top, or rising, as an ordered JSON array where every thread carries its title, author, score, upvote ratio, comment count, and a cursor for the next page.
Why Reddit Subreddit data is hard to collect
Watching a subreddit through Reddit's Data API means registering an OAuth client, since every request now authenticates with OAuth2, and Reddit charges $0.24 per 1,000 calls above a free ceiling of 100 queries per minute introduced on July 1, 2023. The listing surface also stops paging at 1,000 posts per feed and exposes only the most recent ones, so deep or continuous monitoring of an active community runs into that wall fast.
Call the Reddit Subreddit Scraper API in one request
curl "https://api.redditscraperapi.com/api/v1/reddit/subreddit?subreddit=python&sort=hot&limit=25&api_key=$API_KEY" import requests
resp = requests.get(
"https://api.redditscraperapi.com/api/v1/reddit/subreddit",
params={
"subreddit": "python",
"sort": "hot",
"limit": 25,
"api_key": "YOUR_API_KEY",
},
)
data = resp.json()
print(data["total_results"], "posts from r/" + data["subreddit"], "sorted by", data["sort"])
for post in data["posts"]:
print(f"[{post['score']}] {post['title']} ({post['num_comments']} comments)")
# page on with the returned cursor
if data["after_cursor"]:
print("next page after:", data["after_cursor"]) Parameters
| Parameter | Required | Default | Notes |
|---|---|---|---|
subreddit | required | - | The community to pull, with or without a leading r/ (for example python or r/python). This is the only required field. |
sort | optional | hot | Which listing to read: hot, new, top, rising, or controversial. It sets the order Reddit ranks the posts in before we return them. |
t | optional | - | Time window for the top and controversial sorts: hour, day, week, month, year, or all. Ignored by hot, new, and rising. |
after | optional | - | Paging cursor. Pass the after_cursor value from a previous response to fetch the next page of the same listing. |
limit | optional | 25 | How many posts to return, from 1 to 75. One page of the shreddit listing yields up to roughly 24 unique posts, so a higher limit may return fewer. |
Fields the Reddit Subreddit Scraper API returns
{
"subreddit": "python",
"sort": "hot",
"t": null,
"after_cursor": "t3_1abc234",
"total_results": 25,
"posts": [
{
"id": "t3_1abd567",
"title": "What is your favorite Python library and why?",
"score": 4821,
"num_comments": 936,
"upvote_ratio": 0.97,
"awards": 3,
"author": "dev_jane",
"author_id": "t2_8x4q1",
"subreddit": "python",
"permalink": "https://www.reddit.com/r/python/comments/1abd567/",
"external_url": null,
"domain": null,
"created": "2026-05-31T14:22:08+00:00"
},
{
"id": "t3_1abe890",
"title": "I built a CLI for tracking subreddit keywords",
"score": 1290,
"num_comments": 187,
"upvote_ratio": 0.95,
"awards": 0,
"author": "toolmaker",
"author_id": "t2_4k2p9",
"subreddit": "python",
"permalink": "https://www.reddit.com/r/python/comments/1abe890/",
"external_url": "https://github.com/toolmaker/subkeys",
"domain": "github.com",
"created": "2026-05-31T11:08:44+00:00"
}
],
"_source": "shreddit"
} | Field | Type | Description |
|---|---|---|
subreddit | string | The community the listing was read from, without the r/ prefix. |
sort | string | The listing sort that was applied (hot, new, top, rising, or controversial). |
t | string or null | The time window applied for top or controversial, or null when none was set. |
after_cursor | string or null | The cursor for the next page of this listing. Pass it back as after to continue; null when no further page is exposed. |
total_results | integer | How many posts are in the posts array for this page. |
posts | array | The post listing in ranked order, each entry holding the fields below. |
posts[].id | string | The submission's t3_ thing id, unique across Reddit and ready to hand to the post endpoint. |
posts[].title | string | The post title as shown in the listing. |
posts[].score | integer or null | Net upvotes (upvotes minus downvotes) at request time. Null only on the rare .rss fallback when the live vote surface was unreachable. |
posts[].num_comments | integer or null | Comment count Reddit reports for the submission. |
posts[].upvote_ratio | float or null | Share of votes that are upvotes, from 0 to 1, so 0.97 reads as 97 percent upvoted. Null when the listing tag omits it. |
posts[].awards | integer or null | Number of awards on the post when the listing exposes an award count. |
posts[].author | string | Username of the poster, or [deleted] when the account was removed. |
posts[].author_id | string or null | The poster's t2_ account id when Reddit exposes it in the listing. |
posts[].permalink | string (url) | Absolute www.reddit.com link to the submission. |
posts[].external_url | string or null | The outbound link a link post points to, or null for a self post. |
posts[].domain | string or null | Host of external_url (for example github.com) on link posts, otherwise null. |
posts[].created | string | ISO-8601 timestamp of when the post was submitted. |
What you can build with it
Subreddit monitoring at scale
Keyword and topic watch
Idea and demand mining
Trend and ranking research
Seed lists for deeper scraping
Link and image feeds
Why developers pick our Reddit Subreddit Scraper API
Our Reddit subreddit scraper runs the residential fetch, anti-bot clearance, and HTML parsing on our infrastructure, reading the live community listing and returning each thread as a flat post object with real score, comment count, and upvote ratio attached. Pass a subreddit name and the page comes back in about 2.6 seconds behind one api_key, with an after_cursor to walk the listing and a free tier of 1,000 requests.
One key, no developer app
Every sort Reddit serves
Real scores in the listing
Cursor paging built in
Anti-bot and residential proxies
Billed on success
Reddit Subreddit Scraper API compared to the official Reddit API
| Factor | Our Reddit subreddit scraper API | DIY listing scraping | Reddit Data API |
|---|---|---|---|
| Setup | One api_key | Proxies, headers, parser, retries | Registered OAuth client plus token |
| Rate limit | Plan request limit only | None, but you absorb the blocks | 100 queries per minute, OAuth-gated |
| Auth | Single api_key | Custom User-Agent to dodge 429s | OAuth2 bearer token on every call |
| Listing depth | Cursor pages the live feed | You stitch after cursors yourself | 1,000 posts per feed, recent only |
| Scores in listing | Score and ratio per post | Read from rendered markup yourself | Included until quota runs out |
| Anti-bot and proxies | Handled for you | You build and maintain it | Outside the API's scope |
| Output shape | Flat ranked JSON array | Whatever you parse from HTML | Nested Listing JSON |
Free to start, priced to scale
| Plan | Price | Best for |
|---|---|---|
| Free | 1,000 requests | Testing and small jobs |
| Pro | $0.60 / 1k | Production workloads |
| Pay-as-you-go | $0.90 / 1k | Spiky or one-off volume |
Median response 2.6s. You only pay for successful requests.
FAQ
Send the community name in the subreddit parameter to our reddit/subreddit endpoint with your api_key, and add sort to pick hot, new, top, rising, or controversial. The response is a posts array in ranked order, each entry carrying the title, author, score, upvote_ratio, num_comments, permalink, and created timestamp, plus an after_cursor to page on. You do not register a Reddit OAuth app or run any proxy and parsing stack of your own.
No. Reddit's Data API authenticates every request with OAuth2 and holds free access to 100 queries per minute per client id, the ceiling set when Reddit began charging $0.24 per 1,000 calls on July 1, 2023. Our endpoint fetches and parses the listing for you behind a single api_key, so there is no app to register, no client secret to rotate, and no per-minute approval to apply for. The free tier covers 1,000 requests.
Pass sort as hot, new, top, rising, or controversial. The top and controversial sorts also take a t window of hour, day, week, month, year, or all, so you can ask a community for its best threads of the last day or the last year. The hot, new, and rising listings ignore t and return Reddit's current ordering for the subreddit.
Each response includes an after_cursor. Pass that value back as the after parameter on your next call and you get the following page of the same sorted listing. Reddit's own listing surface stops at roughly 1,000 posts per feed and exposes only the most recent ones, so for deeper coverage of an active subreddit, poll the new feed on a schedule and store posts as they appear instead of paging back through history.
Every post returns id, title, score, num_comments, upvote_ratio, awards, author, author_id, subreddit, permalink, external_url, domain, and created. Self posts leave external_url and domain null, while link posts populate both with the outbound URL and its host, so a single shape covers text, link, image, and gallery submissions in the feed.
A listing page returns in a median of 2.6 seconds end to end, including proxy routing, anti-bot clearance, retries, and parsing.
The free tier covers 1,000 requests, Pro pricing is about $0.60 per 1,000 requests, and pay-as-you-go top-ups run $0.90 per 1,000 successful requests. You are billed only for calls that come back with a listing, and each post id can be handed to the reddit/post endpoint when you want the full thread.