Substack Scraper avatar

Substack Scraper

Pricing

from $0.70 / 1,000 post scrapeds

Go to Apify Store
Substack Scraper

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

Solar G

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Share

Scrapes posts and publication details from Substack newsletters, including those on custom domains. No login is required.

Input

FieldDescription
publicationsSubdomains (lenny), Substack URLs (https://lenny.substack.com) or custom domains (www.lennysnewsletter.com).
maxPostsPerPublicationNewest first. Default 50. Set to 0 to return publication records only.
postedAfterOptional. Stop at posts older than this date.
includeContentInclude post text and HTML. Default true.
includePublicationInfoInclude 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 ApifyClient
client = 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.