Substack Scraper: Posts, Comments & Notes avatar

Substack Scraper: Posts, Comments & Notes

Pricing

from $0.30 / 1,000 results

Go to Apify Store
Substack Scraper: Posts, Comments & Notes

Substack Scraper: Posts, Comments & Notes

Scrape any Substack newsletter, post or author profile: full article text, engagement counts, nested comment threads, reactors and Substack Notes. Search a newsletter, filter by date, free or paid. Custom domains work. No login. From $0.30 per 1,000 posts.

Pricing

from $0.30 / 1,000 results

Rating

0.0

(0)

Developer

Sourabh Kumar

Sourabh Kumar

Maintained by Community

Actor stats

0

Bookmarked

108

Total users

28

Monthly active users

19 hours ago

Last modified

Share

Substack scraper: posts, full articles, comments, reactors and Notes

Get Substack data in three ways: every post of a newsletter, single posts by link, or an author's Substack Notes. Paste links or handles, press Start, and download posts with full text, engagement and comment threads.

$0.30 per 1,000 posts or Notes. No login, cookies or proxy needed.

Works with custom domains and .substack.com addresses alike, in any language.


Pick what to paste

Fill one section, or both. Every input works alone or mixed with the others.

You wantPaste into
Every post of a newsletter, with filters and searchurls (newsletter links)
One post, with its commentsurls (post or share links)
The newsletter of an authorurls (substack.com/@handle links)
An author's Substack NotesnotesHandles (handles)

Every input can be scheduled. Run it weekly and you have a newsletter or Notes tracker.


Why this Substack scraper?

  • 📚 The whole archive, not just the latest 20. A 1,500-post newsletter comes back complete in under two minutes.
  • 🎯 Filters that fill your limit. Ask for 40 paid posts from 2026 and you get 40.
  • 🔍 Search inside a newsletter, with the full text of every match.
  • 💬 Full comment threads, nested replies included, ready to rebuild as a tree.
  • 🔗 Any Substack link works: a newsletter, a post, a share link from the app, or a profile.
  • 🧾 Never billed twice. The same post reached through two links is one row, and posts your filters drop are free.

1. Newsletters: every post, with filters and search

Paste newsletter links, for example https://newsletter.pragmaticengineer.com, or a profile link like https://substack.com/@lenny.

Get one row per post: title, full text, author and co-authors, publish date, reactions, comment and restack counts, free or paid, tags, audio, and the newsletter's name.

OptionFieldDefaultWhat it does
Max posts per newslettermaxPosts500 for the whole archive
SortsortBynewestnewest or oldest
Add full article textincludeContenttrueTurn off for faster metadata-only runs
Content formatcontentFormatbothhtml, text or both

Filters (all optional)

FilterField
Only posts whose title or text match a keywordsearchKeyword
Free or paid posts onlyaudienceFilter
Newsletter, podcast, thread or video posts onlytypeFilter
Published on or after / on or before a date (YYYY-MM-DD)dateFrom, dateTo

Input

{
"urls": ["https://newsletter.pragmaticengineer.com"],
"audienceFilter": "paid",
"dateFrom": "2026-01-01",
"maxPosts": 50
}

Output (one real row, selected fields)

{
"id": 221215977,
"title": "Why Global Trepanation?",
"slug": "why-global-trepanation",
"url": "https://www.astralcodexten.com/p/why-global-trepanation",
"author": "Scott Alexander",
"authorHandle": "astralcodexten",
"publishedAt": "2026-10-21T21:53:11.440Z",
"updatedAt": "2026-10-22T00:54:19.173Z",
"contentText": "A friend asked me to investigate the following mystery: why do 5-10% of skulls from 10,000 BC to 3,0...",
"wordCount": 1307,
"readingTimeMinutes": 6,
"coverImageUrl": "https://substack-post-media.s3.amazonaws.com/public/images/73a7ca5d-8a51-4c67-9dd2-9348f3d6ffc3_2340x1316.jpeg",
"audienceType": "everyone",
"isPaywalled": false,
"reactionCount": 383,
"reactions": { "❤": 383 },
"commentCount": 204,
"restackCount": 18,
"type": "newsletter",
"hasAudio": true,
"newsletter": {
"name": "Astral Codex Ten",
"description": "P(A|B) = [P(A)*P(B|A)]/P(B), all the rest is commentary.",
"url": "https://www.astralcodexten.com"
},
"comments": null,
"facepile": null
}

2. Single posts: one post by link, with its comments

Paste post links (https://www.astralcodexten.com/p/why-global-trepanation) or share links from the Substack app. Filters and the post limit do not apply to a post you name.

Get the same row as above for each post. Turn on the extras to add the comment thread and the readers who reacted.

OptionFieldDefaultWhat it does
Add commentsincludeCommentsfalseThe full thread, nested replies included. Charged per comment
Add reactors and restackersincludeFacepilefalseUp to 5 of each, as Substack shows them. Charged per entry

The extras work on newsletter links too: every post gets its own thread.

Input

{
"urls": ["https://www.astralcodexten.com/p/why-global-trepanation"],
"includeComments": true,
"includeFacepile": true
}

Output (one real comment from comments; parentId and depth rebuild the thread)

{
"id": 366989167,
"parentId": 366969428,
"depth": 1,
"bodyText": "I wish we had a like button.",
"authorName": "Greg Gentschev",
"authorHandle": "gentschev",
"publishedAt": "2026-10-21T22:31:56.846Z",
"isPinned": false,
"isDeleted": false,
"reactionCount": 5,
"reactions": { "❤": 5 }
}

3. Notes: an author's Substack Notes

Paste Substack handles, with or without @, for example sahilbloom.

Get one row per note, newest first: the text, reactions, restacks, reply count, and the author's bio and newsletter.

OptionFieldDefaultWhat it does
Max Notes per handlemaxNotesPerHandle50Up to 20,000
Published on or after / beforedateFrom, dateToemptyOnly Notes in this date range

Input

{
"notesHandles": ["sahilbloom", "tedgioia"],
"maxNotesPerHandle": 500,
"dateFrom": "2026-01-01"
}

Output (one real row)

{
"id": 368220860,
"handle": "sahilbloom",
"authorName": "Sahil Bloom",
"authorBio": "NYT Bestselling Author of The 5 Types of Wealth. Gave up a grand slam on ESPN in 2012 and still wait...",
"publishedAt": "2026-10-23T12:28:21.063Z",
"bodyText": "I believe that 99% of success is just the ability to outlast uncertainty. The one who can tolerate t...",
"reactionCount": 217,
"reactions": { "❤": 217 },
"restackCount": 13,
"childrenCount": 38,
"publicationName": "The Curiosity Chronicle",
"publicationUrl": "https://sahilbloom.substack.com"
}

Use it from an AI agent

Connect Claude, Cursor or any MCP client to Apify's MCP server with this scraper as a tool:

https://mcp.apify.com?tools=sourabhbgp/substack-scraper

Then ask in plain words. The agent fills in the input, and you pay the same per result. For example:

  • "Get the 20 newest posts from newsletter.pragmaticengineer.com with their full text."
  • "Find every Lenny's Newsletter post about pricing and summarise them."
  • "Pull all comments on this Substack post and tell me what readers disagree with."
  • "Export Sahil Bloom's Substack Notes since January."

What people use it for

  • 📊 Content research: every post a newsletter has published, with engagement, to see what lands.
  • 🧠 AI and text analysis: clean full text for summaries, topic models or a searchable archive.
  • 💬 Audience research: read what readers actually say in the comments.
  • 🎯 Lead generation: find active commenters and reactors around a topic, with their own newsletters.
  • 🏁 Competitor tracking: watch rival newsletters' publishing pace, paid share and podcast output.

How much does it cost?

The same price on every Apify plan. Full article text costs nothing extra.

What you getPer 1,000
Posts or Notes$0.30
Comments (includeComments)$0.30
Reactors and restackers (includeFacepile)$0.20

Each run also costs $0.00005 to start.

  • Free plan: your $5 monthly credit covers about 16,600 posts.
  • Starter plan ($29): about 96,600 posts a month.

Limitations

  • Paid posts come back as the free preview. Substack shows the full text only to paying subscribers.
  • Paid posts have no comments. Substack shows them only to subscribers, so comments is empty even when commentCount is above zero.
  • Up to 5 reactors and 5 restackers per post, whatever the reaction count. Their handle and bio stay empty.
  • Video posts usually come back as podcast. That's how Substack labels them, so typeFilter: "video" rarely matches.
  • authorTwitter is usually empty. Substack no longer sends it.

FAQ

How do I scrape Substack without coding?

Paste a newsletter or post link, or a handle under Notes, and press Start. Download the results as Excel, CSV or JSON.

Can I get a newsletter's whole archive?

Yes. Set Max posts per newsletter to 0. Set Sort to oldest to start from the first post.

Why did I get fewer posts than I asked for?

The newsletter has fewer posts that match your filters. The run's status message says so, and you pay only for posts delivered.

Do I need a Substack account or a proxy?

No. It reads only what any logged-out visitor can see, and handles blocks by itself.

Can I use it from code or an AI agent?

Yes. Call it through the Apify API, or connect it to an AI agent through Apify's MCP server.

It collects only what Substack shows any visitor, with no login and no paywall bypass. How you use the data is your responsibility, especially personal data such as commenter names.

Your feedback

Something missing or wrong? Open an issue.