# Reddit User Profile & Activity Scraper (`apt_marble/reddit-user-profile-activity-scraper`) Actor

Turn any Reddit username into a full profile dossier: karma breakdown, account age, trophies, plus every post and comment with scores, communities, dates and links. Includes ready-made stats — karma per day, top communities, posting cadence — for vetting, outreach, monitoring and research.

- **URL**: https://apify.com/apt\_marble/reddit-user-profile-activity-scraper.md
- **Developed by:** [Hamza](https://apify.com/apt_marble) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Reddit User Profile & Activity Scraper

Give this actor a list of Reddit usernames and it returns everything a public
Reddit profile can tell you: account age, post and comment karma, trophies, and
the account's actual posting history — every submission and every comment, with
scores, subreddits, timestamps and links. On top of the raw activity it computes
the things you would otherwise work out by hand: how old the account is in days,
how much karma it earns per day, and which communities it is genuinely active in.
It is built for anyone who needs to understand *people* on Reddit rather than
threads — recruiters, community managers, brand and influencer teams, moderators
vetting applicants, and researchers studying online behaviour.

No Reddit account, login or credentials required — paste the usernames and run it.

### What you can do with it

- **Vet an account before you engage with it** — see when it was created, how its
  karma accumulated, and whether its activity looks organic or bursty.
- **Find where a person is influential** — the profile record ranks the
  subreddits they post in by volume and by the karma those items earned.
- **Build creator and advocate lists** — run a list of usernames you collected
  elsewhere and get their full public activity in one dataset.
- **Track a competitor's or a partner's presence** — schedule the actor and watch
  karma, posting cadence and community mix change over time.
- **Research community behaviour** — export thousands of posts and comments per
  account for text analysis, sentiment work or academic study.
- **Screen moderator or contributor applicants** — check history, tone and
  activity spread across communities in one pass.

### What you get

Every run produces one `profile` record per username, plus one record per post
and per comment collected for that account. Abridged examples of what lands in
your dataset:

```json
{
  "type": "profile",
  "status": "ok",
  "username": "spez",
  "url": "https://www.reddit.com/user/spez/",
  "createdAt": "2005-06-06T19:39:12.000Z",
  "accountAgeDays": 7723,
  "totalKarma": 878341,
  "postKarma": 205310,
  "commentKarma": 673031,
  "karmaPerDay": 113.73,
  "isEmployee": true,
  "isMod": true,
  "verified": true,
  "postsScraped": 42,
  "commentsScraped": 100,
  "totalCommentScore": 4754,
  "medianCommentScore": 28.5,
  "topSubreddits": [
    { "subreddit": "RDDT", "posts": 0, "comments": 41, "items": 41, "totalScore": 1123 },
    { "subreddit": "redditstock", "posts": 0, "comments": 28, "items": 28, "totalScore": 2264 }
  ],
  "activeSubredditCount": 8,
  "firstActivityAt": "2025-06-03T19:44:45.000Z",
  "lastActivityAt": "2026-06-16T16:59:58.000Z",
  "activitySpanDays": 377.89,
  "commentsPerDay": 0.26,
  "trophyCount": 41,
  "scrapedAt": "2026-07-28T00:00:00.000Z"
}
```

```json
{
  "type": "comment",
  "username": "spez",
  "id": "os0o1vi",
  "body": "And thank you (mod tools suck) u/shiruken!",
  "url": "https://www.reddit.com/user/spez/comments/1u7hraf/21_years_of_reddit/os0o1vi/",
  "subreddit": "u_spez",
  "score": 93,
  "createdAt": "2026-06-16T16:59:58.000Z",
  "postId": "1u7hraf",
  "postTitle": "21 years of Reddit",
  "isSubmitter": true,
  "isTopLevel": false
}
```

### Input reference

| Field | Type | Default | What it does |
| --- | --- | --- | --- |
| `usernames` | list of strings | `["spez"]` | The accounts to scrape. `spez`, `u/spez` and full profile links all work. Invalid entries are skipped with a warning. |
| `scrapePosts` | boolean | `true` | Collect each account's submissions. |
| `scrapeComments` | boolean | `true` | Collect each account's comments. |
| `maxPostsPerUser` | integer | `100` | Posts to collect per account (0–1000). |
| `maxCommentsPerUser` | integer | `100` | Comments to collect per account (0–1000). |
| `includeTrophies` | boolean | `false` | Add the account's trophy case to its profile record. |
| `sort` | select | `new` | `new`, `top`, `hot` or `controversial` ordering of the history. |
| `time` | select | `all` | Period used by `top` and `controversial`: hour, day, week, month, year, all. |
| `postedAfter` | string | empty | Keep only activity newer than a date (`2026-01-01`) or a relative window (`7d`, `24h`, `4w`). |
| `maxConcurrency` | integer | `4` | How many accounts are processed at the same time (1–10). |
| `proxyCountry` | select | `us` | Country to appear to browse from. |

### Output fields

**Profile records** (`type: "profile"`)

| Field | Type | Description |
| --- | --- | --- |
| `username`, `url`, `userId` | text | The account and its profile link. |
| `status` | text | `ok`, or `not_found` for suspended, deleted or non-existent accounts. |
| `reason`, `message` | text | On a `not_found` record only: `suspended` when Reddit says so, otherwise `not_found`, plus a plain-English explanation. |
| `displayName`, `description` | text | Profile title and public description. |
| `createdAt`, `accountAgeDays` | date / number | When the account was created and how old it is today. |
| `totalKarma`, `postKarma`, `commentKarma`, `awardeeKarma`, `awarderKarma` | number | Karma breakdown. |
| `karmaPerDay` | number | Total karma divided by account age in days. |
| `isEmployee`, `isMod`, `isGold`, `verified`, `hasVerifiedEmail`, `acceptsFollowers`, `over18` | boolean | Account flags. |
| `avatar`, `banner`, `profileSubscribers` | text / number | Profile imagery and follower count of the user's own profile community. |
| `postsScraped`, `commentsScraped` | number | How much activity this run collected. |
| `totalPostScore`, `totalCommentScore`, `medianPostScore`, `medianCommentScore` | number | Score roll-ups over the collected activity. |
| `topSubreddits` | array | Communities ranked by items collected, each with `posts`, `comments`, `items`, `totalScore`. |
| `activeSubredditCount` | number | Distinct communities seen in the collected activity. |
| `firstActivityAt`, `lastActivityAt`, `activitySpanDays` | date / number | Window the collected activity covers. |
| `postsPerDay`, `commentsPerDay` | number | Cadence measured across that window. |
| `trophyCount`, `trophies` | number / array | Trophy case, when requested. |
| `scrapedAt` | date | When the record was produced. |

**Post records** (`type: "post"`) — `id`, `title`, `url`, `permalink`, `subreddit`,
`author`, `body`, `linkUrl`, `domain`, `score`, `upvoteRatio`, `numComments`,
`numCrossposts`, `totalAwards`, `flair`, `createdAt`, `editedAt`, `isSelfPost`,
`isVideo`, `isGallery`, `isCrosspost`, `over18`, `spoiler`, `locked`, `stickied`,
`archived`, `thumbnail`, and `media[]` (image, gallery, video with `dashUrl` and
`hlsUrl`, or embed).

**Comment records** (`type: "comment"`) — `id`, `body`, `url`, `permalink`,
`subreddit`, `author`, `score`, `controversiality`, `createdAt`, `editedAt`,
`postId`, `postTitle`, `postUrl`, `parentId`, `isTopLevel`, `isSubmitter`,
`depth`, `distinguished`, `stickied`, `collapsed`.

Every record — profile, post and comment — carries the `username` you asked for,
so a multi-account run is trivial to group and filter.

### Pricing

**Pay per result: $0.0005 per dataset item — $0.50 per 1,000.**

You are charged only for the rows you receive, whether a row is a profile, a
post or a comment. There is no monthly fee and nothing to pay for accounts that
turn out to be suspended or deleted beyond the single placeholder row they
produce.

- A standard account pull — profile plus 100 posts and 100 comments, 201 rows —
  costs about **$0.10**.
- A 50-account vetting batch at that depth is roughly **$5.00**.
- A deep history dump on one power user (1,000 posts + 1,000 comments) is about
  **$1.00**.

Set a maximum charge on the run and the actor stops cleanly once it is reached,
rather than overshooting your budget.

### Limits and what this actor cannot do

- **About 1,000 items per history feed.** Reddit itself stops any single feed at
  roughly 1,000 records. Posts and comments are separate feeds, so the practical
  maximum is about 1,000 posts *and* 1,000 comments per account. Older activity
  beyond that point is simply not reachable from a public profile — by anyone.
- **Public communities only.** Activity that lives in a private, banned or
  otherwise closed community never appears on a public profile, so it cannot be
  collected. Ordinary and adult (NSFW) communities come back normally; content
  from quarantined communities has not been verified.
- **Accounts Reddit will not serve still appear, flagged.** Any such username
  comes back as a record with `status: "not_found"`, so the name never silently
  disappears from your dataset. Reddit does say outright when an account is
  suspended (`reason: "suspended"`), and a suspended account exposes nothing
  else — no karma, no creation date, no history. A deleted account and a name
  that never existed are indistinguishable from each other; both arrive as
  `reason: "not_found"`.
- **Public data only.** No private messages, no saved, hidden or upvoted items,
  no email addresses, no device or location data, no moderator-only information,
  and no voting history. If it is not on the public profile, it is not in the
  output.
- **No live presence.** There is no "online now" signal and no way to tell
  whether an account is active at this moment — only what it has already done.
- **Deleted and removed content stays deleted.** Items the user or a moderator
  removed come back with `[deleted]`/`[removed]` where the text used to be.
- **Trophy dates are mostly missing.** Reddit publishes a grant date for only a
  handful of trophies — in a real 41-trophy case, three had one. The rest arrive
  with `grantedAt: null`.
- **`time` only applies to two orders.** The `top` and `controversial` orders
  honour the time range; `new` and `hot` ignore it, exactly as Reddit does.
- **Date filtering behaves differently per order.** With the `new` order the
  actor stops as soon as the history passes your cut-off, which makes
  recent-window runs fast; with the score-based orders it has to collect first
  and filter after.
- **Cadence figures describe the sample, not the lifetime.** `postsPerDay`,
  `commentsPerDay` and `activitySpanDays` are measured across the activity this
  run collected. Raise `maxPostsPerUser`/`maxCommentsPerUser` for a longer window.
  `karmaPerDay`, by contrast, uses lifetime karma and full account age.
- **Very large jobs take longer.** Reddit paces how quickly anyone can read it,
  so a huge username list is limited by Reddit itself rather than by the actor.
  The run keeps going, it just needs more time.

### FAQ

**Do I need a Reddit account?**
No. You do not need a Reddit account, a login, or any credentials — just enter
what you want and run it.

**How fast is it?**
A standard account — profile plus 100 posts and 100 comments — is done in a few
seconds. Results come back in large batches, so longer histories scale smoothly,
and several accounts are handled at once: a list of hundreds of usernames
finishes in minutes.

**Can I get a user's complete history?**
Up to about 1,000 posts and 1,000 comments. Reddit does not serve public profile
history beyond that, for anyone.

**What happens if a username is wrong or the account was banned?**
The run continues. That username gets a record with `status: "not_found"` — and
`reason: "suspended"` when Reddit identifies it as a suspension — while
everything else in your list is still scraped.

**Can I run it on a schedule?**
Yes. Scheduling it daily or weekly and appending to the same dataset is a normal
way to track karma growth, posting cadence and community shifts over time.

**Can I feed it profile URLs from a spreadsheet?**
Yes. Full profile links, `u/name` handles and bare usernames can be mixed freely
in the same list.

**Is any of this private data?**
No. Everything the actor returns is what any visitor can already see on a public
Reddit profile — it is simply collected, cleaned and summarised for you.

# Actor input Schema

## `usernames` (type: `array`):

The accounts to scrape. Paste them in any form: `spez`, `u/spez` or a full profile link such as `https://www.reddit.com/user/spez/`. Entries that are not valid usernames are skipped with a warning.

## `scrapePosts` (type: `boolean`):

Include the submissions each account has published.

## `scrapeComments` (type: `boolean`):

Include the comments each account has written.

## `maxPostsPerUser` (type: `integer`):

How many posts to collect for each account. Reddit stops any single history feed at about 1,000 items, so that is the ceiling.

## `maxCommentsPerUser` (type: `integer`):

How many comments to collect for each account. Reddit stops any single history feed at about 1,000 items, so that is the ceiling.

## `includeTrophies` (type: `boolean`):

Add the account's trophy case (cake days, club badges, awards) to its profile record. Costs one extra request per account.

## `sort` (type: `string`):

How to order each account's history. `new` walks backwards in time and is the only order that pairs with the date filter below.

## `time` (type: `string`):

Period the `Highest scoring` and `Most controversial` orders look at. Ignored by the other orders.

## `postedAfter` (type: `string`):

Keep only posts and comments newer than this. Accepts a date such as `2026-01-01` or a relative window such as `7d`, `24h` or `4w`. Leave empty for the full history.

## `maxConcurrency` (type: `integer`):

How many accounts to work on at the same time. Raise it for long username lists, lower it if you want a gentler run.

## `proxyCountry` (type: `string`):

Country to appear to browse from.

## Actor input object example

```json
{
  "usernames": [
    "spez"
  ],
  "scrapePosts": true,
  "scrapeComments": true,
  "maxPostsPerUser": 100,
  "maxCommentsPerUser": 100,
  "includeTrophies": false,
  "sort": "new",
  "time": "all",
  "maxConcurrency": 4,
  "proxyCountry": "us"
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "usernames": [
        "spez"
    ],
    "maxPostsPerUser": 100,
    "maxCommentsPerUser": 100,
    "sort": "new",
    "time": "all",
    "maxConcurrency": 4,
    "proxyCountry": "us"
};

// Run the Actor and wait for it to finish
const run = await client.actor("apt_marble/reddit-user-profile-activity-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "usernames": ["spez"],
    "maxPostsPerUser": 100,
    "maxCommentsPerUser": 100,
    "sort": "new",
    "time": "all",
    "maxConcurrency": 4,
    "proxyCountry": "us",
}

# Run the Actor and wait for it to finish
run = client.actor("apt_marble/reddit-user-profile-activity-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "usernames": [
    "spez"
  ],
  "maxPostsPerUser": 100,
  "maxCommentsPerUser": 100,
  "sort": "new",
  "time": "all",
  "maxConcurrency": 4,
  "proxyCountry": "us"
}' |
apify call apt_marble/reddit-user-profile-activity-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=apt_marble/reddit-user-profile-activity-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/OjQbDfOlxekv8FVJQ/builds/a0XGf3IjbWeeFddzK/openapi.json
