Why this one
Substack has no public API, and most newsletters sit on custom domains that generic crawlers handle badly. This actor talks to the same JSON endpoints Substack's own site uses, follows the domain redirects for you, and returns posts with the full article text, engagement numbers and, if you want, the whole comment thread.
- Works with a subdomain, a custom domain or a single post URL; you do not need to know which one a publication uses.
- Full article text as plain text and HTML, with paywalled posts clearly flagged as preview-only instead of silently truncated.
- Comments come back threaded, with depth and parent IDs, so you can rebuild the conversation.
- Substack's own archive search is exposed as an input, so a keyword run returns only matching posts.
What people use it for
- Research on what the leading newsletters in a niche publish, how often, and which posts get the most likes and restacks.
- A weekly digest of new posts from a list of publications delivered to Notion, Slack or e-mail.
- Clean article text for a vector database or an AI agent, with the podcast audio URL when a post is an episode.
- Engagement analytics for your own publication over time, exported to a sheet.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
publications | array | ["https://www.lennysnewsletter.com"] | Substack newsletter URLs or subdomains, e.g. |
maxPostsPerPublication | integer | 50 | Newest posts first. |
search | string | Optional keyword filter applied by Substack's own archive search. | |
postedAfter | string | Optional ISO date such as `2026-01-01`. | |
includeBody | boolean | true | Fetch each post and add `bodyText` (plain text) and `bodyHtml`. |
includeComments | boolean | false | Also scrape the comment thread of each post as separate records (`type: "comment"`). |
proxyConfiguration | object | Substack rarely blocks. |
Output
Each result is one JSON record. The main fields: type, publication, title, subtitle, postDate, authors, audience, likes, comments, restacks, wordCount, url. Download as JSON, CSV or Excel, or read it through the API.
Pricing
$1.38 / 1,000 results, charged per result with no Apify platform usage added on top. A run that returns nothing costs nothing beyond Apify's default start fee of $0.00005.
Frequently asked
Does it get paywalled posts?
It returns exactly what Substack shows to a non-subscriber, which is the free preview. The post is marked with bodyIsPreviewOnly so you can filter it out. It never bypasses a paywall.
Are Substack Notes included?
No. Notes are a separate social feed. The actor covers posts, podcasts and comments.
How many posts can one run fetch?
The whole archive if you want it. Posts are fetched 50 at a time and full text costs one extra request per post, so a 500-post archive with text takes a couple of minutes.
Full reference documentation, sample output and the changelog live on the Apify listing.
