Reddit Profile Scraper avatar

Reddit Profile Scraper

Pricing

from $2.99 / 1,000 profiles

Go to Apify Store
Reddit Profile Scraper

Reddit Profile Scraper

Scrape public Reddit user profiles by username or profile URL, including karma, account metadata, trophies, and optional recent activity.

Pricing

from $2.99 / 1,000 profiles

Rating

0.0

(0)

Developer

w3crawler

w3crawler

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Reddit Profile Scraper

Extract bounded public profile metadata from Reddit by username or public profile URL. The Actor can include a small, caller-selected window of recent public posts and comments, with explicit activity status when a requested section is empty or unavailable.

Actor page: Reddit Profile Scraper on Apify

Why use this Actor

Use it to build a current, public-only profile inventory for research, moderation support, community analysis, or other lawful workflows that need profile-level context. Each normal record is tied to a canonical public profile URL and includes the representation used for extraction.

The Actor does not log in, access private account data, solve CAPTCHAs, hide automation, alter browser fingerprints, bypass Reddit access controls, or claim that a blocked page is a profile. A failed profile request becomes a four-field diagnostic.

What the dataset contains

FieldDescription
recordTypeprofile for a normal public profile row.
recordIdStable identity derived from the normalized public username.
sourceUrl, profileUrlCanonical public Reddit profile provenance.
username, requestedUsernameUsername returned by Reddit and the caller's normalized request.
commentKarma, linkKarma, totalKarmaPublic karma values when exposed.
createdAt, accountAgeDaysPublic account creation time and derived age when available.
isGold, isMod, isEmployee, hasVerifiedEmail, isSuspendedPublic markers only when observable from the page.
bioPublic profile description when exposed.
trophiesPublic trophy names, descriptions, and icons when exposed.
recentPosts, recentCommentsOptional bounded public activity selected by the caller.
includeRecentPosts, includeRecentComments, maxRecentItemsCaller settings retained in each normal row.
activityStatusPer-section not_requested, available, empty, or unavailable status and count.
extractionMethod, scrapedAtPublic-page representation and UTC extraction time.

Diagnostic rows contain only url, error, errorCode, and scrapedAt. They describe a blocked, login-redirected, unavailable, or incomplete public profile and never contain placeholder profile data.

Input

usernames is required. All other fields are optional. Unknown fields, loose type coercion, invalid usernames, and unsupported profile URL shapes are rejected.

FieldType and limitsDefaultBehavior
usernamesArray of 1–20 strings; each value is a bare Reddit username, u/name, or HTTPS profile URL with a 1–30 character username.requiredDuplicate normalized usernames are removed; one public profile request is scheduled per remaining username.
includeRecentPostsBoolean.falseRequest a bounded public /submitted/ section.
includeRecentCommentsBoolean.falseRequest a bounded public /comments/ section.
maxRecentItemsInteger from 1–50.10Maximum posts and maximum comments per profile when those sections are requested.
proxyConfigurationOptional Apify Proxy or custom proxy object.unsetA proxy is created only when useApifyProxy is true or proxyUrls contains at least one HTTP(S) URL.

Accepted profile URL forms include https://reddit.com/user/name/, https://www.reddit.com/user/name/, and the equivalent old.reddit.com/u/name/ form. The runtime normalizes these to the public www.reddit.com/user/name/ page. The input has no precedence rules: all normalized usernames are processed once, and activity options apply to every profile in the run.

Input examples

Profile metadata only

{
"usernames": [
"public_user",
"u/another_user",
"https://www.reddit.com/user/third_user/"
]
}

Profile plus recent public posts

{
"usernames": ["public_user"],
"includeRecentPosts": true,
"includeRecentComments": false,
"maxRecentItems": 5
}

Profile plus both activity sections and Apify Proxy

{
"usernames": ["public_user", "another_user"],
"includeRecentPosts": true,
"includeRecentComments": true,
"maxRecentItems": 3,
"proxyConfiguration": {
"useApifyProxy": true
}
}

Direct custom proxy configuration

{
"usernames": ["public_user"],
"proxyConfiguration": {
"proxyUrls": ["http://proxy.example.test:8080"]
}
}

Run it in Apify Console

  1. Open the Actor page and choose Try for free or Start.
  2. Enter one or more public usernames or profile URLs in usernames.
  3. Enable recent posts or comments only when the activity window is needed, then choose maxRecentItems.
  4. Add permitted Proxy settings if the run requires them. Proxy does not bypass a challenge or make private data public.
  5. Start the run and inspect normal rows separately from diagnostics. Open the OUTPUT key-value record for counts and activity status totals.

Cost and run sizing

Browser execution, response size, dataset storage, and optional Proxy usage affect Apify cost. The Actor's configured pay-per-event metadata charges per profile dataset event; check the Actor page for current account pricing. Start with one username, metadata only, and a small activity limit. Increase the list or activity window after confirming that Reddit is returning public pages. A Proxy cannot turn an access challenge into a successful profile record.

Normal output example

{
"recordType": "profile",
"recordId": "reddit-profile:87a2c41e3db2194ce9aa",
"sourceUrl": "https://www.reddit.com/user/public_user/",
"username": "public_user",
"profileUrl": "https://www.reddit.com/user/public_user/",
"commentKarma": 1234,
"linkKarma": 5678,
"totalKarma": 6912,
"createdAt": "2020-01-02T03:04:05.000Z",
"accountAgeDays": 2430,
"isGold": false,
"isMod": false,
"isEmployee": false,
"hasVerifiedEmail": true,
"isSuspended": false,
"bio": "Public profile description.",
"trophies": [
{
"name": "Verified Email",
"description": "Public trophy marker",
"icon": "https://www.reddit.com/icon.png"
}
],
"recentPosts": [
{
"id": "abc123",
"title": "A public post",
"subreddit": "smallbusiness",
"score": 12,
"numComments": 3,
"createdAt": "2026-09-07T12:00:00.000Z",
"permalink": "https://www.reddit.com/r/smallbusiness/comments/abc123/a_public_post/",
"url": "https://www.reddit.com/r/smallbusiness/comments/abc123/a_public_post/",
"selfText": "Public post text."
}
],
"requestedUsername": "public_user",
"includeRecentPosts": true,
"includeRecentComments": false,
"maxRecentItems": 5,
"activityStatus": {
"posts": {
"requested": true,
"status": "available",
"count": 1
},
"comments": {
"requested": false,
"status": "not_requested",
"count": 0
}
},
"extractionMethod": "reddit-profile-rendered-dom",
"scrapedAt": "2026-09-08T06:30:00.000Z"
}

Fallback and diagnostic output

If a requested activity section is public but empty, the profile is retained and that section is marked empty. If a requested section cannot be fetched, the profile is retained with activityStatus.<section>.status set to unavailable and a bounded error. The Actor does not invent activity items.

When the profile itself is blocked or unavailable, the dataset contains a diagnostic such as:

{
"url": "https://www.reddit.com/user/public_user/",
"error": "ACCESS_BOUNDARY: Reddit presented an anti-bot challenge or blocked the public profile request",
"errorCode": "REDDIT_ACCESS_BLOCKED",
"scrapedAt": "2026-09-08T06:30:00.000Z"
}

Common diagnostic codes are REDDIT_ACCESS_BLOCKED, PROFILE_UNAVAILABLE, and REDIRECT_OUT_OF_SCOPE. A run can contain normal profile rows and diagnostics for other usernames at the same time.

Run summary output

The OUTPUT key-value record describes the run; it is not a replacement for dataset rows:

{
"recordType": "runSummary",
"sourceWebsite": "https://www.reddit.com/",
"usernames": ["public_user", "another_user"],
"includeRecentPosts": true,
"includeRecentComments": true,
"maxRecentItems": 3,
"proxyConfigured": false,
"profilesStored": 1,
"diagnosticsStored": 1,
"failedRequests": 1,
"blockedRequests": 1,
"activitySummary": {
"postsRequested": 1,
"commentsRequested": 1,
"postsReturned": 3,
"commentsReturned": 3,
"unavailableSections": []
},
"found": true,
"dataAvailable": true,
"diagnosticReasons": [
"ACCESS_BOUNDARY: Reddit presented an anti-bot challenge or blocked the public profile request"
],
"scrapedAt": "2026-09-08T06:30:00.000Z"
}

recordType is runSummary when at least one normal profile is stored and runDiagnostic when none are stored. found and dataAvailable are true only when a normal profile row was written.

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

Advanced usage and boundaries

  • Use bare usernames for simple batch work and canonical profile URLs when the input itself is part of your provenance record.
  • Set both activity flags independently. maxRecentItems is applied separately to posts and comments for every profile.
  • Public profile pages may expose different fields over time. Missing karma, trophies, markers, or timestamps remain absent rather than being inferred.
  • Activity URLs are accepted only when they resolve to HTTPS Reddit URLs. External links in post content are not treated as Reddit activity provenance.
  • Proxy settings are transport configuration only. They do not bypass login walls, CAPTCHAs, rate limits, or access controls.
  • Treat public profile information as personal data where applicable. Minimize retention, restrict access, honor deletion or opt-out requests, and use a lawful purpose.

Troubleshooting

The run contains REDDIT_ACCESS_BLOCKED

Reddit returned a challenge, login wall, WAF response, or other access boundary. Try one public username, reduce the activity scope, wait before retrying, and review Reddit and Proxy terms. Do not attempt to bypass the challenge.

The run contains PROFILE_UNAVAILABLE

The public page loaded without a usable profile representation. Check the username spelling and canonical public URL. Suspended, deleted, or age-gated accounts may not expose the fields this Actor requires.

The run contains REDIRECT_OUT_OF_SCOPE

The final browser URL left HTTPS Reddit. Use the canonical Reddit profile URL and remove external redirect wrappers.

Activity is unavailable

The profile itself was available, but the requested /submitted/ or /comments/ page could not be fetched. The profile row remains usable; inspect the bounded status error and rerun later if the activity is important.

API and issues

The Actor can be started and monitored through the Apify API documentation using the Actor ID or the Actor page. For a reproducible problem, include the run ID, sanitized input shape, diagnostic code, and OUTPUT summary in the Actor's Issues or support channel. Do not include private account data, proxy credentials, or session tokens in a report.

This Actor is intended only for publicly visible Reddit profile and activity pages and does not provide legal advice. You are responsible for complying with Reddit's terms, subreddit rules, applicable privacy and data-protection laws, copyright requirements, and any consent, retention, or opt-out obligations. Do not use results to infer protected characteristics, make high-impact decisions, or target people in sensitive contexts.

This is an independent third-party Actor. It is not sponsored, endorsed, administered, or affiliated with Reddit, Inc., Apify, or any Reddit community. Reddit and related names and marks belong to their respective owners.

Local development

npm install
npm test
npm run check
apify validate-schema
apify run --purge --input-file .actor/input.json
npm run validate-datasets