# Reddit User Scraper: Profile, Posts & Comments, No API Key (`scrapers_lat/reddit-user-scraper`) Actor

Look up any Reddit username and export their recent posts and comments plus profile tagline as clean JSON, CSV or Excel. Scrape many users at once by username or profile URL, in overview, submitted or comments mode. No API key and no login required.

- **URL**: https://apify.com/scrapers_lat/reddit-user-scraper.md
- **Developed by:** [Scrapers Lat](https://apify.com/scrapers_lat) (community)
- **Categories:** Social media, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 10 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $6.15 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

[![Reddit User Scraper](https://scrapers.lat/banners/reddit-user-scraper.png)](https://console.apify.com/actors/8CuawWPx3lV2qrXB2/input)

## Reddit User Scraper: Profile, Posts and Comments (No API Key)

Scrape any **Reddit user** by username and export their **recent posts and comments** plus the public profile tagline as clean JSON, CSV or Excel. Pass one username or hundreds, choose overview, submitted or comments mode, and get one tidy record per user. No API key, no OAuth, no login.

Here is one real result. `recentPosts` and `recentComments` are trimmed to one entry each for readability:

```json
{
  "username": "spez",
  "profileUrl": "https://www.reddit.com/user/spez",
  "description": "Reddit CEO",
  "iconImg": null,
  "id": null,
  "postKarma": null,
  "commentKarma": null,
  "totalKarma": null,
  "accountCreated": null,
  "cakeDay": null,
  "isGold": null,
  "isEmployee": null,
  "isMod": null,
  "isVerified": null,
  "trophies": null,
  "numPostsFetched": 1,
  "numCommentsFetched": 1,
  "recentPosts": [
    {
      "recordType": "post",
      "id": "1vgbkge",
      "fullname": "t3_1vgbkge",
      "title": "Modernizing Reddit's infrastructure with you",
      "url": "https://www.reddit.com/r/u_spez/comments/1vgbkge/modernizing_reddits_infrastructure_with_you/",
      "permalink": "https://www.reddit.com/r/u_spez/comments/1vgbkge/modernizing_reddits_infrastructure_with_you/",
      "subreddit": "u_spez",
      "subredditPrefixed": "r/u_spez",
      "selftext": "Hi everyone, Last May, I shared how we were rebuilding our infrastructure...",
      "contentHtml": "<!-- SC_OFF --><div class=\"md\"><p>Hi everyone,</p> ...</div><!-- SC_ON -->",
      "thumbnail": null,
      "domain": "self.u_spez",
      "isSelf": true,
      "isVideo": null,
      "mediaUrls": null,
      "galleryImageUrls": null,
      "score": null,
      "upvoteRatio": null,
      "numComments": null,
      "totalAwards": null,
      "linkFlairText": null,
      "isNsfw": null,
      "isSpoiler": null,
      "isOriginalContent": null,
      "isPinned": null,
      "isLocked": null,
      "edited": false,
      "editedAt": null,
      "createdAt": "2026-08-05T16:03:56+00:00",
      "updatedAt": "2026-08-05T16:03:56+00:00"
    }
  ],
  "recentComments": [
    {
      "recordType": "comment",
      "id": "p1wosm9",
      "fullname": "t1_p1wosm9",
      "body": "That was the thinking. Otherwise it would be easier to just replicate the UI.",
      "contentHtml": "<!-- SC_OFF --><div class=\"md\"><p>That was the thinking...</p></div><!-- SC_ON -->",
      "subreddit": "u_spez",
      "subredditPrefixed": "r/u_spez",
      "linkTitle": "Modernizing Reddit's infrastructure with you",
      "linkPermalink": "https://www.reddit.com/r/u_spez/comments/1vgbkge/modernizing_reddits_infrastructure_with_you/",
      "permalink": "https://www.reddit.com/r/u_spez/comments/1vgbkge/modernizing_reddits_infrastructure_with_you/p1wosm9/",
      "score": null,
      "totalAwards": null,
      "isSubmitter": null,
      "edited": false,
      "editedAt": null,
      "createdAt": "2026-08-05T18:31:50+00:00",
      "updatedAt": "2026-08-05T18:31:50+00:00"
    }
  ],
  "transport": "rss",
  "observedAt": "2026-09-05T02:20:00.000Z",
  "error": null
}
```

**📥 [Input](https://apify.com/scrapers_lat/reddit-user-scraper/input-schema) · 📤 [Output](https://apify.com/scrapers_lat/reddit-user-scraper/output-schema) · 💰 [Pricing](https://apify.com/scrapers_lat/reddit-user-scraper/pricing) · ▶️ [Examples](https://apify.com/scrapers_lat/reddit-user-scraper/examples)**

![Apify](https://img.shields.io/badge/Platform-Apify-1CE1CE?logo=apify\&logoColor=white)
![Coverage](https://img.shields.io/badge/Coverage-Reddit-blue)
![Output](https://img.shields.io/badge/Output-JSON%20%7C%20CSV%20%7C%20Excel-orange)
![Billing](https://img.shields.io/badge/Billing-Pay%20per%20result-brightgreen)

### Table of contents

- [What it does](#what-it-does)
- [What you can and cannot get](#what-you-can-and-cannot-get)
- [Quickstart](#quickstart)
- [Input reference](#input-reference)
- [Output reference](#output-reference)
- [How this compares](#how-this-compares)
- [Run via API and CLI](#run-via-api-and-cli)
- [Fetch results](#fetch-results)
- [Billing and limits](#billing-and-limits)
- [FAQ and troubleshooting](#faq-and-troubleshooting)

### What it does

This is a **Reddit user history scraper**. Give it one or more usernames (or full profile URLs) and it returns, for each account, one normalized record with the public profile tagline plus the user's recent posts and comments. Use it for **social media monitoring**, brand and influencer research, moderation and abuse review, audience insights, sentiment datasets and academic study, all without a Reddit API key.

For every user you get:

- The **profile**: username, profile URL and the public tagline/description.
- Their **recent posts** (`recentPosts`): title, subreddit, permalink, outbound URL, self text (clean text plus original HTML), thumbnail and reddit-hosted media, gallery images, self vs link classification and ISO timestamps.
- Their **recent comments** (`recentComments`): comment body (clean text plus HTML), the subreddit, the title and permalink of the post it was left on, the comment permalink and ISO timestamps.

You control how many posts and comments to pull per user, the sort order, and whether to fetch posts, comments or both.

### What you can and cannot get

This actor reads Reddit's **public user feeds** over HTTP, with no login and no official API. That keeps it fast, key-free and resilient, but it means some profile metrics that Reddit only exposes through its logged-in API are **not available** and are returned as honest `null` rather than guessed or faked.

**Returned (real data):** username, profile URL, profile tagline/description, and full recent post and comment activity with clean text, HTML, media, subreddit, permalinks and timestamps.

**Not available over the public feeds, returned as `null`:** post karma, comment karma, total karma, account creation date, cake day, trophies, gold/premium, verified, moderator and employee flags, and per-post or per-comment **score, upvote ratio, comment count and awards**. These come only from Reddit's gated endpoints, which now block anonymous access. If you need live karma and vote scores, a browser or API based scraper is required (see [How this compares](#how-this-compares)).

### Quickstart

Open the actor, paste this into the input, and press **Run**. It returns u/spez's recent posts and comments.

```json
{
  "usernames": ["spez"],
  "withDetails": true,
  "mode": "overview",
  "maxPostsPerUser": 25,
  "maxCommentsPerUser": 25,
  "sort": "new"
}
```

Add more usernames to `usernames` to research many accounts in one run. Set `withDetails` to `false` for a fast, profile-only run, or set `mode` to `submitted` or `comments` to pull only one activity type.

### Input reference

Every field is optional. With an empty input the actor looks up the default username.

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `usernames` | string\[] | no | `["spez"]` | Reddit usernames to scrape. Enter with or without the `u/` prefix, or paste full profile URLs. |
| `withDetails` | boolean | no | `true` | When enabled, each user record is enriched with their recent posts and comments. Disable for a faster, profile-only run. |
| `mode` | enum | no | `overview` | Which activity to pull: `overview` (posts and comments), `submitted` (posts only), `comments` (comments only). |
| `maxPostsPerUser` | integer | no | `25` | Maximum recent posts per user. `0` skips posts. |
| `maxCommentsPerUser` | integer | no | `25` | Maximum recent comments per user. `0` skips comments. |
| `sort` | enum | no | `new` | Sort order for the activity feeds: `new`, `hot`, `top`, `controversial`. |

### Output reference

One dataset item per user. Types: `string`, `boolean`, `string[]`, `object[]`, or `null` when the value is absent or not exposed by the public feeds.

| Field | Type | Description |
|---|---|---|
| `username` | string | The resolved Reddit username. |
| `profileUrl` | string | Full URL of the user's public profile. |
| `description` | string | null | The account's public tagline/description. |
| `iconImg` | string | null | Avatar URL when the account uses a custom one. |
| `postKarma`, `commentKarma`, `totalKarma` | null | Karma. Not exposed by the public feeds (Reddit gated API only). |
| `accountCreated`, `cakeDay` | null | Account age. Not exposed by the public feeds. |
| `isGold`, `isEmployee`, `isMod`, `isVerified` | null | Account flags. Not exposed by the public feeds. |
| `trophies` | null | Trophy case. Not exposed by the public feeds. |
| `numPostsFetched` | integer | Number of posts included in `recentPosts`. |
| `numCommentsFetched` | integer | Number of comments included in `recentComments`. |
| `recentPosts` | object\[] | null | The user's recent posts (fields below). Present when the mode includes posts. |
| `recentComments` | object\[] | null | The user's recent comments (fields below). Present when the mode includes comments. |
| `transport` | string | Data source marker (`rss`). |
| `observedAt` | string | ISO 8601 timestamp of collection. |
| `error` | string | `null` on success. On a failed lookup a single item with a populated `error` and the `username` is written instead, and it is not billed. |

Each object in `recentPosts` contains: `id`, `fullname`, `title`, `url`, `permalink`, `subreddit`, `subredditPrefixed`, `selftext`, `contentHtml`, `thumbnail`, `domain`, `isSelf`, `isVideo`, `mediaUrls`, `galleryImageUrls`, `edited`, `editedAt`, `createdAt`, `updatedAt`, plus `score`, `upvoteRatio`, `numComments`, `totalAwards`, `linkFlairText`, `isNsfw`, `isSpoiler`, `isOriginalContent`, `isPinned`, `isLocked` (these last ten are `null`, not exposed by the public feeds).

Each object in `recentComments` contains: `id`, `fullname`, `body`, `contentHtml`, `subreddit`, `subredditPrefixed`, `linkTitle` (the title of the post the comment is on), `linkPermalink`, `permalink`, `edited`, `editedAt`, `createdAt`, `updatedAt`, plus `score`, `totalAwards`, `isSubmitter` (these three are `null`, not exposed by the public feeds).

### How this compares

Honest comparison. Browser or official-API based scrapers can read Reddit's logged-in fields and so return live karma and vote scores that the public HTTP feeds do not expose. This actor trades those metrics for speed, no API key, no login, and clean multi-user output.

| Capability | This actor | Typical Reddit user scrapers |
|---|---|---|
| Scrape by username | Yes | Some (many require a full profile URL) |
| Multiple users per run | Yes, unlimited on paid plans | Often one user per run |
| Accepts full profile URLs | Yes | Yes |
| Overview / submitted / comments modes | Yes | Some |
| Recent posts with self text and HTML | Yes | Yes |
| Recent comments with parent post title and link | Yes | Yes |
| Reddit-hosted media and gallery images | Yes | Some |
| One combined record per user | Yes | Often a flat post/comment stream |
| Profile tagline / description | Yes | Some |
| No API key or login required | Yes | Varies |
| Karma (post / comment / total) | No (null) | Yes (browser/API) |
| Cake day, trophies, account flags | No (null) | Yes (browser/API) |
| Per-post score, upvote ratio, comment count, awards | No (null) | Yes (browser/API) |
| JSON, CSV and Excel export | Yes | Yes |

If your workflow depends on live karma and vote scores, choose a browser or API based tool. If you need fast, key-free access to what users are actually posting and commenting, at scale, this actor is a strong fit.

### Run via API and CLI

Start a run and read the dataset. Replace `<TOKEN>` with your Apify API token.

Run synchronously and get dataset items in one call:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~reddit-user-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"usernames":["spez"],"withDetails":true,"mode":"overview","maxPostsPerUser":25,"maxCommentsPerUser":25}'
```

Start a run asynchronously:

```bash
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~reddit-user-scraper/runs?token=<TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"usernames":["spez","GovSchwarzenegger"],"withDetails":false}'
```

Apify CLI:

```bash
apify call scrapers_lat/reddit-user-scraper \
  --input '{"usernames":["spez"],"mode":"submitted","sort":"top","maxPostsPerUser":10}'
```

### Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing `format`:

```bash
## JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"

## CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"

## Paginate large datasets
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
```

`<DATASET_ID>` is returned as `defaultDatasetId` in the run object. Nested arrays (`recentPosts`, `recentComments`) flatten into indexed columns in CSV and Excel.

### Billing and limits

- **Pay per result.** You are charged per user record returned. A profile-only record (`withDetails` off) is charged as a `result` event; a record enriched with recent posts and comments is charged as a `details` event. See the [pricing tab](https://apify.com/scrapers_lat/reddit-user-scraper/pricing) for current prices.
- **No charge on failure.** If a username cannot be resolved, the actor writes a single item with a populated `error` field and does not charge for it. Empty runs cost nothing.
- **Spend cap respected.** Set `maxTotalChargeUsd` on the run; once reached, the actor stops emitting and charging further billable records.
- **Free Apify plans** are capped at 10 users per run. Upgrade for more.
- **Turn off enrichment to save.** Set `withDetails` to `false` for profile-only records charged at the lower `result` rate.

### FAQ and troubleshooting

**Do I need a Reddit API key or login?**
No. The actor reads Reddit's public user feeds over HTTP. There is nothing to authenticate.

**Why are karma, cake day and post scores `null`?**
Those metrics are only served by Reddit's logged-in API, which now blocks anonymous access. Rather than fake them, the actor returns `null`. See [What you can and cannot get](#what-you-can-and-cannot-get). For live karma and scores, use a browser or API based scraper.

**A user returned an error. Why?**
The username does not exist, was suspended, or the account is deleted or private. The actor writes a single item with a populated `error` field and does not charge for it.

**How do I research several users at once?**
Add each username (or profile URL) to `usernames`. The actor writes one record per user, up to the free-plan cap of 10 per run on free accounts.

**How do I get only posts, or only comments?**
Set `mode` to `submitted` for posts only or `comments` for comments only. Use `overview` for both.

**Why is `url` different from `permalink` on some posts?**
For link posts, `url` is the outbound link and `permalink` is the Reddit discussion page. For self (text) posts, both point at the Reddit post.

**Is this an official Reddit tool?**
No. This actor is independent and has no affiliation with Reddit. It reads only data that is publicly available on Reddit. Use it in accordance with Reddit's terms.

### Related scrapers

- [Reddit Posts and Comments Scraper](https://apify.com/scrapers_lat/reddit-posts-scraper): subreddit feeds, search and full text.
- [Reddit Keyword Search and Mentions Scraper](https://apify.com/scrapers_lat/reddit-search-scraper): Reddit search results and mention tracking.
- [Reddit Trending Scraper](https://apify.com/scrapers_lat/reddit-trending-scraper): trending posts from r/popular and r/all.
- [GitHub Contributor Contacts Scraper](https://apify.com/scrapers_lat/github-contributor-contacts-scraper): contributors and public contact details.
- [Hacker News Scraper](https://apify.com/scrapers_lat/hacker-news-scraper): Hacker News stories, comments and points.

### More scrapers at scrapers.lat

Built and maintained by [scrapers.lat](https://scrapers.lat), where we publish scrapers for public platforms: social media, company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at [scrapers.lat](https://scrapers.lat).

***

> Independent tool, not affiliated with Reddit. Accesses only publicly available Reddit data. Use in accordance with Reddit's terms.

# Actor input Schema

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

Reddit usernames to scrape. Enter them with or without the u/ prefix, or paste full profile URLs, for example: spez, u/GovSchwarzenegger, https://www.reddit.com/user/spez.

## `withDetails` (type: `boolean`):

When enabled, each user record is enriched with their recent posts and comments. Disable for a faster, profile-only run.

## `mode` (type: `string`):

Which activity to pull for each user: Overview (both posts and comments), Submitted (posts only), or Comments (comments only). Used when Fetch Recent Posts and Comments is enabled.

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

Maximum number of recent posts to fetch per user. Used when Fetch Recent Posts and Comments is enabled and the mode includes posts. Set to 0 to skip posts.

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

Maximum number of recent comments to fetch per user. Used when Fetch Recent Posts and Comments is enabled and the mode includes comments. Set to 0 to skip comments.

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

Sort order for the recent posts and comments feeds.

## Actor input object example

```json
{
  "usernames": [
    "spez"
  ],
  "withDetails": true,
  "mode": "overview",
  "maxPostsPerUser": 25,
  "maxCommentsPerUser": 25,
  "sort": "new"
}
```

# Actor output Schema

## `results` (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": 25,
    "maxCommentsPerUser": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapers_lat/reddit-user-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": 25,
    "maxCommentsPerUser": 25,
}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapers_lat/reddit-user-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/8CuawWPx3lV2qrXB2/builds/xzk4O8yDNc2AAGDT1/openapi.json
