ParseForge Scrapers

Reddit Scraper - Posts, Subreddit & Search Data API

parseforge/reddit-posts-scraper

Social mediaDeveloper tools

High-speed scraper for Reddit posts from subreddits. Extracts 1000+ posts/minute with all filters: score, comments, flair, domain, author, NSFW, spoilers. No authentication required.

Run this scraper See the API call
Total users
1.5K
Monthly active
128
Total runs
40.3K
Bookmarked
24
Rating
5.0 (3)
Last modified
8 days ago

Overview

ParseForge

Reddit Scraper - Posts, Subreddit & Search Data API

Scrape Reddit posts from any subreddit, search query, or URL, up to a million per run. Every post comes with its score, comments, upvote ratio, full body text, and computed virality and engagement signals. No login or API key. Export to CSV, JSON, Excel, or XML.

Reddit's official API needs an app registration, OAuth, and rate-limits you. This reads the public post feeds directly, filtered by score, comments, flair, domain, or author, and returns each match in one fixed schema.

Who uses it What they scrape Reddit for
Market researchers Which topics and products a niche is discussing this week
Brand and social teams Mentions of a brand, product, or competitor across subreddits
Data scientists Labeled post corpora for sentiment, topic, and RAG models
Growth marketers Threads where people ask for recommendations or name a rival
Journalists and academics Primary-source discussion with scores, ratios, and timestamps

What it does

This Actor collects Reddit posts by subreddit, search query, or direct URL, and returns each one as a flat row. Every post carries:

  • ๐Ÿงพ Core fields: title, author, subreddit, score, upvote ratio, comment count, and posting time.
  • ๐Ÿ“ Full body: selfText as plain text and selfTextHtml as rendered HTML.
  • ๐Ÿšฉ Flags: NSFW, spoiler, stickied, locked, archived, video, gallery, crosspost.
  • ๐Ÿ“Š Computed signals: virality score, engagement rate, controversy score, estimated views, and post age.

Results export to CSV, JSON, Excel, or XML, or stream from the API.

What you can do with Reddit data

๐Ÿ“ˆ Track topics and trends.

Run a set of subreddits sorted by top over the past week and read which titles, scores, and comment counts are climbing.

๐Ÿ” Monitor a brand or competitor.

Search your name, your rivals, and your product names on a schedule, filter to a minimum score, and see which subreddits mention you.

๐Ÿง  Build sentiment and NLP datasets.

Collect thousands of posts and their body text across subreddits and keywords for a labeled corpus of real discussion.

๐ŸŽฏ Find leads and feedback.

Search problem-phrases and product categories, filter by comment count, and surface threads asking for recommendations.

Why choose this scraper

What you get
Three inputs, one run Feed it subreddits, search queries, and direct URLs together. Every source returns the same fields.
Filters that cut noise Score, comment, flair, domain, and author filters. Only matching posts are written and billed.
Signals already computed Virality, engagement, controversy, estimated views, and post age on every row, ready to sort.
Full post body Text posts include the complete selfText and selfTextHtml.
Cross-platform enrichment Optional Google, YouTube, Amazon, and News momentum signal per post.
Four export formats CSV, JSON, Excel, and XML, from the dashboard or the API.

How it compares

The established Reddit scrapers pull posts and comments. This one adds a computed analytics layer on every post: virality, engagement, controversy, and reach estimates. The others go broader on comments and profiles; none return those signals.

Feature ParseForge trudax harshmaur fatihtahta
Virality & engagement analytics Yes, every row No No No
Controversy score & estimated views Yes No No No
Reddit's raw fields (score, ratio, awards) Yes Yes Yes Yes
Cross-platform momentum enrichment Optional No No No
Comments & user profiles Posts-focused Yes Yes Yes

What a Reddit post looks like

Every post returns as one flat JSON row. Here is a real record, unedited apart from a trimmed body:

{
  "id": "1tlh5aj",
  "parsedId": "1tlh5aj",
  "title": "Announcement: We've Updated The Rules, and April Is Finally Over",
  "author": "ChemicalRascal",
  "authorId": "t2_4ta76",
  "subreddit": "programming",
  "subredditId": "t5_2fwo",
  "score": 940,
  "upvoteRatio": 0.94,
  "numComments": 160,
  "createdUtc": 1779544477,
  "createdAt": "2026-05-23T13:54:37.000Z",
  "selfText": "After temporarily banning LLM-related content over April, and asking for feedback on that ban, we've decided to end the temporary ban on AI-related posts...",
  "url": "https://old.reddit.com/r/programming/comments/1tlh5aj/announcement_weve_updated_the_rules_and_april_is/",
  "permalink": "https://www.reddit.com/r/programming/comments/1tlh5aj/announcement_weve_updated_the_rules_and_april_is/",
  "domain": "self.programming",
  "isSelf": true,
  "isVideo": false,
  "isGallery": false,
  "isOriginalContent": false,
  "isCrosspost": false,
  "linkFlairText": null,
  "over18": false,
  "spoiler": false,
  "stickied": true,
  "locked": false,
  "archived": false,
  "awards": 0,
  "distinguished": "moderator",
  "viralityScore": 89.8,
  "engagementRate": 17,
  "controversyScore": 1,
  "estimatedViews": 1000,
  "postAgeHours": 1417.4,
  "postedDay": "Saturday",
  "postedHour": 13,
  "contentType": "text",
  "scrapedAt": "2026-07-21T15:21:22.346Z"
}

Link posts carry an external url and domain instead of body text. linkFlairText is null when a post has no flair.

Configure the run

Drive the Actor from three source types, alone or together: subreddits, search queries, and direct URLs. Filters (score, comments, flair, domain, author) run as each post is read, so only matches reach your dataset. The Input tab lists every parameter.

Grab the week's top posts from a couple of subreddits:

{ "subreddits": ["programming", "datascience"], "sort": "top", "time": "week", "maxItems": 200 }

Search all of Reddit for a topic and keep only posts with real traction:

{ "searchQueries": ["vector databases"], "sort": "relevance", "minScore": 100, "minComments": 25, "maxItems": 300 }

Scrape a specific subreddit URL and add a cross-platform momentum signal to every post:

{ "startUrls": ["https://www.reddit.com/r/technology/top/?t=month"], "enrichOutput": true, "maxItems": 150 }

Pricing

Pay-per-event: $0.00338 per post, dropping to $0.003 at higher volume, plus a $0.054 run-start fee (down to $0.048). You pay only for posts written to your dataset.

Posts collected Approximate cost
100 $0.39
1,000 $3.43
10,000 $33.85

At higher monthly volume the per-post rate drops to $0.003, so 10,000 posts runs about $30. New Apify accounts start with $5 in free credit.

Free users

Free-plan runs return up to 10 posts as a preview. Upgrade your Apify plan to collect up to 1,000,000 posts per run.

Run it

  1. Create a free Apify account with $5 in credit.
  2. Open the Reddit Posts Scraper.
  3. Enter subreddits, searchQueries, or startUrls, pick a sort and time, add any filters, and click Start.
  4. Export the results as CSV, Excel, JSON, or XML from the Dataset tab.

Run it programmatically through the Apify API or the ApifyClient for JavaScript and Python.

Use with AI agents (MCP)

Give an AI agent live access to Reddit through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/reddit-posts-scraper"

Then prompt it in plain language:

  • "Search Reddit for posts about vector databases from the past week and summarize the top 20 by score."
  • "Pull the top 50 posts from r/datascience this month and list the most discussed topics."
  • "Monitor r/programming for posts mentioning our product and export the matches as a table."

Copy this into ChatGPT, Claude, or Cursor to start:

Use the Apify Actor "parseforge/reddit-posts-scraper" to collect Reddit posts by subreddit, search query, or URL. Input: { "subreddits": ["<name>"], "searchQueries": ["<keyword>"], "sort": "<hot|new|top|rising>", "maxItems": <n> }. It returns title, author, subreddit, score, upvoteRatio, numComments, selfText, url, permalink, and posting date per post. Call it with the ApifyClient and my APIFY_TOKEN.

Troubleshooting

Why am I getting no results?

The subreddit may be misspelled, private, or banned. If you search with sort: top or controversial, widen the time window. A narrow hour or day returns nothing for low-traffic terms.

Why fewer posts than I asked for?

A single feed holds a limited number of posts, and your score, comment, flair, or domain filters remove more. Loosen the filters or add more subreddits and queries.

Why is a field empty?

Link posts have no selfText, text posts have no external domain, and linkFlairText is null when a post has no flair. That is the post's real state.

Why is the run slow?

Each page holds up to 100 posts, so large maxItems or postsPerSource values fetch more pages. Lower them or split one job into scheduled runs.

A field stopped filling.

Reddit changed its public response shape. Email us with your run ID so we can update the parser.

FAQ

Question Answer
Do I need a Reddit API key or app? No. It reads Reddit's public feeds, so there is no OAuth app, client secret, or token to manage.
How is this different from the official API? The official API is rate limited and needs OAuth. This returns the same public posts with virality and engagement already computed.
Can I search all of Reddit, or only subreddits? Both. Use subreddits for communities, searchQueries across all of Reddit, and searchInSubreddit to scope a search.
Does it return the full post body? Yes for text posts: selfText and selfTextHtml. Link posts point to an external url and domain.
Can I filter by score, comments, or flair? Yes. Set min and max score and comments, plus flair, domain, and author filters. Only matches are written and billed.
Does it scrape comments too? It focuses on posts and their comment counts. For full threads, use a dedicated comment scraper.
How many posts per run? Free plan: 10. Paid: up to 1,000,000, bounded by what the feeds and filters return.
What are the virality and engagement scores? Signals computed from score, comments, ratio, and age for ranking. They are estimates, not official Reddit metrics.
Is this an official Reddit product? No. It is unofficial and reads only public Reddit data.

Related actors

Browse the full ParseForge collection for more scrapers.

๐Ÿ†˜ Need help? Email parseforge@protonmail.com with your run ID, your input, and what you expected.

โš ๏ธ Disclaimer. This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by Reddit, Inc. It collects only publicly available Reddit data. You are responsible for using the data in compliance with Reddit's terms and applicable laws, including GDPR, CCPA, and PIPL. Do not use it to identify, profile, or target individuals.

Input

FieldTypeWhat it doesDefault
maxItems integer How many posts to collect per run. 10
startUrls array Direct Reddit URLs to scrape. Supports subreddit URLs and search URLs. Examples: - https://www.reddit.com/r/programming/ - https://www.reddit.com/r/javascript/top/ - https://www.reddit.com/search?q=machine+learning not set
subreddits array List of subreddits to scrape posts from (without r/ prefix). Examples: programming, javascript, datascience ["programming","javascript","typescript"
searchQueries array Search terms to find posts across Reddit. Each query will search all of Reddit unless you specify a subreddit in the query. Examples: - machine learning - best programming language 2025 - subreddit:programming typescript not set
searchInSubreddit string Limit search queries to a specific subreddit (optional). Leave empty to search all of Reddit. not set
sort string (6 options) How to sort the posts: - hot: Currently popular posts - new: Most recent posts - top: Highest scored posts (use with Time Filter) - rising: Posts gaining momentum - controversial: Most debated posts - relevance: Best match (search only) hot
time string (6 options) Time range for 'top', 'controversial', and search results: - hour: Past hour - day: Past 24 hours - week: Past 7 days - month: Past 30 days - year: Past 365 days - all: All time day
includeNSFW boolean Include posts marked as NSFW (Not Safe For Work / 18+) true
includeSpoilers boolean Include posts marked as spoilers true
includeStickied boolean Include moderator-pinned posts at the top of subreddits true
minScore integer Only include posts with at least this many upvotes. Leave empty for no minimum. not set
maxScore integer Only include posts with at most this many upvotes. Leave empty for no maximum. not set
minComments integer Only include posts with at least this many comments. Leave empty for no minimum. not set
maxComments integer Only include posts with at most this many comments. Leave empty for no maximum. not set
flairFilter string Only include posts with this exact flair text. Case-sensitive. Example: Discussion, Question, Tutorial not set
domainFilter string Only include posts from URLs containing this domain. Examples: youtube.com, github.com, imgur.com not set
authorFilter string Only include posts from this specific author (username without u/). not set
maxPages integer Maximum number of pages to scrape per subreddit/query. Each page contains up to 100 posts. 10
postsPerSource integer Maximum posts to scrape from each subreddit or search query. 100
includeAuthorProfile boolean Fetch each post author's public profile (karma, account age, verified status) and attach it under the `authorProfile` field. Off by default. false
includeComments boolean Fetch the top comments for each post and attach them under the `comments` field. Off by default. false
commentLimit integer How many top comments to fetch per post when 'Include comments' is on. 20
includeSentiment boolean Add an AI sentiment classification (positive / neutral / negative + score) for each post under the `sentiment` field. Off by default. false
downloadMedia boolean Download each post's image (and thumbnail) and host it on Apify storage, attaching the hosted URL under the `media` field. Images only, videos are skipped. Off by default. false
enrichOutput boolean Toggle on to add a cross-platform momentum signal to every scraped post. Each post gets enriched with Google / YouTube / Amazon / News search momentum + growth rates under the `enrichment` field. Default off (free of charge). Requires an enrichment connector below. false
enrichConnector string Pick the Trends MCP (recommended) for cross-platform momentum, or DataForSEO for Google SERP rank + news pack on the topic. Click '+' to authorize a new connector if you haven't yet. not set
enrichTool string Override the auto-picked tool name. Leave empty for auto-detect (Trends โ†’ get_trends, DataForSEO โ†’ serp_organic_live). not set
mcpConnector string Pick a connector (Notion, Linear, Airtable, Jira, Monday, etc.) or click '+' to create a new one via OAuth. See the README for the full list of 16 verified-working MCP services with use case examples. not set
mcpMode string (2 options) Per-post: one Notion sub-page / GitHub issue / Linear ticket per scraped Reddit post (default). Summary: a single message at the end with top post + stats. perPost
mcpTarget string For services that need a destination: paste the URL or ID. Notion example: https://www.notion.so/Reddit-abc123def. Slack/Discord don't need this. For Notion, connect the target page to your Apify integration via Notion's Connections menu before running. not set
mcpMessage string Leave empty for a pretty pre-formatted default. Or write your own Markdown: Notion renders headings (#), lists (-), quotes (>), bold (**), links ([text](url)), dividers (---). Per-post placeholders: {{post.title}}, {{post.url}}, {{post.author}}, {{post.score}}, {{post.subreddit}}, {{post.permalink}}, {{post.numComments}}, {{post.selfText}}, {{post.createdAt}}, {{post.domain}}. Summary placeholders: {{totalPosts}}, {{durationSec}}, {{topPost.title}}, {{topPost.url}}, {{topPost.score}}, {{topPost.author}}, {{topPost.subreddit}}, {{datasetUrl}}. not set
mcpTool string Override the auto-detected MCP tool. By default the actor picks the first write-style tool on the connector (e.g. send_message for Slack, notion-create-pages for Notion, create_issue for Linear/GitHub). Leave empty for auto-detect. not set
mcpArguments object Override the full argument shape (e.g. Notion's rich_text blocks). If empty, arguments are auto-built from the message + the tool's inputSchema. Leave empty for normal use. not set
mcpProxyUrlOverride string Diagnostic only. Bypasses Apify's MCP proxy and talks directly to an MCP server URL, useful for debugging Apify proxy issues. Example: https://mcp.airtable.com/mcp. Leave empty for normal use. not set
mcpTokenOverride string Diagnostic only. Used with the URL override above, paste the service's API key or PAT to authenticate directly. Example: for Airtable, get a PAT at airtable.com/create/tokens with scopes data.records:write + schema.bases:read. Leave empty for normal use. not set

Pricing

from $3.00 per 1,000 results

Charged forWhat it isPrice each
result Single result in the default dataset. $0.003 to $0.00338
Actor Start Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). $0.048 to $0.054
Search query Charged once per search query resolved against Reddit. $0.00814 to $0.009
Cross-platform enrichment Charged per post enriched with a cross-platform momentum signal. $0.01357 to $0.015
Author profile Charged per unique post author whose public profile is fetched. $0.00271 to $0.003
Comment Charged per comment collected from a post thread. $0.00163 to $0.0018
Sentiment analysis Charged per post scored for sentiment and topic. $0.00724 to $0.008
Media download Charged per image downloaded and hosted. $0.00452 to $0.005

Tiered: the lower figure is the price on a higher Apify plan. Billing and the free credit live on Apify.

API

One POST returns the dataset directly. Same shape for every scraper in the library, so swapping the slug is the only change.

POST ยท run and get results
curl -X POST "https://api.apify.com/v2/acts/parseforge~reddit-posts-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "helloWorld": 123
  }'

Examples

Input that runs as-is.

input.json
{
  "helloWorld": 123
}

Reviews

Rated 5.0 out of 5 across 3 reviews. Read them on Apify.

Issues

We build and maintain this scraper, so a problem with it comes to us. Report it on the Apify listing and the thread stays attached to the scraper where the next person can find it: open an issue.

Broken and urgent, or you would rather not post in public? Write to parseforge@protonmail.com and it reaches the people who wrote it.

Related scrapers

Run Reddit Scraper - Posts, Subreddit & Search Data API on Apify All scrapers