Reddit Subreddit Members Scraper With Activity History avatar

Reddit Subreddit Members Scraper With Activity History

Pricing

from $4.99 / 1,000 results

Go to Apify Store
Reddit Subreddit Members Scraper With Activity History

Reddit Subreddit Members Scraper With Activity History

Scrape and export subreddit members into your CRM or automation pipeline. Ideal for community targeting, outreach, and social listening workflows driven by live Reddit engagement.

Pricing

from $4.99 / 1,000 results

Rating

0.0

(0)

Developer

API Empire

API Empire

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

6 days ago

Last modified

Share

Reddit Scraper — Extract Participants, Posts and Comments as JSON

Reddit publishes no subscriber list for any subreddit, so this Reddit scraper samples the accounts that are visible in a community's public post feed and its recent-comment feed, de-duplicates them, then opens each account's public overview page for a last-active date, a post/comment split, other communities they post in, karma and account age. Every response is typed, normalized JSON — no HTML, no selectors, no parsing. Their recent posts and comments follow as free child rows. After reading this, you'll know exactly which fields you get, what a "participant" is (and isn't), and where the real limits sit.

What is Reddit Subreddit Members Scraper With Activity History?

It is an Apify Actor that samples the accounts who recently posted or commented in one or more subreddits, then enriches each unique account with its recent activity history: last-active date, post/comment split, the other subreddits it shows up in, post and comment karma, account age, and trophy/admin flags. No Reddit account or login is required — every page it reads is publicly accessible on old.reddit.com.

  • 🧑‍🤝‍🧑 Scrape subreddit participants — usernames sampled from a community's New, Hot, Top or Rising feed, plus its recent-comment feed
  • 🕒 Scrape each participant's activity history — last-active date, karma, account age, other communities
  • 📝 Scrape each participant's recent posts and comments as linked child rows
  • 🚦 Filter participants by recency or cross-subreddit activity before any row is charged
  • 📦 Export results as JSON, CSV, or Excel from the Apify dataset, or pull them via API

What data does Reddit Subreddit Members Scraper With Activity History collect?

Every run returns one of three row shapes, all built from the fields below (read straight from src/main.py).

Data TypeKey FieldsJSON Field Names
Participantsusername, Reddit user ID, karma, account age, last activeusername, userId, postKarma, commentKarma, accountAgeDays, lastActiveISO, recentSubredditsJoined
Recent poststitle, subreddit, score, permalink, ageitemType (post), itemTitle, itemSubreddit, itemScore, itemPermalink, itemCreatedISO
Recent commentsbody, subreddit, score, permalink, ageitemType (comment), itemBody, itemSubreddit, itemScore, itemPermalink, itemCreatedISO

How does Reddit Subreddit Members Scraper With Activity History differ from the official Reddit API?

Reddit's own Data API is the sanctioned way to pull posts, comments and profile data programmatically, but it does not solve the problem this Actor solves: there is no official endpoint that lists a subreddit's subscribers, and there never has been. Both surfaces have to sample who's active instead of listing who's subscribed.

FeatureReddit Data APIReddit Subreddit Members Scraper With Activity History
Subscriber/member list endpointNot offeredNot offered — samples active participants instead (documented in every row)
Access processOAuth app registration, Reddit review, commercial contract for higher-volume useRuns immediately on Apify with input only, no Reddit account
Output shapeRaw JSON matching Reddit's internal schemaNormalized dataset rows — participant + post/comment child rows
Activity enrichment (karma, account age, recent items)Requires separate calls per endpoint, assembled by the callerDelivered by the Actor in one pass per participant
Anti-bot handlingNot applicable (first-party)Residential proxy pinned by default, Firefox/Safari TLS impersonation
Pre-filtering before costCaller's responsibilityactiveWithinDays, otherSubreddits, excludeAuthors run before a row is written or charged

If you already have an approved Reddit API app and only need a handful of endpoints, the official API is the right tool. If you need a de-duplicated, enriched, ready-to-export dataset of who's active in a subreddit without building and maintaining OAuth, pagination and HTML-fallback logic yourself, use this Actor.

Why do developers and teams scrape Reddit subreddit participants?

🤖 For AI engineers and agent builders

Feed a subreddit's active-participant list, complete with recentSubredditsJoined and postsInTargetSubreddit, into a RAG pipeline or agent tool to ground community-analysis prompts in real, typed data instead of scraped HTML. Because every field is a stable JSON key (lastActiveISO, recentPostCount, activitySource), an agent can reason over "who is active and where" without a parsing step, and the linked itemType/itemBody child rows give it real post and comment text to summarize or classify.

📊 For marketers and community managers

Point the Actor at a competitor's or your own subreddit to see which accounts are actually posting and commenting this week, not just subscribed-and-silent. otherSubreddits reveals whether your most active participants also post in adjacent communities, which is a direct signal for cross-community outreach or ambassador targeting.

🔬 For researchers and analysts

discoverySurface, discoverySurfaces and timesSeenInRun make the sampling method auditable per row, and isSubscriberList: false is written into every parent row so a dataset can never be mistaken for a membership list downstream. That auditability matters for any study of community engagement that has to survive peer review or a methods section.

🧑‍💻 For developers building data products

postKarma, commentKarma, accountAgeDays and activityItemsAnalyzed are consistent, typed fields across every run, so a product built on top (a community health dashboard, a moderator tool, a bot-detection heuristic) doesn't need bespoke parsing per subreddit.

How to scrape Reddit subreddit participants (step by step)

  1. Open Reddit Subreddit Members Scraper With Activity History on the Apify Store and click Try for free (or Run, if you already have it saved).
  2. Add at least one entry to communityTargetsr/python, a full subreddit URL, u/spez, or free text to search. Nothing is required by the schema, but the Actor has nothing to sample without a target.
  3. Choose feedSort (New, Hot, Top or Rising) and, for Top, a topTimeWindow. Set postSampleSize / commentSampleSize for how deep to read each feed, and maxParticipants for the charged-row ceiling.
  4. Click Start and watch the run log — it reports how many unique participants were found and how many were filtered before any charge.
  5. Download results as JSON, CSV or Excel from the Dataset tab, or pull them with the Apify API / apify_client.

What to do when Reddit changes its structure

The Actor targets old.reddit.com's public HTML, with a TLS-fingerprint fallback chain and a forced residential proxy already built in for when Reddit's anti-bot posture shifts. The output schema — field names and row types — is what this README documents, and it stays stable across maintenance updates so downstream integrations don't need to change their parsing.

What changed in Reddit scraping recently?

Two changes shape what any Reddit scraper — official or third-party — can realistically do today. Since Reddit's 2023 Data API pricing change, high-volume programmatic access requires a paid, reviewed commercial contract rather than a free API key, which is why most public tooling (including this Actor) reads Reddit's public HTML surfaces instead. Separately, this Actor's own measurements (2026-08-01) show old.reddit.com returning HTTP 403 to Chrome-family TLS fingerprints (Chrome 131, Chrome 124, Chrome 99 Android, Edge 101) while Firefox and Safari fingerprints pass, and every Apify datacenter proxy group blocked while residential exits succeed. Neither change affects what data remains publicly visible — posts, comments and profile overview pages are still open, unauthenticated pages — but both raise the bar for a DIY script to stay working. This Actor is maintained against exactly these two pressure points.

⬇️ Input

Nothing is required — supply at least one target in communityTargets (or subreddits) so the Actor has something to sample.

ParameterRequiredTypeDefaultDescription
communityTargetsNoarrayOne entry per line: r/python, a subreddit URL, u/spez / profile URL, or free text (searched across Reddit)
subredditsNoarrayExtra plain subreddit names, merged with communityTargets
feedSortNostring (enum)"new"Feed to sample participants from: new, hot, top, rising
topTimeWindowNostring (enum)"month"Time window for the top feed: hour, day, week, month, year, all
fetchRecentActivityNobooleantrueOpen each participant's overview page for activity, karma and account age (1 residential request per participant)
activitySampleSizeNointeger (1–100)25Recent items (posts + comments) analysed per participant
includeActivityItemsNobooleantrueAlso emit each recent item as its own free child row
activityItemsPerUserNointeger (0–100)5Cap on child rows per participant (0 = none); does not change the analysis
activeWithinDaysNointeger (0–3650)0Drop participants inactive longer than N days, before the row is charged (0 = disabled)
otherSubredditsNoarrayKeep only participants also active in one of these communities (requires the activity lookup)
excludeAuthorsNoarrayUsernames to skip, case-insensitive
maxParticipantsNointeger (1–10000)50Cap on unique participants (charged parent rows) per run
postSampleSizeNointeger (1–1000)25Items read from the chosen feed per community
commentSampleSizeNointeger (0–1000)25Items read from the recent-comment feed per community (0 = skip)
proxyConfigurationNoobject{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}Apify Proxy configuration
forceResidentialNobooleantrueRewrite any non-RESIDENTIAL proxy group to RESIDENTIAL
browserFingerprintNostring (enum)"firefox133"TLS fingerprint to impersonate: firefox133, safari17_0
requestDelaySecondsNointeger (0–10)1Jittered pause between requests, in seconds
activityConcurrencyNointeger (1–10)3Parallel participant-activity lookups

Example input:

{
"communityTargets": ["r/python", "https://www.reddit.com/r/webscraping/", "u/spez"],
"subreddits": ["learnpython"],
"feedSort": "top",
"topTimeWindow": "month",
"fetchRecentActivity": true,
"activitySampleSize": 25,
"includeActivityItems": true,
"activityItemsPerUser": 5,
"activeWithinDays": 30,
"otherSubreddits": ["datascience"],
"excludeAuthors": ["AutoModerator"],
"maxParticipants": 50,
"postSampleSize": 25,
"commentSampleSize": 25,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] },
"forceResidential": true,
"browserFingerprint": "firefox133",
"requestDelaySeconds": 1,
"activityConcurrency": 3
}

Common pitfall: setting otherSubreddits or a tight activeWithinDays without leaving fetchRecentActivity on true — both filters read the activity lookup, so they silently keep everyone if the lookup that feeds them is disabled.

⬆️ Output

Results are written to the Apify dataset as typed JSON rows, exportable as JSON, CSV or Excel. Three row shapes appear, distinguished by rowType: participant (charged), activityItem (free child row), and — only on a run that writes nothing — a single uncharged runNote accounting row.

Scraped participant

{
"username": "spez",
"userId": "t2_1w72",
"profileUrl": "https://reddit.com/user/spez",
"totalKarma": null,
"postKarma": 152340,
"commentKarma": 891207,
"createdUTC": 1128142944.0,
"isGold": null,
"iconImg": null,
"rowType": "participant",
"rowId": "u_spez",
"parentId": null,
"createdISO": "2005-09-30T22:22:24Z",
"accountAgeDays": 7612.41,
"trophyCount": 42,
"isRedditAdmin": true,
"discoverySurface": "old.reddit:/r/python/top?t=month",
"discoverySurfaces": ["old.reddit:/r/python/top?t=month", "old.reddit:/r/python/comments"],
"discoveredInSubreddit": "python",
"firstSeenItemId": "t3_1abcxyz",
"timesSeenInRun": 2,
"profileFetched": true,
"activityFetched": true,
"activitySource": "old.reddit.com/user",
"activityError": null,
"lastActiveUTC": 1754251200.0,
"lastActiveISO": "2026-08-03T12:00:00Z",
"lastActiveType": "comment",
"lastActiveSubreddit": "announcements",
"daysSinceLastActive": 0.42,
"oldestActivityISO": "2026-06-01T09:14:00Z",
"activitySpanDays": 63.11,
"activityItemsAnalyzed": 25,
"recentPostCount": 4,
"recentCommentCount": 21,
"recentSubreddits": ["announcements", "python", "modnews"],
"recentSubredditCount": 3,
"recentSubredditsJoined": "announcements, python, modnews",
"postsInTargetSubreddit": 3,
"activityChildRows": 5,
"isSubscriberList": false,
"sampleScope": "accounts that recently posted or commented in the sampled feeds; lurkers excluded",
"scrapedAtISO": "2026-08-04T10:00:00Z",
"runId": "abCDefGhij0123"
}

Scraped activity item (child row)

{
"rowType": "activityItem",
"rowId": "u_spez#1",
"parentId": "u_spez",
"parentUsername": "spez",
"username": "spez",
"userId": "t2_1w72",
"profileUrl": "https://reddit.com/user/spez",
"itemIndex": 1,
"activitySource": "old.reddit.com/user",
"itemIsInTargetSubreddit": true,
"scrapedAtISO": "2026-08-04T10:00:00Z",
"runId": "abCDefGhij0123",
"itemType": "comment",
"itemId": "t1_kxyz123",
"itemSubreddit": "python",
"itemTitle": null,
"itemBody": "Have you tried the walrus operator here?",
"itemPermalink": "https://www.reddit.com/r/python/comments/1abc/xyz/kxyz123/",
"itemScore": 14,
"itemCreatedUTC": 1754179200.0,
"itemCreatedISO": "2026-08-02T16:00:00Z",
"itemAgeDays": 1.75
}

How does Reddit Subreddit Members Scraper With Activity History compare to a generic Reddit scraper?

FeatureThis ActorGeneric alternative
Membership labellingEvery row carries isSubscriberList: false and sampleScope — never claims to be a member listOften markets a participant sample as "members" or "subscribers" without saying so
Entity coverage in one runParticipants + their recent posts + comments, linked by parentIdTypically one entity type per scraper; activity requires a second tool
Anti-bot handlingFirefox/Safari TLS impersonation with a fallback chain, forced residential proxyVaries; many default HTTP clients present a Chrome-family fingerprint that this platform blocks
Cost controlactiveWithinDays, otherSubreddits, excludeAuthors filter before a row is written or chargedTypically filters after fetching, or not at all
Output formatTyped, normalized JSON with stable field namesOften raw HTML or inconsistent field names across pages

If you're building an AI agent or RAG pipeline, the output-format row is the decision-maker — parsing HTML inside an agent loop is a reliability failure mode, not a feature.

How many participants can you scrape with this Actor?

maxParticipants caps charged parent rows at up to 10,000 per run (default 50); there is no separate cap on free activityItem child rows beyond activityItemsPerUser (0–100, default 5) each. Feed depth is capped by postSampleSize and commentSampleSize (1–1000 and 0–1000 respectively); each request reads up to 100 items and sweep_listing() follows Reddit's "next" pagination link automatically, up to 12 pages per feed. If a feed page returns HTTP 200 with zero parsed items, the Actor treats that as a block and stops reading that feed rather than looping forever. Every unique participant costs exactly one row_result charge regardless of how many child rows or feeds it was found in; activity lookups add one residential request per participant when fetchRecentActivity is on.

Integrate Reddit Subreddit Members Scraper With Activity History and automate your workflow

Reddit Subreddit Members Scraper With Activity History works with any language or tool that can send an HTTP request — it runs like any other Apify Actor.

REST API integration

from apify_client import ApifyClient
client = ApifyClient("<APIFY_API_TOKEN>")
run = client.actor("<actor-id>").call(run_input={
"communityTargets": ["r/python"],
"feedSort": "top",
"topTimeWindow": "month",
"maxParticipants": 50,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["rowType"], item.get("username"), item.get("lastActiveISO"))

Works in Python, Node.js, Go, Ruby, cURL — any client that can call the Apify API with your API token.

Automation platforms (n8n, Make, LangChain)

In n8n, the built-in Apify node runs this Actor and streams its dataset into the rest of your workflow — no custom HTTP request node needed. In Make, the Apify app's "Run Actor" and "Get Dataset Items" modules do the same. In LangChain, langchain_community.document_loaders.ApifyDatasetLoader (or the ApifyWrapper helper) can start this Actor and load its dataset rows directly as Document objects for an agent or retrieval chain.

Scraping publicly accessible Reddit pages is generally lawful, and this Actor returns only data that is visible without logging in — usernames, public posts and comments, and karma/account-age figures shown on public profile pages. That data is nonetheless personal data about real, identifiable people: it links a stable username to their posting behaviour, community memberships and account history. If you are in the EU/UK or processing data about EU/UK residents, GDPR governs your storage, use and retention of it; CCPA may apply if you are handling data about California residents at scale. Reddit's own Terms of Service and User Agreement also govern automated access regardless of your intent. Consult legal counsel for commercial use cases involving bulk personal data.

Frequently asked questions

Does this Actor work without a Reddit account?

Yes. It reads only public pages on old.reddit.com — no login, cookie or OAuth token is required or used.

How often is the scraped data updated?

Every run fetches live pages at the time it runs; nothing is cached or replayed from a previous run. scrapedAtISO on every row records exactly when that row was read.

What happens if a participant's account is deleted, suspended, or has no public activity?

If the overview page 404s, the row is kept with activityFetched: false and activityError: "profile-not-found-or-suspended". If the page loads but no items are visible, activityError is set to "no-public-items-visible". When the primary lookup fails for another reason, the Actor automatically retries the account through the third-party Arctic Shift archive before giving up — participants with unreadable activity are kept and flagged, never silently dropped, unless activeWithinDays explicitly filters them out.

Can I scrape private subreddits or suspended accounts' content?

No. Only subreddits and profile pages that are publicly visible on old.reddit.com without logging in are read. Private and quarantined subreddits, and suspended or shadowbanned accounts, are not accessible to this Actor.

How is this Actor priced?

Pay per event. One row_result charge is made per unique participant (parent row). Activity activityItem child rows, and the single runNote row written when a run finds zero participants, are pushed without a charged event and cost nothing.

Does this Actor work for AI agent workflows and LLM pipelines?

Yes — it is callable as a standard HTTP endpoint by any agent framework via the Apify API, and every dataset row is typed JSON with stable field names, so no parsing step is needed before passing it into an LLM context window or a retrieval pipeline.

How does this Actor handle Reddit's anti-bot system?

It impersonates a Firefox or Safari TLS fingerprint (Chrome-family fingerprints are measured as blocked on this surface), forces Apify's RESIDENTIAL proxy group by default (datacenter proxies are measured as blocked), rotates proxy exits and fingerprints on a blocked response, retries transport errors with backoff, and validates every response by parsed content rather than HTTP status alone — a 200 response with zero parsed items is treated as a block.

How does this Actor compare to other Reddit scrapers?

See the comparison table above. The concrete, checkable differences are: participant rows are explicitly labelled as a sample (never a subscriber list), posts and comments are returned as linked child rows in the same run, and cost-relevant filters run before a row is charged.

Does this Actor return data in a format LLMs can use directly?

Yes. Every row is typed, normalized JSON with stable field names and no HTML or CSS selectors to strip. Pass it directly into an LLM context window, index it into a vector store, or route it through an agent tool.

Can I use this Actor without managing proxies?

Yes. Apify Proxy with the RESIDENTIAL group is configured by default and forced unless you explicitly turn forceResidential off — you don't need your own proxy pool to run it.

What happens when Reddit changes its structure or blocks the scraper?

The Actor is maintained, and its output schema — field names and row types — stays stable across maintenance updates, so integrations built on it keep working on the user's end without changes.

Your feedback

Found a bug, or a field that doesn't match what's documented here? We want to know — open an issue via the Actor's page on the Apify Store or contact API-Empire through your Apify Console. Reports like these keep this Actor's fields and limits accurate.