Reddit Profile Scraper — $0.8/1K · Search & Comments
Pricing
from $0.80 / 1,000 results
Reddit Profile Scraper — $0.8/1K · Search & Comments
Search Reddit posts by keyword or community, collect public discussions, and research profiles. Source-visible text, authors, dates and IDs; explicit coverage diagnostics. $0.8/1K records plus start and usage; optional Residential Proxy costs extra.
Pricing
from $0.80 / 1,000 results
Rating
0.0
(0)
Developer
Apivault Labs
Maintained by CommunityActor stats
0
Bookmarked
14
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Reddit Profile Scraper — Post Search, Discussions & Analytics
⚡ Use this Actor in n8n — no code
Building no-code workflows in n8n? Install our community node and drop this Actor straight onto your canvas:
Setup: in n8n go to Settings → Community Nodes → Install, paste
n8n-nodes-apivault-redditand confirm → add the new node to your workflow → paste your Apify API token → fill in the input and run.
Bulk Reddit user and activity scraper with built-in analytics. Paste usernames or subreddits to collect structured profiles, recent posts and comments, posting-time histograms, per-subreddit activity and contact signals. It works without user login or cookies through public Reddit feeds; optional Reddit OAuth adds full karma and account metadata.
Profile output declares dataSource and dataCompleteness. In public RSS mode, fields Reddit does not publish in feeds are returned as null rather than estimated.
Reddit post search and discussion collection
Choose mode for the result you need: profiles for account research, search for keyword discovery, or discussion for one or more public post URLs. Existing inputs without mode keep profile behavior. New discovery modes use public Reddit sources and can return fewer records than requested when Reddit limits access.
| Your goal | Mode and input | Useful output |
|---|---|---|
| Research an account or author | profiles, usernames | Profile, observed activity, analytics and public contact signals |
| Find posts mentioning a product or topic | search, searchQueries | Unique post IDs, titles, authors, communities, dates and source text |
| Search one community | search, searchSubreddit | Keyword posts restricted to that community |
| Read an already discovered discussion | discussion, discussionUrls | The post and source-visible comments |
| Import into an application or AI workflow | Any mode through the Apify API | JSON Dataset records and separate run diagnostics |
Public RSS does not supply reliable scores, comment totals, reply parents or depth. These fields are null in feed records. A public JSON discussion response, when accessible, supplies actual parent IDs and nesting; it is not guaranteed. fullCoverage remains false: this Actor does not expand Reddit more nodes into a complete comment archive.
First post search: five records
Choose Search posts, enter a phrase, and leave the small output limit in place:
{"mode":"search","searchQueries":["python"],"maxResults":5,"maxPages":1}
After the run, open the Dataset for results and SUMMARY for coverage. Check the run status before importing a batch: a failed later page can leave useful earlier records in the Dataset. A 403/429 is an unavailable source, not a verified empty search.
Search a specific subreddit
{"mode":"search","searchQueries":["automation","workflow"],"searchSubreddit":"Python","searchSort":"new","maxResults":10,"pageSize":10,"maxPages":1}
Duplicates across phrases are emitted once. Each row keeps the first phrase that produced it in query; it is not a list of every matching phrase. Search ordering is requested from Reddit, not calculated locally. The source decides indexing, matching and freshness.
Read a public discussion
{"mode":"discussion","discussionUrls":["https://www.reddit.com/r/matlab/comments/1xb7rm7/"],"maxResults":5,"maxThreadComments":4}
maxResults counts posts and comments across all URLs; maxThreadComments is a per-discussion comment cap. For five URLs with a global cap of five, the first discussion can consume the cap. Increase it deliberately for wider coverage. Deleted or removed JSON comment bodies are excluded. A comment whose parent is not included can still carry its source parent ID; do not assume the returned records form a complete tree.
Pagination and continuation
pageSize requests a search feed size; it does not guarantee that many valid posts. maxPages bounds requests per phrase. Next requests use an actual t3_ post fullname as after, with deduplication and repeated-page stopping. SUMMARY.paginationConfirmed becomes true only when a later fetched page adds new records. It does not prove full coverage.
When the global cap cuts a page, sources[].nextCursor identifies the last retained post, so a manual continuation does not intentionally skip the unused tail. Read this together with the source status; a cursor is not evidence that Reddit will accept another request. Source restrictions can block continuation even when the first feed succeeds.
{"mode":"search","searchQueries":["python"],"after":"t3_1xb7rm7","maxResults":5,"pageSize":10,"maxPages":1}
The cursor above illustrates format, not a promise of a current next page. Choose the actual value from your run.
Network access and predictable limits
Direct requests are the default. Optional proxyMode: "residential" uses your available Apify Residential Proxy access and incurs additional bandwidth usage. It is never silently enabled. An unavailable proxy produces PROXY_UNAVAILABLE with zero result records. Proxy access cannot guarantee that a restricted Reddit endpoint will return data.
{"mode":"search","searchQueries":["python"],"maxResults":5,"maxPages":1,"proxyMode":"residential","requestRetries":1,"sourceTimeoutSeconds":60}
sourceTimeoutSeconds bounds discovery collection, excluding platform startup, proxy initialization and Dataset delivery. Individual connections and reads also have timeouts. requestRetries is limited to 0–2; transient rate limits and server errors have bounded waits. No unlimited request loop is used.
Discovery output contract for applications and agents
| Field | Meaning and limits |
|---|---|
recordType, id, fullname | post or comment; native Reddit ID and t3_/t1_ identity |
title, body | Source title and plain source text; JSON comments have no title |
url, permalink | Public Reddit record URL and path |
author, subreddit | Source author/community when available |
publishedAt, updatedAt | Feed timestamps; a comment can supply only updatedAt |
createdUtc | JSON source Unix timestamp; not synthesized for RSS |
score, numComments | Available JSON metadata; null for RSS |
parentId, depth | Actual JSON hierarchy, otherwise null |
dataSource | reddit-public-atom or reddit-public-json |
query, discussionUrl | Input provenance for the corresponding discovery mode |
The existing profile record contract below is preserved. Discovery rows do not have the profile analytics fields. Consumers should branch on recordType and handle nullable/source-specific fields. contentHtml is source markup; use body for plain text, or sanitize markup before rendering it in an application.
SUMMARY records collection/delivery totals, per-source statuses, limits, hierarchy availability and observed pagination. ERRORS contains validation/source failures outside the paid Dataset. PARTIAL means useful records were retained alongside a collection error or output-budget stop. A collection error fails the run even if earlier results exist, so integrations can detect incomplete imports. A valid empty Atom feed can succeed with zero rows.
Cost of a useful result
The existing tariff is $0.0008 per delivered Dataset record ($0.80 per 1,000), plus the existing $0.00005 startup event at 256 MB and user-paid Apify platform usage. One post plus four comments is five records: $0.004 in result events plus startup and usage. Errors do not become result rows, but startup and consumed resources can still cost money on a failed or empty run. Residential bandwidth, when explicitly selected, is extra.
Set an Apify maximum total event charge for the run as well as a small input cap. The event cap does not cap platform or proxy usage. In discovery modes, delivery checks the SDK charge result and stops when another paid record cannot be delivered. Keep collection limits small too, because collection happens before Dataset delivery.
API quick start
The existing n8n community node and Python wrappers below target this same Actor. Their dedicated UI fields may still cover profiles only. Use the generic Apify API for discovery until a wrapper explicitly exposes the new inputs; do not expect a new mode selector to appear automatically in an already installed node.
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("apivault_labs/reddit-scraper").call(run_input={"mode": "search", "searchQueries": ["python"], "maxResults": 5, "maxPages": 1},max_total_charge_usd=0.02,)if run["status"] != "SUCCEEDED":raise RuntimeError("Inspect SUMMARY and ERRORS before importing partial data")for row in client.dataset(run["defaultDatasetId"]).iterate_items():print(row["fullname"], row["title"], row["url"])
For an AI agent, pass a JSON object matching the input schema, choose one mode, and set explicit small limits. This is a normal Actor API workflow; no dedicated MCP server is claimed. Existing public Tasks are preserved; this update does not create new discovery Tasks.
Discovery FAQ
Can I collect every Reddit comment? No. Feed coverage is partial; public JSON access is source-dependent, and more expansion is not implemented. Inspect hierarchyAvailable, pending IDs and collection errors.
Why did a search stop early? The global cap, page cap, empty/repeated feed, deadline, access restriction or event budget can stop it. Inspect each source in SUMMARY instead of treating a small Dataset as complete coverage.
Does a missing score mean zero votes? No. Unknown scores are null. The Actor does not estimate votes from titles, position or comment count.
Can I reuse my old profile input? Yes. Omitted mode defaults to profiles; profile controls apply there. Search and discussion ignore the usernames prefill and profile filters.
Is this sentiment analysis or an LLM summary? No. It returns source text for your own downstream analysis. It does not invent sentiment, summaries or engagement values.
✨ What's inside every profile record
| Group | Fields |
|---|---|
| Identity | username, displayName, bio, profileUrl, avatar, snoovatar, profileColor |
| Karma | postKarma, commentKarma, awardeeKarma, awarderKarma, totalKarma |
| Account | createdAt, accountAgeDays, karmaPerDay, lastActiveAt, followerCount |
| Flags | verifiedEmail, isPremium, isEmployee, isModerator, isSuspended, over18, acceptFollowers |
| Collections | trophies, moderatedSubreddits |
| Analytics 🆕 | mostActiveSubreddits, topSubredditsByKarma, postingHoursUTC (0-23 histogram) |
Plus optional activity: latest posts (score, ratio, comments count, flair, NSFW, selftext) and comments (body, score, post title, controversiality).
🎯 Why teams pick this Actor
- 📇 Contact discovery built in — emails, social links (Instagram, X/Twitter, TikTok, OnlyFans, Linktree, Telegram, Discord…) and external domains extracted from bio + recent activity. Review publicly exposed contact signals before any authorized downstream use.
- 🔍 Subreddit → leads pipeline — paste
r/your-nicheand get profiles of authors observed in the requested listing sample, filtered by your quality gates. - 🚦 Lead filters you don't pay for — activity and contact filters work in both profile sourcing modes (RSS and OAuth); karma and account-age filters require OAuth metadata. Filtered-out profiles are never billed.
- 🤖 Bot/farm score (0-100) — around-the-clock posting, duplicate-text bursts, new-high-karma, single-sub spam patterns, with human-readable signals.
- 📈 Change tracking — opt-in
trackChangescompares each account with your previous runs (karmaDelta,previousScrapedAt). Monitor growth without external tooling. - 📊 Behavior analytics — posting-hours histogram (UTC), most-active subreddits, top subreddits by karma, karma-per-day velocity.
📦 Bulk input — one run, many profiles
{"usernames": ["nasa", "u/spez", "https://www.reddit.com/user/GovSchwarzenegger/"],"maxPosts": 25,"maxComments": 25}
All formats resolve to the same account. Set maxPosts/maxComments to 0 for profile-only requests; full metadata requires enhanced OAuth and public RSS coverage can be insufficient.
📤 Output
Three record types in one dataset, filterable by recordType:
- profile — one per account (all fields above)
- post — latest submissions with metadata
- comment — latest comments with metadata
Export as JSON, CSV, Excel, XML — ready for Sheets, CRMs and dashboards.
💰 Pricing
- $0.0008 per record ($0.8 per 1,000 records) — plus startup and user-paid platform usage
- Profile-only run on 1 account = 1 record = $0.0008
- Filtered-out profiles (lead filters) are never billed
- Suspended/deleted/nonexistent accounts are listed in the run
SUMMARYand are not written to the paid Dataset, so failed lookups are not billed
⚡ Performance
- Profile-only: typically a few seconds per account
- Rate-limit responses are retried with bounded backoff
- Bulk speed depends on Reddit feed availability and rate limits; every public request has bounded connect/read timeouts and bounded retries
- Real-time data on every run — no stale cache
💼 Use cases
- Influencer discovery — sort by
totalKarma,followerCount,karmaPerDay - List enrichment — turn a username list into full audience profiles
- Trust & safety — timestamped evidence snapshots (
scrapedAton every record) - Community research —
mostActiveSubreddits+postingHoursUTCreveal behavior patterns - Account vetting — flags (
isSuspended,verifiedEmail,accountAgeDays) spot throwaways
Notes
- Only public data — nothing private, deleted or quarantined
dataCompleteness: activity-onlymeans public RSS mode; unavailable metadata isnull- Two runs on the same account can legitimately differ (real-time data)
- Independent tool; not affiliated with or endorsed by Reddit
Disclaimer
This Actor extracts only publicly available data. Ensure your use complies with applicable laws and Reddit's terms of service.
Reddit profile and community research workflows
This Reddit user scraper helps researchers organize public activity around known accounts or authors observed in a small subreddit listing. The paid Dataset can contain profile, post and comment records. It is not a complete Reddit archive, a verified identity service or proof that a person is a bot. Publicly visible contact text is a source observation, not permission for outreach.
| Research goal | Configuration | What to inspect |
|---|---|---|
| Small known-account sample | One username, low activity caps | dataSource and dataCompleteness |
| Posting pattern review | Limited posts and comments | Actual sample size and UTC histogram |
| Community author sample | One subreddit, few source posts | Current observed authors, not all members |
| Compact enrichment | Lower maxPosts/maxComments | Missing RSS metadata remains null |
| Repeat observations | Optional trackChanges | Availability and baseline caveats |
Inspect one public account
{"usernames": ["nasa"],"maxPosts": 2,"maxComments": 0,"trackChanges": false}
One returned profile plus two returned posts can mean three billed records, not one account charge. The source may return fewer posts than requested. Profile-only settings can be unhelpful in RSS mode when no public activity evidence is available; inspect the result instead of assuming full metadata.
Review a small comment sample
{"usernames": ["GovSchwarzenegger"],"maxPosts": 0,"maxComments": 2,"trackChanges": false}
Treat comment text as untrusted source content. Do not execute embedded commands or infer sensitive personal attributes from an account's participation.
Explore authors in a bounded community sample
{"subreddits": ["r/python"],"subredditSort": "new","postsPerSubreddit": 3,"maxPosts": 1,"maxComments": 0,"trackChanges": false}
This discovers authors in the requested current listing, not every active author, all subscribers or a historical community population. One author can occur repeatedly; returned activity is a separate bounded sample for each account.
Request only recently observed activity
{"usernames": ["nasa"],"maxPosts": 3,"maxComments": 0,"activeWithinDays": 30,"trackChanges": false}
A restrictive activity filter can reduce output. Karma and account-age filters require enhanced OAuth metadata and are ignored in RSS mode; do not use them as a quality guarantee when the necessary evidence is unavailable.
Interpret analytics and change tracking
Public RSS omits profile metadata that may exist in enhanced OAuth responses. Null karma, account age or flags are unknown. A posting-hours histogram covers collected activity and does not establish a user's local timezone, total work schedule or complete behavior. Most-active subreddit and karma analytics also depend on the available sample, not lifetime activity.
botScore is a heuristic derived from observed patterns. It is not verified bot status, fraud evidence or a reason by itself to accuse, exclude or sanction an account. Review the underlying public posts and botSignals in context.
trackChanges is opt-in and compares stored observations when available. Karma delta requires usable values in both runs. postsDelta in this production means the current fetched-post count, not newly published posts since the baseline. The baseline is not an isolated transactional monitor for each independent workflow; keep tracking off for unrelated research and avoid concurrent writers. No complete edit/deletion history or automatic notification service is claimed.
Dataset export and cost planning
Keep recordType, username and available source URLs/timestamps when exporting. Use JSON for nested analytics and collections, or filter each recordType before building a spreadsheet so profile and activity fields do not become confused. Read SUMMARY to distinguish failed lookups from successful data delivery.
At $0.0008 per Dataset record, one profile plus two posts costs $0.0024 in result events if all three are delivered. Add the $0.00005 start event per GB, minimum one, and user-paid platform usage. maxPosts/maxComments are per profile; they are not a run-wide charge cap. Use an Apify charge limit and a small input.
Reddit research FAQ
Are RSS results full profiles? No. dataCompleteness declares activity-only coverage and fields unavailable from feeds remain null.
Are all discovered authors billable? Filtered-out and failed profiles are excluded, but an accepted profile and its collected activity are separate rows.
Can I use this with MCP? Discover apivault_labs--reddit-scraper, inspect
tools/list, then send the same small Actor input. Keep returned run/storage IDs
and inspect actual rows and SUMMARY before answering a research question.
Do I need another run to export CSV? No. Export the stored Dataset or use its items API. A repeated Actor run collects new observations and may create charges.
n8n and developer integrations
Use this Actor in your automation or application with the existing community integrations below. An Apify account and API token are required; Actor and platform charges follow the current pricing.
- n8n community node: n8n-nodes-apivault-reddit. Install package name
n8n-nodes-apivault-redditin a self-hosted n8n instance that permits community packages. - Python client and examples: GitHub.
- Python client and examples: GitHub.
- n8n source and usage: GitHub.
- n8n source and usage: GitHub.
These are community packages. Publication on npm does not establish n8n verification or availability in n8n Cloud. Review the linked package README for supported inputs and setup.
Complete input reference
Choose the mode first. Profile filters and tracking apply only to profiles; discovery controls apply to search and discussion.
| Parameter | Default | Purpose |
|---|---|---|
mode | "profiles" | Profiles keeps the existing behavior. Discovery depends on public Reddit access; 403/429 is reported in ERRORS. |
usernames | "not set" | One or many accounts: plain username ('nasa'), 'u/nasa', or a full profile URL (https://www.reddit.com/user/nasa/). Bulk lists supported — one profile record per account. |
maxPosts | 25 | Latest submissions to collect per account (0 = profile only). Each collected post is a billable dataset item. |
maxComments | 25 | Latest comments to collect per account (0 = none). Each collected comment is a billable dataset item. |
searchQueries | "not set" | Search mode only. 1–10 phrases; results deduplicated across phrases. |
searchSubreddit | "not set" | Optional bare name, e.g. Python. Search mode only. |
searchSort | "new" | Ordering requested from Reddit search. Search mode only. |
discussionUrls | "not set" | Discussion mode only. 1–10 public HTTPS Reddit post URLs. Full comment coverage is not guaranteed. |
maxResults | 5 | Global post + comment cap across all discovery inputs. Not used for profiles. |
maxThreadComments | 20 | Maximum visible comments per URL. Missing replies are not fabricated. |
pageSize | 10 | Requested feed size; Reddit can return fewer. Discovery only. |
maxPages | 2 | Stops on repeated or empty pages. Continuation is source-dependent. |
sourceTimeoutSeconds | 90 | Global collection deadline for discovery modes. |
requestRetries | 1 | Bounded retry for 429 and server/network failures. No bypass of unavailable access. |
after | "not set" | Optional t3_ fullname cursor for search. Not a guarantee of additional source results. |
proxyMode | "direct" | Optional for search and discussion only. Residential bandwidth is charged by Apify separately and availability depends on your account. Does not guarantee Reddit access. |
subreddits | "not set" | Lead discovery: paste subreddits (r/datascience or a URL) and the Actor profiles every author of current posts. Combines with the usernames list above. |
subredditSort | "hot" | Which listing to pull authors from: Hot (active now), New (fresh posters), Top, Rising. |
postsPerSubreddit | 50 | How many posts to scan for authors per subreddit (1-100). |
minKarma | 0 | Skip accounts below this karma (0 = off). Applied when Reddit OAuth enhanced mode is available. |
minAccountAgeDays | 0 | Skip fresh accounts (0 = off). Applied when Reddit OAuth enhanced mode is available. |
activeWithinDays | 0 | Keep only accounts that posted or commented in the last N days (0 = off). |
hasContactInfoOnly | false | Keep only profiles where an email or social link was found (bio/posts/comments). |
trackChanges | false | Adds karmaDelta and previousScrapedAt to each profile by comparing with your previous runs of the same accounts. |