Reddit Subreddit Members Scraper
Pricing
$19.99/month + usage
Reddit Subreddit Members Scraper
Scrape active Reddit users from any public subreddit. Perfect for analyzing community size, identifying key contributors, or building user datasets for sentiment or behavioral research.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
Scraper Engine
Maintained by CommunityActor stats
0
Bookmarked
9
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Reddit Subreddit Members Scraper — Karma, User ID and Account Age
Reddit Subreddit Members Scraper (Active Participants) reads a subreddit's post feed and its recent-comment feed and returns every account that posted or commented, as structured JSON — username, real t2_ Reddit user id, post karma, comment karma, account creation date and where the account was found. Reddit publishes no subscriber list, so this is a participation sample, not a membership roster. Add a subreddit below and start a run to see it working.
🧭 What is Reddit Subreddit Members Scraper?
Reddit Subreddit Members Scraper (Active Participants) is an Apify Actor that reads a subreddit's public post feed and its recent-comment feed and returns the accounts behind them as a deduplicated JSON dataset — one row per unique participant, enriched with karma and account-creation-date data pulled from each account's public profile sidebar. It runs entirely against logged-out, public old.reddit.com pages; no Reddit account, API key or OAuth app is required. It's built for community managers, growth marketers, researchers and developers who need a list of real, currently active accounts in a subreddit — not a static subscriber count.
🔓 What Reddit participant data is publicly available to scrape?
Everyone who posts or comments in a public subreddit has their username, karma totals and account age visible on their own profile page without logging in. The table below separates what any logged-out visitor can still see from what Reddit has retired from public view entirely.
| Data Category | Publicly available (no login) | No longer exposed by Reddit |
|---|---|---|
| Post and comment authors in a subreddit's feed | Yes | — |
| Post karma / comment karma (profile sidebar) | Yes | — |
| Account creation date | Yes | — |
Real Reddit user id (t2_…) | Yes, embedded in page markup | — |
| Subreddit subscriber / member list | — | Never published on any surface, official or not |
| Subreddit subscriber count | — | about.json now returns HTTP 403 on every client and proxy tier |
| Combined total karma (post + comment + award) | — | Only ever available via the now-dead about.json |
| Reddit gold status / avatar icon URL | — | Same about.json-only retirement |
Reddit Subreddit Members Scraper only returns publicly visible data — what any logged-out visitor sees. Nothing behind a login wall, and nothing Reddit no longer exposes to anyone.
📊 What data can I extract with Reddit Subreddit Members Scraper?
Every run returns one row per unique participant, covering identity and discovery details, karma and account-age enrichment, and the handful of legacy fields Reddit has retired.
Identity & discovery fields
| Field Name | Description |
|---|---|
username | The account's Reddit username (no u/ prefix). |
userId | The account's real Reddit user id, in Reddit's own t2_<base36> format, read from page markup or the profile sidebar. Null if neither surface exposed it. |
profileUrl | Direct link to the account's public profile: https://reddit.com/user/<username>. |
discoverySurface | Where the account was found: subreddit_posts, subreddit_comments, keyword_search, or direct_input (a username supplied directly in targets). |
sourceSubreddit | The subreddit the account was discovered in, lowercased. Null for keyword-search hits with no subreddit match, or for direct-input usernames. |
sortOrderUsed | The post feed sort (new / hot / top / rising) active when the account was discovered. Null for comment-firehose and direct-input rows. |
runId | The Apify run id that produced this row. |
Karma, account age & profile status
| Field Name | Description |
|---|---|
postKarma | The account's post karma, read from its public profile sidebar. Null until read, or if the profile couldn't be read. |
commentKarma | The account's comment karma, from the same sidebar. |
createdISO | Account creation date/time in ISO 8601, parsed from the sidebar's <time datetime> attribute. |
createdUTC | The same creation date as a Unix epoch (UTC seconds). |
profileFetched | true only when the profile sidebar was successfully read and parsed. |
profileFetchStatus | Why the profile fetch did or didn't succeed: ok, not_found, blocked, no_sidebar (page loaded but had no karma/age markup), skipped (fetchDetails was off), or unknown. |
scrapedAt | UTC timestamp (ISO 8601) when the row was written. |
Fields Reddit no longer exposes (always null)
| Field Name | Description |
|---|---|
totalKarma | Always null. Reddit's combined post+comment+award karma total was only ever on /about.json, which now returns HTTP 403 on every client and proxy tier. Never estimated. |
isGold | Always null. Same /about.json-only retirement. |
iconImg | Always null. Same /about.json-only retirement (avatar URL). |
🛠️ Why not build this yourself?
Reddit's own OAuth API mirrors the same public data model as its web pages and has never exposed a subreddit's member list either — so API access alone doesn't hand you the answer this Actor gives you. What's left to build is genuinely hard to keep working:
- Anti-bot escalation —
old.reddit.comblocks Chrome- and Edge-family TLS fingerprints outright. This Actor impersonates Firefox and Safari withcurl_cffiand rotates fingerprints automatically on a block. - Silent false positives — Reddit serves at least three distinct "you're blocked" or "prove you're human" pages with a plain HTTP 200, so a status-code check alone will silently return zero real rows. Every response here is validated by its content, not just its status code.
- Proxy cost — every Apify datacenter proxy group returns HTTP 403 from
old.reddit.com; only the residential group gets through. This Actor pins Apify Residential from the first request rather than discovering the block mid-run.
▶️ How to use Reddit Subreddit Members Scraper
No parameter is required — the Actor ships with r/python pre-filled so a first run works out of the box.
- Open Reddit Subreddit Members Scraper (Active Participants) on the Apify Store and click Try for free (or Run, if you already have it).
- In targets, add the subreddits, usernames or search terms you want (
r/python,u/spez, or a plain keyword — one per line). - Set maxPosts, maxComments and sort_order to control how deep each subreddit is read, and leave fetchDetails on to get karma and account-creation-date enrichment.
- Start the run.
- Download results as JSON, CSV or Excel from the run's default dataset, or read the Active participants table view directly in the Console.
How to scale to bulk participant extraction
targets and subreddits are both array (stringList) inputs — add as many subreddits, usernames or keywords as you like, one per line, and a single run sweeps all of them, deduplicating any account that shows up in more than one target so it's charged only once. There is no separate "bulk mode": more lines is the bulk mode.
🎯 What can you do with Reddit participant data?
- 🧑💼 Community managers auditing a subreddit's health use
postKarma,commentKarmaandcreatedISOto see whether recent activity is coming from established accounts or brand-new ones. - 📈 Growth marketers building outreach lists use
usernameandprofileUrlfromdiscoverySurface: "subreddit_comments"rows to find people actively discussing a topic, not just lurking. - 🔬 Researchers studying community composition use
sourceSubredditandsortOrderUsedacross a batch of subreddits to compare who shows up in "hot" versus "new" feeds. - 🛡️ Trust & safety teams use
createdISOandpostKarma/commentKarmatogether to spot clusters of very new, very low-karma accounts posting in the same window — a common brigading signal. - 🤖 AI engineers feed
username,postKarma,commentKarmaandcreatedISOinto an LLM agent or a RAG pipeline as structured context on a community's active participants, with no HTML parsing required on their end.
🛡️ How does Reddit Subreddit Members Scraper handle rate limits and blocking?
Every request goes through Apify Residential proxy, impersonating a Firefox or Safari TLS fingerprint (never Chrome or Edge, which Reddit's edge blocks outright), with a fresh proxy session minted per request. A response is accepted only after a content check — not just its HTTP status — because Reddit serves several distinct "blocked" and "prove you're human" pages with a plain HTTP 200. On a detected block, the Actor rotates to the next TLS fingerprint in its ladder and retries, up to 5 attempts per request, with a growing backoff between attempts. requestDelay (default 1 second) sets a floor between any two requests, regardless of retries. If a subreddit's feed still can't be read after retries, that read is logged as a failed, uncharged accounting row and the run moves on to the next target rather than aborting.
⚠️ Apify's datacenter proxy groups are hard-blocked by old.reddit.com (HTTP 403) as of this Actor's own measurements — Apify Residential is required, and any other proxy group supplied in proxyConfiguration is automatically overridden to RESIDENTIAL.
⬇️ Input
All parameters are optional. targets is pre-filled with r/python so a default run returns real data.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
targets | No | Array (stringList) | One entry per line. Accepts r/python, https://www.reddit.com/r/python/, u/spez, /user/spez/ or a plain keyword. Do not decorate entries with emoji. | ["r/python", "r/webscraping"] |
subreddits | No | Array (stringList) | Plain subreddit names without the r/ prefix. Merged with targets and always treated as subreddits. | ["learnprogramming"] |
startUrls | No | Array (stringList) | Legacy alias for targets, used only when targets is empty. | [] |
sort_order | No | String (select) — enum new, hot, top, rising; default "new" | Which ranking of the subreddit's posts to read. top is always requested with an explicit t=month window, because a bare top request silently returns only today's top posts. | "hot" |
maxPosts | No | Integer — min 1, max 1000, default 10 | How many posts to read per subreddit or per search term. Reddit serves at most 100 per page, so larger values page through the feed. | 50 |
maxComments | No | Integer — min 0, max 1000, default 10 | How many recent comments to read per subreddit. Set to 0 to skip the comment firehose. Comment authors are largely different people from post authors. | 25 |
fetchDetails | No | Boolean — default true | Adds post karma, comment karma and the account creation date. When a profile can't be read, karma fields stay null and profileFetchStatus says why — never reported as zero. | true |
maxConcurrentUsers | No | Integer — min 1, max 10, default 3 | How many profile sidebars to read at once. Lower is gentler on the proxy pool. | 3 |
requestDelay | No | Integer — min 0, max 10, default 1 | A run-wide floor, in seconds, on the gap between two requests. Raise it if you see repeated blocks. | 1 |
proxyConfiguration | No | Object (proxy editor) — default {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} | Apify Residential is required. Any other group is overridden to RESIDENTIAL and the override is logged. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
Example input
{"targets": ["r/python", "r/webscraping", "u/spez"],"subreddits": ["learnprogramming"],"sort_order": "hot","maxPosts": 50,"maxComments": 25,"fetchDetails": true,"maxConcurrentUsers": 3,"requestDelay": 1,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
⬆️ Output
Results are typed, normalized JSON with the same 17 keys on every row, and export from the run's default dataset as JSON, CSV, Excel, HTML table or RSS — the standard Apify dataset export options. Each run also writes a RUN_SUMMARY object to the key-value store with run-level totals (participants discovered, HTTP outcomes, TLS fingerprint used) and an uncharged run-log-<runId> dataset with one accounting row per feed read, including any that failed.
Example output
{"username": "reddit_user_42","userId": "t2_9k2j1a","profileUrl": "https://reddit.com/user/reddit_user_42","totalKarma": null,"postKarma": 15420,"commentKarma": 48310,"createdUTC": 1451606400,"isGold": null,"iconImg": null,"createdISO": "2016-01-01T00:00:00","discoverySurface": "subreddit_posts","sourceSubreddit": "python","sortOrderUsed": "hot","profileFetched": true,"profileFetchStatus": "ok","scrapedAt": "2026-08-04T10:15:32Z","runId": "a1b2c3d4e5f6g7h8i9j0"}
⚙️ How does it work?
Requests reach old.reddit.com through Apify Residential proxy, with each request impersonating a Firefox or Safari TLS fingerprint via curl_cffi — Reddit's edge blocks Chrome- and Edge-family fingerprints outright, so the Actor never uses them. A fresh proxy session is minted per request, and if a response comes back blocked, the Actor rotates to the next fingerprint in its ladder and retries. Because Reddit serves several "blocked" and "prove you're human" pages with a normal HTTP 200, every response is checked for real content, not just its status code, before it's accepted. Only public, logged-out pages are read — the post feed, the comment firehose, search results, and each participant's profile sidebar — so no login is ever used. The output schema stays the same 17 fields regardless of how Reddit's page markup shifts, because the Actor normalizes everything it parses into that fixed shape.
🔌 Integrations
Reddit Subreddit Members Scraper runs on the Apify platform, so it's reachable anywhere you can call the Apify API or use an Apify client library.
Calling it programmatically
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("reddit-subreddit-members-scraper").call(run_input={"targets": ["r/python", "r/webscraping"],"maxPosts": 50,"sort_order": "hot",})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["username"], item["postKarma"])
Works the same way in Go, Ruby, Node.js or cURL — any language that can make an HTTP request to the Apify API.
No-code tools
Apify Console runs can be started and scheduled from n8n, Make and Zapier through Apify's own platform-level connectors, which call the same run API shown above — no Actor-specific setup beyond pointing the node at this Actor's id and input.
⚖️ Is it legal to scrape Reddit participant data?
Scraping publicly visible data on Reddit — usernames, karma and account creation dates that any logged-out visitor can already see — is generally lawful in most jurisdictions. Reddit Subreddit Members Scraper returns only that publicly available data; it never reads private messages, saved content, or anything gated behind a login. Because usernames, karma history and account age are personal data tied to an identifiable Reddit account, storing or reusing them at scale can fall under GDPR (EU/UK) or the CCPA (California) depending on where you and your data subjects are, which means you need a lawful basis for collecting and retaining it. Consult legal counsel if your use case involves bulk storage of personal data.
❓ Frequently asked questions
What Reddit participant fields does Reddit Subreddit Members Scraper return?
The top fields are username, userId, postKarma, commentKarma and createdISO — see What data can I extract for the full 17-field list.
Does Reddit Subreddit Members Scraper require a Reddit account or login?
No. It reads old.reddit.com's public, logged-out pages — the post feed, comment firehose, search results and profile sidebars — using no Reddit account, API key or OAuth app.
How many participants can I extract in one run?
As many as your inputs allow: up to 1000 posts and 1000 comments read per subreddit (maxPosts, maxComments), across as many subreddits, usernames and keywords as you list in targets/subreddits, deduplicated so each unique account is only counted once.
What happens if a subreddit's feed can't be read?
The Actor retries up to 5 times with fingerprint rotation, then logs that read as failed (blocked, not_found, feed_empty or feed_exhausted) in the uncharged run-log-<runId> dataset and moves on to the next target — it doesn't abort the run. A profile sidebar that can't be read leaves postKarma/commentKarma as null with profileFetchStatus explaining why, never a fabricated zero.
Can I scrape multiple subreddits at once?
Yes. targets and subreddits both accept arrays — add one subreddit, username or keyword per line and a single run sweeps all of them.
Does Reddit Subreddit Members Scraper work with Claude, ChatGPT and other AI agent tools?
It's callable as an HTTP endpoint through the Apify API by any agent framework that can make a request — start a run, poll or wait for it, then read the resulting dataset.
Is this the same as a subreddit subscriber-count or member-list tool?
No. Reddit has never published a subreddit's member list, and its subscriber count is no longer readable on any surface (about.json returns HTTP 403 everywhere). This Actor returns null for both rather than guessing, and instead returns the accounts that actually posted or commented — active participants, not subscribers.
Does Reddit Subreddit Members Scraper return data in a format LLMs can use directly?
Yes. Typed, normalized JSON with the same field names on every row — no HTML parsing or selectors needed. Pass it directly to an LLM, index it into a vector store, or feed it to an agent tool.
What happens when Reddit changes its layout or anti-bot system?
The Actor is maintained and its output schema is kept stable across Reddit markup changes — no specific turnaround time is promised for any given change.
Can I use Reddit Subreddit Members Scraper without managing proxies or browser infrastructure?
Yes. Apify Residential proxy sessions and TLS-fingerprint rotation are handled internally; you don't run a browser or manage IPs yourself.
Which fields work best for AI training data and RAG indexing?
For RAG-style lookups, username, discoverySurface and sourceSubreddit identify who was found and where. For structured training features, postKarma, commentKarma and createdISO are the most consistently populated numeric/date fields across records — all return as typed primitives, never as strings that need parsing.
💬 Your feedback
Found a bug or missing a field? Open an issue on this Actor's Apify Store page (the Issues tab) or reach out through the Apify Console — reports like these directly shape what gets fixed and documented next.