Substack Scraper - Posts, Newsletters & Comments avatar

Substack Scraper - Posts, Newsletters & Comments

Pricing

from $2.40 / 1,000 posts

Go to Apify Store
Substack Scraper - Posts, Newsletters & Comments

Substack Scraper - Posts, Newsletters & Comments

Substack scraper for posts, newsletters, authors, subscriber data, full public content, engagement, and nested comments. Search by keyword or scrape any publication.

Pricing

from $2.40 / 1,000 posts

Rating

4.5

(3)

Developer

LIAICHI MUSTAPHA

LIAICHI MUSTAPHA

Maintained by Community

Actor stats

5

Bookmarked

77

Total users

10

Monthly active users

15 days ago

Last modified

Features

Limited permissions

Share

Scrape Substack posts, newsletters, authors, publication details, subscriber data, engagement metrics, public article content, and nested comments. Start from publication URLs, custom domains, direct post URLs, or search keywords.

The Actor uses lightweight public web endpoints instead of a browser, so routine runs are fast and use only 256 MB of memory. Results are available as JSON, CSV, Excel, XML, HTML, and RSS through the Apify Dataset API.

Features

  • Discover Substack publications by keyword, topic, author, or niche
  • Scrape complete publication archives or individual /p/ URLs
  • Extract headlines, descriptions, dates, authors, tags, images, language, and word counts
  • Collect reactions, comments, replies, restacks, and free or paid access status
  • Return public article content as plain text, Markdown, and HTML
  • Preserve nested public comment threads with author and reaction details
  • Include publication name, description, logos, payment status, and visible subscriber counts
  • Filter by date, post type, access, reactions, comments, and word count
  • Support standard substack.com publications and Substack custom domains
  • Produce a STATS record with per-publication results and run duration

Use Cases

  • Competitor monitoring: track publishing frequency, topics, authors, and engagement
  • Newsletter discovery: find publications in a market before building a prospect list
  • Content research: compare headlines, tags, formats, and audience response
  • AI and RAG datasets: export clean Markdown or text with source metadata
  • Media monitoring: schedule recurring snapshots of selected newsletters
  • Audience research: analyze public conversations in comments and replies
  • Lead generation: identify relevant publications, authors, and custom domains by niche

Input

Provide at least one publication URL or search keyword.

FieldTypeDefaultDescription
substackUrlsarrayoptionalPublication URLs, custom domains, or direct post URLs
searchQueriesarrayoptionalKeywords used to discover relevant publications
maxSearchResultsPerQueryinteger10Publications discovered per keyword
maxPostsPerSubstackinteger50Matching posts per publication; 0 means the full archive
includeContentbooleantrueReturn public HTML, Markdown, and plain text
includeCommentsbooleanfalseReturn public comments and nested replies
maxCommentsPerPostinteger20Maximum comments and replies per post
includePublicationInfobooleantrueAdd publication and visible subscriber metadata
postTypestringallall, newsletter, podcast, or thread
startDatedateoptionalInclude posts published on or after this date
endDatedateoptionalInclude posts published on or before this date
onlyFreebooleanfalseExclude posts marked for paid subscribers
minReactionsinteger0Minimum reaction count
minCommentsinteger0Minimum comment count
minWordCountinteger0Minimum word count
postConcurrencyinteger10Parallel post requests, from 1 to 25

Scrape publications and comments

{
"substackUrls": [
"https://www.lennysnewsletter.com",
"https://platformer.news"
],
"maxPostsPerSubstack": 20,
"includeContent": true,
"includeComments": true,
"maxCommentsPerPost": 30,
"startDate": "2026-01-01",
"onlyFree": true,
"postConcurrency": 10
}

Discover newsletters by keyword

{
"searchQueries": ["artificial intelligence", "product management"],
"maxSearchResultsPerQuery": 5,
"maxPostsPerSubstack": 10,
"includeContent": false,
"minReactions": 10
}

Output

Each Dataset item represents one post. Existing fields such as headline, date, likes, comments, and article_text remain available, with richer fields added.

{
"record_type": "post",
"post_id": 208730073,
"publication_id": 10845,
"substack_url": "https://www.lennysnewsletter.com",
"post_url": "https://www.lennysnewsletter.com/p/example-post",
"slug": "example-post",
"headline": "Example newsletter post",
"subheading": "A public subtitle",
"post_type": "newsletter",
"published_at": "2026-08-18T15:40:06.921Z",
"date": "Aug 18, 2026",
"free_or_paid": "Free",
"is_paywalled": false,
"likes": 346,
"comments": 17,
"child_comments": 14,
"restacks": 9,
"word_count": 933,
"language": "en",
"tags": ["Career"],
"cover_image_url": "https://...",
"author_name": "Example Author",
"author_handle": "example",
"author_url": "https://substack.com/@example",
"article_text": "Plain text content...",
"article_markdown": "## Markdown content...",
"article_html": "<div>HTML content...</div>",
"content_type": "full",
"comment_threads": [
{
"id": 123,
"body": "Useful analysis.",
"author_name": "Reader",
"reaction_count": 4,
"is_author": false,
"replies": []
}
],
"comments_collected": 1,
"publication": {
"name": "Example Newsletter",
"url": "https://example.substack.com",
"hero_text": "Publication description",
"subscriber_count": 12000,
"subscriber_count_label": "Over 12,000 subscribers",
"payments_enabled": true,
"logo_url": "https://..."
},
"search_query": "product management",
"scraped_at": "2026-08-23T10:00:00Z"
}

content_type is full, preview_only, metadata_only, or failed. The Actor never bypasses a paywall; paid posts contain only content Substack exposes publicly.

How to Use

  1. Open the Actor and select Try for free.
  2. Add publication or post URLs, search keywords, or both.
  3. Set the number of posts and optional filters.
  4. Enable comment extraction only when comment bodies are needed.
  5. Start the run and open the Output tab.
  6. Export the overview or content view in the format required by your workflow.

For a fast competitor snapshot, disable includeContent. For AI or RAG exports, keep it enabled and use article_markdown or article_text.

API Examples

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("scraper_guru/substack-scraper").call(run_input={
"substackUrls": ["https://www.lennysnewsletter.com"],
"maxPostsPerSubstack": 25,
"includeContent": True,
"includeComments": True,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["headline"], item["post_url"])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('scraper_guru/substack-scraper').call({
searchQueries: ['AI newsletters'],
maxSearchResultsPerQuery: 5,
maxPostsPerSubstack: 10,
includeContent: false,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Pricing

This Actor uses pay-per-event pricing, so platform usage is included. You pay only for posts that are saved to the Dataset.

PlanPer 1,000 posts (from November 9, 2026)Per 1,000 posts (until November 8, 2026)
Free$3.00$0.50
Bronze$2.80$0.45
Silver$2.60$0.40
Gold, Platinum, Diamond$2.40$0.35

Each run also has a start charge of $0.00035. Example: 20 posts from each of 5 newsletters (100 posts) costs about $0.30 on the Free plan. Apify shows the exact plan-adjusted price before each run.

Reliability and Limits

  • The Actor collects public data and does not log in or bypass paid-content restrictions.
  • Visible subscriber counts are returned when Substack exposes them on the publication page.
  • Keyword search discovers publications through Substack profiles, then applies your post settings to each publication.
  • Very large full-archive runs take longer and produce more results. Test with 5 to 20 posts first.
  • Comment extraction adds one request per post and can increase run duration.
  • Substack can change its public web endpoints. Report reproducible extraction problems in the Actor's Issues tab.

FAQ

Can it scrape a Substack custom domain?

Yes. Use the custom publication URL, such as https://platformer.news, or a standard https://name.substack.com URL.

Can it scrape one specific post?

Yes. Add a direct URL containing /p/. The Actor processes that post instead of the full publication archive.

Can it extract full paid posts?

No. It returns only the preview and metadata available to the public. content_type is set to preview_only for paid posts.

How does keyword discovery work?

The Actor searches public Substack profiles and publications matching each keyword, deduplicates the publications, and then scrapes their newest matching posts.

Set startDate, minReactions, and minComments. Filters are applied before full content and comments are requested, reducing unnecessary work.

Why is a subscriber count missing?

Some publications do not display a public count. The field remains empty instead of estimating a value.

Which content format should I use for AI pipelines?

Use article_markdown when headings and links matter, or article_text for embeddings and simple text analysis.

Does it support scheduled monitoring?

Yes. Create an Apify Task from a working input and schedule it. Connect the Dataset to a webhook, Make, n8n, Zapier, Google Sheets, or your own API.

Building a newsletter or audience research dataset? These Actors from the same developer pair well with this one:

ActorWhat it collects
Beehiiv Newsletter ScraperPosts, authors and publication details from any Beehiiv newsletter
Reddit Comments Deep ScraperFull Reddit comment threads with nested replies, for audience research
YouTube Comments ExtractorComments and replies from YouTube videos
⌂ 换网址