Reddit Posts Scraper avatar

Reddit Posts Scraper

Pricing

from $1.44 / 1,000 item processeds

Go to Apify Store
Reddit Posts Scraper

Reddit Posts Scraper

Search and export normalized public Reddit posts by keyword, subreddit, author, URL, and time window for research and monitoring.

Pricing

from $1.44 / 1,000 item processeds

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

Collect normalized public Reddit posts for community research, topic monitoring, content discovery, and data pipelines. Search by keyword, collect a subreddit or author's submissions, process a Reddit URL, and apply a UTC date window. Each dataset row includes the post text, author, subreddit, engagement, flair, media links, permalink, and timestamps.

What does Reddit Posts Scraper do?

Reddit Posts Scraper turns public post feeds into structured JSON records. It supports four ways to identify posts:

  • keyword queries, including focused subreddit:NAME keyword searches;
  • one or more subreddit names;
  • one or more public authors;
  • Reddit post, subreddit, user, or search URLs.

The Actor deduplicates posts across inputs and enforces one run-wide maxItems limit. It can filter records by both Reddit's relative time filter and exact fromDate / toDate boundaries.

Who is this Reddit posts tool for?

  • Community managers tracking topics across relevant subreddits.
  • Market researchers collecting discussion titles, text, and engagement.
  • Content teams finding questions and themes worth answering.
  • Developers and data teams feeding public Reddit data into a warehouse or spreadsheet.
  • Analysts comparing activity across communities or scheduled snapshots.

This Actor collects public posts only. It does not log in, vote, post, message users, or collect private communities.

Why use this Actor?

  • Multiple discovery inputs produce one consistent row format.
  • Post IDs are deduplicated across all supplied targets.
  • Engagement and flair are included when exposed by the available public data surface.
  • Date boundaries are applied consistently before a record is saved.
  • A blocked route is retried through bounded sessions and, where equivalent, a public structured fallback.
  • Charge events map directly to the run start and emitted post records.

What Reddit post data can I extract?

FieldMeaning
postIdReddit post ID
titlePost title
bodyPublic self-post text when available
authorPublic username or [deleted]
subredditCommunity name without r/
scoreVisible or archived post score
commentsCountVisible or archived comment count
upvoteRatioPublic upvote ratio when available
flairPost flair text
postTypetext, link, image, video, or unknown
mediaUrlsPublic image or video URLs discovered for the post
outboundUrlDestination of a link post, or its Reddit URL
permalinkCanonical public Reddit post URL
createdAtPost creation time in ISO 8601
scrapedAtCollection time in ISO 8601
matchedTargetInput target that discovered the post
metricsAvailableWhether engagement enrichment was available

How to scrape Reddit posts

  1. Open the Actor input page.
  2. Add at least one search query, subreddit, author, or Reddit URL.
  3. Choose a sort and relative time filter if relevant.
  4. Optionally add exact UTC fromDate and toDate values.
  5. Set maxItems to bound the output and cost.
  6. Click Start.
  7. Open the Reddit posts dataset view or export JSON, CSV, Excel, XML, or RSS.

A focused first run might use:

{
"searchQueries": ["subreddit:webscraping crawler"],
"sort": "new",
"timeFilter": "year",
"maxItems": 20
}

Input parameters

InputTypeDefaultDescription
searchQueriesstring arraynoneKeywords or phrases. Use subreddit:NAME keyword for a focused community search.
subredditsstring arraynonePublic subreddit names without r/.
authorsstring arraynonePublic Reddit usernames without u/.
startUrlsURL request listnoneReddit post, subreddit, user, or search URLs.
sortstringrelevancerelevance, new, hot, top, or comments.
timeFilterstringallhour, day, week, month, year, or all.
fromDateYYYY-MM-DDnoneKeep posts on or after this UTC date.
toDateYYYY-MM-DDnoneKeep posts on or before this UTC date.
maxItemsinteger50Maximum unique posts across every input, from 1 to 5,000.
maxRequestRetriesinteger2Transient request retries, from 0 to 5.

At least one discovery input is required. Unsupported domains and malformed dates fail clearly instead of producing a silent empty dataset.

Output example

This shortened example reflects the current normalized output shape:

{
"postId": "1visw8i",
"title": "PatronView blocks Amazon's AI crawler after 117,000 daily page reads",
"body": "",
"author": "danie-l",
"subreddit": "webscraping",
"score": 1,
"commentsCount": 0,
"upvoteRatio": 1,
"flair": "Bot detection 🤖",
"postType": "link",
"mediaUrls": [],
"outboundUrl": "http://ppc.land/patronview-blocks-amazons-ai-crawler-after-117-000-daily-page-reads",
"permalink": "https://www.reddit.com/r/webscraping/comments/1visw8i/",
"createdAt": "2026-08-08T10:51:50.000Z",
"scrapedAt": "2026-08-08T15:00:02.920Z",
"source": "reddit",
"matchedTarget": "r/webscraping",
"metricsAvailable": true
}

Values change as Reddit discussions change. A zero score or comment count can be a real value; use metricsAvailable to distinguish successful enrichment from limited metadata.

How much does it cost to scrape Reddit posts?

The Actor uses pay-per-event pricing:

  • one Start event of $0.0025 per run;
  • one Item processed event for each post saved;
  • the BRONZE item price is $0.0024 per post, with lower unit prices on higher platform tiers.

At BRONZE pricing:

Saved postsEstimated Actor charge
10$0.0265
100$0.2425
1,000$2.4025

The estimates are the start event plus saved-item events. Your Apify plan and platform usage can affect the final account total. Use maxItems to set a predictable output ceiling.

Monitor communities and topics

For recurring monitoring, create an Apify Task with stable inputs and schedule it daily or weekly. A useful weekly snapshot can include multiple communities:

{
"subreddits": ["artificial", "technology"],
"fromDate": "2026-08-01",
"toDate": "2026-08-08",
"sort": "new",
"maxItems": 100
}

Store each run's dataset ID or export rows to your destination. Compare postId, score, and commentsCount across snapshots in your own database when change history matters. The Actor emits a current normalized snapshot; it does not maintain cross-run alerts itself.

Export Reddit posts to spreadsheets and data pipelines

From the dataset page you can download JSON, CSV, Excel, XML, or RSS. For automation, connect the run or dataset to:

  • Google Sheets for editorial and community review;
  • Make or Zapier for downstream workflows;
  • a webhook that starts when a run succeeds;
  • a database or data warehouse through the Apify API;
  • an LLM or retrieval pipeline using the normalized body and metadata.

Use postId as the stable source key when upserting records. Use matchedTarget when one run combines several communities or queries.

Run with the Apify API

Set APIFY_TOKEN in your shell rather than embedding it in source control.

cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~reddit-posts-search-scraper/runs?token=$APIFY_TOKEN" \
-H 'content-type: application/json' \
-d '{"subreddits":["games"],"sort":"new","maxItems":25}'

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/reddit-posts-search-scraper').call({
searchQueries: ['subreddit:webscraping crawler'],
sort: 'new',
timeFilter: 'year',
maxItems: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/reddit-posts-search-scraper').call(run_input={
'authors': ['spez'],
'maxItems': 20,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)

Use Reddit Posts Scraper with MCP

Claude Code

Add the Actor to Claude Code through Apify MCP:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/reddit-posts-search-scraper"

Claude Desktop

Add this HTTP server in Claude Desktop's MCP configuration:

{
"mcpServers": {
"apify": {
"type": "http",
"url": "https://mcp.apify.com?tools=automation-lab/reddit-posts-search-scraper"
}
}
}

Cursor

Add the same mcpServers.apify HTTP configuration in Cursor's MCP settings.

VS Code

Add the same Apify HTTP endpoint to your VS Code MCP server configuration.

Example prompts:

  • “Collect 25 new posts from r/games and summarize the recurring themes.”
  • “Search r/webscraping for crawler discussions and return the posts with the most comments.”
  • “Create a weekly Reddit community monitoring input for r/artificial and r/technology.”

Review generated inputs before running them, especially maxItems and date boundaries.

Data quality and source behavior

Reddit can challenge or rate-limit automated requests. The Actor starts with a lightweight public feed, uses bounded sticky-session recovery when needed, and uses an equivalent public structured fallback for subreddit, author, and post targets. It never converts a challenge page into an empty successful result.

Public archive enrichment can lag live Reddit or retain a historical value that later changes. Deleted, removed, quarantined, banned, or private posts may be absent or have limited fields. Global keyword searches rely on Reddit's public search feed; a subreddit:NAME keyword query has a stronger constrained fallback.

Limits and troubleshooting

  • A run can save at most 5,000 posts.
  • Reddit feeds and archive endpoints can expose fewer records than requested.
  • Date filtering applies before saving and charging an item.
  • Inputs are processed in order until the run-wide item limit is reached.
  • Duplicate IDs are saved once.
  • This Actor collects posts, not comment bodies or full comment trees.

If a global query is blocked, retry later or constrain it as subreddit:NAME keyword when that scope meets your research job. If an author or community has no rows, confirm that it is public and has submitted posts in the requested period.

Responsible use and legality

Only collect public data you are permitted to use. Follow Reddit's terms, applicable laws, and the requirements of your downstream systems. Do not use the output for harassment, spam, invasive profiling, re-identification, or decisions that require protected personal data. Minimize retention, secure exports, and honor deletion obligations relevant to your use case. This documentation is not legal advice.

FAQ

Can I search all of Reddit by keyword?

Yes, use searchQueries for public Reddit search. For more resilient focused monitoring, use subreddit:NAME keyword or combine a query with explicit subreddit tasks.

Can I scrape a single Reddit post URL?

Yes. Add a public post URL to startUrls. The result uses the same normalized fields and date filters as discovered records.

Can I collect posts by a Reddit user?

Yes. Add one or more usernames to authors, or provide a public Reddit user URL. Private, suspended, or deleted accounts may return no records.

Does it collect comments?

It returns each post's public commentsCount when available, but it does not collect comment bodies. Use a dedicated comments Actor when you need discussion trees.

Why is metricsAvailable false?

Reddit exposed the post through a feed but the engagement enrichment surface was unavailable. The title, author, body/link, permalink, and timestamp remain useful; engagement fields may be zero.

Why did my run fail instead of returning an empty dataset?

A source challenge is not a genuine no-result response. The Actor fails clearly after its bounded recovery routes are exhausted so monitoring systems can retry or alert rather than store a false empty snapshot.

Choose this Actor when the primary output should be one normalized record per public Reddit post for search and scheduled monitoring.