# Substack Newsletter Finder & Scraper (`watershowdigital/substack-newsletter-finder`) Actor

Find Substack newsletters by keyword or category with subscriber counts, author social links (X, LinkedIn, website, YouTube) and posting activity. Export posts with full text.

- **URL**: https://apify.com/watershowdigital/substack-newsletter-finder.md
- **Developed by:** [WaterShow Digital](https://apify.com/watershowdigital) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 newsletters

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 Newsletter Finder & Scraper

Find Substack newsletters by **keyword** or **category** and get, for each one: **subscriber count**, the author's **X/Twitter, LinkedIn, website, YouTube and Bluesky**, **language**, whether it has a **paid plan or podcast**, and how **active** it is (last post date, posts in the last 30 days).

Second mode: **export posts** from any Substack newsletter, with full text of free posts.

Built for **newsletter sponsorships**, **PR and outreach**, **influencer research**, **competitor monitoring** and feeding **AI / RAG pipelines** with newsletter content.

### What you can do with it

- 📣 **Find newsletters to sponsor.** Search "fintech" or browse the Finance category, keep only English newsletters with 10,000+ subscribers that posted in the last 30 days.
- 🤝 **Build an outreach list.** Author name, Substack profile, X/Twitter, LinkedIn and website in one table, ready for a CRM.
- 🔎 **Map a niche.** Who writes about "product management" or "crypto", how big they are, who has a paid plan.
- 🧠 **Collect content.** Export posts with text, likes and comments for analysis, summaries or a RAG knowledge base.

### Input

| Field | What it does |
|---|---|
| **What to collect** | `Find newsletters` or `Export posts from newsletters` |
| **Search keywords** | Topics to search, each one separately: `saas`, `ai agents`, `real estate investing` |
| **Categories** | Whole Substack categories: `Technology`, `Business`, `Finance`, `Culture`, `Science`, `Health & Wellness`… |
| **Minimum subscribers** | Keep only newsletters with at least this public audience |
| **Language** | `en`, `es`, `de`… empty = any |
| **Add author social links** | X/Twitter, LinkedIn, website, YouTube, Bluesky, plus exact subscriber and follower counts |
| **Check posting activity** | Adds last post date and posts in the last 30 days |
| **Only active within (days)** | Skip newsletters that have gone quiet |
| **Max newsletters** | Stop after this many |
| **Newsletter URLs** | For post export: `name.substack.com`, a custom domain or any post link |
| **Include post text** | Adds full text of free posts and the public preview of paid ones |

Example: find English tech and business newsletters with 5,000+ subscribers that posted this month.

```json
{
  "mode": "newsletters",
  "searchQueries": ["saas", "startup marketing"],
  "categories": ["Technology", "Business"],
  "minSubscribers": 5000,
  "language": "en",
  "checkActivity": true,
  "activeWithinDays": 30,
  "maxResults": 200
}
```

### Output

One row per newsletter:

```json
{
  "name": "The Pragmatic Engineer",
  "url": "https://newsletter.pragmaticengineer.com",
  "description": "Big Tech and startups, from the inside. Highly relevant for software engineers, AI engineers and engineering leaders, useful for those working in tech.",
  "language": "en",
  "subscribersLabel": "Over 1,100,000 subscribers",
  "subscribersMin": 1100000,
  "subscribers": 1100000,
  "authorFollowers": 1221564,
  "hasPaidPlan": true,
  "hasPodcast": true,
  "author": {
    "name": "Gergely Orosz",
    "handle": "pragmaticengineer",
    "bio": "Big Tech and startups from the inside. Especially relevant for software engineers / AI engineers, useful for anyone working in tech.",
    "twitter": "https://x.com/GergelyOrosz",
    "profileUrl": "https://substack.com/@pragmaticengineer"
  },
  "links": {
    "twitter": "https://x.com/GergelyOrosz",
    "linkedin": "https://www.linkedin.com/in/gergelyorosz/",
    "youtube": "https://www.youtube.com/@pragmaticengineer",
    "bluesky": "https://bsky.app/profile/gergely.pragmaticengineer.com",
    "website": "https://www.pragmaticengineer.com/",
    "other": [{ "label": "Books", "url": "https://thetechresume.com/" }]
  },
  "contactEmail": null,
  "lastPostAt": "2026-10-22T14:08:21.295Z",
  "postsLast30Days": 13,
  "source": "category",
  "foundBy": "Technology"
}
```

Post export rows contain `title`, `subtitle`, `url`, `publishedAt`, `audience` (`everyone` or `only_paid`), `likes`, `comments`, `restacks`, `wordcount` and `text`.

Download results as **JSON, CSV, Excel** or pull them through the Apify API, schedule runs, or connect to Make, Zapier, n8n and Google Sheets.

### Pricing

Pay only for results, no start fee:

- **$2.50 per 1,000 newsletters**, including author social links and activity
- **$0.90 per 1,000 posts** without text
- **$1.80 per 1,000 posts** with full text

Set a maximum budget for a run and the scraper stops cleanly when it is reached.

### Good to know

- Subscriber counts are the ranges Substack shows publicly ("Over 10,000 subscribers"). `subscribersMin` is the number from that label, so it is a lower bound. Newsletters that hide their audience have `null`.
- `subscribers` is the most exact public number: from the author's profile when available, otherwise the lower bound from the label. `authorFollowers` is the author's follower count on Substack.
- `contactEmail` is only filled in when a newsletter publishes a support email, which is rare. Most authors are easiest to reach through the links in `links`.
- Newsletters that moved off Substack keep their old Substack data but post export skips them and says so in the log.
- Paid posts are exported with their public preview only. The scraper never logs in and never bypasses a paywall.
- Only public data is collected. Use it in line with Substack's terms and the privacy laws that apply to you (for example GDPR when contacting people in the EU).

### FAQ

**How many newsletters can one keyword find?** Usually 50 to 200. Categories go much deeper: thousands of newsletters per category.

**Is it fast?** About 20 to 60 newsletters per minute with author links and activity on. Turn both off for a quick list.

**Something broke or you need a field?** Open an issue on the Actor page and it will be fixed quickly.

# Actor input Schema

## `mode` (type: `string`):

Find newsletters (audience, author, social links, activity) or export posts from newsletters you already know.

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

Topics to search, e.g. "saas", "ai agents", "real estate investing". Each keyword is searched separately and usually finds 50 to 300 newsletters.

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

Browse whole Substack categories. Each category goes up to about 500 of its most popular newsletters.

## `minSubscribers` (type: `integer`):

Keep only newsletters with at least this many subscribers. Newsletters that hide their audience are skipped when this is set.

## `language` (type: `string`):

Two-letter language code, e.g. en, es, de, fr. Empty means any language.

## `includeAuthorProfile` (type: `boolean`):

Adds the author's X/Twitter, LinkedIn, website, YouTube, Bluesky and other links, plus a more exact subscriber count and Substack follower count. One extra request per newsletter.

## `checkActivity` (type: `boolean`):

Adds the date of the last post and the number of posts in the last 30 days. One extra request per newsletter.

## `activeWithinDays` (type: `integer`):

Skip newsletters with no new post in this many days. Works with "Check posting activity".

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

Stop after this many newsletters.

## `newsletterUrls` (type: `array`):

Newsletters to export posts from: https://name.substack.com, a custom domain like https://www.lennysnewsletter.com, or any post link from the newsletter.

## `maxPostsPerNewsletter` (type: `integer`):

Newest posts first.

## `includeContent` (type: `boolean`):

Adds the full text of free posts and the public preview of paid ones. One extra request per post.

## `onlyFree` (type: `boolean`):

Skip paid posts and export only posts that everyone can read.

## `proxyConfiguration` (type: `object`):

Apify Proxy spreads requests over several IPs so Substack does not slow the run down. Recommended for runs over a few hundred results.

## Actor input object example

```json
{
  "mode": "newsletters",
  "searchQueries": [
    "saas",
    "startup marketing"
  ],
  "minSubscribers": 0,
  "includeAuthorProfile": true,
  "checkActivity": true,
  "maxResults": 50,
  "maxPostsPerNewsletter": 50,
  "includeContent": true,
  "onlyFree": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Newsletters with subscribers, author social links and activity, or posts with metadata and optional full text.

# 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 = {
    "searchQueries": [
        "saas",
        "startup marketing"
    ],
    "maxResults": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("watershowdigital/substack-newsletter-finder").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 = {
    "searchQueries": [
        "saas",
        "startup marketing",
    ],
    "maxResults": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("watershowdigital/substack-newsletter-finder").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 '{
  "searchQueries": [
    "saas",
    "startup marketing"
  ],
  "maxResults": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call watershowdigital/substack-newsletter-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,watershowdigital/substack-newsletter-finder"
        }
    }
}
```

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/BuozBfedM0GudWfOT/builds/KhhkFlRp20AOY8pkI/openapi.json
