# Reddit Subreddit Analytics & Best Time to Post (`apt_marble/reddit-subreddit-analytics-best-time-to-post`) Actor

Analyse any public subreddit in one row: members, real posts per day, median and top-10% engagement, self-post vs link winners, top flairs, domains and authors — plus the best day and hour to post, in your timezone. Qualify a community and time your launch before you write a single word.

- **URL**: https://apify.com/apt\_marble/reddit-subreddit-analytics-best-time-to-post.md
- **Developed by:** [Hamza](https://apify.com/apt_marble) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 2 total users, 1 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. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Analytics & Best Time to Post

Point this actor at any public subreddit and get back one clean analytics record per community: how big it is, how old it is, how many posts a day it really gets, what a normal post scores, what kind of content wins, who the heavy hitters are — and, above all, **when to post**. The best-time report breaks the community's own history down by hour of day and day of week in *your* timezone, then names the strongest day-and-hour slots. It is built for marketers, community managers, founders and researchers who need to decide where to spend attention and when to hit publish, without scrolling a subreddit for an afternoon.

Every number is reported next to the sample it was computed from, so you always know whether you are looking at a solid trend or a coincidence.

### What you can do with it

- **Find your posting window.** See which day and hour historically earn the highest scores in a community, in your own timezone, before you schedule your next post.
- **Qualify a community before you invest in it.** Members, posts per day, median score and median comments tell you in one row whether a subreddit is busy, dead, or busy-but-unrewarding.
- **Compare a shortlist side by side.** Run ten subreddits in one go and sort the table by median engagement, posting volume or audience size.
- **Learn what format wins.** The self-post versus link split, the median score of each, and the most-shared domains show you what the community actually upvotes.
- **Spot the people who matter.** Two author leaderboards — most prolific and most upvoted — surface the accounts worth following, partnering with, or watching as competitors.
- **Track a community over time.** Schedule the actor weekly and keep the reports; the sample-provenance fields make run-to-run comparisons meaningful.

### What you get

One record per subreddit. Abridged example:

```json
{
  "recordType": "subreddit-report",
  "subreddit": "Python",
  "title": "Python",
  "url": "https://www.reddit.com/r/Python/",
  "subscribers": 1500262,
  "createdAt": "2008-01-25T03:14:39.000Z",
  "ageDays": 6759.4,
  "subredditType": "public",

  "sampleSize": 250,
  "sampleSort": "new",
  "sampleSpanDays": 6.42,
  "sampleOldestPostAt": "2026-07-22T04:11:38.000Z",
  "sampleNewestPostAt": "2026-07-28T14:29:02.000Z",
  "timezone": "UTC-05:00",

  "postsPerDay": 38.8,
  "postsPerHour": 1.617,
  "cadenceSource": "new-sample",

  "medianScore": 12,
  "meanScore": 47.3,
  "p90Score": 121,
  "maxScore": 2884,
  "medianComments": 6,
  "p90Comments": 31,
  "meanUpvoteRatio": 0.88,
  "scoreDistribution": [
    { "bucket": "0 or below", "posts": 21, "share": 0.084 },
    { "bucket": "1-9", "posts": 96, "share": 0.384 },
    { "bucket": "10-49", "posts": 78, "share": 0.312 }
  ],

  "selfPosts": 173,
  "linkPosts": 77,
  "selfPostShare": 0.692,
  "medianScoreSelfPosts": 14,
  "medianScoreLinkPosts": 8,
  "betterPerformingFormat": "self",
  "uniqueAuthors": 228,
  "flairUsageShare": 0.74,

  "topFlairs": [
    { "flair": "Showcase", "posts": 46, "share": 0.184, "medianScore": 21, "medianComments": 9 }
  ],
  "topDomains": [
    { "domain": "github.com", "posts": 31, "share": 0.124, "medianScore": 27, "totalScore": 1884 }
  ],
  "topAuthorsByScore": [
    { "author": "example_user", "posts": 3, "totalScore": 3120, "topPostScore": 2884,
      "topPostUrl": "https://www.reddit.com/r/Python/comments/abc123/..." }
  ],

  "bestDayToPost": "Tuesday",
  "bestHourToPost": "09:00",
  "bestSlotToPost": "Tuesday 09:00",
  "bestSlotMeanScore": 96.4,
  "bestSlotPosts": 4,
  "bestSlotConfidence": "low",
  "bestTimeToPost": {
    "timezone": "UTC-05:00",
    "postsAnalysed": 250,
    "bestDays": [{ "dayName": "Tuesday", "posts": 41, "meanScore": 63.2, "confidence": "high" }],
    "bestHours": [{ "hourLabel": "09:00", "posts": 14, "meanScore": 88.1, "confidence": "high" }],
    "topSlots": [{ "slot": "Tuesday 09:00", "posts": 4, "meanScore": 96.4, "adjustedScore": 76.2 }],
    "byHour": [{ "hour": 0, "hourLabel": "00:00", "posts": 7, "meanScore": 19.4 }],
    "byDayOfWeek": [{ "day": 0, "dayName": "Sunday", "posts": 29, "meanScore": 41.8 }],
    "hourDayHeatmap": [{ "slot": "Sunday 00:00", "posts": 2, "meanScore": 11 }]
  },

  "topPosts": [
    { "id": "abc123", "title": "…", "score": 2884, "numComments": 214, "author": "example_user" }
  ],
  "notes": [],
  "scrapedAt": "2026-07-28T15:02:11.000Z"
}
```

Turn on **Also output the analysed posts** and every post behind the report is written to the dataset too, so you can check the maths or reuse the raw posts.

### Input reference

| Field | Type | Default | What it does |
| --- | --- | --- | --- |
| `subreddits` | list of text | `["python"]` | Communities to analyse. `python`, `r/python` or a full reddit.com link all work. One report per community. |
| `sampleSize` | integer | `250` | How many posts to read before computing the report (10–1000). More posts means steadier averages and a fuller best-time matrix. |
| `sampleSort` | select | `new` | `new` = an unbiased picture of everyday posting and the most reliable timing advice; `top` = study what wins; `hot` = what is getting traction right now. |
| `time` | select | `year` | Only used with `top`: how far back the ranking looks (`hour`, `day`, `week`, `month`, `year`, `all`). |
| `timezoneOffset` | integer | `0` | Hours from UTC for the timing report (−12 to 14). `-5` New York, `-8` Los Angeles, `1` Berlin, `8` Singapore. |
| `topAuthorsLimit` | integer | `20` | How many authors appear in each of the two author leaderboards (0–100). `0` leaves them out. |
| `topFlairsLimit` | integer | `15` | How many flairs appear (0–100) — the same limit also caps the list of most-shared link domains. `0` leaves both out. |
| `includeSamplePosts` | boolean | `false` | Also writes every analysed post to the dataset alongside the report. |
| `maxConcurrency` | integer | `5` | How many communities to work on at the same time (1–20). |
| `country` | select | `us` | Which country to browse Reddit from — 17 to choose from. Reddit shows the same content everywhere, so the default is fine unless you specifically need another locale. |

### Output fields

| Field | Type | Description |
| --- | --- | --- |
| `recordType` | text | `subreddit-report`, or `post` for the optional sample posts. |
| `subreddit`, `subredditId`, `title`, `url`, `description` | text | Community identity. |
| `subscribers` | number | Current member count. |
| `createdAt`, `ageDays`, `ageYears` | date / number | When the community was created and how old it is. |
| `subredditType`, `over18`, `quarantined`, `language`, `submissionType` | text / boolean | Community settings that affect what you may post there. |
| `allowsImages`, `allowsVideos`, `allowsPolls`, `wikiEnabled` | boolean | What the community permits. |
| `sampleSize`, `sampleRequested`, `sampleSort`, `sampleTime` | number / text | Exactly what the report was computed from. |
| `sampleSpanDays`, `sampleOldestPostAt`, `sampleNewestPostAt` | number / date | The stretch of time the sample covers. |
| `timezone`, `timezoneOffset` | text / number | The timezone every hour, day and slot in the report is expressed in. |
| `postsPerDay`, `postsPerHour` | number | Posting cadence, measured from the gaps between consecutive posts (pinned posts excluded). |
| `cadenceSource`, `cadenceSampleSize`, `cadenceSpanDays` | text / number | Which posts the cadence came from. |
| `meanScore`, `medianScore`, `p90Score`, `minScore`, `maxScore`, `totalScore` | number | Upvote statistics for the sample. `p90` is what the top 10% of posts clear. |
| `meanComments`, `medianComments`, `p90Comments`, `maxComments`, `totalComments` | number | Comment statistics. |
| `meanUpvoteRatio`, `medianUpvoteRatio` | number | How lopsided the voting is (1.0 = no downvotes). |
| `scoreDistribution`, `commentDistribution` | array | Post counts and shares per engagement band. |
| `selfPosts`, `linkPosts`, `selfPostShare`, `linkPostShare` | number | The text-versus-link split. |
| `medianScoreSelfPosts`, `medianScoreLinkPosts`, `betterPerformingFormat` | number / text | Which format actually earns more here. |
| `videoPosts`, `galleryPosts`, `crossposts`, `originalContentPosts`, `over18Posts`, `spoilerPosts`, `stickiedPosts`, `removedPosts` | number | Content mix. |
| `postsWithFlair`, `flairUsageShare`, `uniqueAuthors` | number | How the community tags posts, and how many distinct people posted. |
| `topFlairs`, `topDomains` | array | Each row carries `posts`, `share`, `medianScore`, `medianComments` and the group's best post. |
| `topAuthorsByPosts`, `topAuthorsByScore` | array | The most prolific and the most upvoted accounts, with their totals. |
| `topPosts` | array | The five highest-scoring posts in the sample. |
| `bestDayToPost`, `bestHourToPost`, `bestSlotToPost` | text | The headline timing answer, in your timezone. |
| `bestSlotMeanScore`, `bestSlotPosts`, `bestSlotConfidence` | number / text | The evidence behind that slot: its average, its post count and how much to trust it. |
| `bestTimeToPost` | object | The full timing report: `byHour` (24 rows), `byDayOfWeek` (7 rows), `bestDays`, `bestHours`, `topSlots` and an `hourDayHeatmap`. |
| `notes` | array | Plain-English caveats when the sample is thin or ranked rather than chronological. |
| `scrapedAt` | date | When the report was produced. |

### Pricing

Pay per event — you pay for results, not for run time.

| Event | What you pay for | Price |
| --- | --- | --- |
| **Result row** | Every row written to your dataset: one per community report, plus one per post if you switch on *Also output the analysed posts*. | $0.0010 each ($1.00 per 1,000 rows) |
| **Subreddit report** | Charged once for each completed community report. | $0.05 each |

A ten-community shortlist costs **$0.51** — ten reports at $0.05 plus ten result rows. Switch the analysed posts on as well, at 250 posts per community, and the same run comes to about **$3.01**.

A report is only charged when it actually lands in your dataset: a community that turns out to be empty, private or misspelled is skipped and never charged. If you set a spend limit, the run stops cleanly at the limit instead of overshooting it.

### FAQ

**Do I need a Reddit account?**
No. You do not need a Reddit account, a login, or any credentials — just enter what you want and run it.

**How fast is it?**
Posts are pulled in large batches, so a 250-post report on a single community usually lands in a few seconds. Communities are analysed in parallel — five at a time by default, up to twenty — so a ten-community shortlist finishes in roughly the time one community takes. Transient failures are retried automatically.

**Which timezone are the results in?**
Whatever you set in *Your timezone*. The default is UTC. Every hour label, day name and slot in the report is expressed in that timezone, and the `timezone` field on each record records which one was used.

**Why is the best slot marked "low" confidence?**
Because a week has 168 day-and-hour slots and a 250-post sample cannot fill them all. The best *day* and best *hour* rest on far more posts and are the sturdier signals — increase `sampleSize` if you want the slot-level answer to firm up.

**Can I run it on a schedule?**
Yes. It is a natural weekly or monthly job: keep the reports and you build the trend line that Reddit itself does not publish.

**Can I analyse a private or a banned community?**
No. Neither is readable without moderator access, and the run will simply note that the community was skipped.

# Actor input Schema

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

Communities to analyse. Paste them however you like: `python`, `r/python` or a full link such as https://www.reddit.com/r/python/. One report is produced per community.

## `sampleSize` (type: `integer`):

How many posts to read before computing the report. More posts means steadier averages and a fuller best-time matrix; 250 is a good balance, 1000 is the maximum Reddit will return for one listing.

## `sampleSort` (type: `string`):

`Newest` gives an unbiased picture of everyday posting and the most reliable best-time advice. `Top` samples the highest-scoring posts, which is better for studying what wins. `Hot` samples what is currently getting traction.

## `time` (type: `string`):

Only used when sampling top posts — how far back the ranking should look.

## `timezoneOffset` (type: `integer`):

The best-time-to-post report is expressed in this timezone. Use 0 for UTC/London winter time, -5 for New York, -8 for Los Angeles, 1 for Berlin, 5 for Karachi, 8 for Singapore.

## `topAuthorsLimit` (type: `integer`):

How many authors to include in the two leaderboards (most posts, and most upvotes earned). Set to 0 to leave authors out.

## `topFlairsLimit` (type: `integer`):

How many post flairs to include — the same limit also caps the list of most-shared link domains. Set to 0 to leave both out.

## `includeSamplePosts` (type: `boolean`):

Adds every post used in the calculation to the dataset alongside the report, so you can check the maths or reuse the raw posts. This multiplies the number of result rows.

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

How many subreddits to work on at the same time. Higher is faster for long lists; lower is gentler and steadier.

## `country` (type: `string`):

Which country's view of Reddit to use. Reddit content is the same almost everywhere, so the default suits nearly every run.

## Actor input object example

```json
{
  "subreddits": [
    "python",
    "dataisbeautiful"
  ],
  "sampleSize": 50,
  "sampleSort": "new",
  "time": "year",
  "timezoneOffset": 0,
  "topAuthorsLimit": 20,
  "topFlairsLimit": 15,
  "includeSamplePosts": false,
  "maxConcurrency": 5,
  "country": "us"
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "subreddits": [
        "python",
        "dataisbeautiful"
    ],
    "sampleSize": 50,
    "sampleSort": "new",
    "time": "year",
    "timezoneOffset": 0,
    "topAuthorsLimit": 20,
    "topFlairsLimit": 15,
    "includeSamplePosts": false,
    "maxConcurrency": 5,
    "country": "us"
};

// Run the Actor and wait for it to finish
const run = await client.actor("apt_marble/reddit-subreddit-analytics-best-time-to-post").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": [
        "python",
        "dataisbeautiful",
    ],
    "sampleSize": 50,
    "sampleSort": "new",
    "time": "year",
    "timezoneOffset": 0,
    "topAuthorsLimit": 20,
    "topFlairsLimit": 15,
    "includeSamplePosts": False,
    "maxConcurrency": 5,
    "country": "us",
}

# Run the Actor and wait for it to finish
run = client.actor("apt_marble/reddit-subreddit-analytics-best-time-to-post").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 '{
  "subreddits": [
    "python",
    "dataisbeautiful"
  ],
  "sampleSize": 50,
  "sampleSort": "new",
  "time": "year",
  "timezoneOffset": 0,
  "topAuthorsLimit": 20,
  "topFlairsLimit": 15,
  "includeSamplePosts": false,
  "maxConcurrency": 5,
  "country": "us"
}' |
apify call apt_marble/reddit-subreddit-analytics-best-time-to-post --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=apt_marble/reddit-subreddit-analytics-best-time-to-post",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/8tUwjANvTtoo4N85i/builds/ZmKeZpRjAfRWULxcQ/openapi.json
