# Substack Notes Scraper (`brick_joey_yto/substack-notes-scraper`) Actor

Scrape Notes from Substack profiles or search across all Substack Notes.

- **URL**: https://apify.com/brick\_joey\_yto/substack-notes-scraper.md
- **Developed by:** [William Billings](https://apify.com/brick_joey_yto) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 1 monthly users, 50.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$30.00 / 1,000 result items

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

## Substack Notes Scraper — Extract Notes & Engagement From the Fastest-Growing Writer Platform

Scrape Notes from Substack profiles or search across all Substack Notes at scale for writer research, content monitoring, and trend detection. Get clean, structured data with author info, engagement metrics, and media — **no authentication required**. The only Substack Notes scraper on Apify, powered by browser automation since no public API exists for Notes.

### What data can you extract from Substack?

For each note, you get:

- **Note content** — full text, note URL, posted date, note ID
- **Author info** — handle, display name, avatar URL
- **Engagement metrics** — likes, replies, and restacks per note
- **Media** — media URLs for notes with images or embeds
- **Mentions** — parsed and extracted from note text
- **Linked posts** — URL of any linked Substack post referenced in the note

### Sample output

```json
{
  "note_id": "c-1234567890",
  "author_handle": "platformer",
  "author_name": "Platformer",
  "author_avatar": "https://substackcdn.com/image/fetch/example.jpg",
  "text": "The future of media is independent. Substack Notes is where writers are building real communities.",
  "like_count": 342,
  "reply_count": 28,
  "restack_count": 56,
  "posted_date": "2026-08-01T14:30:00.000Z",
  "note_url": "https://substack.com/@platformer/note/c-1234567890",
  "has_media": true,
  "media_urls": ["https://substackcdn.com/image/fetch/note-example.jpg"],
  "mentions": ["@caseynewton"],
  "linked_post": "https://platformer.com/the-end-of-the-social-media-era"
}
```

### How to use the Substack Notes Scraper

1. **Choose a mode** — Select `profile` to get notes from a specific author, or `search` to find notes by keyword across all of Substack
2. **Enter a handle or search query** — For profile mode, provide a Substack handle (e.g., `platformer`). For search mode, enter a keyword
3. **Set max notes** — Choose how many notes to extract (up to 500)
4. **Run the actor** — Click Start and get your data in minutes
5. **Export** — Download as JSON, CSV, XML, Excel, or HTML

### Input fields

| Field       | Type    | Required     | Default | Description                                             |
| ----------- | ------- | ------------ | ------- | ------------------------------------------------------- |
| mode        | string  | Yes          | profile | `profile` for author notes, `search` for keyword search |
| handle      | string  | profile mode | —       | Substack handle without @ (e.g., `platformer`)          |
| searchQuery | string  | search mode  | —       | Keyword to search across all Substack Notes             |
| maxNotes    | integer | No           | 50      | Maximum notes to return (1-500)                         |

### Use cases

- **Writer research** — Find popular Substack writers and analyze their Notes engagement
- **Content monitoring** — Track what writers are saying about your brand or topic
- **Trend detection** — Identify trending notes and discussions on the fastest-growing writer platform
- **Competitor tracking** — Monitor competing publications' Notes activity and engagement
- **Influencer identification** — Discover high-engagement Substack writers for partnerships
- **Audience analysis** — Understand which topics and writers drive the most discussion on Substack
- **Academic research** — Study the evolution of independent media and short-form publishing

### How much does it cost to scrape Substack?

**$0.03 per result.** You only pay for the data you actually receive — failed or empty requests are not charged.

| Results   | Cost    |
| --------- | ------- |
| 50 notes  | ~$1.50  |
| 100 notes | ~$3.00  |
| 250 notes | ~$7.50  |
| 500 notes | ~$15.00 |

The first run is free under Apify's free tier, so you can test with a small batch before scaling up.

### Is scraping Substack legal?

Yes. This scraper only accesses publicly available Notes data through browser automation of public Substack pages. It does not bypass authentication or access private data. Always check Substack's Terms of Service for restrictions on how you use the data.

### FAQ

#### What are Substack Notes?

Notes are Substack's short-form social posts, similar to tweets. They include text, media, mentions, and engagement metrics. Notes can be posted by any Substack writer and are visible on the platform's social feed.

#### Do I need a Substack account?

No, the scraper works with public notes. No authentication is required. Both search mode and profile mode work without any login credentials.

#### Can I get notes from a specific author?

Yes, use profile mode with the author's handle (e.g., `platformer`). The scraper will pull all available notes from that author's profile page.

#### What is the difference between profile and search mode?

**Profile mode** pulls all notes from a specific Substack author's profile. **Search mode** scrolls through the Substack Notes feed and filters results by your keyword, giving you notes from across the entire platform.

#### How many results can I get per run?

You can retrieve up to 500 results per run using the `maxNotes` parameter. For broader searches, run multiple times with different keywords or handles.

#### Can I integrate this with my existing pipeline?

Yes. Apify provides a REST API, webhooks, and integrations with Zapier, Make, Airbyte, and LangChain. You can schedule runs, export to S3 or Google Sheets, and chain actors together.

### Related actors

Check out our other social media scrapers:

| Actor                                                                               | Platform  | Use case                                |
| ----------------------------------------------------------------------------------- | --------- | --------------------------------------- |
| [Bluesky Search Scraper](https://apify.com/brick_joey_yto/bluesky-search-scraper)   | Bluesky   | Decentralized social posts & profiles   |
| [Threads Profile Scraper](https://apify.com/brick_joey_yto/threads-profile-scraper) | Threads   | Meta's text platform                    |
| [BitChute Video Scraper](https://apify.com/brick_joey_yto/bitchute-search-scraper)  | BitChute  | Alternative video platform data         |
| [Farcaster Cast Scraper](https://apify.com/brick_joey_yto/farcaster-scraper)        | Farcaster | Web3 social data                        |
| [Spoutible Profile Scraper](https://apify.com/brick_joey_yto/spoutible-scraper)     | Spoutible | Twitter alternative monitoring          |
| [Gab Search Scraper](https://apify.com/brick_joey_yto/gab-search-scraper)           | Gab       | OSINT & alternative platform monitoring |

### Support

Need a custom feature or found a bug? Open an issue on the Actor's page and we'll respond within 24 hours. We can also build custom scrapers for your specific use case — just reach out.

# Actor input Schema

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

Profile: scrape notes from a specific author. Search: search notes by keyword.

## `handle` (type: `string`):

Substack handle without @ (for profile mode)

## `searchQuery` (type: `string`):

Keyword to search (for search mode)

## `maxNotes` (type: `integer`):

Maximum number of notes to extract

## Actor input object example

```json
{
  "mode": "profile",
  "handle": "platformer",
  "maxNotes": 50
}
```

# 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 = {
    "handle": "platformer"
};

// Run the Actor and wait for it to finish
const run = await client.actor("brick_joey_yto/substack-notes-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 = { "handle": "platformer" }

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=brick_joey_yto/substack-notes-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/3a9JxUL2afzLowZ2Y/builds/AHRwHfRDYpraAIBFw/openapi.json
