Substack Scraper - Posts, Full Text, Comments & Engagement avatar

Substack Scraper - Posts, Full Text, Comments & Engagement

Pricing

from $0.50 / 1,000 posts

Go to Apify Store
Substack Scraper - Posts, Full Text, Comments & Engagement

Substack Scraper - Posts, Full Text, Comments & Engagement

Scrape any Substack newsletter: every post with title, subtitle, date, authors, full text of free posts (clean Markdown-style text or HTML), likes, comments count, restacks, paid/free flag, tags, plus optional comments. Custom domains supported. Date and keyword filters, new-posts-only monitoring.

Pricing

from $0.50 / 1,000 posts

Rating

0.0

(0)

Developer

Alex

Alex

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

Substack Scraper

Scrape any Substack newsletter, including ones on custom domains. For every post you get the title, subtitle, date, authors, full text of free posts (clean, readable text with headings and lists, or the original HTML), likes, comment count and restacks, word count, paid/free flag, tags, section, cover image and podcast link. Turn on comments to also get every comment and reply.

Use it to analyse what topics perform best, monitor competitors' newsletters, build a dataset for an LLM or RAG, research creators, or archive a newsletter.

Features

  • Any input: https://name.substack.com, custom domains (https://www.lennysnewsletter.com), just the subdomain (name), substack.com/@handle profiles, or links to single posts.
  • Whole archive or the latest N posts, newest first or most popular first.
  • Full text of free posts; paid posts give the public preview and are flagged with isPaid: true.
  • Comments with replies (parentId links a reply to its comment).
  • Filters: date cut-off and keywords.
  • New posts only: for scheduled runs it remembers the newest post per newsletter.

Output

{
"type": "post",
"newsletter": "https://www.lennysnewsletter.com",
"title": "All of the Lenny & Friends Summit talks are now online!",
"subtitle": "Plus, some reflections and takeaways from the day",
"url": "https://www.lennysnewsletter.com/p/all-of-the-lenny-and-friends-summit",
"date": "2026-09-29T13:15:57.512Z",
"authors": [{"name": "Lenny Rachitsky", "handle": "lenny"}],
"isPaid": false,
"wordCount": 1276,
"reactions": 271,
"comments": 6,
"restacks": 4,
"text": "I'm excited to share that every main-stage talk ...",
"isFullText": true
}

Comment rows ("type": "comment"): postUrl, commentId, parentId, author, authorHandle, date, text, reactions, url.

Input example

{
"newsletters": ["https://www.lennysnewsletter.com", "https://www.astralcodexten.com"],
"maxPostsPerNewsletter": 100,
"since": "2026-01-01",
"includeComments": true
}

Pricing

$0.50 per 1,000 posts and $0.10 per 1,000 comments. No subscription.

Use from code

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("alex9080/substack-scraper").call(run_input={
"newsletters": ["https://www.lennysnewsletter.com"], "maxPostsPerNewsletter": 20,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["date"], item["reactions"], item["title"])

Notes

Only publicly available content is collected: paid posts are returned as the public preview, never the paywalled text. Respect authors' copyright when reusing the text.