Reddit Post Scraper API
Point our Reddit post scraper at one submission and the post object comes back as structured JSON: its title, selftext body, author, score, upvote ratio, comment count, creation time, and permalink, all from a single REST call.
Why Reddit Post data is hard to collect
Reading one post through Reddit's Data API means registering an OAuth client and holding it under 100 queries per minute, the free ceiling Reddit drew alongside its $0.24 per 1,000 calls charge in June 2023. Appending .json to a submission URL looks easier, yet that route answers anonymous bots with HTTP 429 unless you send a custom User-Agent, and Reddit's recovery pages do not reliably expose the score or upvote ratio you came for.
Call the Reddit Post Scraper API in one request
curl "https://api.redditscraperapi.com/api/v1/reddit/post?url=https://www.reddit.com/r/python/comments/1abc234/&api_key=$API_KEY" import requests
resp = requests.get(
"https://api.redditscraperapi.com/api/v1/reddit/post",
params={
"post_id": "1abc234",
"subreddit": "python",
"api_key": "YOUR_API_KEY",
},
)
post = resp.json()["post"]
print(post["title"], "by u/" + (post["author"]["username"] or "[deleted]"))
print("Score:", post["score"], "| Ratio:", post["upvote_ratio"], "| Comments:", post["num_comments"])
if post["body"]:
print(post["body"][:200]) Parameters
| Parameter | Required | Default | Notes |
|---|---|---|---|
post_id | optional | - | The submission's base-36 id, with or without the t3_ prefix (for example 1abc234). Send post_id with subreddit, or send url. |
url | optional | - | Any reddit.com .../comments/ |
subreddit | optional | - | The subreddit the post sits in, without the leading r/. Required when you pass post_id on its own so we can reach the canonical submission; a full url already carries it. |
sort | optional | top | Sort applied to the thread that ships alongside the post: top, new, or controversial. The post object itself is unaffected. |
Fields the Reddit Post Scraper API returns
{
"post": {
"id": "t3_1abc234",
"title": "What is your favorite Python library and why?",
"author": { "username": "dev_jane", "id": "t2_8x4q1" },
"score": 4821,
"upvote_ratio": 0.97,
"num_comments": 936,
"created": "2026-05-31T14:22:08+00:00",
"body": "I keep coming back to requests for almost everything. What is the one library you would not start a project without?",
"permalink": "https://www.reddit.com/r/python/comments/1abc234/",
"external_url": null,
"domain": null,
"is_locked": null,
"is_removed": null
},
"comments_returned": 48,
"_meta": {
"source": "svc-comments+post-page",
"sort": "top",
"pages_fetched": 2,
"truncated": false
}
} | Field | Type | Description |
|---|---|---|
post.id | string | The submission's t3_ thing id, unique across Reddit. |
post.title | string | The post title exactly as shown on the submission page. |
post.author | object | The poster as { username, id }; username is [deleted] when the account was removed. |
post.score | integer or null | Net upvotes (upvotes minus downvotes) at request time. Null only when the live vote surface was unreachable. |
post.upvote_ratio | float or null | Share of votes that are upvotes, from 0 to 1, so 0.97 means 97 percent upvoted. |
post.num_comments | integer | Total comment count Reddit reports for the submission. |
post.created | string | ISO-8601 timestamp of when the post was submitted. |
post.body | string or null | The selftext body for a text post, decoded to plain readable text. Null for a pure link, image, or video post. |
post.permalink | string (url) | Absolute www.reddit.com link to the submission. |
post.external_url | string or null | The outbound link a link post points to. Null when the post is self text. |
post.domain | string or null | Host of external_url (for example youtube.com) for link posts, otherwise null. |
post.is_locked | boolean or null | Whether the submission is locked to new comments. |
What you can build with it
Keyword and mention tracking
Idea and demand mining
Virality and ranking signals
Link-post auditing
Dataset and LLM corpora
Archiving and compliance
Why developers pick our Reddit Post Scraper API
Our Reddit post scraper runs the residential fetch, anti-bot clearance, and HTML parsing on our infrastructure, then folds Reddit's split submission markup into one flat post object with the real selftext and vote data attached. Hand it a post id and a subreddit, or just the URL, and the parsed submission returns in about 2.6 seconds behind a single api_key, on a free tier of 1,000 requests.
One key, no developer app
Selftext bodies, fully decoded
Live score and upvote ratio
Link and self posts alike
Billed on success
Reddit Post Scraper API compared to the official Reddit API
| Factor | Our Reddit post scraper API | DIY .json fetching | Reddit Data API |
|---|---|---|---|
| Setup | One api_key | Proxies, User-Agent, parser, retries | Registered OAuth client plus token |
| Rate limit | Plan request limit only | 10 rpm anonymous before 429s | 100 queries per minute, OAuth-gated |
| Auth header | Not your concern | Custom User-Agent or instant 429 | OAuth bearer token on every call |
| Selftext body | Decoded plain text | You strip the markup yourself | Rich-text JSON you unpack |
| Score and ratio | Read from the live page | Often missing on recovery pages | 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 post object | Whatever you parse | 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 submission's post id together with its subreddit, or just paste the thread URL, to our reddit/post endpoint with your api_key. The response carries a post object holding the title, author, score, upvote_ratio, num_comments, created timestamp, selftext body, permalink, and link fields. You do not register a Reddit OAuth app or run any proxy and parsing stack of your own.
Each post returns id, title, author as a username and id pair, score, upvote_ratio, num_comments, created, body (the selftext for text posts), permalink, external_url and domain for link posts, plus is_locked and is_removed flags. A text submission carries a body and a null external_url, while a link submission carries external_url and domain with a null body, so one shape fits both.
Yes. The endpoint fetches the live submission page through residential proxies and parses it for you, so no Reddit API access or OAuth client is involved. That matters because the anonymous shortcut of adding .json to a post URL returns HTTP 429 to automated traffic without a custom User-Agent, and Reddit's fallback pages frequently omit the score and upvote ratio. Our call returns those values from the rendered page, which is what makes it practical to scrape Reddit posts at any volume.
The reddit/post response is built around the submission object, and it also ships the first page of the thread as a comments array with a comments_returned count, sorted by the sort you pass. When the whole conversation is what you are after, the dedicated Reddit comment scraper API page covers the nested reply tree, depth, and parent ids in full. For post-level work, read the post object and ignore the rest.
Either works. Pass the base-36 post id (with or without the t3_ prefix) along with the subreddit it lives in, and we build the canonical submission URL for you. Or pass the full reddit.com comments URL and we read the id and subreddit out of it. A subreddit is needed with a bare post id because the underlying page is keyed by r/{subreddit}, so id alone cannot be resolved.
Submissions return 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 return the post.