Substack Newsletter Scraper · Find Active Newsletters + Leads avatar

Substack Newsletter Scraper · Find Active Newsletters + Leads

Pricing

from $5.00 / 1,000 scraped newsletters

Go to Apify Store
Substack Newsletter Scraper · Find Active Newsletters + Leads

Substack Newsletter Scraper · Find Active Newsletters + Leads

Find Substack newsletters by keyword or category and qualify them in one row: subscriber figure, paid-subscriber band, bestseller tier, paid price, last post date, posts per 30/90 days, median likes and comments. Optional post rows. No login.

Pricing

from $5.00 / 1,000 scraped newsletters

Rating

0.0

(0)

Developer

TheQuietStack

TheQuietStack

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Find Substack newsletters by keyword, category leaderboard or URL, and get one qualified row per newsletter: public subscriber figure, paid-subscriber band, Bestseller tier, paid price, last post date, posting frequency and median engagement per post. Dead newsletters and ones outside your size range are filtered out before you pay for them. No login, no API key.

Built for sponsorship buyers, newsletter-swap and cross-promotion outreach, PR lists, and anyone researching a Substack niche.

Why this scraper

  • Qualified, not just listed. A keyword search on Substack returns plenty of newsletters with 0–100 subscribers and no post in a year. Every row here carries daysSinceLastPost, postsLast30Days, postsLast90Days, medianLikes, medianComments, medianRestacks and likesPer1kSubscribers, so you can sort by who is actually read, not by who has the biggest headline number. Measured on 23 Sep 2026 for the search term "ai marketing": one newsletter shows 107K+ subscribers and gets a median of 0 likes per post; another with 9.3K+ gets a median of 73.5.
  • Paid-side signals in one row. Substack's own paid-subscriber band (e.g. "Tens of thousands of paid subscribers"), the Bestseller tier (100+ / 1,000+ / 10,000+ paid), and the monthly, yearly and founding-member price.
  • Filters that save money. minSubscribers, maxSubscribers, activeWithinDays, onlyPaidEnabled, onlyBestsellers, languages. Filtered-out newsletters are never charged.
  • No silently missing posts. Substack's archive API returned only 23 of 50 posts for a limit=50 request in our tests (23 Sep 2026), without any error. This Actor pages in steps of 20, which returned every post.
  • Custom domains work. lennysnewsletter.com, noahpinion.blog or @handle — if a custom domain fails, the *.substack.com address is tried as a fallback. Publications that have left Substack are listed in the run summary instead of failing silently.

Input example

{
"searchTerms": ["ai marketing"],
"categories": ["technology"],
"categoryRanking": "paid",
"newsletters": ["https://www.lennysnewsletter.com", "@noahpinion"],
"minSubscribers": 1000,
"activeWithinDays": 30,
"maxNewsletters": 200
}

Set "includePosts": true to also get one row per post (title, URL, date, likes, comments, restacks, paywalled flag, word count, preview text).

Output example (newsletter row, measured 23 Sep 2026)

{
"name": "Lenny's Newsletter",
"url": "https://www.lennysnewsletter.com",
"authorName": "Lenny Rachitsky",
"authorProfileUrl": "https://substack.com/@lenny",
"twitter": "https://x.com/lennysan",
"subscribersShown": 1200000,
"subscribersLabel": "1.2M+",
"paidSubscribersBand": "Tens of thousands of paid subscribers",
"paidSubscribersAtLeast": 10000,
"isBestseller": true,
"bestsellerTier": "10,000+ paid subscribers",
"priceMonthly": 20,
"priceYearly": 200,
"priceFoundingMember": 400,
"priceCurrency": "USD",
"lastPostDate": "2026-09-22T12:45:14.998Z",
"daysSinceLastPost": 1,
"postsLast30Days": 4,
"postsLast90Days": 11,
"postsAnalyzed": 20,
"medianLikes": 453,
"medianComments": 6.5,
"medianRestacks": 24.5,
"likesPer1kSubscribers": 0.38,
"paywalledShare": 0.75,
"topPostTitle": "How to turn your AI into a world-class designer",
"topPostLikes": 1011,
"source": "url:https://www.lennysnewsletter.com"
}
FieldMeaning
subscribersShown / subscribersLabelThe subscriber figure the newsletter shows publicly ("1.2M+"). Substack rounds it and it is a floor, not an exact count. null when the writer hides it.
paidSubscribersBandSubstack's own paid band text, e.g. "Hundreds of paid subscribers". null when not shown.
bestsellerTierBestseller badge: 100+, 1,000+ or 10,000+ paid subscribers.
priceMonthly / priceYearly / priceFoundingMemberPaid plan prices in priceCurrency.
postsLast30Days / postsLast90DaysPosts published in that window — exact, or null if the newsletter posts so often that the window exceeds 100 posts; postsLast90DaysAtLeast then gives the lower bound.
medianLikes / medianComments / medianRestacksMedian over the latest postsToAnalyze posts that are older than 48 hours.
likesPer1kSubscribersMedian likes per 1,000 shown subscribers — an engagement indicator, based on the rounded subscriber figure.
paywalledShareShare of analyzed posts that are for paid subscribers only.
sourceWhich search term, category or URL found this newsletter.

A run summary (SUMMARY in the key-value store) lists candidates per source, how many newsletters each filter dropped, failed publications with the reason, and HTTP status counts.

Honest limits

  • Public data only. Paywalled posts are returned as metadata (title, date, likes, comments, word count, preview) — never their full text. No login, no paywall access.
  • Subscriber numbers are Substack's rounded public figures. Nobody outside Substack has the exact count; we label the field accordingly instead of pretending.
  • Keyword search depth: Substack's search returns about 80 publications per term. Use several terms or the category leaderboards (up to 525 per category) for bigger lists.
  • Substack rate-limits fast clients. The Actor keeps concurrency low, retries with backoff and a fresh proxy IP; failures are listed in the summary, not hidden.

Pricing (pay per event)

  • Actor start: small flat fee per run
  • Per scraped newsletter: charged only for newsletters that pass your filters and are written to the dataset
  • Per scraped post: only when post rows are switched on