# Reddit Subreddit Metadata Scraper (`automation-lab/reddit-subreddit-metadata-scraper`) Actor

Bulk-enrich subreddit names and URLs with community details, audience size, policy flags, media, and Arctic Shift archive activity statistics.

- **URL**: https://apify.com/automation-lab/reddit-subreddit-metadata-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Social media
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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/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 Subreddit Metadata Scraper

Bulk-enrich subreddit names and Reddit `/r/...` URLs with structured community metadata, audience size, policy flags, media links, and Arctic Shift archive activity statistics.

Use this Actor to qualify communities before social listening, audience research, lead generation, content planning, or recurring Reddit monitoring. It returns one normalized dataset row per unique community—not Reddit posts or comments.

### What does Reddit Subreddit Metadata Scraper do?

The Actor accepts up to 1,000 subreddit names or URLs in one run. It normalizes and deduplicates them, queries the anonymous public Arctic Shift subreddit endpoint, requires an exact community-name match, and writes typed records to the default dataset.

Each record can include:

- stable Reddit ID, display name, and title;
- short and full descriptions;
- subscriber and active-user counts when archived;
- creation date, language, NSFW, quarantine, and access type;
- icon, header, and banner URLs;
- posting and media capability flags;
- archived post/comment totals and earliest indexed dates;
- upstream retrieval time, source URL, and Actor scrape time.

The v1 route is HTTP-only. It requires no Reddit account, Reddit API key, browser, or proxy.

### Who is this Reddit community data for?

#### Social-listening teams

Refresh a community watchlist and rank subreddits before paying to collect posts and comments.

#### Audience and market researchers

Compare community size, age, accessibility, descriptions, and historical activity signals across a niche.

#### Community and content managers

Check whether communities permit images, videos, galleries, polls, or discovery before planning campaigns.

#### Lead-generation teams

Enrich lists of communities associated with customer problems, industries, or buyer roles before outreach research.

#### Data and AI engineers

Feed stable, source-linked community records into warehouses, RAG pipelines, enrichment jobs, or scheduled automations.

### Why use this Actor?

- **Bulk input:** process names and full Reddit URLs in one run.
- **Normalized results:** receive consistent camelCase fields instead of a raw upstream response.
- **Case-insensitive deduplication:** repeated forms such as `MachineLearning` and `r/MachineLearning` produce one row.
- **Archive context:** include Arctic Shift post/comment totals and earliest indexed dates.
- **Small-output option:** exclude long Markdown sidebars with `includeFullDescription: false`.
- **Fail-closed matching:** fuzzy upstream results are never silently returned for a different subreddit.
- **Cost-efficient route:** no browser, login, or automatic residential proxy fallback.

### What Reddit subreddit data can I extract?

| Group | Fields |
| --- | --- |
| Identity | `subredditId`, `name`, `prefixedName`, `title`, `canonicalUrl` |
| Description | `publicDescription`, `fullDescription` |
| Audience | `subscribers`, `activeUsers` |
| Lifecycle | `createdAt`, `language`, `communityType` |
| Safety/access | `isNsfw`, `isQuarantined` |
| Media | `communityIconUrl`, `iconUrl`, `bannerUrl`, `mobileBannerUrl`, `headerImageUrl` |
| Posting policy | `submissionType`, `allowsImages`, `allowsVideos`, `allowsVideoGifs`, `allowsGalleries`, `allowsPolls`, `allowsTalks` |
| Community policy | `allowsDiscovery`, `wikiEnabled`, `spoilersEnabled`, `restrictsPosting`, `restrictsCommenting`, `archivesPosts` |
| Archive activity | `archivePostCount`, `archiveCommentCount`, earliest and count-update timestamps |
| Provenance | `sourceUrl`, `retrievedOn`, `scrapedAt` |

Source fields can be `null` when the archived Reddit snapshot did not contain a value. Zero, `false`, and `null` remain distinct.

### How to scrape Reddit subreddit metadata

1. Open the Actor input page.
2. Add subreddit names, `r/name` paths, or full Reddit URLs to **Subreddits**.
3. Disable **Include full descriptions** if you only need compact enrichment rows.
4. Set **Maximum records** to cap unique outputs.
5. Keep concurrency at `3` unless you have a reason to lower it.
6. Click **Start**.
7. Export the default dataset as JSON, CSV, Excel, XML, or another supported format.

A working input:

```json
{
  "subreddits": [
    "MachineLearning",
    "https://www.reddit.com/r/datascience/",
    "r/technology"
  ],
  "includeFullDescription": false,
  "maxItems": 3,
  "maxConcurrency": 3
}
```

### Input parameters

| Field | Type | Default | Limits | Meaning |
| --- | --- | --- | --- | --- |
| `subreddits` | string array | required prefill | 1–1,000 | Names, `r/name` paths, or `reddit.com/r/name` URLs |
| `includeFullDescription` | boolean | `true` | — | Include the potentially long Markdown sidebar description |
| `maxItems` | integer | `100` | 1–1,000 | Maximum unique records after normalization and deduplication |
| `maxConcurrency` | integer | `3` | 1–10 | Simultaneous Arctic Shift requests |

Valid subreddit names contain 2–21 letters, numbers, or underscores. URLs must use a `reddit.com` host and contain `/r/<name>`.

`maxItems` is applied after normalization. If ten inputs represent the same community, they still count as one unique record.

### Output example

This abbreviated record reflects current output for `r/MachineLearning`:

```json
{
  "subredditId": "2r3gv",
  "name": "MachineLearning",
  "prefixedName": "r/MachineLearning",
  "title": "Machine Learning",
  "publicDescription": "Beginners -> /r/mlquestions or /r/learnmachinelearning ...",
  "fullDescription": null,
  "subscribers": 2953027,
  "activeUsers": null,
  "createdAt": "2009-07-29T14:34:44.000Z",
  "language": "en",
  "isNsfw": false,
  "isQuarantined": false,
  "communityType": "public",
  "canonicalUrl": "https://www.reddit.com/r/MachineLearning/",
  "allowsImages": true,
  "allowsVideos": false,
  "allowsGalleries": true,
  "archivePostCount": 261588,
  "archiveCommentCount": 1094852,
  "earliestArchivedPostAt": "2009-07-29T14:35:16.000Z",
  "earliestArchivedCommentAt": "2009-07-29T15:21:06.000Z",
  "sourceUrl": "https://arctic-shift.photon-reddit.com/api/subreddits/search?subreddit=MachineLearning",
  "retrievedOn": "2025-02-14T23:49:59.000Z",
  "scrapedAt": "2026-07-26T02:19:51.012Z"
}
```

The complete dataset schema documents all media and policy fields.

### How much does it cost to enrich Reddit subreddits?

This Actor uses pay-per-event pricing:

- a **$0.005 start fee** per run;
- **$0.000041071 per saved subreddit record** on the Free plan;
- lower per-record prices on higher Apify plan tiers, down to $0.00001 on Diamond.

Free-plan examples:

| Useful output | Estimated Actor charge |
| ---: | ---: |
| 1 subreddit | `0.005 + 1 × 0.000041071 = 0.005041071 USD` |
| 10 subreddits | `0.005 + 10 × 0.000041071 = 0.00541071 USD` |
| 100 subreddits | `0.005 + 100 × 0.000041071 = 0.0091071 USD` |

Only exact, successfully saved subreddit records trigger the item event. Invalid inputs, duplicates, no-result inputs, and failed requests are not charged as items. Apify displays the final charge before and after each run.

### Bulk enrichment workflow

A practical recurring workflow is:

1. Export candidate community names from a social-listening query, CRM note, or research sheet.
2. Run this Actor weekly or monthly with `includeFullDescription: false`.
3. Rank rows by subscribers, archive activity, age, and access type.
4. Exclude quarantined, private, or unsuitable communities.
5. Send the qualified subreddit list to a post/comment monitoring Actor.
6. Compare snapshots in your warehouse to identify material metadata changes.

Archive counts describe Arctic Shift coverage, not guaranteed complete Reddit totals. Use them as qualification signals rather than audited platform metrics.

### Integrations and exports

The default dataset works with:

- Google Sheets and Microsoft Excel exports;
- webhooks and Make automations;
- Zapier workflows;
- the Apify API and official clients;
- cloud warehouses and scheduled ETL jobs;
- AI agents through the Apify MCP server.

Use `name` as the normalized community key and `subredditId` as the stable Reddit identifier when available.

### Run with the Apify API

Replace `YOUR_APIFY_TOKEN` with a secret environment variable. Never commit it.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~reddit-subreddit-metadata-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "subreddits": ["technology", "MachineLearning", "datascience"],
    "includeFullDescription": false,
    "maxItems": 3,
    "maxConcurrency": 3
  }'
```

#### JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/reddit-subreddit-metadata-scraper').call({
    subreddits: ['technology', 'MachineLearning', 'datascience'],
    includeFullDescription: false,
    maxItems: 3,
    maxConcurrency: 3,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("automation-lab/reddit-subreddit-metadata-scraper").call(run_input={
    "subreddits": ["technology", "MachineLearning", "datascience"],
    "includeFullDescription": False,
    "maxItems": 3,
    "maxConcurrency": 3,
})

items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### Use with MCP and AI agents

Add the Actor to Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/reddit-subreddit-metadata-scraper"
```

#### Claude Desktop

Use this remote-server configuration in Claude Desktop:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/reddit-subreddit-metadata-scraper"
    }
  }
}
```

#### Cursor

Add the same JSON under **Settings → Tools & MCP** in Cursor.

#### VS Code

Add the same remote MCP URL to your VS Code MCP server configuration.

Example prompts:

- “Compare r/technology, r/MachineLearning, and r/datascience by subscribers and archive activity.”
- “Enrich this list of Reddit community URLs and omit long descriptions.”
- “Return only public, non-NSFW communities from these results for a monitoring shortlist.”

Your MCP client may need an Apify token depending on its authentication setup.

### Reliability, retries, and failures

The Actor uses a 20-second timeout and up to three attempts for transient network errors, HTTP 429 responses, and temporary 5xx responses. It does not repeatedly retry deterministic invalid inputs or other permanent HTTP failures.

For mixed batches, successful communities are saved while individual failures are named in logs. The run fails when no useful records can be saved. This prevents an upstream outage or entirely invalid watchlist from appearing as a successful empty run.

No exact match means no row. The Actor will not substitute a similarly named subreddit returned by upstream search.

### Limits and data freshness

- Arctic Shift is a public third-party archive, not Reddit's official API.
- Metadata and archive totals can lag current Reddit values.
- `retrievedOn` is the upstream metadata snapshot time.
- Archive count update fields can have different timestamps.
- Private, banned, deleted, or very new communities may be unavailable.
- Active-user counts are often absent or snapshot-dependent.
- Maximum input and output size is 1,000 communities per run.
- Full descriptions can make exports significantly larger.
- The Actor does not scrape posts, comments, moderators, rules endpoints, or member identities.

If you need fresher values for a decision, verify the `retrievedOn` and archive update timestamps in each row.

### Responsible and legal use

The Actor accesses anonymously available community metadata from a public archive. It does not log in to Reddit or access private communities.

You are responsible for:

- following Reddit and Arctic Shift terms and policies;
- respecting applicable privacy, copyright, and database laws;
- avoiding harassment, profiling, spam, or discriminatory targeting;
- applying appropriate retention and security controls;
- verifying data before consequential decisions.

Community descriptions may contain user-generated text and links. Treat them as untrusted content when rendering or passing them to downstream systems.

### Troubleshooting

#### Why did my run fail immediately?

Check that `subreddits` is a non-empty array. Use a name, `r/name`, or a full `reddit.com/r/name` URL. Other hosts and malformed names are rejected.

#### Why did I receive fewer rows than inputs?

Duplicates are removed case-insensitively. Some communities may have no exact Arctic Shift record, and individual request failures are listed in logs. `maxItems` may also cap output.

#### Why is `fullDescription` null?

You may have disabled `includeFullDescription`, or the archived snapshot may not contain a full description.

#### Why are subscriber or archive counts old?

Inspect `retrievedOn`, `archivePostCountUpdatedAt`, and `archiveCommentCountUpdatedAt`. They expose source freshness instead of presenting archived values as real-time.

#### Should I increase concurrency?

Usually no. The default balances speed with respectful public API use. Lower it if you observe repeated rate limiting. The hard maximum is 10.

### Related Automation Lab Actors

- [Reddit Scraper](https://apify.com/automation-lab/reddit-scraper) — extract current Reddit posts and search/listing results after community qualification.
- [Reddit Historical Archive Scraper](https://apify.com/automation-lab/reddit-historical-archive-scraper) — retrieve historical Reddit posts and comments.
- [Reddit User Profile Bulk Scraper](https://apify.com/automation-lab/reddit-user-profile-bulk-scraper) — enrich public Reddit user profiles instead of communities.

Choose this Actor for one row per subreddit. Choose the related Actors when the primary records you need are posts, comments, or users.

### FAQ

#### Does it require a Reddit API key or account?

No. The required route is anonymous and uses Arctic Shift.

#### Does it use proxies?

No. v1 sends direct HTTP requests and has no hidden residential fallback.

#### Can I submit full Reddit URLs?

Yes. Standard and subdomain Reddit URLs such as `https://old.reddit.com/r/technology/` are normalized.

#### Does it return posts or comments?

No. It returns community metadata plus aggregate Arctic Shift coverage statistics. Use a related Reddit Actor for content extraction.

#### Are archive totals complete Reddit totals?

No. They are counts indexed by Arctic Shift and should be treated as archive coverage signals.

#### Can I schedule it?

Yes. Create an Apify schedule with the same watchlist and send each dataset to your warehouse or automation destination.

#### Is the output stable for integrations?

The default dataset uses documented camelCase fields. Source-dependent values remain nullable so missing upstream fields do not change the result shape.

# Actor input Schema

## `subreddits` (type: `array`):

Subreddit names, r/name paths, or full reddit.com/r/name URLs. Duplicates are removed case-insensitively.

## `includeFullDescription` (type: `boolean`):

Include each community's potentially long Markdown sidebar description. Disable for smaller datasets.

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

Maximum number of unique subreddit records to return after input normalization and deduplication.

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

Maximum simultaneous Arctic Shift API requests. Keep the default for reliable recurring runs.

## Actor input object example

```json
{
  "subreddits": [
    "MachineLearning",
    "https://www.reddit.com/r/datascience/"
  ],
  "includeFullDescription": true,
  "maxItems": 20,
  "maxConcurrency": 3
}
```

# Actor output Schema

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

Dataset containing one record per unique subreddit found.

# 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 = {
    "subreddits": [
        "MachineLearning",
        "https://www.reddit.com/r/datascience/"
    ],
    "includeFullDescription": true,
    "maxItems": 20,
    "maxConcurrency": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/reddit-subreddit-metadata-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 = {
    "subreddits": [
        "MachineLearning",
        "https://www.reddit.com/r/datascience/",
    ],
    "includeFullDescription": True,
    "maxItems": 20,
    "maxConcurrency": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/reddit-subreddit-metadata-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 '{
  "subreddits": [
    "MachineLearning",
    "https://www.reddit.com/r/datascience/"
  ],
  "includeFullDescription": true,
  "maxItems": 20,
  "maxConcurrency": 3
}' |
apify call automation-lab/reddit-subreddit-metadata-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/reddit-subreddit-metadata-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/WJwK81jWSH8uxI3Rg/builds/jCLaKzzDltuoMnV4N/openapi.json
