# Reddit Scraper Pro | FREE 🔥 | No API Key Required (`coding-doctor-omar/reddit-scraper-pro`) Actor

A powerful FREE Reddit scraper for posts and comments with detailed metrics. No API key required. Scrape subreddits, profiles, and specific posts, or search Reddit site-wide by keywords or domains. Collect rich, structured data including authors, scores, timestamps, flairs, comment threads, and more

- **URL**: https://apify.com/coding-doctor-omar/reddit-scraper-pro.md
- **Developed by:** [Coding Doctor Omar](https://apify.com/coding-doctor-omar) (community)
- **Categories:**
- **Stats:** 4 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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 Scraper Pro 🔥

<p align="center">
    <img src="https://images.apifyusercontent.com/EBzlwGfK_gTJ5b9Dzif-8qvxOZhVPF20DL3bLhMf3ig/cb:1/aHR0cHM6Ly9hcGlmeS1pbWFnZS11cGxvYWRzLXByb2QuczMudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20vOVpGY1BsVEhQM09Cc3hFN0ktYWN0b3ItbXc1SnZSRjdrU3hqZk5xZHUtRzJoMXhkSWIzdy1yZWRkaXRfc2NyYXBlcl9wcm8ucG5n.png" width="350" alt="reddit scraper pro logo">
</p>

<p align="center" style="border: 1px solid blue; padding: 10px; border-radius: 12px;"><i>A powerful FREE Reddit scraper for posts and comments with detailed metrics. No API key required. Scrape subreddits, profiles, and specific posts, or search Reddit site-wide by keywords or domains. Collect rich, structured data including authors, scores, timestamps, flairs, comment threads, and more (30+ fields).</i></p>

<p align="center"><a href="https://console.apify.com/actors/mw5JvRF7kSxjfNqdu/reviews">Leave a Review</a> • <a href="https://apify.com/coding-doctor-omar/reddit-scraper-pro/input-schema">Input</a> • <a href="https://apify.com/coding-doctor-omar/reddit-scraper-pro/api/python">API Docs</a> • <a href="https://apify.com/coding-doctor-omar/reddit-scraper-pro/issues/open">Issues/Open an Issue</a></p>

### Quickstart Tutorial Video

[tutorial video](https://youtu.be/l7wntNP1Ek4)

### Scraper Modes

Below are the modes available in **Reddit Scraper Pro**. Details about each of these modes are provided in the coming sections.

1. **Standard Mode**: Scrapes posts and comments from subreddits, from profiles, or from a list of direct post URLs you provide (profiles that hide their posts, deleted profiles, and banned profiles will not be scraped).
2. **Keyword Search Mode**: Scrapes posts and comments from Reddit search (site-wide) based on your custom keyword inclusion and exclusion criteria.
3. **Domain Search Mode**: Scrapes posts and comments site-wide for references to your domain(s).

*After each scrape is finished, you can choose to view results for posts only, comments only, or all together.*

### Example Post Output

```json
{
  "submissionId": "1w1gc8p",
  "submissionIdPrefixed": "t3_1w1gc8p",
  "submissionType": "post",
  "submissionUrl": "https://www.reddit.com/r/Sat/comments/1w1gc8p/is_this_good_improvement_for_10_hours_of/",
  "submittedAt": "2026-08-29T07:53:42+00:00",
  "parentId": null,
  "parentPostId": null,
  "parentPostUrl": null,
  "postType": "image",
  "isCrosspost": false,
  "crosspostParentId": null,
  "crosspostParentUrl": null,
  "title": "Is this good improvement for 10 hours of dedicated study + need help for rw section",
  "bodyText": "math significantly improved but reading writing is too tough for me (international student)\n\nplease help, i have to give the sat in two months, will reading novels improve my rw score?",
  "isEdited": false,
  "author": "stcer",
  "authorFlairText": null,
  "authorFlairImageUrl": null,
  "depth": null,
  "postFlair": null,
  "isNSFW": false,
  "subreddit": "r/Sat",
  "score": 32,
  "upvoteRatio": 0.98,
  "numComments": 29,
  "numCrossposts": 0,
  "externalUrl": "https://i.redd.it/cjhezz5bs9mh1.jpeg",
  "thumbnailUrl": null,
  "videoUrl": null,
  "imageUrl": "https://i.redd.it/cjhezz5bs9mh1.jpeg",
  "galleryImagesUrls": null
}
```

### Example Comment Output

```json
{
  "submissionId": "p6lwobb",
  "submissionIdPrefixed": "t1_p6lwobb",
  "submissionType": "comment",
  "submissionUrl": "https://www.reddit.com/r/Sat/comments/1w1gc8p/is_this_good_improvement_for_10_hours_of/p6lwobb/",
  "submittedAt": "2026-08-29T13:41:52+00:00",
  "parentId": "t3_1w1gc8p",
  "parentPostId": "t3_1w1gc8p",
  "parentPostUrl": "https://www.reddit.com/comments/t3_1w1gc8p",
  "postType": null,
  "isCrosspost": false,
  "crosspostParentId": null,
  "crosspostParentUrl": null,
  "title": null,
  "bodyText": "How did you do that in 10 hours? Can you please give me the sources that you used? I also need help in rw section and I’ll take the sat in 2 weeks",
  "isEdited": false,
  "author": "AnalysisStill4932",
  "authorFlairText": null,
  "authorFlairImageUrl": null,
  "depth": 0,
  "postFlair": null,
  "isNSFW": false,
  "subreddit": "r/Sat",
  "score": 9,
  "upvoteRatio": null,
  "numComments": null,
  "numCrossposts": null,
  "externalUrl": null,
  "thumbnailUrl": null,
  "videoUrl": null,
  "imageUrl": null,
  "galleryImagesUrls": null
}
```

### Output Fields Explanation

1. `submissionId` — \[`string`] The ID of the post or comment.
2. `submissionIdPrefixed` — \[`string`] The prefixed ID of the post or comment.
3. `submissionType` — \[`string`] Whether the submission is a `post` or `comment`.
4. `submissionUrl` — \[`string`] The URL for the submission.
5. `submittedAt` — \[`string`] The date and time the post or comment was submitted in UTC timezone and ISO format.
6. `parentId` — \[`string`, `null`] The ID of the direct parent post or comment.
7. `parentPostId` — \[`string`, `null`] The ID of the parent post. For posts, this field will always be `null` since posts have no parent.
8. `parentPostUrl` — \[`string`, `null`] The URL of the parent post. For posts, this field will always be `null` since posts have no parent.
9. `postType` — \[`string`, `null`] The post type. Can be any of `text`, `poll`, `link`, `image`, `gallery`, or `video`. For comments, this field will always be `null`.
10. `isCrosspost` — \[`boolean`] Whether the post is a crosspost.
11. `crosspostParentId` — \[`string`, `null`] The ID of the parent of the crosspost (for posts that are not crossposts, will be `null`).
12. `crosspostParentUrl` — \[`string`, `null`] The URL of the parent of the crosspost (for posts that are not crossposts, will be `null`).
13. `title` — \[`string`, `null`] The post title (will always be `null` for comments).
14. `bodyText` — \[`string`, `null`] The main text content of a post or comment.
15. `isEdited` — \[`boolean`] Whether the post or comment is edited.
16. `author` — \[`string`] The author of the post or comment.
17. `authorFlairText` — \[`string`, `null`] The text content of the author flair or a text version of it.
18. `authorFlairImageUrl` — \[`string`, `null`] The URL for the image in an author flair.
19. `depth` — \[`integer`, `null`] The comment depth (top-level comments have a depth of `0` and posts have a depth of `null`).
20. `postFlair` — \[`string`, `null`] The post flair (will be `null` for comments).
21. `isNSFW` — \[`boolean`] Whether the post or comment is NSFW.
22. `subreddit` — \[`string`, `null`] The subreddit in which the post or comment was submitted.
23. `score` — \[`integer`, `null`] The vote score of the post or comment.
24. `upvoteRatio` — \[`float`, `null`] The ratio of upvotes to total number of votes of a post (always `null` for comments).
25. `numComments` — \[`integer`, `null`] The number of comments in a post (always `null` for comments).
26. `numCrossposts` — \[`integer`, `null`] The number of crossposts for a post (always `null` for comments).
27. `externalUrl` — \[`string`, `null`] The external URL in a post. For comments, this field will be `null` because external URLs will be included in the `bodyText` anyway.
28. `thumbnailUrl` — \[`string`, `null`] The thumbnail image URL for `video`, `image`, and `gallery` post types (always `null` for any other submission).
29. `videoUrl` — \[`string`, `null`] The URL for the video in a post (always `null` for any submission other than `video` posts).
30. `imageUrl` — \[`string`, `null`] The URL for the image in a post (always `null` for any submission other than `image` posts).
31. `galleryImageUrls` — \[`string`, `null`] A string of `|`-separated URLs for all images in a gallery (always `null` for any submission other than `gallery` posts).

### General Input Options

1. **Scraping Mode** (`scrapingMode`) — The mode to use in your scraping run.
2. **Maximum Results** (`maxResults`) — Maximum total number of posts and comments to scrape.
3. **Maximum Posts Per Collection** (`maxPostsPerCollection`) — Maximum posts to scrape per subreddit, profile, keyword search query, or single domain search.
4. **Sort** (`sort`) — The posts' sort option to use when scraping posts (`default`, `hot`, or `new`). This option only applies when scraping subreddits, profiles, or keyword search.
5. **Time Frame** (`timeFrame`) — The time frame in which to look for posts. This option only applies when scraping subreddits, profiles, or keyword search.

### Standard Mode Input Options

1. **Subreddit URLs** (`subredditUrls`) — The URLs of the subreddits to be scraped.
2. **Post URLs** (`postUrls`) — The URLs of specific posts to be scraped.
3. **Profile URLs** (`profileUrls`) — The URLs of the profiles to be scraped.

### Keyword Search Mode Input Options

1. **Keywords Included** (`keywordsIncluded`) — At least one of these keywords should be included in the posts to be scraped.
2. **Keywords Excluded** (`keywordsExcluded`) — None of these keywords should be included in the posts to be scraped.

### Domain Search Mode Input Options

1. **Domains** (`domains`) — The domains that should be referenced in the posts to be scraped.

### Comments Scraping Input Options

1. **Include Comments** (`includeComments`) — Whether or not to scrape comments (either `true` or `false`).
2. **Maximum Comments Depth** (`maxCommentsDepth`) — The maximum depth of comments to scrape (an integer from `0` to `10`, where `0` represents top-level comments only).
3. **Maximum Comments Per Post** (`maxCommentsPerPost`) — The maximum total number of comments and replies to scrape PER POST.
4. **Maximum Top-Level Comments Per Post** (`maxTopCommentsPerPost`) — The maximum top-level comments to scrape PER POST.

### Frequently Asked Questions (FAQs)

#### Is this Reddit scraper free?

Yes! This Actor is **free to use**. Just configure your desired scraping options and run it. You will only be charged very small platform usage fees from your credits. These fees go to Apify, and I am not responsible for them, but the actual scraping and data are COMPLETELY FREE on my part. I don't get any revenue from this Actor, unlike most other Reddit Scraper Actors.

#### Do I need a Reddit API key?

**No.** No Reddit API credentials or API key are required.

#### What can I scrape?

You can scrape posts and comments from subreddits, Reddit profiles, or specific posts URLs. Additionally, you can scrape posts and comments by keywords or domains.

#### Can I scrape comments?

Yes. Enable `includeComments` to collect comments and replies, with configurable comment depth and limits.

#### What data does the scraper return?

The dataset includes **post/comment text, authors, scores, timestamps, URLs, subreddits, flairs, post types, comment depth, engagement metrics, media URLs, and more**.

#### Can I search Reddit by keyword?

Yes. **Keyword Search Mode** lets you find posts and comments across Reddit containing or excluding your specified keywords.

#### Can I search Reddit for links to a domain?

Yes. **Domain Search Mode** lets you find posts and comments across Reddit that reference one or more domains, such as `github.com`.

# Actor input Schema

## `maxResults` (type: `integer`):

The maximum total number of posts and comments to scrape.

## `maxPostsPerCollection` (type: `integer`):

The maximum number of posts to scrape per collection. A collection is either a subreddit, a profile, or a domain.

## `scrapingMode` (type: `string`):

Choose Standard mode for your regular use cases or Domain Search mode for scraping posts & comments that mention a particular domain site-wide or Keyword Search mode for scraping posts & comments that include or exclude certain keywords site-wide.

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

The sort order of posts. The default option will use the default sort order for each subreddit scraped.

## `timeFrame` (type: `string`):

The time frame in which to look for posts and comments.

## `subredditUrls` (type: `array`):

A list of the URLs of subreddits to scrape. In Domain Search and Keyword Search modes, this option will be ignored.

## `postUrls` (type: `array`):

A list of the URLs of the specific posts to scrape. In Domain Search and Keyword Search modes, this option will be ignored.

## `profileUrls` (type: `array`):

A list of the URLs of the specific profiles to scrape. In Domain Search and Keyword Search modes, this option will be ignored.

## `keywordsIncluded` (type: `array`):

Filters down posts to those containing any of this list of keywords. Only English letters, numbers, hyphens, and space are supported.

## `keywordsExcluded` (type: `array`):

Filters down posts to those NOT containing any of this list of keywords. Only English letters, numbers, hyphens, and space are supported.

## `domains` (type: `array`):

A list of domains for which to look for posts and/or comments across reddit (e.g. look for posts/comments referencing github.com across reddit). Only relevant in Domain Search mode.

## `includeComments` (type: `boolean`):

If enabled, comments for each post will also be scraped (will take more time).

## `maxCommentsDepth` (type: `integer`):

Sets the maximum depth of comments to scrape when scraping comments. Set to 0 or lower to scrape top-level comments only. Default is 10.

## `maxCommentsPerPost` (type: `integer`):

The maximum total number of comments and replies to scrape per post.

## `maxTopCommentsPerPost` (type: `integer`):

The maximum top-level comments (depth 0) to scrape per post.

## Actor input object example

```json
{
  "maxResults": 100,
  "maxPostsPerCollection": 500,
  "scrapingMode": "standard",
  "sort": "default",
  "timeFrame": "all-time",
  "subredditUrls": [
    {
      "url": "https://www.reddit.com/r/webscraping"
    }
  ],
  "domains": [
    "github.com"
  ],
  "includeComments": false,
  "maxCommentsDepth": 10,
  "maxCommentsPerPost": 50000,
  "maxTopCommentsPerPost": 500
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `posts` (type: `string`):

No description

## `comments` (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 = {
    "maxResults": 100,
    "maxPostsPerCollection": 500,
    "scrapingMode": "standard",
    "sort": "default",
    "timeFrame": "all-time",
    "subredditUrls": [
        {
            "url": "https://www.reddit.com/r/webscraping"
        }
    ],
    "domains": [
        "github.com"
    ],
    "includeComments": false,
    "maxCommentsDepth": 10,
    "maxCommentsPerPost": 50000,
    "maxTopCommentsPerPost": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("coding-doctor-omar/reddit-scraper-pro").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 = {
    "maxResults": 100,
    "maxPostsPerCollection": 500,
    "scrapingMode": "standard",
    "sort": "default",
    "timeFrame": "all-time",
    "subredditUrls": [{ "url": "https://www.reddit.com/r/webscraping" }],
    "domains": ["github.com"],
    "includeComments": False,
    "maxCommentsDepth": 10,
    "maxCommentsPerPost": 50000,
    "maxTopCommentsPerPost": 500,
}

# Run the Actor and wait for it to finish
run = client.actor("coding-doctor-omar/reddit-scraper-pro").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 '{
  "maxResults": 100,
  "maxPostsPerCollection": 500,
  "scrapingMode": "standard",
  "sort": "default",
  "timeFrame": "all-time",
  "subredditUrls": [
    {
      "url": "https://www.reddit.com/r/webscraping"
    }
  ],
  "domains": [
    "github.com"
  ],
  "includeComments": false,
  "maxCommentsDepth": 10,
  "maxCommentsPerPost": 50000,
  "maxTopCommentsPerPost": 500
}' |
apify call coding-doctor-omar/reddit-scraper-pro --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,coding-doctor-omar/reddit-scraper-pro"
        }
    }
}

```

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/mw5JvRF7kSxjfNqdu/builds/B7dlTyEMqRcs1qZ5P/openapi.json
