# Substack Email Scraper (`email_scraper/substack-email-scraper`) Actor

Substack Email Scraper finds publicly indexed Substack contact emails using targeted keywords, locations, and custom email domains. Build structured lead datasets with titles, descriptions, URLs, and matching email addresses for creator, publisher, and newsletter research.

- **URL**: https://apify.com/email\_scraper/substack-email-scraper.md
- **Developed by:** [Email Scraper](https://apify.com/email_scraper) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Email Scraper – Overview

**Substack Email Scraper** is an Apify Actor designed to discover publicly indexed Substack contact emails using targeted keywords, optional locations, and selected email domain suffixes. It helps turn search terms such as `Creator`, `Publisher`, `Writer`, or other audience and profession-related queries into structured lead data.

Instead of requiring you to manually search through large numbers of search results, **Substack Email Scraper** searches for relevant Substack results and looks for matching email addresses in their publicly indexed descriptions. Each discovered lead is stored in an Apify Dataset with the keyword, result title, description, URL, and email address.

The Actor is useful for creator research, newsletter discovery, publisher outreach, partnership research, audience development, and other workflows where publicly indexed Substack contact information is relevant.

> 💡 **Quick Start:** Enter one or more keywords, optionally specify a location, choose email domains such as `@gmail.com` or `@yahoo.com`, set a maximum number of emails per keyword + domain combination, and run the Actor.

### 🔎 Substack Email Scraper – SEO Description

Substack Email Scraper finds publicly indexed Substack contact emails using targeted keywords, locations, and custom email domains. Extract structured lead data with titles, descriptions, URLs, and emails into an Apify Dataset.

### 🔹 Substack Email Scraper – Key Features

**Substack Email Scraper** combines keyword targeting with email-domain filtering to help you discover relevant publicly indexed contact information.

> **Key Features**
>
> - Search Substack results using multiple keywords or queries
> - Target specific email domains such as `@gmail.com`, `@yahoo.com`, and `@outlook.com`
> - Narrow search using a country, state, or city
> - Exclude unwanted words or phrases from result descriptions
> - Set a result target for every keyword + domain combination
> - Automatically avoid duplicate email addresses
> - Store results incrementally in an Apify Dataset
> - Preserve progress so interrupted runs can continue
> - Return structured lead information for further processing

The Actor is designed for flexible search rather than a single fixed audience. You can search for broad categories such as `Creator`, or use more specific terms such as `Newsletter Creator`, `Independent Publisher`, `Content Writer`, or `Technology Newsletter`.

Using several closely related keywords can increase the range of relevant search results because different Substack publishers may describe themselves in different ways.

### 🎯 Substack Email Scraper – Why Use It?

Finding relevant newsletter publishers or creators manually can involve repeated searches, opening individual results, checking descriptions, and recording contact information. **Substack Email Scraper** automates the repetitive discovery portion of that workflow.

It is particularly useful when your research depends on a combination of **keyword intent + email domain + optional location**.

> **Why Use Substack Email Scraper?**
>
> - Build structured Substack contact datasets from search-driven discovery
> - Search multiple audience segments in a single run
> - Focus on particular email providers or custom domains
> - Add geographic targeting when location matters
> - Filter out unwanted categories using exclude words
> - Reduce duplicate contacts across different searches
> - Receive results directly in an Apify Dataset

The Actor does not guarantee a specific number of results. It can only collect email addresses that are publicly indexed in the search-result information and match the configured criteria.

### 📊 Substack Email Scraper – What Data Can You Extract?

**Substack Email Scraper** produces structured lead records containing information associated with the search result where the email was discovered.

The default dataset view displays five primary fields, while the Actor also includes a network identifier in each pushed record.

| Field         | Description                                            | Default View |
| ------------- | ------------------------------------------------------ | ------------ |
| `keyword`     | Keyword used to discover the result                    | Yes          |
| `title`       | Title of the search result                             | Yes          |
| `description` | Search-result description containing the relevant text | Yes          |
| `url`         | URL returned by the search result                      | Yes          |
| `email`       | Matching email address                                 | Yes          |
| `network`     | Identifies the source network as `Substack.com`        | No           |

The `description` field is especially useful because it represents the indexed search-result text from which the matching email address is extracted.

> 📦 **Dataset:** Results are stored in the configured **Substack Emails Dataset** and presented through the `Scraped Leads` table view.

### ⚙️ Substack Email Scraper – How to Use It

Using **Substack Email Scraper** requires only a few input decisions.

#### 🔹 Step 1: Add Keywords

Enter one or more keywords or search queries.

For example:

```text
Creator
Publisher
Newsletter Writer
Content Creator
Business Newsletter
```

Specific search terms can be more useful than a single broad term. For example, instead of only searching `Fitness`, consider:

```text
Fitness Coach
Fitness Creator
Fitness Newsletter
Online Fitness Coach
Fitness Publisher
```

#### 🔹 Step 2: Add a Location if Needed

The optional `location` field lets you add a country, state, or city to the search.

Examples include:

```text
New York
London
Canada
California
Australia
```

Leave the field empty when geographic targeting is not important.

Location is used as a search refinement rather than a guarantee that every returned profile belongs to that exact geographic area.

#### 🔹 Step 3: Choose Email Domains

The `customDomains` input determines which email suffixes the Actor searches for.

Examples:

```text
@gmail.com
@yahoo.com
@outlook.com
@hotmail.com
```

You can also provide custom domains when your research requires specific business or organization email addresses.

#### 🔹 Step 4: Set the Maximum Email Target

`maxEmails` accepts values from **1 to 10,000**.

The limit applies independently to each keyword + domain combination.

For example, if you provide:

- 3 keywords
- 2 email domains
- `maxEmails = 20`

There are six keyword/domain combinations, and the Actor can target up to 20 emails for each combination, subject to available results and duplicate removal.

#### 🔹 Step 5: Add Exclude Words

Use `excludeWords` when you want to skip search-result descriptions containing unwanted terms.

For example:

```text
crypto
onlyfans
adult
```

The matching is case-insensitive. Single words are matched as whole words, while phrases are matched as text within the description.

### 🔎 How Substack Email Scraper Finds Contact Emails

**Substack Email Scraper** uses keyword-driven search queries focused on Substack results and the selected email domain.

Conceptually, a query combines:

```text
site:substack.com
+ keyword
+ email domain
+ optional location
```

For example, a search may target a combination similar to:

```text
site:substack.com Creator "@gmail.com" "New York"
```

The Actor then examines available search-result information and extracts email addresses that match the selected domain suffix.

This means the Actor is a **search-based email discovery tool**, rather than a crawler that claims to inspect every Substack page directly.

> ⚠️ **Important:** An email must be present in the publicly indexed search-result description and match the selected domain pattern to be collected. Results depend on what is publicly indexed and available to the search engine.

### 🧩 How to Scrape Substack Emails by Keyword

The most practical approach is to combine broad audience categories with specific professional or content-related terms.

For example, a creator research project might use:

- `Creator`
- `Content Creator`
- `Newsletter Creator`
- `Independent Publisher`
- `Writer`
- `Author`
- `Business Newsletter`
- `Technology Writer`

This keyword strategy gives **Substack Email Scraper** multiple opportunities to discover relevant search results instead of relying on one generic query.

For specialized research, combine role-based terms with topics:

```text
AI Newsletter
Finance Writer
Marketing Newsletter
Technology Publisher
Startup Newsletter
```

The quality and quantity of results will depend on how much relevant information is publicly indexed.

### 📍 Can Substack Email Scraper Search by Country or City?

Yes. The `location` field can be used to add a geographic term to the search.

For example:

```text
location = Canada
```

or:

```text
location = Toronto
```

This can be useful for regional creator research, local newsletter discovery, market research, or location-specific outreach.

However, location should be treated as a **search filter**, not as verified profile metadata. The Actor does not claim that every result is physically located in the specified region.

### 🚫 Can You Exclude Specific Words or Phrases?

Yes. **Substack Email Scraper** supports an `excludeWords` list.

If an excluded word or phrase appears in a result description, the entire snippet is skipped and no email is collected from that result.

For example:

```json
{
  "excludeWords": [
    "crypto",
    "onlyfans"
  ]
}
```

Single words use case-insensitive whole-word matching. Phrases use case-insensitive substring matching.

This feature can help remove categories that are not relevant to a particular lead-generation or research workflow.

### 💼 Substack Email Scraper – Use Cases

**Substack Email Scraper** can support several research and lead-discovery workflows based on publicly indexed Substack information.

#### 🔹 Creator and Publisher Research

Discover contact information associated with creators, writers, publishers, and newsletter operators.

Potential keywords include:

- Creator
- Publisher
- Newsletter Writer
- Independent Writer
- Content Creator

#### 🔹 Newsletter Outreach

Build structured datasets of publicly indexed newsletter-related contacts for legitimate business communication, partnerships, or research.

#### 🔹 Sponsorship Research

Brands and agencies can use relevant keywords to discover newsletters and publishers that may be appropriate for sponsorship or partnership research.

#### 🔹 Content and Audience Research

Search by topics, professional roles, or content categories to identify relevant Substack publications and associated public contact information.

#### 🔹 Market Research

Use keyword and location combinations to investigate how different creator or publisher categories appear across publicly indexed Substack results.

#### 🔹 B2B Research

Custom email domains can help identify contacts associated with business domains when those addresses are publicly indexed.

### 📝 Input

The required input is `keywords`. Other fields are optional but can significantly change the search scope.

| Input           | Type        | Required | Default                |
| --------------- | ----------- | -------- | ---------------------- |
| `keywords`      | String list | Yes      | `Creator`, `Publisher` |
| `location`      | Text        | No       | Empty                  |
| `customDomains` | String list | No       | `@gmail.com`           |
| `maxEmails`     | Integer     | No       | `5`                    |
| `excludeWords`  | String list | No       | Empty                  |

#### 🔹 Example Input

```json
{
  "keywords": [
    "Creator",
    "Publisher",
    "Newsletter Writer"
  ],
  "location": "New York",
  "customDomains": [
    "@gmail.com",
    "@yahoo.com",
    "@outlook.com"
  ],
  "maxEmails": 20,
  "excludeWords": [
    "crypto",
    "onlyfans"
  ]
}
```

> 💡 **Input Tip:** Start with a small number of specific keywords and email domains. If results are sparse, broaden the keywords, add additional domains, or remove the location filter.

### 📤 Output

Each collected email is pushed to the Apify Dataset as a structured record.

#### 🔹 Example Output

```json
{
  "network": "Substack.com",
  "keyword": "Creator",
  "title": "Example Substack Newsletter",
  "description": "Example newsletter description with contact creator@example.com",
  "url": "https://example.substack.com/",
  "email": "creator@example.com"
}
```

The example above is illustrative. Actual titles, descriptions, URLs, and email addresses depend on available search results.

#### 🔹 Output Data Fields

- `network` — source network identifier, set to `Substack.com`
- `keyword` — keyword responsible for discovering the result
- `title` — title of the returned search result
- `description` — indexed result description used for email discovery
- `url` — URL associated with the returned search result
- `email` — extracted email matching the selected domain suffix

### 💰 Substack Email Scraper – Pricing and Result Limits

The Actor configuration does not define a fixed monetary price for using **Substack Email Scraper**. Actual Apify platform costs depend on the applicable account, Actor run resources, and platform pricing.

The Actor supports a `maxEmails` range from **1 to 10,000**.

> **Result Limit**
>
> - `maxEmails` is applied per keyword + domain combination.
> - The configured maximum is a target, not a guarantee.
> - Results can be lower when suitable public search results are unavailable.
> - Duplicate email addresses are not added again.
> - On the free tier, the Actor applies a maximum of 100 emails per keyword + domain combination.

Lower targets can help keep searches smaller, while higher targets allow the Actor to continue searching for additional matching results when they exist.

### 💡 Tips and Best Practices

#### 🔹 Use Multiple Specific Keywords

Instead of relying only on `Creator`, consider related terms such as:

- Newsletter Creator
- Newsletter Publisher
- Content Creator
- Independent Publisher
- Substack Writer

This can improve search coverage across different descriptions and audiences.

#### 🔹 Combine Several Email Domains

If `@gmail.com` produces limited results, consider adding:

```text
@yahoo.com
@outlook.com
@hotmail.com
@icloud.com
```

You can also add relevant custom business domains.

#### 🔹 Remove Location When Results Are Sparse

A location filter can make a search more focused, but it may also reduce the available result pool.

If a location-specific search returns very few contacts, try removing the location or using a broader region.

#### 🔹 Choose Relevant Exclusions

Use `excludeWords` to remove categories that do not fit your research.

Avoid adding overly broad exclusion terms because they may cause potentially useful search results to be skipped.

#### 🔹 Allow Enough Run Time

The Actor input documentation specifies a default run timeout of **3600 seconds**. Wide searches involving many keyword/domain combinations can take longer.

For larger runs, review the Apify run settings and adjust the timeout when appropriate.

#### 🔹 Understand Duplicate Handling

**Substack Email Scraper** keeps track of previously discovered email addresses during the run. If the same email appears through multiple keyword searches, it is not stored repeatedly.

This helps keep the resulting contact dataset cleaner.

### 🔐 Responsible Use and Data Quality

**Substack Email Scraper** is intended for discovering publicly indexed information.

Email availability is not guaranteed, and a successful search does not mean that an address is verified, monitored, or appropriate for every type of outreach.

> ⚠️ **Important:** Use collected contact information responsibly. Follow applicable privacy, data protection, anti-spam, and platform rules when storing, analyzing, or contacting people.

### ❓ Frequently Asked Questions

#### 🔹 What is Substack Email Scraper?

**Substack Email Scraper** is an Apify Actor that searches publicly indexed Substack results using keywords, optional locations, and selected email domains, then extracts matching email addresses into a structured dataset.

#### 🔹 How does Substack Email Scraper find email addresses?

It searches for Substack-related results using the supplied keyword and email domain, optionally combined with a location. Matching email addresses are extracted from the available search-result descriptions.

#### 🔹 Does Substack Email Scraper directly crawl every Substack profile?

No. The Actor is designed around search-result discovery. It does not claim to crawl every Substack profile or guarantee that every publicly available email will be found.

#### 🔹 Can I search Substack by keyword?

Yes. The `keywords` input accepts multiple search terms or queries. Using specific role, topic, or audience keywords can help target more relevant results.

#### 🔹 Can I search Substack emails by location?

Yes. Add a country, state, city, or other geographic term to the `location` field. The location is used to narrow the search.

#### 🔹 Can I search multiple email domains?

Yes. Add multiple values to `customDomains`, such as `@gmail.com`, `@yahoo.com`, and `@outlook.com`.

Each keyword + domain combination receives its own collection target.

#### 🔹 Is maxEmails a run-wide limit?

No. The configured Actor behavior applies `maxEmails` independently to each keyword + domain combination.

For example, two keywords and three domains create six combinations. A target of 10 can therefore allow up to 10 matching addresses for each combination, subject to duplicate removal and available results.

#### 🔹 Does Substack Email Scraper guarantee the requested number of emails?

No. `maxEmails` is a collection target. The Actor can only collect matching addresses that are available in the search results.

Narrow keywords, restrictive locations, limited email domains, duplicate addresses, or limited public indexing can all reduce the final count.

#### 🔹 How does excludeWords work?

If an excluded word or phrase appears in a search-result description, that entire result is skipped.

Single words are matched as whole words, while phrases are matched as text. Matching is case-insensitive.

#### 🔹 Does Substack Email Scraper remove duplicate emails?

Yes. The Actor tracks discovered email addresses and avoids adding the same email more than once during the run.

#### 🔹 What happens if my search returns very few results?

Try broader or additional keywords, add more email domains, or remove the location filter.

For example, replace a highly specific query such as `Independent SaaS Newsletter Founder` with related searches such as `SaaS Newsletter`, `Startup Writer`, or `Business Newsletter`.

#### 🔹 Can I use custom company email domains?

Yes. The `customDomains` field accepts custom email suffixes. This can be useful when researching contacts associated with specific organizations or business domains.

#### 🔹 Can an interrupted run continue?

The Actor persists progress during collection and stores discovered email information so that its search state can be resumed after an interruption.

#### 🔹 Where are the results stored?

Collected records are pushed to the Apify Dataset configured for the Actor. The default view is named **Scraped Leads** and displays the keyword, title, description, URL, and email fields.

#### 🔹 What is the free-tier email limit?

For free-tier runs, the Actor limits the requested maximum to 100 emails per keyword + domain combination when a higher value is requested. Paid runs do not apply this Actor-level free-tier ceiling.

### 🛠️ Substack Email Scraper – Best Search Strategies

The most effective configuration depends on your research objective.

For general creator discovery:

```text
Creator
Publisher
Newsletter Writer
```

For business research:

```text
Business Newsletter
Startup Newsletter
Marketing Publisher
Industry Writer
```

For topic-based research:

```text
AI Newsletter
Finance Newsletter
Technology Writer
Marketing Newsletter
```

For regional research, combine these keywords with a location such as `London`, `Canada`, `New York`, or another target region.

This flexible structure makes **Substack Email Scraper** suitable for both broad discovery and focused contact research without requiring a separate Actor configuration for each audience.

### 📌 Important Notes

> **Before running a large search**
>
> - Confirm that your keywords accurately represent the audience you want to research.
> - Add multiple email domains when broader email coverage is needed.
> - Use `location` only when geographic targeting is useful.
> - Use `excludeWords` carefully so relevant results are not filtered accidentally.
> - Remember that search availability determines the final number of collected emails.
> - Treat `maxEmails` as a target rather than a guaranteed result count.
> - Review collected information before using it for outreach or other business purposes.

### 🤝 Support

If you need help configuring **Substack Email Scraper**, choosing search keywords, improving result coverage, or creating a customized scraping solution, you can contact me by email.

**contact me by email : <alphascraper69@gmail.com>**

# Actor input Schema

## `keywords` (type: `array`):

A list of keywords or queries to search for.

## `location` (type: `string`):

Optional country, state or city used to narrow the search. Leave it empty to search without a geographic filter.

## `customDomains` (type: `array`):

List of custom email domains

## `maxEmails` (type: `integer`):

How many addresses each search keyword + domain suffix combination may collect before the finder moves on to the next one. This is a per-combination target, not a run-wide total: with 3 keyword and 2 Domains and a limit of 20, the run works through all 6 combinations and aims for up to 20 addresses in each, so up to 120 overall. Lower values finish sooner and cost less; higher values dig deeper but never guarantee a fuller result, since the run can only find what is publicly listed.

## `excludeWords` (type: `array`):

Words or phrases you do not want to see.

## Actor input object example

```json
{
  "keywords": [
    "Creator",
    "Publisher"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com"
  ],
  "maxEmails": 5,
  "excludeWords": []
}
```

# 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 = {
    "keywords": [
        "Creator",
        "Publisher"
    ],
    "location": "",
    "customDomains": [
        "@gmail.com"
    ],
    "excludeWords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("email_scraper/substack-email-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 = {
    "keywords": [
        "Creator",
        "Publisher",
    ],
    "location": "",
    "customDomains": ["@gmail.com"],
    "excludeWords": [],
}

# Run the Actor and wait for it to finish
run = client.actor("email_scraper/substack-email-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 '{
  "keywords": [
    "Creator",
    "Publisher"
  ],
  "location": "",
  "customDomains": [
    "@gmail.com"
  ],
  "excludeWords": []
}' |
apify call email_scraper/substack-email-scraper --silent --output-dataset

```

## MCP server setup

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