Substack Scraper - Posts, Full Text, Comments & Engagement
Pricing
from $0.50 / 1,000 posts
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.
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/@handleprofiles, 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 (
parentIdlinks 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 ApifyClientclient = 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.