# Reddit User Profile Scraper (`khadinakbar/reddit-user-profile-scraper`) Actor

Scrape public Reddit profiles and submitted-post history from usernames or profile URLs, with explicit source and outcome fields for AI agents and research. No login. Not for private messages or login-walled data. $0.02/profile + $0.01/post.

- **URL**: https://apify.com/khadinakbar/reddit-user-profile-scraper.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Social media, Lead generation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 profile scrapeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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 Scraper — Karma, Account Age & Post History

**Reddit User Profile Scraper** helps OSINT analysts, community moderators, brand researchers, and AI agents turn Reddit usernames or profile URLs into structured rows: public karma fields when Reddit about data is reachable, account age, bio/flags, and recent submitted posts. Run it on [Apify](https://apify.com) for scheduling, API/MCP access, dataset export (JSON/CSV/Excel), and monitored runs.

Primary entity: one `profile` dataset row per user, plus optional `post` rows for that user's submitted history. Public data only — not private messages, follower graphs, or login-walled settings.

### Best fit

Use this Actor when you already have Reddit usernames / `u/` handles / profile URLs and need a **profile + post history** table for vetting, enrichment, or agent tools.

**Constructive next step:** for subreddit feeds or keyword discovery, route to [Reddit Posts Scraper](https://apify.com/khadinakbar/reddit-posts-scraper) (search/subreddit posts). For comment trees on a thread, use [Reddit Comments Scraper](https://apify.com/khadinakbar/reddit-comments-scraper). For open keyword search across Reddit, use [Reddit Search Scraper](https://apify.com/khadinakbar/reddit-search-scraper).

### Workflow story

A trust-and-safety analyst pastes `spez` and sets **Max posts per user** to `5`. The run writes one profile row (karma when about succeeds, otherwise a posts-inferred profile with `karmaAvailable: false`) and up to five post rows with title, score, subreddit, and permalink. They export CSV into a review sheet, then schedule the same input weekly via Apify to watch posting cadence — without writing a custom Reddit client.

### How to use

1. Open the Actor in Apify Console (Input tab).
2. Prefill already includes `spez` — click **Start**, or paste your usernames.
3. Keep **Include post history** on for research; set **Max posts per user** to `0` / turn posts off for a profile-only snapshot.
4. Open the dataset **Profiles** and **Posts** views, or download JSON/CSV/Excel.

### Input

| Field           | Required | Description                                  |
| --------------- | -------- | -------------------------------------------- |
| `usernames`     | yes      | Usernames, `u/name`, or profile URLs         |
| `maxPosts`      | no       | 0–200 posts per user (default 25; prefill 5) |
| `includePosts`  | no       | Default true                                 |
| `includeNSFW`   | no       | Default false                                |
| `sort`          | no       | Provider search sort (`new` default)         |
| `maxItems`      | no       | Cap unique users (default 25)                |
| `providerOrder` | no       | ScrapeCreators / SociaVault order            |
| `proxy`         | no       | Residential recommended for OAuth about      |

```json
{
  "usernames": ["spez"],
  "maxPosts": 5,
  "includePosts": true,
  "includeNSFW": false
}
```

### Output

You can download the dataset in JSON, HTML, CSV, or Excel.

| Field                                         | On      | Description                                                                     |
| --------------------------------------------- | ------- | ------------------------------------------------------------------------------- |
| `recordType`                                  | both    | `profile` or `post`                                                             |
| `username`                                    | both    | Canonical username                                                              |
| `profileUrl`                                  | both    | `https://www.reddit.com/user/{name}/`                                           |
| `totalKarma` / `linkKarma` / `commentKarma`   | profile | When about/karma is available                                                   |
| `karmaAvailable`                              | profile | `false` when profile was inferred from posts                                    |
| `createdAt` / `accountAgeDays`                | profile | Account age when about succeeds                                                 |
| `title` / `score` / `subreddit` / `permalink` | post    | Submitted post fields                                                           |
| `provider`                                    | both    | `scrapecreators`, `sociavault`, `reddit-oauth`, `scrapfly`, or `posts-inferred` |
| `outcome`                                     | both    | Row outcome (`OK`, …)                                                           |

**Profile example**

```json
{
  "recordType": "profile",
  "username": "spez",
  "profileUrl": "https://www.reddit.com/user/spez/",
  "karmaAvailable": false,
  "postsReturned": 5,
  "outcome": "OK",
  "provider": "posts-inferred"
}
```

**Post example**

```json
{
  "recordType": "post",
  "username": "spez",
  "postId": "1u7hraf",
  "title": "21 years of Reddit",
  "subreddit": "u_spez",
  "score": 4200,
  "permalink": "https://www.reddit.com/r/u_spez/comments/1u7hraf/21_years_of_reddit/",
  "outcome": "OK",
  "provider": "scrapecreators"
}
```

Missing users finish `VALID_EMPTY` with zero billable profile/post events.

### Pricing (Pay per event + usage)

This Actor uses **Pay per event + platform usage**. Event prices below are the configured PPE map; always confirm the live Pricing tab in Console as the current source of truth.

| Event               | Price                |
| ------------------- | -------------------- |
| `apify-actor-start` | $0.00005 / run       |
| `profile-scraped`   | $0.020 / profile row |
| `post-scraped`      | $0.010 / post row    |

**Example:** one profile row plus five post rows costs $0.00005 + $0.020 + 5×$0.010 = about $0.07005 in event charges, plus platform usage.

### API example

```bash
curl "https://api.apify.com/v2/acts/khadinakbar~reddit-user-profile-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"usernames":["spez"],"maxPosts":5,"includePosts":true}'
```

```javascript
import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("khadinakbar/reddit-user-profile-scraper").call({
  usernames: ["spez"],
  maxPosts: 5,
  includePosts: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

### Agent / MCP prompt

> Use khadinakbar/reddit-user-profile-scraper with usernames=\["spez"], maxPosts=5. Expect one profile row and up to five post rows. Read OUTPUT.outcome, dataset provenance via provider, and karmaAvailable. Paginate the dataset for larger maxPosts. For subreddit feeds, continue with Reddit Posts Scraper.

Check `OUTPUT` / `RUN_SUMMARY` for outcome readback, `itemsPushed`, `chargedEventCounts` (cost), `providersUsed` (provenance), and scope. Paginate dataset items when maxPosts is large.

### Builder's note

I built this Actor after I found Reddit about.json unavailable on common exits while ScrapeCreators and SociaVault author search still returned real submitted posts. I designed the runtime to cost-rank that provider path for post history, try OAuth and Scrapfly for about/karma when owner secrets succeed, and emit an honest posts-inferred profile (`karmaAvailable: false`) when about is unavailable — so agents still get usable history with usable history for agents.

### Best results

- Start with the prefill username and maxPosts 5 to validate your workflow cheaply.
- Provide specific public usernames; duplicates are removed automatically.
- Keep includeNSFW false unless you need over\_18 posts; profile rows still write.
- When karmaAvailable is false, treat karma fields as unavailable rather than zero — confirm about coverage in RUN\_SUMMARY warnings.

### FAQ and legal

Use public Reddit data you are authorized to collect under Reddit's terms of service and applicable laws. Prefer authorized public sources. Open Issues for support; custom workflows available on request.

Related portfolio Actors with routing context: [Reddit Posts Scraper](https://apify.com/khadinakbar/reddit-posts-scraper) for subreddit/keyword posts, [Reddit Comments Scraper](https://apify.com/khadinakbar/reddit-comments-scraper) for thread comments, [Reddit Search Scraper](https://apify.com/khadinakbar/reddit-search-scraper) for open search.

# Actor input Schema

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

Reddit usernames, u/handles, or profile URLs to scrape. Example: spez, u/spez, or https://www.reddit.com/user/spez/. Duplicates are removed. Cap via maxItems. Not a subreddit or post URL.

## `maxPosts` (type: `integer`):

Maximum submitted posts to return per user. Default 25, minimum 0 (profile only), maximum 200. Each returned post is billed separately.

## `includePosts` (type: `boolean`):

When true (default), collect recent submitted posts for each user. Turn off to bill only profile rows.

## `includeNSFW` (type: `boolean`):

Include posts marked over\_18 / NSFW. Default false. Profile about still returns regardless.

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

Sort order for provider-backed post search (author:username). new is default. OAuth submitted feed always uses Reddit's newest order.

## `maxItems` (type: `integer`):

Hard cap on unique usernames processed in one run. Default 25, minimum 1, maximum 100.

## `providerOrder` (type: `string`):

Which post-history provider to try first after OAuth. scrapecreators-first is recommended. sociavault-first swaps fallback. \*-only pins one vendor. oauth-first still falls back to providers for posts.

## `proxy` (type: `object`):

Apify Proxy used for Reddit OAuth about/submitted calls. Residential is recommended. Provider post search does not need your proxy.

## Actor input object example

```json
{
  "usernames": [
    "spez",
    "u/AutoModerator"
  ],
  "maxPosts": 5,
  "includePosts": true,
  "includeNSFW": false,
  "sort": "new",
  "maxItems": 10,
  "providerOrder": "scrapecreators-first",
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

## `outputRecord` (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"
    ],
    "maxPosts": 5,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/reddit-user-profile-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"],
    "maxPosts": 5,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

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

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).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"
  ],
  "maxPosts": 5,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call khadinakbar/reddit-user-profile-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/reddit-user-profile-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/eAulEMIbfyznAN5zg/builds/E8J7J1utLC9gWbqSZ/openapi.json
