Substack Scraper: Newsletter Posts, Likes & Comments
Pricing
from $1.50 / 1,000 post results
Substack Scraper: Newsletter Posts, Likes & Comments
Scrape posts from any Substack newsletter (subdomain or custom domain): title, subtitle, date, authors, likes, comments, wordcount, paid/free and full text of free posts. Date range, category discovery and a new-posts monitor mode.
Pricing
from $1.50 / 1,000 post results
Rating
0.0
(0)
Developer
Gabor Sziladi
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 hours ago
Last modified
Categories
Share
Substack Scraper: Newsletter Posts, Likes, Comments & Full Text
Substack Scraper extracts posts from any public Substack newsletter, whether it lives on name.substack.com or on a custom domain like www.lennysnewsletter.com. For every post you get the title, subtitle, URL, publish date, authors, likes, comments, restacks, word count, free/paid audience and the post content as plain text and HTML. Filter by date range or audience, find newsletters by category, and use monitor mode to get only new posts on a schedule.
No login, no cookies, no proxies. The Actor only reads the same public JSON and RSS data that Substack serves to every logged-out visitor.
What can this Substack scraper do?
- 📰 Scrape any Substack publication: subdomain (
noahpinion), Substack URL, custom domain, author profile (@lenny) or a single post URL - ❤️ Engagement metrics: public likes (reactions), comment count and restacks for every post
- 📝 Full text of free posts as clean plain text plus the original HTML
- 🔒 Paywalled posts handled safely: metadata plus the public preview only (
content_is_preview: true); paid content is never accessed - 📅 Date range filter: absolute (
2026-01-01) or relative (30 days,6 months) - 🆓 Free / paid filter to keep only free posts or only paywalled ones
- 🔎 Newsletter discovery: add the top publications from a Substack category (Technology, Business, Finance, Culture, Politics, Science, …)
- 🔔 Monitor mode (only new posts): schedule the Actor and you only get (and only pay for) posts you haven't seen yet
- 📊 Run summary with per-publication counts and clear error messages; one broken URL never fails the whole run
- 🐢 Polite by design: per-site throttling plus automatic retries with backoff on HTTP 429/5xx
What data does it extract?
| Field | Description |
|---|---|
publication_name, publication_url | Newsletter name and home URL (custom domain if set) |
post_id, title, subtitle, slug, url | Post identity and canonical URL |
published_at, updated_at | ISO 8601 timestamps (UTC) |
authors, author_names | Bylines with name, handle, ID and profile URL |
likes, comments, restacks | Public engagement counts |
wordcount | Length of the full post (also for paid posts) |
audience, is_paid | everyone, only_paid, founding, … and a simple boolean |
type, section | newsletter / podcast / thread, and the publication section |
description, cover_image, podcast_url | SEO description, cover image, podcast audio (if public) |
content_text, content_html | Post body: full for free posts, public preview for paid posts |
content_is_preview | true when the content is only the public preview |
How to scrape Substack
- Click Try for free.
- Paste newsletter URLs or subdomains into Substack publications or post URLs (or pick a category under Newsletter discovery).
- Set Max posts per publication and, if needed, a date range.
- Click Start, then download the data as JSON, CSV, Excel or HTML, or read it through the Apify API.
The default input (3 newsletters × 10 posts with full content) finishes in about a minute.
Input example
{"publications": ["https://www.lennysnewsletter.com", "astralcodexten.substack.com", "noahpinion", "@lenny"],"maxPostsPerPublication": 50,"dateFrom": "90 days","audience": "all","includeContent": true,"onlyNewPosts": false}
Output example
{"publication_name": "Lenny's Newsletter","publication_url": "https://www.lennysnewsletter.com","post_id": 215694124,"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","published_at": "2026-09-29T13:15:57Z","type": "newsletter","audience": "everyone","is_paid": false,"authors": [{"name": "Lenny Rachitsky", "handle": "lenny", "id": 1849774, "profile_url": "https://substack.com/@lenny"}],"author_names": "Lenny Rachitsky","likes": 291,"comments": 7,"restacks": 5,"wordcount": 1276,"content_text": "👋 Hey there, I’m Lenny. Each week, I share deeply researched product, growth, and career advice…","content_html": "<p><em>👋 Hey there, I’m Lenny…","content_is_preview": false}
A paywalled post looks the same, with "is_paid": true, "audience": "only_paid", the full wordcount, and "content_is_preview": true. The content is only the teaser that Substack shows to logged-out readers.
A run summary is saved as OUTPUT in the default key-value store: posts scanned and output per publication, discovered publications, and errors (e.g. "https://example.com does not look like a Substack publication").
Monitor Substack newsletters for new posts
Turn on Only new posts (monitor mode) and schedule the Actor (e.g. every hour or every day). Each run checks the latest Max posts per publication posts of every newsletter and outputs only the ones that earlier runs haven't returned. Seen posts are stored in a named key-value store (substack-scraper-seen by default; use a different State store name for each independent monitor). Connect the run to Slack, email, Google Sheets, Zapier, Make or n8n through Apify integrations or webhooks to get alerted about new posts.
How much does it cost to scrape Substack?
The Actor uses pay-per-event pricing:
| Event | Price |
|---|---|
| Post result (one post saved to the dataset) | $0.0015 ($1.50 per 1,000 posts) |
| Actor start | $0.002 per run |
Failed publications and posts skipped by filters or by monitor mode are never charged. Example: scraping the latest 50 posts of 20 newsletters (1,000 posts) costs about $1.50. Set a maximum cost per run in the run options to cap spending. The run stops cleanly when the limit is reached.
Use cases
- Content and market research: track what top newsletters in your niche publish and what gets the most likes and comments
- Media monitoring and PR: get alerts when newsletters publish about your company, industry or competitors
- Lead generation and creator outreach: build lists of Substack writers by category with their engagement
- AI and LLM datasets / RAG: clean plain-text bodies of free posts, with dates and authors
- Newsletter analytics: posting frequency, paid vs. free mix, word count and engagement trends
FAQ
Does it work with custom domains? Yes. Paste the custom domain (e.g. https://www.lennysnewsletter.com). name.substack.com URLs that redirect to a custom domain are followed automatically.
Can it get paid (paywalled) content? No, by design. For paid posts you get the metadata (title, date, authors, likes, comments, word count) and only the public preview that anyone can see without subscribing. No login or subscription is ever used.
How many posts can I get? Set Max posts per publication to 0 to walk the whole public archive (combine it with a date range to limit it).
How do I find newsletters to scrape? Use Newsletter discovery to add the top publications of a Substack category, or paste author profiles like @handle.
Is scraping Substack legal? The Actor only collects publicly available data that Substack serves without login, and it throttles its requests. Note that Substack's Terms of Use restrict automated access, and posts can contain personal data and copyrighted text. You are responsible for using the data in line with Substack's terms, copyright and privacy laws (e.g. GDPR). If unsure, consult a lawyer.
Something doesn't work? Check the OUTPUT record for per-publication errors and open an issue on the Actor's Issues tab. We respond quickly.