Substack Scraper: Newsletters, Posts, Subscribers, Leaderboards avatar

Substack Scraper: Newsletters, Posts, Subscribers, Leaderboards

Pricing

from $1.00 / 1,000 result rows

Go to Apify Store
Substack Scraper: Newsletters, Posts, Subscribers, Leaderboards

Substack Scraper: Newsletters, Posts, Subscribers, Leaderboards

Public Substack data with no login. Posts with likes, comments, restacks and free full text as Markdown. Newsletter profiles with subscriber counts, prices and socials. Find newsletters by keyword or category leaderboard. Only-new alerts. Failed inputs are free.

Pricing

from $1.00 / 1,000 result rows

Rating

0.0

(0)

Developer

Dottti

Dottti

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Security

Limited permissions

Share

Get public Substack data with no login and no cookies.

  • Posts from any newsletter: title, date, link, free or paid, likes, comments, restacks, word count, authors, and the full text of free posts as Markdown.
  • Newsletter profiles: subscriber count where Substack shows it, paid subscriber range, monthly, yearly and founding prices, leaderboard rank, about text and the writer's social links.
  • Discovery: find newsletters by keyword, or read a category leaderboard (Top Bestsellers or Rising) with stats for each newsletter.

Every input gets an answer. A newsletter that does not exist, a bad link or an unknown category returns a free status row that says what went wrong. The run still ends as SUCCEEDED.

Who it is for

  • Marketers and sponsors who need a list of newsletters to sponsor in a niche, with subscriber counts and prices.
  • Researchers and analysts who track what newsletters publish and how readers react.
  • AI and RAG builders who need clean newsletter text. Free posts come as Markdown, ready for a vector store.
  • Writers who watch other newsletters in their niche.

Paywalls

This actor reads only what Substack shows to a logged-out visitor. Paid posts are never unlocked. A paid post row has all its public stats, isPaywalled: true and textStatus: "paywalled", with no full text.

Input

Pick a mode, then fill the fields for that mode.

ModeFieldsYou get
postsnewsletters, postUrls, maxPostsPerNewsletter, includeFullText, audience, postedAfterOne row per post
profilesnewsletters, includeAuthorSocialsOne row per newsletter
discoversearchKeywords, categories, leaderboard, maxPublicationsPerSourceOne row per newsletter found

A newsletter can be written any of these ways:

  • lenny
  • lenny.substack.com
  • https://www.lennysnewsletter.com (custom domains work)
  • @noahpinion (a writer's handle; the actor finds their main newsletter)

Example: the 50 newest posts from two newsletters, with full text of free posts.

{
"mode": "posts",
"newsletters": ["astralcodexten", "https://www.lennysnewsletter.com"],
"maxPostsPerNewsletter": 50,
"includeFullText": true
}

Example: sponsor research. The top 100 Technology and Finance bestsellers, plus newsletters about climate.

{
"mode": "discover",
"categories": ["technology", "finance"],
"leaderboard": "bestsellers",
"searchKeywords": ["climate"],
"maxPublicationsPerSource": 100
}

Valid categories include technology, business, finance, culture, us-politics, world-politics, news, science, health, climate, crypto, sports, food, travel, music, art, fiction, history, education, parenting, philosophy and humor. A wrong name returns a free status row with the full list.

With an empty input, the actor runs a small demo and returns 20 posts from one public newsletter.

Output

Every row has a type: post, publication or status. The dataset has three views: Posts, Newsletters and Input status.

A post row (from a real run, text shortened):

{
"type": "post",
"newsletterUrl": "https://www.astralcodexten.com",
"newsletterName": "Astral Codex Ten",
"publicationId": 89120,
"postId": 212349565,
"title": "Your Book Review: The History And Adventures Of An Atom",
"subtitle": "Finalist #14 in the Book Review Contest",
"url": "https://www.astralcodexten.com/p/your-book-review-the-history-and",
"publishedAt": "2026-10-30T16:30:33.689Z",
"postType": "newsletter",
"audience": "free",
"isPaywalled": false,
"likes": 83,
"reactions": { "❤": 83 },
"commentCount": 61,
"restacks": 3,
"wordCount": 5789,
"authors": ["Scott Alexander"],
"coverImage": "https://substack-post-media.s3.amazonaws.com/public/images/159d85cb-..._777x394.jpeg",
"textMarkdown": "[*This is one of the finalists in the 2026 book review contest...",
"textStatus": "included"
}

textStatus is included, paywalled, not_requested, empty or unavailable.

A newsletter profile row (from a real run):

{
"type": "publication",
"source": "profile",
"name": "Lenny's Newsletter",
"url": "https://www.lennysnewsletter.com",
"about": "Deeply researched product, growth, and career advice for product leaders, founders, and ambitious builders.",
"authorName": "Lenny Rachitsky",
"authorHandle": "lenny",
"subscriberCountText": "Over 1,200,000 subscribers",
"subscriberCountApprox": "1.2M+",
"subscriberCountNumber": 1200000,
"paidSubscriberRange": "Tens of thousands of paid subscribers",
"authorFollowerCount": 1389381,
"monthlyPrice": 20,
"yearlyPrice": 200,
"foundingPrice": 400,
"currency": "USD",
"categoryRanking": { "category": "Business", "rank": 1, "board": "bestsellers" },
"socials": {
"twitter": "https://x.com/lennysan",
"youtube": "https://www.youtube.com/c/LennysPodcast",
"website": "https://www.lennyrachitsky.com/"
}
}

Leaderboard rows also carry leaderboardCategory, leaderboardBoard and leaderboardRank. Search rows carry searchQuery.

About subscriber numbers: Substack shows a rounded public figure ("Over 1,200,000 subscribers", "44K+ subscribers"). subscriberCountNumber is that figure as a number. It is a lower bound, not an exact count. Some writers hide their count; then the fields are empty.

A status row (free):

{
"type": "status",
"input": "thisdoesnotexist98765xyz",
"kind": "newsletter",
"status": "not_found",
"error": "No Substack newsletter at this address.",
"charged": false
}

Statuses: not_found, invalid_input, no_posts, no_matching_posts, no_new_posts, no_new_publications, no_results, blocked, skipped_cost_limit.

The key-value store record RUN_SUMMARY lists every input with its status, rows by type, requests, bytes and the proxy tier used.

Alerts: only new posts or newsletters

Turn on onlyNew and schedule the actor (Schedules in Apify Console, for example daily). The first run delivers everything and saves a baseline. Each later run delivers only posts published since the last run, or newsletters that newly entered a leaderboard or keyword result. You pay only for the new rows. Use a different stateName for each schedule.

Pricing

You pay per result row. Platform usage is included in the price. Status rows are free. If you set a maximum cost per run, the actor stops at that limit and marks the remaining inputs skipped_cost_limit.

Limits

  • Full text is for free posts only.
  • Keyword discovery uses Substack's writer search. It returns writers who have a newsletter, about 20 per page.
  • Substack limits how fast one address can make requests. The actor paces itself to about two requests a second and backs off when Substack asks it to. A post with full text needs one extra request. Expect about 1,000 posts with full text in 10 to 25 minutes.
  • Substack can change its public pages. If a field disappears, the row keeps its other fields and the status row explains any input that failed.