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

Get a Reddit user's public profile — karma, account age, premium status, trophies.

- **URL**: https://apify.com/xtracto/reddit-user-profile-scraper.md
- **Developed by:** [Farhan Febrian Nauval](https://apify.com/xtracto) (community)
- **Categories:** Social media
- **Stats:** 3 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Scraper

Extract public profile data from any Reddit user in bulk — post karma, comment karma, account creation date, trophies (verified email, premium, employee), profile picture, and Reddit's internal user ID — in a clean structured JSON output.

### Why use this actor

- **No account / no login required** — just give it a Reddit username or profile URL.
- **No API key needed** — works out of the box; you can optionally plug in a Reddit Client ID for higher throughput.
- **Rich detail** — post karma and comment karma broken out separately, account creation timestamp, verified-email flag, premium / employee / mod badges, avatar URL, and the stable `id` (t2\_xxx) you can use to cross-reference with other Reddit records.
- **Bulk input** — pass a list of usernames or URLs in one run; one clean dataset row per profile.
- **Automatic retries** — transient failures retry with exponential backoff; profiles that genuinely don't exist surface as `_error: "not_found"` so you can triage failures.
- **Stable JSON output** suitable for pipelines, spreadsheets, and databases — every row carries `_input`, `_source`, `_scrapedAt` envelope fields so you can join results back to your input list.

### How it works

1. You provide a list of Reddit usernames (e.g. `spez`) or full profile URLs (e.g. `https://www.reddit.com/user/spez/`).
2. The actor fetches each profile and reads the same `about` record Reddit's web app shows, then assembles a flat JSON row.
3. If the primary path is rate-limited, the actor automatically falls back to a public path so the run keeps moving.
4. Results stream into your dataset, ready to download as JSON, CSV, or Excel.

You do not need to manage scrapers, browsers, or rotating IPs — all handled internally.

### Input

```json
{
  "usernames": [
    "spez",
    "GoldenSights"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["DATACENTER"]
  }
}
```

| Field | Type | Description |
|---|---|---|
| `usernames` | array | List of Reddit usernames or profile URLs to scrape. Both `spez` and `https://www.reddit.com/user/spez/` are accepted. |
| `redditClientId` | string | *(Optional.)* Token that unlocks a higher-throughput path (~60 rpm vs ~10 rpm). Leave blank to use the public path. Get one for free at reddit.com/prefs/apps. |
| `proxyConfiguration` | object | Apify Proxy settings. Datacenter proxy works for most cases; Residential recommended for runs above 5,000 profiles. |

### Output

Input: `spez`

```json
{
  "_input": "spez",
  "_source": "S3-fallback",
  "_scrapedAt": "2026-05-18T11:09:11.628957+00:00",
  "id": "1w72",
  "name": "spez",
  "created_utc": 1118030400.0,
  "link_karma": 182650,
  "comment_karma": 755338,
  "awardee_karma": 0,
  "awarder_karma": 0,
  "total_karma": 937988,
  "is_gold": true,
  "is_mod": true,
  "is_employee": true,
  "is_friend": false,
  "is_blocked": false,
  "verified": true,
  "has_verified_email": true,
  "hide_from_robots": false,
  "accept_followers": true,
  "has_subscribed": true,
  "pref_show_snoovatar": false,
  "snoovatar_img": "",
  "snoovatar_size": null,
  "icon_img": "https://styles.redditmedia.com/t5_3k30p/styles/profileIcon_uj015iwx9s7g1.png?width=256&height=256&crop=256:256,smart&s=aa819b0964f6e3019e769d1cc8ede7318c3869a3",
  "subreddit": {
    "display_name": "u_spez",
    "display_name_prefixed": "u/spez",
    "title": "spez",
    "public_description": "Reddit CEO",
    "subscribers": 0,
    "subreddit_type": "user",
    "url": "/user/spez/",
    "over_18": false,
    "name": "t5_3k30p"
  }
}
```

| Field | Type | Description |
|---|---|---|
| `_input` | string | The username or URL exactly as you supplied it. Use this to join results back to your input list. |
| `_source` | string | Internal tag for the path used to fetch the record. `S1-primary` = fastest authenticated path; `S2-fallback` / `S3-fallback` = public fallback paths. |
| `_scrapedAt` | string | ISO-8601 UTC timestamp when the record was scraped. |
| `id` | string | Reddit's internal user ID (without the `t2_` prefix). Stable across username changes. |
| `name` | string | Current username. |
| `created_utc` | number | Account creation time as a UNIX timestamp (seconds since epoch). |
| `link_karma` | integer | Karma earned from posts (submissions). |
| `comment_karma` | integer | Karma earned from comments. |
| `awardee_karma` | integer | Karma earned from awards received. |
| `awarder_karma` | integer | Karma earned from giving awards. |
| `total_karma` | integer | Sum of all karma types. |
| `is_gold` | boolean | `true` if the user has Reddit Premium. |
| `is_mod` | boolean | `true` if the user moderates at least one subreddit. |
| `is_employee` | boolean | `true` if the user is a Reddit employee (admin). |
| `verified` | boolean | `true` if Reddit has verified the account (e.g. AMA-verified, official). |
| `has_verified_email` | boolean | `true` if the user has confirmed their email address. |
| `is_friend` | boolean | Always `false` for unauthenticated scrapes — kept for parity with Reddit's payload. |
| `is_blocked` | boolean | Always `false` for unauthenticated scrapes — kept for parity. |
| `hide_from_robots` | boolean | `true` if the user opted out of search-engine indexing. |
| `accept_followers` | boolean | `true` if other users can follow this profile. |
| `icon_img` | string | URL of the profile avatar. |
| `snoovatar_img` | string | URL of the user's custom Snoovatar, if set. |
| `subreddit` | object | The user's own `u_<name>` profile subreddit — display name, public description ("bio"), banner, subscriber count, and NSFW flag. |

#### Error envelope

Profiles that don't exist or fail to fetch return a structured error instead of crashing the run:

```json
{
  "_input": "this-user-does-not-exist-xyz",
  "_error": "not_found",
  "_errorDetail": "NotFound https://old.reddit.com/user/this-user-does-not-exist-xyz/about.json",
  "_source": "S3-fallback",
  "_scrapedAt": "2026-05-18T11:09:11.628957+00:00"
}
```

Filter on `_error` to triage failed rows. Possible values: `not_found` (404 — deleted, never existed, or suspended), `fetch_failed` (transient errors after all retries exhausted).

### Pricing

This actor is billed per result: **$3.50 per 1,000 profiles** (Tier 3). Each successful profile = 1 result. Errors (not-found, fetch-failed) are not billed.

### Other Sosmed Actors

| Platform | Actor | Best for |
|---|---|---|
| Reddit | [Reddit Subreddit Posts Scraper](https://apify.com/xtracto/reddit-subreddit-posts-scraper) | Hot/new/top posts from any subreddit |
| Reddit | [Reddit Search Scraper](https://apify.com/xtracto/reddit-search-scraper) | Keyword search across Reddit |
| Reddit | [Reddit Post Detail Scraper](https://apify.com/xtracto/reddit-post-detail-scraper) | Full post + nested comment tree |
| Quora | [Quora User Profile Scraper](https://apify.com/xtracto/quora-user-profile) | Display name, credential, followers |
| Twitter / X | [X Account Scraper](https://apify.com/xtracto/x-account-scraper) | Profile + tweet counts for any handle |
| Instagram | [Instagram Account Scraper](https://apify.com/xtracto/instagram-account-scraper) | Bio, followers, post count |
| Bluesky | [Bluesky Account Scraper](https://apify.com/xtracto/bluesky-account-scraper) | atproto profile + counters |

Browse the full catalog at [apify.com/xtracto](https://apify.com/xtracto).

### Notes

- Deleted, never-existed, or fully-suspended accounts return `{"_error": "not_found", "_input": "..."}`.
- **Shadowbanned** users still resolve normally — Reddit's `about` endpoint returns their public record even when their posts are hidden from feeds. Use the karma fields and `created_utc` to spot suspicious accounts.
- Counters (`link_karma`, `comment_karma`, `total_karma`) are eventually-consistent and may lag the live count by a few minutes.
- The internal `id` (e.g. `1w72`, full form `t2_1w72`) is the most reliable identifier — usernames can change but `id` does not.
- For large jobs (>5,000 profiles), switch the proxy group to `RESIDENTIAL` to avoid per-IP rate limits.

# Actor input Schema

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

List of Reddit usernames or profile URLs to scrape. Both `spez` and `https://www.reddit.com/user/spez/` are accepted.

## `redditClientId` (type: `string`):

Optional token that unlocks a higher-throughput path (about 60 requests per minute instead of 10). Leave blank to use the public path — the actor will still work, just slightly slower. You can generate one for free at reddit.com/prefs/apps.

## `proxyConfiguration` (type: `object`):

Apify Proxy settings. A Residential proxy is required — Reddit blocks datacenter addresses, so datacenter runs return no data. This is prefilled for you.

## Actor input object example

```json
{
  "usernames": [
    "spez",
    "GoldenSights"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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",
        "GoldenSights"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("xtracto/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",
        "GoldenSights",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("xtracto/reddit-user-profile-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",
    "GoldenSights"
  ]
}' |
apify call xtracto/reddit-user-profile-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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