Substack Scraper – Posts, Comments & Subscribers
Pricing
from $1.50 / 1,000 posts
Substack Scraper – Posts, Comments & Subscribers
Substack scraper and Substack API alternative, no login. Scrape newsletter posts with full text, likes, comments and restacks, plus publication profiles: subscriber estimates, paid plan prices, bestseller tier and posting cadence. Custom domains, filters and new-post monitoring.
Pricing
from $1.50 / 1,000 posts
Rating
0.0
(0)
Developer
Signal Wharf
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
3 hours ago
Last modified
Categories
Features
Share
Substack Scraper: posts, comments & subscriber data (Substack API alternative)
Scrape any Substack newsletter without logging in or using an API key. Each run gives you three things:
- Posts with the full text, likes, comments, restacks, a paid/free flag, tags, authors and outbound links
- Publication profiles: a subscriber estimate, paid plan prices, the Substack bestseller tier, posting cadence and engagement averages
- Comments with their replies (optional)
You can filter by date or keyword. A monitoring mode returns only the posts that are new since the last run. Full text costs nothing extra, and a monitoring run that finds nothing new isn't charged.
It works with *.substack.com addresses, custom domains (e.g. www.lennysnewsletter.com), and substack.com/@handle profile links.
What can this Substack scraper do?
- 📰 Full text costs the same as metadata. Each post is one flat price.
- 📊 Publication intelligence, not just posts. You get subscriber counts (e.g. "Over 466,000 subscribers" →
466000) and monthly, yearly and founding prices. You also get the bestseller tier, posts per week, the share of posts that are paid, and average likes, comments and restacks. That's everything you need to compare newsletters for sponsorships, research, or competitive analysis. - 🔔 Monitoring mode. Schedule it every hour and receive only new posts. A run with nothing new costs you $0.
- 💬 Optional comments, with their reply threads (parent id and depth).
- 🔗 Outbound links from each post, for link and citation analysis.
- 🛡️ Robust. Polite rate limiting and retries. One broken publication never fails the run, and you get a per-publication
RUN_SUMMARY.
Substack scraper use cases
- Newsletter sponsorships and media buying: shortlist newsletters by audience size, price and engagement.
- Market and competitor research: see what newsletters in your niche publish, how often, and what gets engagement.
- AI, RAG and LLM pipelines: clean full text plus metadata for summarizers, vector stores and agents (works through the Apify API and MCP server).
- Monitoring and alerts: watch a list of publications and send new posts to Slack, email, Zapier, Make or n8n.
- Academic and journalism research: build datasets of essays, discussions and comment threads.
How to scrape Substack
- Add one or more publications: a subdomain (
noahpinion), a Substack URL, a custom domain (https://www.lennysnewsletter.com), a post URL, or asubstack.com/@handleprofile. - Choose max posts per publication, and optionally a date range, keywords, comments, or only new posts.
- Click Start. Posts, publication profiles and comments go to one dataset. Use
itemTypeto tell them apart. - Export to JSON, CSV, Excel, or read the results through the Apify API. To monitor newsletters, schedule the Actor with Only new posts turned on.
Input
| Field | Default | Description |
|---|---|---|
publications | – | Required. Subdomains (noahpinion), URLs, custom domains, or substack.com/@handle links |
maxPostsPerPublication | 50 | The most posts to save per publication, newest first |
dateFrom / dateTo | – | Date range (YYYY-MM-DD or ISO, UTC) |
keywords | – | Keep posts matching any keyword in the title, subtitle, tags or text |
includeFullText | true | Full plain text plus outbound links (free preview only for paid posts) |
includeHtml | false | Also return the raw HTML |
includePaidPosts | true | Include subscriber-only posts (metadata plus the public preview) |
includePublicationProfile | true | One profile item per publication |
includeComments | false | Public comments with replies |
maxCommentsPerPost | 50 | Cap on comments per post |
onlyNewPosts | false | Monitoring mode |
stateStoreName | substack-scraper-state | Where monitoring state is kept. Use one name per monitor |
resetMonitoringState | false | Start monitoring from scratch |
{"publications": ["noahpinion", "https://www.lennysnewsletter.com", "https://substack.com/@platformer"],"maxPostsPerPublication": 100,"dateFrom": "2026-10-01","includeComments": true,"maxCommentsPerPost": 20}
Output
Every dataset item has an itemType: post, publication, or comment. The Console offers ready views: Posts, Content, Publication profiles and Comments.
Post (trimmed):
{"itemType": "post","publication": "noahpinion","publicationName": "Noahpinion","postId": 224380601,"url": "https://www.noahpinion.blog/p/india-is-quietly-doing-great","title": "India is quietly doing great","subtitle": "The world’s biggest country continues to defy the skeptics.","postDate": "2026-11-11T08:51:56.921Z","type": "newsletter","isPaid": false,"authors": [{ "name": "Noah Smith", "handle": "noahpinion" }],"wordcount": 1596,"reactionCount": 404,"commentCount": 25,"restacks": 47,"bodyText": "My last post was about how for the first time, I’m becoming bearish on China’s ...","isFullTextComplete": true,"links": ["https://ourworldindata.org/grapher/human-development-index?tab=line&country=IND~CHN"]}
Publication profile (trimmed):
{"itemType": "publication","publicationName": "Lenny's Newsletter","publicationUrl": "https://www.lennysnewsletter.com","authorName": "Lenny Rachitsky","subscriberCountText": "Over 1,200,000 subscribers","subscriberCountApprox": 1200000,"paidSubscriberTierText": "Tens of thousands of paid subscribers","bestsellerTier": 10000,"monthlyPrice": 20.0,"yearlyPrice": 200.0,"foundingMemberPrice": 400.0,"postsPerWeek": 0.69,"paidPostShare": 0.8,"avgWordcount": 3622,"avgReactions": 488.7,"avgComments": 11.5}
Comment: postId, postUrl, commentId, parentCommentId, depth, authorName, authorHandle, body, date, reactionCount and replyCount.
The stats in a profile (cadence, averages, paid share) are calculated from the posts saved in that run. Scrape more posts for more reliable stats.
How much does it cost to scrape Substack?
Pay per event, with no subscription:
| Event | Price |
|---|---|
| Post (full text included) | $0.0015 ($1.50 per 1,000) |
| Publication profile | $0.003 |
| Comment (only if enabled) | $0.0003 |
Examples:
- 1 newsletter, last 100 posts with full text and a profile = $0.153
- 20 newsletters × 25 posts plus profiles = $0.81
- An hourly monitor on 10 newsletters with about 5 new posts a day = about $0.02/day. Runs with nothing new cost $0.
Set a maximum cost per run in the run options, and the Actor stops cleanly when it gets there.
Limits and good to know
- No login and no paywall bypass. For subscriber-only posts you get the metadata plus the free preview Substack shows every visitor (
isFullTextComplete: false). - Some publications hide their subscriber count, so those fields are
null. Substack shows subscriber counts as rounded public text, so treat them as estimates. - Archive pages hold 25 posts. Full text needs one extra request per post, at about 0.8 s each by default.
- Substack Notes, chats and private member data aren't collected.
- Dates are in UTC.
Is it legal to scrape Substack?
This Actor reads only information Substack publishes openly to every visitor, through the same public endpoints its website uses. It doesn't log in, bypass paywalls, or collect email addresses or private data. Comments include public display names and handles, which are personal data. Make sure your use complies with the GDPR and other privacy laws, copyright law, and Substack's terms. Don't republish authors' full articles without permission. If you're unsure, consult a lawyer. See Is web scraping legal?
FAQ
Does it work with custom domains? Yes. Enter the domain, a post URL, or the substack.com/@handle profile link.
Can I get the whole archive? Yes. Raise maxPostsPerPublication, or use dateFrom.
How do I get alerts for new posts? Turn on onlyNewPosts, schedule the Actor, and add a webhook or integration on Run succeeded.
Is there an official Substack API? Substack has no public developer API for reading other newsletters. This Actor works as a Substack API alternative: one call returns clean JSON for posts, comments and publication data.
Does it scrape subscriber emails? No. It collects only public information: never email lists or private subscriber data.
Can I scrape Substack Notes? Not yet. This Actor covers newsletter posts, comments and publication profiles.
Can I use it from Python? Yes. Use the Apify Python client or the REST API, then download the dataset.
Something is missing or broken? Open an issue on the Issues tab.
Related signalwharf Actors
- Telegram Channel Scraper: scrape public Telegram channel posts, views, reactions and media without login.
- Substack Scraper: Substack posts with full text, comments, subscriber estimates and paid plan prices.
- AI Brand Visibility Tracker: track how often ChatGPT, Claude, Gemini and Perplexity mention your brand vs competitors.