Substack Scraper – Posts, Comments & Subscribers avatar

Substack Scraper – Posts, Comments & Subscribers

Pricing

from $1.50 / 1,000 posts

Go to Apify Store
Substack Scraper – Posts, Comments & Subscribers

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

Signal Wharf

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 hours ago

Last modified

Features

Limited permissions

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

  1. Add one or more publications: a subdomain (noahpinion), a Substack URL, a custom domain (https://www.lennysnewsletter.com), a post URL, or a substack.com/@handle profile.
  2. Choose max posts per publication, and optionally a date range, keywords, comments, or only new posts.
  3. Click Start. Posts, publication profiles and comments go to one dataset. Use itemType to tell them apart.
  4. 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

FieldDefaultDescription
publications–Required. Subdomains (noahpinion), URLs, custom domains, or substack.com/@handle links
maxPostsPerPublication50The 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
includeFullTexttrueFull plain text plus outbound links (free preview only for paid posts)
includeHtmlfalseAlso return the raw HTML
includePaidPoststrueInclude subscriber-only posts (metadata plus the public preview)
includePublicationProfiletrueOne profile item per publication
includeCommentsfalsePublic comments with replies
maxCommentsPerPost50Cap on comments per post
onlyNewPostsfalseMonitoring mode
stateStoreNamesubstack-scraper-stateWhere monitoring state is kept. Use one name per monitor
resetMonitoringStatefalseStart 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:

EventPrice
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.

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.