Substack Posts Scraper

Collect public Substack newsletter posts, archives, and metadata for content research and media monitoring.

Data fields

FieldTypeDescription
publicationDomaintextPublication exported in the dataset view.
titletextTitle exported in the dataset view.
canonicalUrllinkURL exported in the dataset view.
postDatedatePost date exported in the dataset view.
audiencetextAudience exported in the dataset view.
isPaidOnlybooleanPaid only exported in the dataset view.
wordCountnumberWords exported in the dataset view.
reactionCountnumberReactions exported in the dataset view.

Input preview

publicationUrlsPublication URLs or domains *
maxPostsPerPublicationMaximum posts per publication
searchTermSearch term
dateFromPublished after
dateToPublished before
includeBodyHtmlInclude body HTML

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

Export public Substack newsletter posts, archive entries, post metadata, previews, reactions, comments counts, and optional body fields.

Use this Actor to collect public Substack posts for newsletter research, media monitoring, creator tracking, content analysis, competitive research, and recurring archive snapshots. Results can be downloaded as CSV, JSON, Excel, XML, RSS, or used through the Apify Dataset API.

At a glance

  • Publication archive export: Enter Substack publication URLs, custom domains, or publication domains.
  • Post metadata rows: Collect post URLs, titles, subtitles, dates, authors, previews, reactions, comments, and body fields when available.
  • Keyword and date filters: Use search terms and date ranges to narrow archive exports.
  • Fallback support: Use feed fallback when a publication archive is limited.
  • API export: Send Substack rows to spreadsheets, media monitoring workflows, dashboards, databases, or AI agents.

What can it do?

Substack Posts Scraper extracts public posts from Substack publications and saves one dataset row per post.

  • Scrape publications: Add Substack URLs, publication domains, or custom domains.
  • Search archives: Use searchTerm to focus on posts around a topic.
  • Filter by date: Limit results with dateFrom and dateTo.
  • Include body fields: Save body HTML when your workflow needs article content.
  • Export repeatable datasets: Use Apify downloads, API calls, schedules, webhooks, and integrations.

Common workflows

  • Newsletter research: Build lists of posts from publications, writers, and categories.
  • Media monitoring: Track mentions of topics, companies, products, or people across newsletters.
  • Competitive research: Monitor how competitors, analysts, or creators discuss a market.
  • Content analysis: Export titles, previews, dates, reactions, and optional body text for review.
  • Creator tracking: Watch a publication archive for new posts and public engagement signals.
  • AI summaries: Feed public post content and metadata into summarization or classification workflows.

What data can you extract?

The Actor returns one dataset row per public Substack post.

Field Description
publicationUrl Source publication URL or domain
publicationName Publication name when available
postUrl Public Substack post URL
title Post title
subtitle Post subtitle when available
description Preview or description text
authorName Public author name when available
publishedAt Public post date
isPaid Whether the post is marked paid when visible
reactionsCount Public reaction count when available
commentsCount Public comment count when available
bodyText Body text when available
bodyHtml Optional body HTML when enabled
source Archive, search, or feed fallback source
scrapedAt Timestamp when the row was saved

Example input

{
  "publicationUrls": ["https://example.substack.com"],
  "maxPostsPerPublication": 25,
  "searchTerm": "AI",
  "includeBodyHtml": false,
  "includeRssFallback": true
}

Example output

{
  "publicationUrl": "https://example.substack.com",
  "publicationName": "Example Newsletter",
  "postUrl": "https://example.substack.com/p/example-post",
  "title": "Example post",
  "subtitle": "A public Substack post",
  "description": "Preview text...",
  "authorName": "Example Author",
  "publishedAt": "2026-07-03T10:00:00.000Z",
  "isPaid": false,
  "reactionsCount": 123,
  "commentsCount": 8,
  "bodyText": "Post body text...",
  "source": "archive",
  "scrapedAt": "2026-07-03T12:00:00.000Z"
}

How to run it

  1. Open the Actor on Apify.
  2. Add one or more Substack publication URLs or domains.
  3. Set maxPostsPerPublication.
  4. Add optional search or date filters.
  5. Choose whether to include body HTML and feed fallback.
  6. Start the run and export the dataset.

Search tips

  • Use publication URLs first: Full Substack URLs are usually the clearest input.
  • Use search terms for topics: Add searchTerm when monitoring a topic or company.
  • Use date windows: Date filters keep scheduled archive checks small and comparable.
  • Enable body HTML selectively: Body HTML is useful for content analysis but increases row size.
  • Try feed fallback: RSS/feed fallback can help when archive pages are limited.

Limits and caveats

  • The Actor extracts publicly visible Substack posts only.
  • It does not access private subscriber-only content, paid post bodies hidden from public view, email lists, or logged-in data.
  • Some publications use custom domains or archive layouts that may expose fewer fields.
  • Body fields are empty when the public page or feed does not expose them.

API usage

curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~substack-posts-scraper/runs?token=YOUR_APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"publicationUrls":["https://example.substack.com"],"maxPostsPerPublication":25}'

MCP and AI agents

This Actor can be used through the official Apify MCP server at https://mcp.apify.com.

For a focused single-Actor tool setup, use:

https://mcp.apify.com?tools=fetch_cat/substack-posts-scraper

Use the same JSON keys shown in the input configuration table, such as publicationUrls, maxPostsPerPublication, searchTerm, dateFrom, dateTo, and includeBodyHtml.

Support

If a run fails, returns no data, or a field looks wrong, open an issue from the Actor page.

Please include the Apify run ID or run URL, input JSON, one example public URL, query, or input item, what you expected, and what the dataset returned. Small reproducible inputs make parsing or site-layout issues much faster to fix.

Common questions

Questions and answers reused from the canonical actor README.

Can it scrape paid Substack posts?

It can save public metadata for posts that are visible, but it does not bypass paywalls or access private subscriber-only content.

Why is body text missing?

Some publications expose only metadata or previews publicly. Enable body options only when the public page provides the body.

Can I monitor new posts?

Yes. Use Apify schedules with the same publication list and date filters.

Can I export to CSV or Excel?

Yes. Apify datasets can be downloaded as CSV, JSON, Excel, XML, RSS, HTML, or accessed through the API.