Substack Scraper - Newsletters, Posts, Comments & Leaderboards avatar

Substack Scraper - Newsletters, Posts, Comments & Leaderboards

Pricing

from $0.45 / 1,000 newsletter rows

Go to Apify Store
Substack Scraper - Newsletters, Posts, Comments & Leaderboards

Substack Scraper - Newsletters, Posts, Comments & Leaderboards

Scrape Substack newsletters, posts and comments: subscriber counts, paid plan prices, author socials and contact emails, leaderboard ranks, full text of free posts, likes, restacks. Search by keyword or category. $0.45 per 1,000 newsletters, $0.27 per 1,000 posts, $0.18 per 1,000 comments.

Pricing

from $0.45 / 1,000 newsletter rows

Rating

0.0

(0)

Developer

Top Api

Top Api

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

What does Substack Scraper do?

Substack Scraper extracts public data from Substack and turns newsletter links, search terms or leaderboard categories into structured rows: newsletters with subscriber counts, paid plan prices, author socials and contact emails; posts with likes, comments, restacks and the full text of free posts; and comment threads. Built for sponsorship and partnership teams, creator-economy analysts, media researchers and AI teams who need Substack data without an API key.

Substack Scraper - Substack API alternative - Substack newsletter scraper - Substack leaderboard scraper - Substack posts and comments scraper

  • Three kinds of rows in one actor: newsletters, posts and comments. The type field says which.
  • Newsletter leads in every newsletter row: subscriber count, paid subscriber band, monthly / annual / founding prices, author followers, X, LinkedIn, Instagram, YouTube, TikTok and website links, contact emails from the About page, post count and posting rate.
  • Leaderboards and categories: Substack's paid Bestsellers and Rising leaderboards for all 33 categories, plus each category's Top, Top paid and Top free lists, in rank order.
  • Full text of free posts: plain text, HTML or Markdown, with likes, comments, restacks, word count, tags and bylines. Paid posts keep their metadata and Substack's public teaser line.
  • Search by keyword: find newsletters or posts on any topic.
  • No login, cookies or API key: the actor reads the same public data substack.com shows a signed-out visitor.
  • Monitor mode: run it on a schedule and get only new posts and comments, and newsletters whose subscribers, prices or post count changed.
  • Pay per row, no start fee: $0.27 per 1,000 posts, $0.45 per 1,000 newsletters, $0.18 per 1,000 comments.

What data can you get from Substack?

๐Ÿ“ฐ Newsletter name, link, tagline๐Ÿ‘ฅ Subscriber count subscriberCount๐Ÿ’ฐ Paid subscriber band
๐Ÿ’ณ Monthly, annual, founding price๐Ÿ† Leaderboard rank and category๐Ÿ… Bestseller tier
โœ๏ธ Author name, handle, bio, followers๐Ÿ”— X, LinkedIn, Instagram, YouTube, TikTok, website๐Ÿ“ง Contact emails emails
๐Ÿ—“๏ธ Created, first and last post date๐Ÿงฎ Post count, posts per month๐ŸŽ™๏ธ Podcast, community, sections
๐Ÿ“ Post title, subtitle, link, date๐Ÿ”’ Audience (free / paid)โค๏ธ Likes, comments, restacks
๐Ÿ“„ Full text, HTML, Markdown๐Ÿ”ค Word count, reading time, tags๐Ÿ’ฌ Comments with author, likes, depth

How to scrape Substack with Substack Scraper

  1. Create a free Apify account (it comes with free monthly credit).
  2. Open Substack Scraper and click Try for free.
  3. Paste newsletter links, add search terms, or pick leaderboard categories.
  4. Choose what to read: posts, full text, comments, and the filters you need.
  5. Click Start.
  6. Download the results as JSON, CSV, Excel or HTML, or read them through the API.

Input

Combine any of these in one run. Every field is optional; a run with no input scrapes a small documented sample.

ParameterTypeDescription
startUrlsarrayNewsletter links or names (https://www.lennysnewsletter.com, lenny.substack.com, lenny), post links (โ€ฆ/p/<slug>), profiles (substack.com/@lenny), leaderboard links (substack.com/leaderboard/technology/paid) or search links.
searchQueriesarraySearch terms.
searchTypestringnewsletters (default) or posts.
maxResultsPerSearchintegerNewsletters or posts per search term. Default 20.
leaderboardCategoriesarrayCategory slugs: technology, business, culture, finance โ€ฆ or bestseller (all categories, Rising list).
boardTypesarraypaid (Bestsellers, default), rising, top, topPaid, topFree.
maxResultsPerBoardintegerNewsletters per list in rank order. Default 25; leaderboards hold 100, Top lists up to 525.
includePublicationInfobooleanA newsletter row for each newsletter link. Default on.
newsletterDetailsbooleanAuthor profile (followers, socials), About page (emails), sitemap (post count), latest posts (last post date, posts per month). Default on.
includeRecommendationsbooleanNewsletters each newsletter recommends. Default off.
minSubscribers, onlyPaidNewsletters, onlyWithEmailNewsletter filters, applied before the charge.
includePostsbooleanPosts of each newsletter link. Default on.
scrapePostsOfFoundNewslettersbooleanPosts of newsletters found by search or leaderboards. Default off.
maxPostsPerNewsletterintegerPosts per newsletter after filters. Default 20. 0 = newsletter rows only.
postSortstringnew (default) or top.
searchInNewsletterstringOnly posts matching these words (Substack's archive search).
includeContentbooleanFull text of free posts. Default on.
contentFormatstringtextAndHtml (default), text, html, markdown, all.
audience, postType, dateFrom, dateTo, withinDays, minReactions, minComments, minWordCount, titleContainsPost filters, applied before the charge.
includeCommentsbooleanComment rows for every saved post. Default off.
maxCommentsPerPostintegerComments and replies per post. Default 50.
maxItemsintegerMost rows per run (all kinds together). Default 500. 0 = no cap.
monitorMode, monitorStoreNameOnly rows that are new or changed since the last run, remembered in a named store.
proxyConfigurationobjectOptional; Substack answers without a proxy.
maxConcurrencyintegerParallel requests. Default 8.

Input JSON

{
"startUrls": ["https://www.lennysnewsletter.com", "newsletter.pragmaticengineer.com"],
"maxPostsPerNewsletter": 50,
"audience": "free",
"includeComments": true,
"maxCommentsPerPost": 100
}

Build a sponsor or partner list from a leaderboard

{
"leaderboardCategories": ["technology", "business", "finance"],
"boardTypes": ["paid", "rising"],
"maxResultsPerBoard": 100,
"maxPostsPerNewsletter": 0
}

Each newsletter row carries its rank, subscriber count, prices, author socials and emails. Add minSubscribers or onlyWithEmail to keep only the newsletters you can pitch.

Find newsletters on a topic

Put the topic in searchQueries and keep searchType on newsletters. Substack's newsletter search sometimes answers empty; the actor asks again, and if it stays empty it takes the newsletters behind the keyword's matching posts, ranked with the keyword in the newsletter's name or description first. The foundVia field says which route found each one.

Output

Every row has a type: newsletter, post or comment. A newsletter row (excerpt, from a real run):

{
"type": "newsletter",
"rank": 1,
"boardType": "paid",
"category": "Technology",
"name": "SemiAnalysis",
"url": "https://newsletter.semianalysis.com",
"subscriberCount": 325000,
"subscriberCountString": "325K+",
"paidSubscriberDetail": "Tens of thousands of paid subscribers",
"monthlyPrice": 50,
"annualPrice": 500,
"currency": "USD",
"postCount": 349,
"lastPostDate": "2026-10-23T19:06:44.981Z",
"authorName": "Dylan Patel",
"authorFollowerCount": 378202,
"authorTwitterUrl": "https://x.com/dylan522p",
"authorLinkedinUrl": null,
"email": "Sales@SemiAnalysis.com",
"leaderboardRank": 1,
"createdAt": "2025-09-22T15:54:12.958Z"
}

A post row (excerpt):

{
"type": "post",
"postId": 197186925,
"title": "Open Thread 433",
"url": "https://www.astralcodexten.com/p/open-thread-433",
"publishedAt": "2026-05-11T08:43:51.779Z",
"audience": "everyone",
"postType": "newsletter",
"wordCount": 283,
"reactionCount": 72,
"commentCount": 887,
"restacks": 5,
"authorName": "Scott Alexander",
"publicationName": "Astral Codex Ten",
"bodyText": "This is the weekly visible open thread. Post about anything you want, ask random questions, whatever. ACX has an unofficial subreddit, Discoโ€ฆ"
}

A comment row (excerpt):

{
"type": "comment",
"commentId": 200886717,
"postTitle": "The Dilbert Afterlife",
"parentId": 200690507,
"depth": 1,
"body": "Yeah, I got this feeling, too. I don't think it was the author's intent, but he did end up saying some apologist/sympathizer statements thatโ€ฆ",
"publishedAt": "2026-01-16T23:15:48.515Z",
"authorName": "Braden F",
"authorHandle": "bradenf",
"reactionCount": 3,
"childrenCount": 3,
"commentUrl": "https://www.astralcodexten.com/p/the-dilbert-afterlife/comment/200886717"
}

Fields

RowFieldTypeMeaningFilled
newsletternamestringNewsletter name.100%
newsletterurlstringLink to the newsletter (custom domain when it has one), the post, or the comment.100%
newslettersubscriberCountintegerSubscribers as a number (exact when Substack shows "Over 1,200,000 subscribers", else from the rounded figure). Null when the newsletter hides it.94%
newslettersubscriberCountStringstringSubscriber figure as Substack shows it, e.g. "1.2M+".94%
newslettertotalSubscriberDetailstringSubstack's exact subscriber line, e.g. "Over 1,200,000 subscribers".94%
newsletterpaidSubscriberDetailstringPaid-subscriber band, e.g. "Tens of thousands of paid subscribers".91%
newsletterbestsellerTierintegerSubstack Bestseller badge tier (100, 1000, 10000 paid subscribers).100%
newslettermonthlyPricenumberMonthly plan price.99%
newsletterannualPricenumberAnnual plan price.99%
newsletterfoundingPricenumberFounding-member plan price (minimum).75%
newslettercurrencystringPlan currency.99%
newsletterplansarrayEvery active plan: name, interval, price, currency, founding.99%
newsletterpostCountintegerPosts in its sitemap (every published post link).95%
newsletterlastPostDatestringDate of its newest post.71%
newsletterpostsPerMonthnumberPosting rate over its latest 12 posts.71%
newslettercreatedAtstringWhen the newsletter was created on Substack.100%
newsletterauthorNamestringAuthor name.100%
newsletterauthorHandlestringAuthor Substack handle.100%
newsletterauthorFollowerCountintegerAuthor followers on Substack.88%
newsletterauthorTwitterUrlstringTwitter / X link.70%
newsletterauthorLinkedinUrlstringLinkedIn link.41%
newsletterauthorInstagramUrlstringInstagram link.17%
newsletterauthorYoutubeUrlstringYouTube link.35%
newsletterwebsiteUrlstringAuthor website.41%
newslettersocialLinksobjectEvery link on the author profile, by network.80%
newsletteremailstringContact email found on the About page (contact-style mailboxes first).27%
newsletteremailsarrayEvery contact email found on the About page.27%
newsletterleaderboardRankintegerBest leaderboard rank Substack shows for the newsletter.84%
newsletterleaderboardCategorystringCategory of that leaderboard rank.84%
newsletterrankintegerPosition in the list this row came from (1 = top).100%
newsletterboardTypestringList the row came from: paid, rising, top, topPaid, topFree.100%
newslettercategorystringCategory of the list the row came from, else the newsletter's leaderboard category.100%
newslettercontributorsarrayWriters and admins: name, handle, role, owner flag, bio, photo.99%
newsletterhasPodcastbooleanPublishes a podcast.100%
postpostIdintegerSubstack post id.100%
posttitlestringPost title.100%
postsubtitlestringPost subtitle.100%
posturlstringLink to the newsletter (custom domain when it has one), the post, or the comment.100%
postpublishedAtstringWhen the post or comment was published.100%
postaudiencestringWho can read it: everyone, only_paid, founding, only_free.100%
postpostTypestringnewsletter, podcast, thread or video.100%
postwordCountintegerWords in the post.100%
postreactionCountintegerLikes.100%
postcommentCountintegerComments.100%
postrestacksintegerRestacks (shares on Substack).100%
postauthorNamestringAuthor name.98%
postauthorsarrayEvery byline: id, name, handle, bio, photo, guest flag.98%
postpublicationNamestringNewsletter the post or comment belongs to.100%
postbodyTextstringFull post text (free posts).76%
postbodyHtmlstringFull post HTML (free posts).76%
postpreviousPostSlugstringSlug of the previous post.76%
commentcommentIdintegerSubstack comment id.100%
commentpostTitlestringTitle of that post.100%
commentparentIdintegerId of the comment this one replies to (null for a top-level comment).72%
commentdepthinteger0 for a top-level comment, 1 for a reply, and so on.100%
commentbodystringComment text.99%
commentpublishedAtstringWhen the post or comment was published.100%
commentauthorNamestringAuthor name.99%
commentauthorHandlestringAuthor Substack handle.97%
commentreactionCountintegerLikes.100%
commentchildrenCountintegerDirect replies.100%
commentcommentUrlstringLink to the comment.100%

Filled = share of rows with a value on real runs (2026-10-28): newsletters from the 100 Technology Bestsellers, posts from 176 Astral Codex Ten posts (paid posts carry no body), comments from 9,080 Astral Codex Ten comments. Every field is listed with its description in the Output tab's dataset schema (131 fields).

Use cases

  • ๐Ÿค Newsletter sponsorship and partnerships: ranked lists of newsletters by category with subscriber counts, prices and the author's contact links.
  • ๐Ÿ“Š Creator-economy research: paid tiers and prices, subscriber bands and posting rates across the leaderboards over time.
  • ๐Ÿ”Ž Media monitoring: new posts from a watch list of newsletters on a schedule, with likes and comments.
  • ๐Ÿง  AI and RAG datasets: full text of free posts in Markdown or plain text.
  • ๐Ÿ’ฌ Audience research: comment threads with commenter, likes and replies.
  • ๐Ÿงญ Competitor tracking: a rival newsletter's subscriber count, prices and post count, flagged when they change.

How much does it cost to scrape Substack?

Pay per row, no start fee. Rows removed by your filters, duplicates and unchanged rows in monitor mode are not charged.

RowPrice per 1,000
Newsletter$0.45
Post (full text of free posts included)$0.27
Comment$0.18
Example runRowsCost
10 newsletters10$0.0045
100 posts of one newsletter + its newsletter row101$0.02745
100 Technology Bestsellers100$0.045
1,000 posts1,000$0.27
1,000 comments1,000$0.18

Set Maximum cost per run in the run options to cap any run; the actor stops cleanly at the limit.

Integrations, API, scheduling & MCP

  • Schedules: run Substack Scraper daily with monitor mode on to collect only new posts and changed newsletters.
  • Webhooks: get a call when a run finishes and pull the dataset.
  • Make, Zapier, n8n, Google Sheets, Slack: connect through Apify's integrations.
  • API: start runs and read results from Python or JavaScript with the Apify client.
  • MCP: AI agents can call the actor through the Apify MCP server.

More scrapers from TopApi

All TopApi actors: apify.com/TopApi

Limits & empty runs

  • Substack rate-limits each address. The actor paces itself and, when Apify's shared address keeps drawing refusals, moves to a datacenter route. Measured: 100 posts with full text in 84 s, 9,080 comments in 16 s, 25 leaderboard newsletters with details in 30 s, 100 in 4.8-5.7 minutes, 1,000 posts with full text in 16.5 minutes.
  • Substack's newsletter search answers empty to about half of requests, and to every request from Apify's addresses; the actor then uses the newsletters behind the keyword's matching posts (foundVia).
  • Paid posts: metadata and the public teaser line only.
  • Hidden subscriber counts are null, never 0 (94% of the Technology Bestsellers show one). About-page emails were found for 27% of them.
  • Leaderboards hold 100 newsletters; Top lists up to 525.
  • A free post whose full text Substack refuses is left out, not charged, and listed in the run summary. A run that finds nothing says why and charges nothing.

FAQ

How much does Substack Scraper cost?

$0.45 per 1,000 newsletters, $0.27 per 1,000 posts and $0.18 per 1,000 comments, with no start fee. The full text of free posts is included in the post price.

How many results can Substack Scraper return?

Every post in a newsletter's archive, up to 100 newsletters per leaderboard, up to 525 per category Top list, and as many search results as Substack lists. maxItems caps a run.

Can Substack Scraper find newsletter emails and socials?

Yes. Each newsletter row carries the contact emails written on its About page and the links on the author's Substack profile (X, LinkedIn, Instagram, YouTube, TikTok, website).

Does Substack Scraper get paid posts?

It returns paid posts' metadata (title, date, likes, comments, word count) and Substack's public teaser line. The paid body is not read.

Can I monitor newsletters on a schedule?

Yes. Turn on monitor mode and schedule the actor; each run returns only new posts and comments and newsletters whose subscribers, prices or post count changed.

Can I use Substack Scraper with the Apify API or Python?

Yes. Start runs and read datasets with the Apify client for Python or JavaScript, or plain HTTP.

Can AI agents use Substack Scraper through MCP?

Yes, through the Apify MCP server.

Do I need a Substack account, login or API key?

No. The actor reads public Substack data only.

Why did my Substack Scraper run return no results?

The run's status message says why: the link is not a Substack newsletter, the filters removed everything, or nothing is new in monitor mode. Nothing is charged for an empty run.

Your feedback

Found a bug or need a field? Open an issue in the Issues tab.