# Substack Leaderboard Scraper (`parsebird/substack-leaderboard-scraper`) Actor

Scrape Substack leaderboard rankings across 30 categories. Extract top bestseller and rising publications with subscriber counts, pricing tiers, author details, and ranking metrics.

- **URL**: https://apify.com/parsebird/substack-leaderboard-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:** AI, Agents, News
- **Stats:** 21 total users, 5 monthly users, 91.1% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $4.00 / 1,000 substack leaderboard entries

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/actors/running/actors-in-store.md#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

### Substack Leaderboard Scraper

Scrape Substack leaderboard rankings across 30 categories. Extract top bestseller and rising publications with subscriber counts, pricing, author details, badge tiers, and publication URLs.

<table><tr>
<td style="border-left:4px solid #FF6719;padding:12px 16px;font-weight:600">Track the highest-earning and fastest-growing paid newsletters on Substack — extract rankings, subscriber counts, subscription pricing, author details, badge tiers, and publication URLs from every category leaderboard.</td>
</tr></table>

<br>

<table>
<tr>
<td colspan="2" style="padding:10px 14px;background:#FF6719;border:none;border-radius:4px 4px 0 0">
<span style="color:#FFFFFF;font-size:14px;font-weight:700;letter-spacing:0.5px">ParseBird Substack Suite</span>
<span style="color:#FFD4B8;font-size:13px">&nbsp;&nbsp;&bull;&nbsp;&nbsp;Newsletter intelligence at scale</span>
</td>
</tr>
<tr>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-radius:0 0 0 4px;border-right:none;border-top:none;vertical-align:top;width:50%;background:#FFF7ED">
<img src="https://substackcdn.com/image/fetch/w_24,h_24,c_fill,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack.com%2Fimg%2Fsubstack.png" width="20" height="20" style="vertical-align:middle"> &nbsp;<a href="https://apify.com/parsebird/substack-leaderboard-scraper" style="color:#FF6719;text-decoration:none;font-weight:700;font-size:13px">Leaderboard</a><br>
<span style="color:#FF6719;font-size:11px;font-weight:600">&#10148; You are here</span>
</td>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-radius:0 0 4px 0;border-top:none;vertical-align:top;width:50%">
<img src="https://substackcdn.com/image/fetch/w_24,h_24,c_fill,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack.com%2Fimg%2Fsubstack.png" width="20" height="20" style="vertical-align:middle"> &nbsp;<span style="color:#78716C;font-weight:700;font-size:13px">More coming soon</span><br>
<span style="color:#78716C;font-size:11px">Additional Substack scrapers in development</span>
</td>
</tr>
</table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
parsebird/substack-leaderboard-scraper on Apify. Call: ApifyClient("TOKEN").actor("parsebird/substack-leaderboard-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items for results. Key inputs: categories (array of strings, default ["bestseller"], multi-select from 31 category slugs), boardTypes (array of strings, default ["paid"], options: "paid"/"rising"), maxResults (integer, default 100). Full actor spec: fetch build via GET https://api.apify.com/v2/acts/parsebird~substack-leaderboard-scraper (Bearer TOKEN). Get token: https://console.apify.com/account/integrations
```

### What does Substack Leaderboard Scraper do?

This Actor scrapes Substack's leaderboard API, which ranks the highest-earning and fastest-growing paid publications across 30 categories. For each publication on the leaderboard, it extracts:

- **Rank** — position on the leaderboard (1-100 per board)
- **Publication name** — the newsletter's display name
- **Author name, handle, and bio** — the writer behind the publication
- **Subscriber count** — total (free + paid) subscriber count (e.g. "257,000")
- **Subscriber count magnitude** — abbreviated form (e.g. "257K+")
- **Paid subscriber detail** — paid subscriber tier description (e.g. "Thousands of paid subscribers")
- **Total subscriber detail** — full subscriber text (e.g. "Over 257,000 subscribers")
- **Subscription pricing** — monthly and annual price in USD
- **Badge tier** — bestseller badge color indicating paid subscriber count:
  - Purple = 10,000+ paid subscribers
  - Orange = 1,000+ paid subscribers
  - White = 100+ paid subscribers
- **Publication URL** — the actual website/domain of the newsletter
- **Profile URL** — Substack profile page link
- **Subscribe URL** — direct link to the subscription page
- **Description** — publication tagline/hero text
- **Author photo/logo** — avatar and logo image URLs

### How the leaderboards work

Substack has two types of leaderboards per category:

- **Top Bestsellers** (`paid`) — ranked by estimated annual recurring revenue (ARR) from paid subscriptions. Updated daily.
- **Rising** (`rising`) — ranked by recent paid subscriber growth velocity. Updated every few hours and highly volatile.

Each board shows up to 100 publications. There are 30 categories plus a cross-category "All Categories" board (note: "All Categories" only has a Rising board).

You can select **multiple categories** and **both board types** in a single run.

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `categories` | Array of strings | `["bestseller"]` | Categories to scrape. Select one or more. Use `bestseller` for cross-category, or specific categories like `technology`, `culture`, `business`, etc. |
| `boardTypes` | Array of strings | `["paid"]` | Board types to scrape. Select one or both: `paid` for Top Bestsellers (by revenue), `rising` for Rising (by growth). |
| `maxResults` | Integer | `100` | Maximum total publications to return across all selected categories and board types. |

#### Available categories

| Slug | Category |
|------|----------|
| `bestseller` | All Categories (Rising only) |
| `culture` | Culture |
| `technology` | Technology |
| `business` | Business |
| `us-politics` | U.S. Politics |
| `finance` | Finance |
| `food-drink` | Food & Drink |
| `sports` | Sports |
| `art-illustration` | Art & Illustration |
| `world-politics` | World Politics |
| `health-politics` | Health Politics |
| `news` | News |
| `fashion-beauty` | Fashion & Beauty |
| `music` | Music |
| `faith-spirituality` | Faith & Spirituality |
| `climate-environment` | Climate & Environment |
| `science` | Science |
| `literature` | Literature |
| `fiction` | Fiction |
| `health-wellness` | Health & Wellness |
| `design` | Design |
| `travel` | Travel |
| `parenting` | Parenting |
| `philosophy` | Philosophy |
| `comics` | Comics |
| `international` | International |
| `crypto` | Crypto |
| `history` | History |
| `humor` | Humor |
| `education` | Education |
| `film-tv` | Film & TV |

### Output example

```json
{
    "rank": 1,
    "publicationName": "SemiAnalysis",
    "publicationUrl": "https://newsletter.semianalysis.com/",
    "authorName": "Dylan Patel",
    "authorHandle": "semianalysis",
    "authorBio": "Bridging the gap between business and the worlds most important industry.",
    "authorPhotoUrl": "https://substackcdn.com/image/fetch/...",
    "logoUrl": "https://substackcdn.com/image/fetch/...",
    "description": "Bridging the gap between the world's most important industry, semiconductors, and business.",
    "bestsellerBadgeTier": "orange",
    "subscriberCount": "257,000",
    "subscriberCountMagnitude": "257K+",
    "paidSubscriberDetail": "Thousands of paid subscribers",
    "totalSubscriberDetail": "Over 257,000 subscribers",
    "monthlyPrice": 50.0,
    "annualPrice": 500.0,
    "currency": "USD",
    "profileUrl": "https://substack.com/@semianalysis",
    "subscribeUrl": "https://newsletter.semianalysis.com/subscribe",
    "category": "technology",
    "boardType": "paid",
    "scrapedAt": "2026-04-21T12:00:00.000Z"
}
```

### Use cases

- **Newsletter market research** — See which publications dominate each category by revenue and subscriber count
- **Competitive analysis** — Track competitors' leaderboard positions and growth over time
- **Content strategy** — Identify underserved categories with fewer top publications
- **Pricing intelligence** — Compare subscription pricing across categories to find market rates
- **Trend monitoring** — Use the Rising board to spot newsletters gaining traction fast
- **Lead generation** — Build targeted lists of newsletter authors for partnerships or outreach
- **Investment research** — Track the newsletter creator economy's top performers with subscriber metrics

### How it works

1. Fetches data from Substack's internal leaderboard API for each selected category and board type
2. Paginates through results (25 per page, up to 100 per board)
3. Extracts publication metadata including subscriber counts, pricing, and badge tiers
4. Returns structured data for each publication with all available fields

### Pricing

This actor uses a pay-per-event model. Each leaderboard entry extracted counts as one event.

| Event | Price per 1000 |
|-------|---------------|
| `substack-leaderboard-entry` | $4.00 |

A full category board (100 publications) costs approximately $0.40. Selecting 2 categories with both board types (up to 400 entries) costs approximately $1.60.

### Legal and compliance

This actor accesses publicly available leaderboard data from Substack's API. No authentication is required. The data represents publicly visible rankings and publication metadata. Always review and comply with the website's Terms of Service before use.

# Actor input Schema

## `categories` (type: `array`):

Substack leaderboard categories to scrape. Select one or more. 'All Categories' shows the cross-category bestseller list.

## `boardTypes` (type: `array`):

Which leaderboards to scrape. Select one or both.

Top Bestsellers — ranked by annual recurring revenue (ARR)
Rising — ranked by recent paid subscriber growth

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

Maximum total publications to return across all selected categories and board types. Each board has up to 100 entries.

## Actor input object example

```json
{
  "categories": [
    "bestseller"
  ],
  "boardTypes": [
    "paid"
  ],
  "maxResults": 25
}
```

# Actor output Schema

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

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/substack-leaderboard-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 = { "maxResults": 25 }

# Run the Actor and wait for it to finish
run = client.actor("parsebird/substack-leaderboard-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 '{
  "maxResults": 25
}' |
apify call parsebird/substack-leaderboard-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/substack-leaderboard-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/IaeZOKMCVpwWyxNS3/builds/1HQgBmePmNsqjEnIj/openapi.json
