Substack Scraper avatar

Substack Scraper

Pricing

from $2.00 / 1,000 results

Go to Apify Store
Substack Scraper

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

Norm Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

Norm Data

πŸ“° 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

CapabilityThis actorOther Substack scrapers on Apify
Posts with full body (Markdown / text / HTML)yesyes
Comment threads with nested repliesyessome
Publication firmographics (subscribers, pricing, cadence)yesrare
Leaderboard: rank a whole categoryyesno
Discovery: find newsletters by keywordyesno
Author, recommendations, notes modesyesno
Incremental "only new since" runsyesrare
One row per post / comment / publicationyesno

πŸ“¦ What data you get

EntityUseful fields
PostTitle, 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.
PublicationName, 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.
AuthorHandle, name, bio, photo, external links, follower count, subscriber count, bestseller tier, leaderboard ranking, and every publication they run.
CommentBody, author name & handle & photo, date, edited date, reaction count, restacks, pinned flag, reply count, and nested replies.
RecommendationRecommended 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:

SectionWhat 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 fromFill 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 collectMaximum 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 articleFull 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 formatOne 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 install
bun test
bun run typecheck
apify run

Local results are stored in storage/datasets/default.