Substack Scraper
Pricing
from $0.70 / 1,000 post scrapeds
Substack Scraper
Scrape posts and newsletter details from any Substack publication, including custom domains. Find newsletters by keyword. No login needed.
Pricing
from $0.70 / 1,000 post scrapeds
Rating
0.0
(0)
Developer
Solar G
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
an hour ago
Last modified
Categories
Share
Scrapes posts and publication details from Substack newsletters, including those on custom domains. No login is required.
Input
| Field | Description |
|---|---|
publications | Subdomains (lenny), Substack URLs (https://lenny.substack.com) or custom domains (www.lennysnewsletter.com). |
maxPostsPerPublication | Newest first. Default 50. Set to 0 to return publication records only. |
postedAfter | Optional. Stop at posts older than this date. |
includeContent | Include post text and HTML. Default true. |
includePublicationInfo | Include one record per publication. Default true. |
{"publications": ["https://www.lennysnewsletter.com", "astralcodexten"],"maxPostsPerPublication": 100,"postedAfter": "2026-01-01"}
Output
Each item has a type of post, publication or error.
Post
{"type": "post","publicationUrl": "https://www.lennysnewsletter.com","id": 219482066,"title": "How to tell if a startup has a moat","subtitle": "A framework for assessing whether the company you're considering joining is built to last","url": "https://www.lennysnewsletter.com/p/how-to-tell-if-a-startup-has-a-moat","date": "2026-10-13T12:45:41.160Z","postType": "newsletter","audience": "only_paid","isPaywalled": true,"wordcount": 4153,"reactionCount": 352,"commentCount": 2,"restacks": 18,"authors": [{ "name": "Dan Hockenmaier", "handle": "danhock", "id": 2607892 }],"tags": ["Career"],"coverImage": "https://substackcdn.com/...","podcastUrl": null,"contentText": "...","contentHtml": "..."}
Publication
{"type": "publication","name": "Lenny's Newsletter","url": "https://www.lennysnewsletter.com","subdomain": "lenny","customDomain": "www.lennysnewsletter.com","description": "Deeply researched product, growth, and career advice...","language": "en","hasPaidPlans": true,"paidPlans": [{ "interval": "month", "amount": 20, "currency": "usd" }],"rankingDetail": "Tens of thousands of paid subscribers","createdAt": "2019-..."}
API usage
Run the Actor and get results in one request:
curl -X POST "https://api.apify.com/v2/acts/solarg~substack-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"publications": ["lenny"], "maxPostsPerPublication": 50}'
With the JavaScript client:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('solarg/substack-scraper').call({"publications": ["lenny"], "maxPostsPerPublication": 50});const { items } = await client.dataset(run.defaultDatasetId).listItems();
With Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("solarg/substack-scraper").call(run_input={"publications": ["lenny"], "maxPostsPerPublication": 50})items = client.dataset(run["defaultDatasetId"]).list_items().items
You can also schedule runs in Apify Console and send results to Google Sheets, Slack, webhooks, Zapier, Make or n8n through Apify's integrations.
Pricing
- $1.00 per 1,000 posts (content included)
- $0.002 per publication record
Platform usage is included in the price.
Limitations
- Paid posts return only the free preview that Substack shows publicly. Paywalled content isn't accessed.
- Comments are not included.
Notes
Report problems in the Issues tab.