# Substack Scraper: Newsletter Finder, Subscribers & Prices (`precious_bathmat/substack-scraper`) Actor

Find Substack newsletters by category, bestseller list or search, and get one report each: subscriber tier, paid prices, posting pace, likes and comments per post, top posts and leaderboard rank. Built for sponsors and writers. No login, no proxy.

- **URL**: https://apify.com/precious\_bathmat/substack-scraper.md
- **Developed by:** [Mariam Ahmed](https://apify.com/precious_bathmat) (community)
- **Categories:** Lead generation, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 newsletter reports

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?

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

## Substack Scraper: Newsletter Finder, Subscribers & Prices

Find **Substack newsletters** by category, bestseller list, rising list or search, and get **one report per newsletter**: **subscriber count and tier, paid subscriber tier, monthly and yearly price, leaderboard rank, posting pace, likes and comments per post, share of paywalled posts** and its **top posts**. Every post behind the reports comes as CSV too.

Built for **sponsors looking for newsletters to advertise in**, and for **writers sizing up a niche**. No login, no API key, no proxy.

### What does this Substack scraper do?

```
Business bestsellers · 30 newsletters · 580 posts · under 2 minutes

 #1  Lenny's Newsletter    1.2M subscribers   $20/mo   0.8 posts/wk   median 411 likes
 #2  Noahpinion            458K subscribers   $10/mo   3.5 posts/wk   median 392 likes, 77 comments
 #19 One Useful Thing      480K subscribers   $10/mo   no paywall     median 1,000 likes
```

1. **Find newsletters**: Substack's **bestseller** (top paid) and **rising** lists for 26 categories, the full category directory, a search of Substack writers, or your own list of addresses.
2. **Read each one**: its listing, its full publication record, its author's public profile and its latest posts.
3. **One row per newsletter** that makes them comparable: audience, price, activity and engagement.

### Who is it for?

- **Advertisers and sponsorship buyers**: shortlist newsletters by real audience and engagement, not just rank
- **Agencies and media buyers**: build and refresh a newsletter media list for a niche
- **Newsletter writers**: see what the leaders in your category charge, how often they post and what gets engagement
- **Investors and analysts**: track the Substack creator economy by category
- **PR teams**: find the newsletters that matter in a topic

### What data do you get?

**One report per newsletter** (the dataset):

| Field | What it tells you |
|---|---|
| `name`, `url`, `description`, `language`, `launchedAt`, `authorName` | Who it is |
| `subscriberCount` | Exact subscribers, when the author shows the number publicly |
| `totalSubscribersTier`, `paidSubscribersTier` | Substack's own tiers, e.g. "Hundreds of thousands of subscribers", "Thousands of paid subscribers" |
| `authorFollowers` | The author's Substack followers |
| `leaderboardCategory`, `leaderboardRank`, `leaderboardType` | Where it ranks on Substack's bestseller or rising list |
| `offersPaidSubscription`, `monthlyPrice`, `yearlyPrice`, `foundingPrice`, `currency`, `freeTrial` | What readers pay |
| `postsPerWeek`, `postsLast30Days`, `lastPostAt`, `daysSinceLastPost` | How active it is |
| `medianLikes`, `medianComments`, `medianRestacks`, `medianWordCount` | How readers respond, and how long posts are |
| `paywalledPostsPercent`, `podcastPostsPercent` | How much is behind the paywall, and how much is audio |
| `recommendsNewsletters` | How many newsletters it recommends (a sign of an active network) |
| `topPosts`, `latestPost` | The best-liked recent posts, with links |

**Every post** (`POSTS_CSV`): title, link, date, type, audience (free or paid), likes, comments, restacks and word count.

### Examples from live runs, 29 September 2026

**Business bestsellers, 30 newsletters, 580 posts, in 113 seconds:**

| Rank | Newsletter | Subscribers | Price | Posts / week | Median likes |
|---|---|---|---|---|---|
| 1 | Lenny's Newsletter | 1,200,000 | $20 / month | 0.8 | 411 |
| 2 | Noahpinion | 458,000 | $10 / month | 3.5 | 392 |
| 11 | Prof G Media | 424,000 | $20 / month | **20.0** | 22 |
| 19 | One Useful Thing | 480,000 | $10 / month | 0.3 | **1,000** |
| 20 | Energy Outlook Advisors | 16,000 | **$420 / month** | 2.0 | 11 |

The table shows why rank alone misleads a sponsor. **One Useful Thing posts about once every three weeks and draws a median of 1,000 likes**, while Prof G Media posts 20 times a week at 22. Energy Outlook Advisors reaches a small audience that pays $420 a month.

**Technology bestsellers**: SemiAnalysis (#1, 318,000 subscribers, $50 a month), The Pragmatic Engineer (#3, 1.1 million, $15 a month), Exponential View (#6, 166,000, recommends 77 other newsletters).

**Rising lists** for finance and food returned 20 newsletters, from Cassandra Unchained (336,000 subscribers, $49 a month) to What To Cook When You Don't Feel Like Cooking (590,000 subscribers, $7 a month).

### How to use it

1. Pick **categories** and **which list**: bestsellers, rising, or all newsletters in the category.
2. Or paste **specific newsletters** (`https://name.substack.com`, a custom domain, or `https://substack.com/@handle`), or **search Substack writers**.
3. Set how many newsletters per category and posts per newsletter.
4. Run it and download the reports and posts as **JSON, CSV or Excel**.

### Pricing

**$0.01 per newsletter report** and **$0.001 per post** saved.

A newsletter with 20 posts costs **$0.03**. The 30 Business bestsellers above, with all 580 posts, cost **$0.88**, or **$0.30** for the reports alone.

### Good to know

- **Subscriber numbers are what Substack shows publicly.** Tiers ("Tens of thousands of subscribers") appear for most established newsletters. The exact `subscriberCount` appears only when the author shows it, and only on the author's primary newsletter.
- **Search matches writers, not topics.** Substack's search returns a few writers per page, so categories and lists find far more newsletters.
- **A few custom domains refuse automated requests.** Those newsletters keep their listing details (rank, tiers, prices, subscribers), and the run summary says their posts could not be read. In testing, this was 1 newsletter in 30.
- **Likes, comments and restacks** are Substack's public counts on each post at the time of the run.
- **No personal data.** Newsletters and their public authors only: no subscribers, commenters or readers.

### Input

| Field | Meaning |
|---|---|
| **Categories** | 26 Substack categories |
| **Which list** | Bestsellers (top paid), Rising, or All newsletters in the category |
| **Newsletters per category** | 1 to 500, 25 per page |
| **Specific newsletters** | Addresses, custom domains or `substack.com/@handle` profiles |
| **Search Substack writers** | Words to search for, and how many newsletters to take |
| **Recent posts per newsletter** | 1 to 200 |
| **Also save every post** | Adds the posts file; charged per post |

### Integrations

Export to JSON, CSV, Excel or Google Sheets, or connect through the Apify API, webhooks, Make, Zapier and n8n. **Schedule it monthly** to keep a sponsorship shortlist current, or weekly to watch a category's rising list.

# Actor input Schema

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

Substack categories to pull newsletters from. Bestseller and rising lists come with subscriber tiers.

## `listType` (type: `string`):

Bestsellers are Substack's top paid newsletters per category; Rising is its trending list; All is the full category directory (no subscriber tiers).

## `maxPerCategory` (type: `integer`):

How far down each list to go, 25 per page.

## `newsletters` (type: `array`):

Newsletter addresses to report on: https://name.substack.com, a custom domain like www.lennysnewsletter.com, or a profile like https://substack.com/@handle.

## `searchQueries` (type: `array`):

Words to search Substack's writers for, e.g. "AI", "personal finance". Substack returns a few writers per page, so categories find more.

## `maxPerQuery` (type: `integer`):

The most newsletters to take from each search.

## `postsPerNewsletter` (type: `integer`):

How many of each newsletter's latest posts the report is built from.

## `includePosts` (type: `boolean`):

Saves the posts behind the reports as CSV and JSON: title, link, date, likes, comments, restacks, word count and whether it is paywalled. Charged per post.

## Actor input object example

```json
{
  "categories": [
    "technology"
  ],
  "listType": "bestsellers",
  "maxPerCategory": 25,
  "maxPerQuery": 10,
  "postsPerNewsletter": 20,
  "includePosts": true
}
```

# Actor output Schema

## `newsletters` (type: `string`):

One row per newsletter: subscriber tier, prices, posting pace, engagement, top posts and leaderboard rank.

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

Every post behind the reports, with likes, comments, restacks, word count and paywall status.

## `summary` (type: `string`):

Requests, problems and the limits of the data.

# 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 = {
    "categories": [
        "technology"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("precious_bathmat/substack-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 = { "categories": ["technology"] }

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

```

## MCP server setup

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