Substack Scraper
Pricing
from $2.00 / 1,000 results
Substack Scraper
Scrape any Substack. Get full articles in Markdown, text or HTML, plus comments, aut hor profiles, subscriber counts, pricing and category leaderboards, no login. Made for sales teams build ing sponsor lists, analysts benchmarking newsletters, and AI teams gathering clean long form training da ta.
Pricing
from $2.00 / 1,000 results
Rating
0.0
(0)
Developer
Norm Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share

π° Substack Scraper
Extract public Substack data (posts, comments, publications, authors, and Leaderboard rankings) as clean, structured records. Full article content in HTML, Markdown, and plain text, plus subscriber counts, structured pricing, posting cadence, and the recommendation graph between newsletters. No login, no Substack account, no browser extension, no manual copying.
Point it at newsletter URLs, discover them by keyword, or start from a category Leaderboard, and get export-ready data for lead generation, competitor research, content analysis, and AI training sets.
π― Who uses it?
π Sales & partnership teams
Build lists of newsletters by category, size, and pricing, with author names and handles for sponsorship and partnership outreach.
π Market & competitor researchers
Benchmark newsletters by subscriber count, paid/free mix, posting cadence, engagement, and price. Map which publications recommend each other.
π§βπ» Content & SEO strategists
Track topics, headlines, and publishing frequency across a niche. Pull full archives to study what performs.
π€ AI / ML engineers
Collect high-quality long-form writing as Markdown or clean text, with metadata, for training and retrieval datasets.
ποΈ Data journalists & analysts
Build exportable datasets of newsletter content, comments, and author networks.
β¨ What it does
- Posts: full article body in Markdown, plain text, or HTML, with title, subtitle, tags, word count, reading time, reactions, restacks, cover image, podcast details, and outbound links.
- Comments: complete threads with nested replies, author info, and reaction counts. Optionally flatten to one row per comment.
- Publications: one row per newsletter, with subscriber count, structured pricing (monthly / annual / founding), language, first post date, podcast flag, posting cadence, paid ratio, and average reactions.
- Leaderboard: the top newsletters in any Substack category, ranked, with all publication fields. The fastest way to map a niche.
- Author: everything a writer runs from their
@handle: bio, links, follower and subscriber counts, and every publication they operate. - Recommendations: the newsletters each publication endorses, for network mapping.
- Notes: a publication's recent short-form Notes, when public.
- Discovery: don't know the URLs? Give keywords and the Actor finds matching newsletters for you.
- Handles any size: a single newsletter or an entire category, with automatic pagination.
- Filters: date range, content type (newsletter / podcast / thread), free-only, and incremental "only new since".
- CRM-ready layout: one row per post, per comment, or per publication.
Why this scraper
- Eight modes in one actor: posts, comments, publications, leaderboard, author, recommendations, notes, and keyword discovery. The other Substack scrapers on Apify do posts and little else.
- Leaderboard mode ranks every newsletter in a category, so you can map a whole niche in one run.
- Discovery by keyword finds newsletters when you do not have the URLs.
- Full article bodies in Markdown, ready for an AI dataset or a content pipeline.
- CRM-ready flattening: one row per post, per comment, or per publication.
- No login, no API key.
How it compares
| Capability | This actor | Other Substack scrapers on Apify |
|---|---|---|
| Posts with full body (Markdown / text / HTML) | yes | yes |
| Comment threads with nested replies | yes | some |
| Publication firmographics (subscribers, pricing, cadence) | yes | rare |
| Leaderboard: rank a whole category | yes | no |
| Discovery: find newsletters by keyword | yes | no |
| Author, recommendations, notes modes | yes | no |
| Incremental "only new since" runs | yes | rare |
| One row per post / comment / publication | yes | no |
π¦ What data you get
| Entity | Useful fields |
|---|---|
| Post | Title, subtitle, URL, slug, type, audience, paid flag, tags, published/updated dates, word count, reading time, reactions, comment count, restacks, cover image, podcast URL & duration, outbound links, description, and body in Markdown / text / HTML. |
| Publication | Name, URL, subdomain, custom domain, author name & handle & bio, tagline, language, logo, subscriber count, structured pricing, first post date, podcast flag, posting cadence, paid ratio, average reactions. |
| Author | Handle, name, bio, photo, external links, follower count, subscriber count, bestseller tier, leaderboard ranking, and every publication they run. |
| Comment | Body, author name & handle & photo, date, edited date, reaction count, restacks, pinned flag, reply count, and nested replies. |
| Recommendation | Recommended publication name, URL, id, and the recommending note. |
Every record includes scraped_at (UTC) and source. Download your dataset from Apify as CSV, JSON, Excel, or XML.
π‘ Use cases
π Map a niche and its biggest newsletters
{"mode": "leaderboard","leaderboardCategory": "Technology","leaderboardType": "paid","maxItems": 100,"includeRecommendations": true}
π Benchmark competitor newsletters
{"mode": "publications","urls": ["https://www.lennysnewsletter.com","https://newsletter.pragmaticengineer.com"],"includeRecommendations": true}
π€ Pull a full archive as Markdown for an AI dataset
{"mode": "posts","urls": ["https://www.astralcodexten.com"],"maxPostsPerNewsletter": 0,"contentFormat": "markdown","onlyFree": true}
π§βπΌ One row per comment for analysis
{"mode": "posts","urls": ["https://www.lennysnewsletter.com"],"maxPostsPerNewsletter": 20,"includeComments": true,"outputMode": "comment"}
π Discover newsletters by topic
{"mode": "posts","keywords": ["artificial intelligence", "climate"],"maxNewslettersPerKeyword": 15,"maxPostsPerNewsletter": 5}
βοΈ How the input is organised
The input form is split into six numbered sections:
| Section | What it's for |
|---|---|
| 1 Β· What do you want to scrape? | Pick one type of data: Articles, Newsletter profiles, Top newsletters (Leaderboard), Writer profile, or Notes. |
| 2 Β· Where to get it from | Fill in only the field that matches your choice: newsletter links (Articles / profiles / Notes), topics to search (Articles), writer handles (Writer profile), or a category (Leaderboard). The others can stay empty. |
| 3 Β· How much to collect | Maximum rows for the whole run, articles per newsletter (0 = full archive, paid plans), and how many newsletters to find per topic. |
| 4 Β· What to include in each article | Full text (and its format: Markdown / plain / HTML / all), newsletter stats, recommended newsletters, reader comments, notes. |
| 5 Β· Filters (optional) | Only regular posts / podcasts / threads, a published-date range, free-only, and "only newer than" for scheduled runs. Leave blank to get everything. |
| 6 Β· Output format | One row per article (comments nested), or one row per comment (flat, spreadsheet-ready). |
Pagination, retries, deduplication, and parallelism are handled automatically. There is no "concurrency" knob to set.
Apify Free plan: every run is limited to a fixed 10-row sample. Upgrade your Apify plan to run your own settings.
π‘οΈ Limits & responsible use
This Actor collects only publicly available information from Substack. It never signs in and never accesses private, paid-only, or subscriber-gated content. For paywalled posts you get the public metadata (title, word count, reactions) but not the body text.
Author and comment data are personal data. Use them in line with Substack's Terms of Service and applicable law (GDPR / CCPA). Prefer publication-level and business use; do not use the output for spam.
If a newsletter's page can't be loaded, its row is still saved with whatever was available plus an error field.
π§ͺ Local development
bun installbun testbun run typecheckapify run
Local results are stored in storage/datasets/default.