Substack Scraper: Newsletter Posts, Likes & Comments avatar

Substack Scraper: Newsletter Posts, Likes & Comments

Pricing

from $1.28 / 1,000 posts

Go to Apify Store
Substack Scraper: Newsletter Posts, Likes & Comments

Substack Scraper: Newsletter Posts, Likes & Comments

Export any Substack newsletter's posts: title, subtitle, date, authors, free or paid, likes, comments, restacks, word count, podcast audio and optional full text. Paste publication URLs or names. Keyword and date filters. $1.50 per 1,000 posts, no big start fee.

Pricing

from $1.28 / 1,000 posts

Rating

0.0

(0)

Developer

Larkmoor Data

Larkmoor Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

Export every post of any Substack newsletter into a clean table: title, subtitle, publish date, authors, free or paid, likes, comment count, restacks, word count, cover image, podcast audio and, if you want it, the full public text. Paste newsletter URLs (or just their names), set how far back to go, and download the results as JSON, CSV or Excel.

It reads each newsletter's own public archive data (the same JSON the newsletter's archive page loads in your browser), respects robots.txt, and never logs in.

What you can use it for

  • Competitor and market research: see which topics get the most likes, comments and restacks in your niche
  • Content strategy: find the best-performing posts of the top newsletters in a category before you write your next issue
  • Sponsorship and partnership scouting: compare how active and engaged newsletters are before you pitch or buy an ad
  • Monitoring: run it daily with "only posts from the last 1 day" to get new posts from a list of newsletters in a spreadsheet, Slack or your CRM
  • AI and research datasets: export the full text of free posts for summarisation, topic modelling or sentiment analysis
  • Writers: back up your own archive with all engagement numbers in one file

Why this one

  • Cheap and predictable: $1.50 per 1,000 posts and a $0.001 start fee. No $0.09 start fee, no monthly rental.
  • Engagement numbers on every row: likes, comments, restacks and word count, so you can rank posts immediately
  • Free vs paid flag on every post (audience, isPaid), so you can measure how much of a newsletter is paywalled
  • Any address works: name.substack.com, custom domains (www.lennysnewsletter.com), substack.com/@name or just name
  • Filters that save money: date window, keywords and "skip paid posts" are applied before you are charged
  • Full archive depth: page through the whole archive, newest first or most popular first

Input

FieldWhat it does
publicationsList of newsletters: URL, custom domain, substack.com/@name or just the name
maxPostsPerPublicationHow many posts per newsletter (default 50, up to 5,000)
sortnew (newest first) or top (most popular first)
maxAgeDaysOnly posts from the last N days (with newest first)
keywordsKeep only posts whose title, subtitle, description or preview contains one of these words
skipPaidPostsLeave out paid-subscribers-only posts
includeContentAdd the post body as plain text (free posts are complete; paid posts give their public preview)
previewCharsLength of the short preview text (0 = none)
maxResultsHard cap across all newsletters, keeps the cost predictable

Example input:

{
"publications": ["https://www.lennysnewsletter.com", "noahpinion"],
"maxPostsPerPublication": 100,
"sort": "new",
"maxAgeDays": 90,
"includeContent": false
}

Output

One row per post:

{
"publication": "noahpinion.substack.com",
"title": "A Nobel for New Keynesian macro, at last!",
"subtitle": "...",
"url": "https://noahpinion.substack.com/p/...",
"publishedAt": "2026-10-13T...Z",
"authors": ["Noah Smith"],
"audience": "everyone",
"isPaid": false,
"type": "newsletter",
"tags": [],
"likes": 441,
"comments": 120,
"restacks": 35,
"wordCount": 2753,
"coverImage": "https://substackcdn.com/...",
"description": "...",
"preview": "First 300 characters of the post...",
"podcastUrl": null,
"podcastDurationSec": null,
"language": "en"
}

With includeContent on, each row also gets contentText (plain text) and contentIsFull (true for free posts).

A summary (newsletters read, posts returned, and any newsletter that could not be read with the reason) is saved as OUTPUT in the run's key-value store.

How much does it cost?

Pay per result: $1.50 per 1,000 posts on the Free plan plus $0.001 per run, with automatic discounts on paid Apify plans. Platform compute is included. Posts removed by your filters are not charged, and a newsletter that cannot be read costs nothing.

Worked examples:

  • Weekly check of 30 newsletters in your niche, maxAgeDays: 7, about 2 posts each: 60 posts = $0.09 a week
  • Top 100 posts of 20 big newsletters with sort: top: 2,000 posts = $3.00
  • Full archive of one newsletter with about 800 posts: $1.20

Set maxResults to cap any run.

FAQ

Is it legal to scrape Substack? This actor only reads data that each newsletter publishes openly to every visitor: its public archive listing and public post pages. It respects robots.txt, does not log in, does not bypass the paywall and does not collect subscriber lists or personal data. Paid posts return only what Substack shows the public (title, numbers and preview). As always, use the data in line with the newsletter's terms and copyright: analysis and research are fine, republishing someone's writing is not.

Can I get the full text of paid posts? No. Paid posts give their public preview only (contentIsFull: false). Free posts are complete.

Does it work with custom domains? Yes. Most big newsletters use their own domain (for example www.lennysnewsletter.com); paste it as is.

Can I search all of Substack by keyword? This actor works per newsletter. Give it a list of newsletters and use keywords to keep only posts about your topic.

How fresh is the data? Live: every run reads the newsletter's archive at that moment, including like and comment counts.

Why is a newsletter missing from the results? It has moved off Substack, is private, or the address is wrong. The reason is listed in the OUTPUT summary.

Can I schedule it? Yes. Use Apify Schedules (for example daily at 8:00) with maxAgeDays: 1 and connect the dataset to Google Sheets, Slack, Zapier or Make.

Integrations

Results work with every Apify integration: Google Sheets, Slack, Zapier, Make, Airtable, webhooks, the Apify API and the Python and JavaScript clients. Download as JSON, CSV, Excel, XML or HTML.

Changelog

  • 2026-10-20 — First release: posts with likes, comments, restacks, word count, free/paid flag, podcast info, optional full text; date, keyword and paid filters; custom domains and @name profiles.