Reddit Scraper: User Profiles & Subreddit Activity
Pricing
from $2.99 / 1,000 results
Reddit Scraper: User Profiles & Subreddit Activity
Reddit Scraper for User Profiles & Subreddit Activity extracts public Reddit profiles, posts, comments, karma, timestamps, and subreddit participation. Analyze user activity, interests, communities, and engagement for audience research, market analysis, and social insights.
Pricing
from $2.99 / 1,000 results
Rating
0.0
(0)
Developer
SimpleAPI
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Reddit User Scraper — Profiles, Post History and Subreddit Activity
Get any public Reddit user's karma profile, full post and comment archive, and a ranked breakdown of the subreddits they're actually active in — as structured JSON. Feed in usernames like spez or profile URLs and pull postKarma, commentKarma, numPosts, every submitted post and comment with score, subreddit and createdAt, plus a subreddit affinity table ranked by activityCount. Built for growth marketers, community managers, and researchers who need to understand a Reddit user's real behavior, not just their bio.
🧭 What is Reddit Scraper: User Profiles & Subreddit Activity?
Reddit Scraper: User Profiles & Subreddit Activity is an Apify Actor that takes one or more Reddit usernames (or profile URLs) and returns a real karma/profile summary, a fresh post-and-comment history archive, and a subreddit affinity ranking — no Reddit account, login, or API key required. It also carries every mode from the base Reddit Scraper (search, subreddit listing, single post + comment tree, subreddit info) unchanged, so it doubles as a general-purpose Reddit data source.
Key features:
- 👤 Target by username or profile URL — paste a bare username or a full
reddit.com/user/...link; both resolve the same way. - 🪪 Real karma/profile aggregate — post karma, comment karma, total karma, lifetime post/comment counts.
- 📝💬 Full post and comment history — freshly fetched every run, not cached.
- 📅 A working activity-date filter — restrict a user's history to an absolute date or a relative window (
"2 weeks","3 months"). - 📊 Subreddit affinity breakdown — which communities a user is actually active in, ranked by real activity count and share of total.
- 🗂️ Legacy Start-URL modes preserved — post + comment tree, subreddit post listing, keyword search, and subreddit info still work from raw Reddit URLs.
- 🌐 Automatic proxy escalation — retries through Apify datacenter, then residential proxy, on a blocked or failed request.
📦 What data can I extract with Reddit Scraper: User Profiles & Subreddit Activity?
Every run returns rows tagged by type, so a single dataset can carry profile summaries, posts, comments, and affinity rows side by side.
| Field | Example value | Use case |
|---|---|---|
type | "user_post" | Discriminates the row kind: user_profile, user_post, user_comment, user_subreddit_affinity, search, subreddit_post, post, comment, subreddit_info, top_subreddit |
isChild | true | true for rows nested under a parent (a user's posts/comments/affinity, or a post's comments) |
username | "spez" | Which target user this row belongs to |
postKarma | 184213 | Karma from submitted posts |
commentKarma | 521904 | Karma from comments |
totalKarma | 706117 | Combined karma total |
numPosts | 1204 | Lifetime submitted-post count reported by the archive |
numComments | 38210 | Lifetime comment count reported by the archive |
earliestPostAt | "2015-06-01T12:00:00.000Z" | Earliest tracked post timestamp |
lastPostAt | "2026-08-10T09:15:00.000Z" | Most recent tracked post timestamp |
userSubmittedCount | 20 | Posts actually fetched this run for the user |
userCommentsCount | 20 | Comments actually fetched this run for the user |
id | "1abc23d" | Reddit post or comment ID |
title | "State of the subreddit" | Post title |
subreddit | "announcements" | Subreddit the post/comment belongs to |
score | 4521 | Post or comment score (upvotes minus downvotes) |
upvoteRatio | 0.94 | Post upvote ratio, if available |
numComments | 312 | Comment count on a post |
createdUtc | 1755000000 | Creation time, Unix epoch seconds |
createdAt | "2026-08-12T13:20:00.000Z" | Creation time, ISO 8601 |
body | "Thanks for the update!" | Comment text |
permalink | "https://www.reddit.com/r/announcements/comments/1abc23d/..." | Link back to the live post or comment |
subscribers | 4200000 | Subreddit subscriber count |
activityCount | 47 | How many tracked posts+comments a user has in one subreddit |
activityShare | 18.5 | That subreddit's share (%) of the user's total tracked activity |
affinityRank | 1 | Rank of the subreddit in the user's affinity list, highest activity first |
scrapedAt | "2026-08-15T09:02:11.123Z" | When this row was pushed, added to every row |
📝 Post and comment history
Each user_post row carries the full submission record — title, subreddit, score, selftext, linkFlairText, over18, spoiler, stickied, postHint, thumbnail, domain, numCrossposts, gilded, isVideo, isOriginalContent, and subredditSubscribers. Each user_comment row carries body, parentId, linkId, distinguished, and isSubmitter. This is what turns a karma number into an auditable activity trail: pull every post a user made in a competitor's subreddit, or every comment thread they've contributed to in the last quarter.
📊 Subreddit affinity (targeting data)
user_subreddit_affinity rows are the fields you filter and segment on for this Actor: subreddit, activityCount, activityShare, and affinityRank. Set minAffinityActivityCount to drop one-off drive-by comments and keep only a user's real recurring communities, and maxAffinitySubreddits to cap how many subreddits come back per user (1–100).
⚖️ How does Reddit Scraper: User Profiles & Subreddit Activity differ from the official Reddit API?
Reddit's own Data API requires an OAuth2 app registration, a compliant custom User-Agent, and — as of Reddit's Data API terms and Responsible Builder Policy in effect at the time of writing (checked 2026-08-15) — explicit approval before pulling data, with commercial use requiring a separate written agreement. This Actor needs none of that: give it usernames and it returns structured rows immediately, with no Reddit developer account, no app review, and no OAuth token to refresh.
| Feature | Reddit Data API (official) | Reddit User Scraper (this Actor) |
|---|---|---|
| Setup | OAuth2 app + registered User-Agent, subject to Reddit's approval process | Apify account only — set input, run |
| Commercial use | Requires separate written approval/agreement per Reddit's current terms | Governed by Apify's standard usage terms |
| User-scoped history date filter | Not exposed as a first-class parameter | activityDateFrom — absolute date or relative window |
| Subreddit affinity ranking | Not provided as a built-in endpoint | includeSubredditAffinity — ranked, with activity share |
| Output shape | Raw Reddit "Thing" JSON (kind/data wrappers) per endpoint | One flat, typed row per record, same shape across runs |
| Legacy search/subreddit/post modes | Separate endpoints, separate auth scopes | Bundled in the same Actor run |
Why does Reddit's own API make bulk user research hard?
Reddit's Data API is built around per-endpoint OAuth calls with rate limits enforced per app, and — per its currently published terms (checked 2026-08-15) — commercial or high-volume use requires going through Reddit's own approval and pricing process rather than self-serve signup. For a one-off research question ("what has this user posted, and where"), that means standing up an OAuth app, handling token refresh, and potentially waiting on approval before you can pull a single archive. This Actor sidesteps that entirely by reading from public archive endpoints that don't require a Reddit-issued credential, at the cost of the profile karma aggregate being a periodic snapshot rather than a live read (disclosed on every user_profile row via profileCoverageNote).
Use the official API when you're building a Reddit-native application that needs live write access (posting, voting, moderation) or a long-term OAuth integration. Use this Actor when you need a fast, structured pull of a user's public history and community footprint without standing up API infrastructure.
🎯 How to use data extracted from Reddit?
Community and social listening teams
Pull a target subreddit's active users, then run each username through includePostHistory and includeCommentHistory to see where else they post. Set activityDateFrom to "1 month" to scope the pull to recent activity only, and read subreddit, score, and body off each row to spot recurring topics or sentiment shifts around your brand or product.
Agencies running repeat user research
For agencies auditing creator or influencer Reddit presence across multiple client engagements, batch usernames through usernames with includeSubredditAffinity on, and export subreddit, activityCount, and activityShare per user to benchmark which communities each account is actually rooted in — repeatable per client, same output shape every run.
Market and community research
Use includeSubredditAffinity across a sample of users active in a niche subreddit to map which other communities overlap with it — a proxy for where else that audience spends time. Combine with fetchTopSubreddits (legacy mode) to compare a niche community's size against the platform's largest subreddits by subscribers.
AI agents and automated pipelines
Because every row is flat, typed JSON keyed by type, an agent can call this Actor with a username list, filter on type == "user_subreddit_affinity", and feed the result straight into a RAG context or a lead-scoring pipeline — no HTML parsing or Reddit "Thing" unwrapping required.
⬇️ Input sample
| Parameter | Required | Type | Description | Example value |
|---|---|---|---|---|
usernames | No | array | One or more Reddit usernames (e.g. "spez") or full profile URLs. For each, the Actor fetches profile, full post + comment history, and subreddit affinity. minItems: 0 | ["spez", "https://www.reddit.com/user/spez/"] |
includeUserProfile | No | boolean | Fetch each username's karma aggregate (post/comment/total karma, lifetime counts). An aggregate snapshot that updates infrequently, not a live profile-page read; may be null for inactive accounts. | true |
includePostHistory | No | boolean | Fetch each username's submitted-posts archive, freshly fetched every run. | true |
includeCommentHistory | No | boolean | Fetch each username's comment archive, freshly fetched every run. | true |
activityDateFrom | No | string | Only include posts/comments on or after this date. Absolute (2026-01-15) or relative ("3 days", "2 weeks", "1 month"). Leave empty for full history. | "2 weeks" |
maxHistoryItemsPerUser | No | integer | Per username, max submitted posts AND max comments to fetch (counted separately). minimum: 1 | 20 |
historyPagesPerUser | No | integer | Per username, max pages to fetch for posts and comments (each page up to 100 items). minimum: 1 | 2 |
includeSubredditAffinity | No | boolean, default true | Add one row per username per subreddit they're active in, ranked by activity count, with each subreddit's share of tracked activity. | true |
maxAffinitySubreddits | No | integer, default 15; minimum: 1, maximum: 100 | Max subreddits to return per username in the affinity breakdown, ranked highest-activity first. | 15 |
minAffinityActivityCount | No | integer, default 1; minimum: 0 | Only include a subreddit if the user's tracked activity count there is at least this number. | 1 |
startUrls | No | array | One or more Reddit URLs for the legacy modes: post URLs (containing /comments/), subreddit URLs, or user profile URLs. minItems: 0 | ["https://www.reddit.com/r/python/"] |
skipComments | No | boolean, default false | If enabled, don't fetch comments for post URLs in Start URLs — post-level data only. | false |
skipUserPosts | No | boolean, default false | If enabled, ignore user profile URLs in the legacy Start URLs field. Doesn't affect usernames. | false |
skipCommunity | No | boolean, default false | If enabled, don't fetch subreddit/community metadata for subreddits found in legacy Start URLs. | false |
searchTerms | No | array | One or more search phrases for the legacy search mode. Each term queried separately. | ["climate policy"] |
searchCommunity | No | string | Optional subreddit name (no r/ prefix) to restrict search to. Only affects results when a Search Term is set. | "python" |
ignoreStartUrls | No | boolean, default false | When enabled, skip legacy Start URLs entirely; only search runs. | false |
searchForPosts | No | boolean, default true | Include posts in search results — the only search scope this Actor supports. | true |
sortSearch | No | string, default "new"; enum relevance, new, hot, top, comments | How search results are ordered. relevance/hot/top all rank by score (no live "trending" signal from a no-login source); new = newest first; comments = most comments first. | "new" |
timeFilter | No | string, default "all"; enum hour, day, week, month, year, all | Restricts search results to a relative time window. | "month" |
filterByDate | No | string | Only include posts on/after this date, for legacy search and subreddit listing only. Absolute or relative. | "2026-06-01" |
enableSearch | No | boolean, default true | Run the legacy search mode if Search Terms are provided. | true |
enableSubreddit | No | boolean, default true | Scrape subreddit URLs in legacy Start URLs for their post listing. | true |
sortSubreddit | No | string, default "new"; enum hot, new, top, rising, controversial | Order for posts from each legacy subreddit URL. new/top are real, direct orderings; hot/rising are a disclosed approximation (score decayed by age); controversial is upvote ratio closest to 50/50. | "new" |
enablePost | No | boolean, default true | Scrape post URLs in legacy Start URLs for the full post and comment tree. | true |
enableUser | No | boolean, default true | Scrape user profile URLs found in legacy Start URLs, using the fetch toggles below. Doesn't affect usernames. | true |
enableSubredditInfo | No | boolean, default true | Fetch metadata for subreddits found in legacy Start URLs, plus the optional top-subreddits ranking. | true |
fetchUserProfile | No | boolean, default true | For legacy Start-URL users, fetch profile/karma summary. Also the fallback for includeUserProfile when unset. | true |
fetchUserSubmitted | No | boolean, default true | For legacy Start-URL users, fetch submitted posts. Also the fallback for includePostHistory when unset. | true |
fetchUserComments | No | boolean, default true | For legacy Start-URL users, fetch comments. Also the fallback for includeCommentHistory when unset. | true |
fetchTopSubreddits | No | boolean, default false | Fetch a ranking of large subreddits by real subscriber count, added as top_subreddit rows. | false |
maxSubredditsInfo | No | integer, default 25; minimum: 1, maximum: 100 | Max subreddits to return when fetchTopSubreddits is enabled. | 25 |
maxItemsToSave | No | integer, default 200; minimum: 1 | Global max rows across profiles/history/affinity AND every legacy mode combined. The run stops once reached. | 200 |
limitPostsPerPage | No | integer, default 10; minimum: 1 | Target posts to fetch per legacy search term / per subreddit. | 10 |
limitCommentsPerPage | No | integer, default 50; minimum: 1 | Max comments to fetch for a single legacy post URL. | 50 |
limitCommunityPages | No | integer, default 2; minimum: 1 | Max result pages to paginate through per legacy subreddit URL or search term. | 2 |
maxCommentDepth | No | integer, default 5; minimum: 1, maximum: 20 | Max nested-reply depth to parse for legacy post URLs. Depth 1 = top-level comments only. | 5 |
maxItemsPerUser | No | integer, default 20; minimum: 1 | For legacy Start-URL users: max posts and comments to fetch. Also the fallback for maxHistoryItemsPerUser when unset. | 20 |
limitUserPages | No | integer, default 2; minimum: 1 | For legacy Start-URL users: max pages for posts and comments. Also the fallback for historyPagesPerUser when unset. | 2 |
proxyConfiguration | No | object | Apify Proxy config. Direct connection by default; auto-retries through datacenter, then residential proxy, on a rate-limited or failed request. | {"useApifyProxy": false} |
Common pitfall: setting usernames alone is enough to get the full profile + history + affinity pull — you do not need to also populate startUrls. The legacy startUrls/enableUser/fetchUser* fields are a separate, independent user-scraping path kept for backward compatibility; mixing both without ignoreStartUrls can produce duplicate user_profile rows for the same username if it appears in both usernames and a legacy startUrls profile link.
{"usernames": ["spez"],"includeUserProfile": true,"includePostHistory": true,"includeCommentHistory": true,"activityDateFrom": "3 months","includeSubredditAffinity": true,"maxAffinitySubreddits": 15,"minAffinityActivityCount": 1,"maxHistoryItemsPerUser": 20,"historyPagesPerUser": 2,"maxItemsToSave": 200,"proxyConfiguration": { "useApifyProxy": false }}
⬆️ Output sample
Every row is typed, normalized JSON with a consistent shape per type value — no HTML, no Reddit "Thing" kind/data wrapping. Results land in the Actor's default dataset, downloadable as JSON, CSV, Excel, XML, or RSS from the Apify Console or via the API. Below is one complete user_profile row (fields for user_post, user_comment, and user_subreddit_affinity rows are documented in the data table above).
{"type": "user_profile","isChild": false,"username": "spez","userSubmittedCount": 20,"userCommentsCount": 20,"activityDateFrom": "3 months","profileCoverageNote": "Karma/aggregate fields update infrequently (archive snapshot, not a live profile page) and may show null for inactive accounts; post/comment history below is fetched fresh this run.","postKarma": 184213,"commentKarma": 521904,"totalKarma": 706117,"numPosts": 1204,"numComments": 38210,"earliestPostAt": "2015-06-01T12:00:00.000Z","lastPostAt": "2026-08-10T09:15:00.000Z","scrapedAt": "2026-08-15T09:02:11.123Z"}
🎛️ How do you filter and target specific user profiles?
This Actor's targeting model is username-first, not query-first: you name exact users and control how much of their footprint comes back.
- Username or profile URL, not a search query.
usernamesaccepts either a bare handle or a fullreddit.com/user/...URL — both resolve identically, so you can paste directly from a browser tab without stripping the URL. - Depth vs. breadth on history.
maxHistoryItemsPerUsercaps how many posts and comments come back per user;historyPagesPerUsercaps how many pages get paginated to find them (100 items per page). Raise pages before raising items if a user is prolific and you're getting truncated results. - Recency scope.
activityDateFromaccepts an absolute date or a relative window ("2 weeks","3 months") and is applied while paginating a user's own history — a filter the legacy Start-URL modes have no equivalent for. - Affinity quality threshold.
minAffinityActivityCountdrops subreddits where a user only commented once or twice, somaxAffinitySubredditsreturns their real recurring communities instead of noise. - Run-wide volume control.
maxItemsToSaveis a single global cap across every row type in the run (profiles, posts, comments, affinity, and any legacy-mode rows) — the run stops pushing once it's hit.
Three real examples:
{ "usernames": ["spez"], "activityDateFrom": "2 weeks", "includeSubredditAffinity": false }
{ "usernames": ["spez", "kn0thing"], "includeSubredditAffinity": true, "maxAffinitySubreddits": 10, "minAffinityActivityCount": 3 }
{ "usernames": ["spez"], "includePostHistory": true, "includeCommentHistory": false, "maxHistoryItemsPerUser": 100, "historyPagesPerUser": 5 }
🔗 Want to try other Reddit scrapers?
| Scraper | What it extracts |
|---|---|
| Reddit Ads Scraper — Full Catalog Access | Reddit's ad catalog and advertiser data |
| Instagram Post Details Scraper With Engagement Data | Instagram post details plus likes/comments engagement data |
| TikTok Scraper With Repost Insights Data | TikTok video data including repost signals |
| Snapchat Popular Accounts Scraper: Story & Spotlight Content | Popular Snapchat accounts with story and Spotlight content |
| Facebook Reviews Scraper — Headlines, Tags & Reviewer Detail | Facebook Page reviews with reviewer-level detail |
| Pinterest Autocomplete Scraper — Topic Audience & Reach | Pinterest autocomplete suggestions with audience/reach signals |
🐍 How to extract Reddit data programmatically
This Actor runs like any other Apify Actor: one API call starts the run, and results come back as structured JSON from the dataset — no separate Reddit credential involved.
Python example
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("<store-username>/reddit-scraper-user-profiles-and-subreddit-activity").call(run_input={"usernames": ["spez"],"includeSubredditAffinity": True,"activityDateFrom": "1 month",})for item in client.dataset(run["defaultDatasetId"]).iterate_items():if item["type"] == "user_subreddit_affinity":print(item["username"], item["subreddit"], item["activityCount"])
Export to spreadsheets or CRM
From the Apify Console, open the run's dataset and export directly to CSV or Excel — username, subreddit, activityCount, and activityShare map cleanly onto spreadsheet columns for a pivot table, or username, postKarma, commentKarma, and lastPostAt for a CRM enrichment import.
⚖️ Is it legal to scrape Reddit?
Scraping publicly visible Reddit data — usernames, karma, post and comment content posted to public subreddits — is generally lawful, since these are records the platform and its users have made publicly accessible. This Actor collects only what's already visible without logging in.
Because the output includes personal data (usernames, karma history, and the content of posts and comments tied to identifiable individuals), GDPR and CCPA apply if you store or process it in bulk: you need a lawful basis for collection and retention, and reasonable limits on how long you keep it and who it's shared with. Reddit's own Terms of Service also govern automated access separately from data-protection law. Consult legal counsel for commercial applications involving bulk storage of personal data.
❓ FAQ
Does the profile karma data go stale?
Yes — postKarma, commentKarma, totalKarma, numPosts, and numComments come from a periodically-updated aggregate, not a live read of the profile page, and profileCoverageNote discloses this on every user_profile row. It may also be null for accounts with little activity. Post and comment history, by contrast, is fetched fresh on every run.
Can I get a user's subreddit activity along with their profile and history?
Yes. Set includeSubredditAffinity to true (it's on by default) and each username also gets user_subreddit_affinity rows — one per subreddit they're active in, ranked by affinityRank, capped by maxAffinitySubreddits (max 100) and floored by minAffinityActivityCount.
How accurate is the post and comment data?
The Actor returns posts and comments exactly as recorded in the underlying archive at request time. Because content can be edited or deleted on Reddit after the archive captured it, cross-check anything decision-critical against the live permalink before acting on it.
How many records can I get per run?
maxItemsToSave sets a single global cap on total rows across the whole run (default 200, minimum 1, no upper bound enforced by the Actor) — the run stops pushing new rows once it's hit, across profiles, history, affinity, and any legacy-mode rows combined.
What does the subreddit affinity ranking actually measure?
It's a real, direct measurement — not derived from the sampled post/comment history above — of how many tracked activities (posts plus comments) a user has in each subreddit, sorted highest first, with activityShare showing each subreddit's percentage of the user's total tracked activity. Raise minAffinityActivityCount to filter out incidental one-off activity.
Does this Actor work with Claude, ChatGPT, and AI agent frameworks?
It's callable as a standard Apify Actor run via apify-client, which any agent framework capable of making an HTTP/SDK call can invoke — point it at the Actor ID, pass usernames in the run input, and read typed JSON back from the dataset.
Can I use this without a Reddit API key or developer account?
Yes. You only need an Apify account and API token; the Actor reads from public archive endpoints and never requires Reddit OAuth credentials, an app registration, or a Reddit login.
What happens if a username doesn't exist or has no activity?
The Actor still pushes a user_profile row for it, with null values on the karma/aggregate fields it couldn't resolve and userSubmittedCount/userCommentsCount at 0 — it does not silently drop the username.
Conclusion
Reddit Scraper: User Profiles & Subreddit Activity turns a list of Reddit usernames into structured karma profiles, full post/comment history, and a ranked subreddit affinity map — without Reddit API credentials, OAuth setup, or approval waiting periods. It's built for growth teams, agencies, and researchers who need to understand what a Reddit user actually does, not just what their bio says, with the same typed row shape on every run. Set your usernames in the Apify Console and run it now.