Reddit Profile Scraper — $0.8/1K · Search & Comments avatar

Reddit Profile Scraper — $0.8/1K · Search & Comments

Pricing

from $0.80 / 1,000 results

Go to Apify Store
Reddit Profile Scraper — $0.8/1K · Search & Comments

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

Apivault Labs

Maintained by Community

Actor stats

0

Bookmarked

14

Total users

0

Monthly active users

3 days ago

Last modified

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:

📦 n8n-nodes-apivault-reddit

Setup: in n8n go to Settings → Community Nodes → Install, paste n8n-nodes-apivault-reddit and 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 goalMode and inputUseful output
Research an account or authorprofiles, usernamesProfile, observed activity, analytics and public contact signals
Find posts mentioning a product or topicsearch, searchQueriesUnique post IDs, titles, authors, communities, dates and source text
Search one communitysearch, searchSubredditKeyword posts restricted to that community
Read an already discovered discussiondiscussion, discussionUrlsThe post and source-visible comments
Import into an application or AI workflowAny mode through the Apify APIJSON 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

FieldMeaning and limits
recordType, id, fullnamepost or comment; native Reddit ID and t3_/t1_ identity
title, bodySource title and plain source text; JSON comments have no title
url, permalinkPublic Reddit record URL and path
author, subredditSource author/community when available
publishedAt, updatedAtFeed timestamps; a comment can supply only updatedAt
createdUtcJSON source Unix timestamp; not synthesized for RSS
score, numCommentsAvailable JSON metadata; null for RSS
parentId, depthActual JSON hierarchy, otherwise null
dataSourcereddit-public-atom or reddit-public-json
query, discussionUrlInput 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 os
from apify_client import ApifyClient
client = 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

GroupFields
Identityusername, displayName, bio, profileUrl, avatar, snoovatar, profileColor
KarmapostKarma, commentKarma, awardeeKarma, awarderKarma, totalKarma
AccountcreatedAt, accountAgeDays, karmaPerDay, lastActiveAt, followerCount
FlagsverifiedEmail, isPremium, isEmployee, isModerator, isSuspended, over18, acceptFollowers
Collectionstrophies, 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-niche and 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 trackChanges compares 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 SUMMARY and 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 (scrapedAt on every record)
  • Community research — mostActiveSubreddits + postingHoursUTC reveal behavior patterns
  • Account vetting — flags (isSuspended, verifiedEmail, accountAgeDays) spot throwaways

Notes

  • Only public data — nothing private, deleted or quarantined
  • dataCompleteness: activity-only means public RSS mode; unavailable metadata is null
  • 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 goalConfigurationWhat to inspect
Small known-account sampleOne username, low activity capsdataSource and dataCompleteness
Posting pattern reviewLimited posts and commentsActual sample size and UTC histogram
Community author sampleOne subreddit, few source postsCurrent observed authors, not all members
Compact enrichmentLower maxPosts/maxCommentsMissing RSS metadata remains null
Repeat observationsOptional trackChangesAvailability 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-reddit in 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.

ParameterDefaultPurpose
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.
maxPosts25Latest submissions to collect per account (0 = profile only). Each collected post is a billable dataset item.
maxComments25Latest 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.
maxResults5Global post + comment cap across all discovery inputs. Not used for profiles.
maxThreadComments20Maximum visible comments per URL. Missing replies are not fabricated.
pageSize10Requested feed size; Reddit can return fewer. Discovery only.
maxPages2Stops on repeated or empty pages. Continuation is source-dependent.
sourceTimeoutSeconds90Global collection deadline for discovery modes.
requestRetries1Bounded 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.
postsPerSubreddit50How many posts to scan for authors per subreddit (1-100).
minKarma0Skip accounts below this karma (0 = off). Applied when Reddit OAuth enhanced mode is available.
minAccountAgeDays0Skip fresh accounts (0 = off). Applied when Reddit OAuth enhanced mode is available.
activeWithinDays0Keep only accounts that posted or commented in the last N days (0 = off).
hasContactInfoOnlyfalseKeep only profiles where an email or social link was found (bio/posts/comments).
trackChangesfalseAdds karmaDelta and previousScrapedAt to each profile by comparing with your previous runs of the same accounts.