Substack Scraper | Posts, Full Text & Comments | $0.99/1K
Pricing
from $0.70 / 1,000 results
Substack Scraper | Posts, Full Text & Comments | $0.99/1K
Scrape Substack newsletters: posts, full text (HTML + plain), comments, authors, tags and engagement. Search by keyword, filter by date, get only new posts. $0.99 per 1,000 results (less on paid plans), content included. No login, no cookies.
Pricing
from $0.70 / 1,000 results
Rating
0.0
(0)
Developer
Yusuf Barış
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 days ago
Last modified
Categories
Share
Scrape any public Substack newsletter into clean, structured data: post metadata, full article text (HTML and plain text), authors, tags, engagement counts and comments with replies. No login, no cookies and no browser needed, so runs are fast, cheap and reliable.
$0.99 per 1,000 results at most, full content included, and cheaper on paid Apify plans. No surcharge for content or comments, and only a negligible $0.00005 per-run start charge applied by Apify.
What you can do with it
- Sponsor and partnership research — find newsletters in your niche, see how often they publish, how many likes, restacks and comments each post earns, and who writes them.
- Content and competitor analysis — export a publication's whole archive, track topics and tags over time, compare engagement between newsletters.
- LLM and RAG datasets — get clean plain text plus original HTML for thousands of articles, ready for fine-tuning, embeddings or summarisation.
- Audience research — read what readers say in comments, who replies to whom, and which posts spark discussion.
- Monitoring — run on a schedule with incremental mode and receive only posts you have not seen yet.
- Keyword discovery — search all of Substack for a topic and scrape every matching post.
Features
- Full archive of one or many publications (
name.substack.comor custom domains such aswww.lennysnewsletter.com) - A single post URL works too (
https://example.substack.com/p/some-post) - Full content as HTML and plain text
- Comments with nested replies, author flag and likes (optional)
- Date range filter (
startDate/endDate) - Free-only filter (
onlyFree) - Incremental mode — return only new posts since the last run
- Keyword search across Substack (
searchQueries) - Built-in retries and rate-limit handling, so long runs finish cleanly
Pricing
Pay per result: $0.99 / 1,000 results ($0.00099 per post) on the standard price. Paid Apify plans get lower per-result prices automatically. Each post written to the dataset is one result.
| What you get per result | Included |
|---|---|
| Metadata (title, date, audience, counts, tags, authors, cover image) | Yes |
| Full content (HTML + plain text) | Yes |
| Comments tree | Yes |
| Per-run start charge (set by Apify) | $0.00005 |
| Results | Cost at the standard price |
|---|---|
| 100 | $0.099 |
| 1,000 | $0.99 |
| 10,000 | $9.90 |
| 100,000 | $99.00 |
Use maxItems to cap spend. Apify's free plan credits cover your first runs.
Input
| Field | Type | Description |
|---|---|---|
publications | string[] | Subdomain (lenny), URL (https://lenny.substack.com) or custom domain. A /p/slug URL scrapes one post. |
searchQueries | string[] | Optional keywords to search all of Substack. |
maxPostsPerPublication | integer | Max posts per publication and per search query. Default 100. |
maxItems | integer | Total result cap for the run. Default 100. |
includeContent | boolean | Fetch full HTML and plain text. Default true. |
includeComments | boolean | Fetch comments and replies. Default false. |
maxCommentsPerPost | integer | Comments kept per post (0 = unlimited). Default 100. |
startDate / endDate | string | Only posts published within this range (YYYY-MM-DD, inclusive). |
onlyFree | boolean | Skip paid posts. Default false. |
incremental | boolean | Only return posts not returned by earlier incremental runs. Default false. |
proxyConfiguration | object | Optional. Usually not needed. |
Example input
{"publications": ["https://www.lennysnewsletter.com", "astralcodexten"],"searchQueries": ["product management"],"maxPostsPerPublication": 50,"maxItems": 100,"includeContent": true,"includeComments": true,"maxCommentsPerPost": 50,"startDate": "2026-01-01","onlyFree": true,"incremental": false}
Output
Each dataset item is one post:
{"postId": 208730073,"slug": "announcing-lennys-jobs-the-best-place","publication": "Lenny's Newsletter","publicationUrl": "https://www.lennysnewsletter.com","title": "Announcing Lenny’s Jobs: The best place in the world to find, vet, and land your dream job","subtitle": "Where product managers, engineers, designers, and growth/marketing professionals discover high-quality open roles at tech companies","url": "https://www.lennysnewsletter.com/p/announcing-lennys-jobs-the-best-place","publishedAt": "2026-08-18T15:40:06.921Z","postType": "newsletter","audience": "everyone","isPaywalled": false,"wordcount": 933,"likes": 382,"restacks": 9,"commentCount": 18,"tags": ["Career"],"authors": [{"name": "Lenny Rachitsky","handle": "lenny","bio": "Writing • Angel investing • Advising","photoUrl": "https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/afba5161-65bb-4d99-8d6b-cce660917fa1_1540x1540.png","url": "https://substack.com/@lenny"}],"coverImage": "https://substackcdn.com/image/fetch/…","contentHtml": "<p><em><span>👋 Hey there, I’m Lenny. …</span></em></p>","contentText": "👋 Hey there, I’m Lenny. Each week, I share deeply researched product, growth, …","comments": [{"id": 317389445,"body": "The Lenny 100 list is GENIUS 👏","author": "Tom Orbach","handle": "marketingideas","date": "2026-08-18T15:48:15.832Z","likes": 7,"isAuthor": false,"children": []}]}
comments is present only when includeComments is on. Items from keyword search also carry searchQuery. Download results as JSON, CSV, Excel, XML or HTML, or use the API.
Paid (paywalled) posts
Substack only exposes the public preview of subscriber-only posts to anonymous readers, and so does this Actor. Paid posts are returned with audience: "only_paid", isPaywalled: true and the preview text that appears before the paywall; wordcount still reflects the full article length. Comments on paid posts are hidden by Substack from non-subscribers, so they usually come back empty. Use onlyFree to skip paid posts entirely. The Actor does not log in or bypass paywalls.
Incremental mode
Turn on incremental and schedule the Actor. The Actor remembers which posts it has already returned for each publication or search keyword and returns only new ones. Repeat runs are fast and cheap.
Tips
- Start with a small
maxItemsto preview the output, then raise it. - Metadata-only runs (
includeContent: false) are the fastest, and the price per result is the same. - To scrape a whole archive, set both
maxPostsPerPublicationandmaxItemshigh.
FAQ
Do I need a Substack account or cookies? No. Only publicly available data is collected.
Does it work with custom domains?
Yes. Pass the domain (https://www.lennysnewsletter.com) or the name.substack.com address; both work.
Why is the text of some posts short? Those are paid posts. Anonymous access returns only the preview that Substack shows before the paywall.
Why did I get fewer results than maxItems?
The publication has fewer posts than the limits, or your date range, onlyFree or incremental filters excluded the rest.
What happens if Substack rate-limits me? The Actor slows down and retries automatically, so your run keeps going without any setup.
How does the search work?
searchQueries searches Substack for matching posts. Each match is returned with the same fields as any other post. For keyword search inside a single publication, scrape its archive and filter on title or contentText.
Is scraping Substack legal? The Actor only reads publicly available data. You are responsible for using it in line with Substack's terms, applicable law and privacy regulations such as GDPR, especially when handling commenters' names and handles.
Something is broken or missing. Who do I ask? Open an issue in the Actor's Issues tab and include your run URL.