Substack Posts & Newsletters Scraper avatar

Substack Posts & Newsletters Scraper

Pricing

from $0.80 / 1,000 posts

Go to Apify Store
Substack Posts & Newsletters Scraper

Substack Posts & Newsletters Scraper

Scrape Substack posts and find newsletters by category leaderboard: titles, dates, likes, comments, free-post text, subscriber counts, prices, author social links and recommendations.

Pricing

from $0.80 / 1,000 posts

Rating

0.0

(0)

Developer

ThisIsB3

ThisIsB3

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

17 days ago

Last modified

Share

Scrape Substack posts and find Substack newsletters by category leaderboard. Get post titles, dates, likes, comments, restacks, word counts and the full text of free posts, plus publication details nobody else gives you in one place: leaderboard rank, subscriber count, subscription prices, authors' social links and each newsletter's recommendations. No login, no browser, no code. Export to JSON, CSV or Excel, or use it through the Apify API.

What does Substack Posts & Newsletters Scraper do?

It reads Substack's public data the same way the Substack website does, with three ways in:

  • Publications: paste name.substack.com or a custom domain such as www.astralcodexten.com. You get the latest posts (as many as you want, newest first) and one row with the publication's details.
  • Categories: pick Substack categories such as Technology, Business or Finance. You get the Bestsellers leaderboard for each (ranked), or every newsletter in the category, as publication rows ready for outreach or research.
  • Post URLs: paste links to individual posts, including links copied from the Substack app.

Every row has a type field (post or publication), so one run can mix both. The dataset has a Posts view and a Publications view.

Why use it?

  • Newsletter discovery: list the top newsletters in any category with their rank, size, price and authors. Turn on recommendations to follow each newsletter's recommendation network and find the ones around it.
  • Sponsorship and partnership research: compare subscriber counts, paid-subscriber bands and prices, then reach authors through the public social links on their Substack profile (X/Twitter, LinkedIn, YouTube, Bluesky, websites).
  • Competitor monitoring: schedule a daily or weekly run on the newsletters you follow and track what they publish, how often, and how readers react (likes, comments, restacks).
  • Media research: build a dataset of posts on a beat, with dates, sections, tags, podcast episodes and word counts, plus the text of free posts.

It is built for reliability: it uses Substack's public JSON (no fragile page parsing, no browser), slows down automatically if Substack asks it to, keeps partial results when a single request fails, and is checked every day by an automated test.

How to use it

  1. Click Try for free.
  2. Add newsletters to Publications, pick Categories, or paste Post URLs (any combination).
  3. Choose what you want: posts per publication, full text, publication details, recommendations.
  4. Click Start and download your data when the run finishes (usually seconds to a few minutes).

You can also call it from the Apify API, schedule it, or connect it to Make, Zapier, Google Sheets and other integrations.

How much does it cost?

You pay only for the rows you receive. There is no monthly fee.

RowEventPrice
Post (all fields except the text)post$1.00 per 1,000
Post with full text (free posts only)post-full-text$2.00 per 1,000, charged instead of post
Publication (details, rank, authors, social links, recommendations)publication$3.00 per 1,000

Examples: the latest 50 posts of 20 newsletters cost about $1.06 (1,000 posts plus 20 publication rows). The Bestsellers top 25 of 10 categories costs $0.75. Apify's free plan includes monthly platform credit, enough for thousands of posts every month. Set a maximum cost per run in the run options and the scraper stops exactly at that budget.

Input

FieldDescription
PublicationsNewsletters to scrape: name.substack.com, a custom domain, or any link to the publication.
CategoriesSubstack categories to discover newsletters in (publication rows only).
Post URLsIndividual posts, e.g. https://name.substack.com/p/post-title or https://substack.com/@name/p-123456789.
Max posts per publicationLatest posts per publication (default 20). 0 = publication rows only.
Include full text of free postsAdds plain text and HTML for free, public posts (default off).
Include publication detailsOne row per publication in Publications (default on).
Include recommended newslettersAdds each publication's recommendations to its row (default off).
Category listbestsellers (paid leaderboard, ranked; default) or all (every newsletter in the category).
Max publications per categoryHow many publications per category, from the top (default 25).
Maximum resultsStop after this many rows in total (default 1,000; 0 = no limit).
Max concurrencyParallel requests, also the most started per second (default 4).

Example input:

{
"publications": ["https://on.substack.com", "www.astralcodexten.com"],
"categories": ["technology", "business"],
"maxPostsPerPublication": 50,
"includeFullText": false,
"includeRecommendations": true,
"maxPublicationsPerCategory": 25
}

Output

Post rows

FieldDescription
title, subtitle, url, slugThe post and its link.
publishedAtPublish date (ISO 8601).
audience, isPaidfree (public), subscribers (free sign-up), paid or founding; isPaid is true for paywalled posts.
postType, isPodcastnewsletter, podcast, thread or video.
reactionCount, restackCount, commentCountLikes, restacks and comments.
wordCount, tags, sectionName, coverImageUrlLength, tags, section and cover image.
authorsBylines (id, name, handle).
publicationId, publicationName, publicationSubdomain, publicationUrlThe newsletter the post belongs to.
fullText, fullTextHtmlText of free posts when "Include full text" is on; otherwise null.

A real post row (from the default input):

{
"type": "post",
"id": 218520648,
"title": "A CEO tried to bully a journalist into silence. He failed.",
"subtitle": "This week, we notched another win for free speech",
"url": "https://on.substack.com/p/a-ceo-tried-to-bully-a-journalist",
"slug": "a-ceo-tried-to-bully-a-journalist",
"publishedAt": "2026-10-02T17:10:42.907Z",
"audience": "free",
"isPaid": false,
"postType": "newsletter",
"isPodcast": false,
"reactionCount": 3731,
"restackCount": 587,
"commentCount": 0,
"wordCount": 323,
"tags": [],
"sectionName": "News & Views",
"coverImageUrl": "https://substackcdn.com/image/fetch/$s_!qRDf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4b63deba-7410-45fd-a672-d7a41e2e3924_3240x2160.png",
"authors": [],
"publicationId": 1,
"publicationName": "On Substack",
"publicationSubdomain": "on",
"publicationUrl": "https://on.substack.com",
"fullText": null,
"fullTextHtml": null,
"scrapedAt": "2026-10-07T16:37:42.305Z"
}

Publication rows

FieldDescription
name, subdomain, customDomain, urlThe newsletter and its addresses.
description, logoUrl, languageTagline, logo and language.
category, leaderboardRankSubstack category and position on its Bestsellers leaderboard, when known.
subscriberCountSubscribers as rounded and shown publicly by Substack (when the publisher shows it).
paidSubscribersEstimateSubstack's public paid-subscriber band, e.g. "Thousands of paid subscribers".
hasPaidSubscriptions, monthlyPrice, annualPrice, currencyWhether it sells subscriptions, and the cheapest plans.
createdAt, firstPostAt, hasPodcastAge and podcast.
authorsOwner first, up to 3 authors: name, handle, bio, photoUrl, profileUrl, isOwner, socialLinks (platform, url, title).
recommendationsNewsletters it recommends (id, name, url, hasPaidSubscriptions, description), when turned on.

A real publication row from a Technology category run (social links and recommendations shortened):

{
"type": "publication",
"id": 458709,
"name": "The Pragmatic Engineer",
"subdomain": "pragmaticengineer",
"customDomain": "newsletter.pragmaticengineer.com",
"url": "https://newsletter.pragmaticengineer.com",
"description": "Big Tech and startups, from the inside. Highly relevant for software engineers, AI engineers and engineering leaders, useful for those working in tech.",
"logoUrl": "https://substackcdn.com/image/fetch/$s_!eod5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27076b05-e3f4-4d05-9621-3da4f7f189cd_300x300.png",
"category": "Technology",
"leaderboardRank": 3,
"hasPaidSubscriptions": true,
"subscriberCount": 1100000,
"paidSubscribersEstimate": "Tens of thousands of paid subscribers",
"monthlyPrice": 15,
"annualPrice": 150,
"currency": "USD",
"language": "en",
"createdAt": "2021-08-25T13:08:12.798Z",
"firstPostAt": "2021-08-30T11:24:02.082Z",
"hasPodcast": true,
"authors": [
{
"name": "Gergely Orosz",
"handle": "pragmaticengineer",
"bio": "Big Tech and startups from the inside. Especially relevant for software engineers / AI engineers, useful for anyone working in tech.",
"photoUrl": "https://substack-post-media.s3.amazonaws.com/public/images/58fed27c-f331-4ff3-ba47-135c5a0be0ba_400x400.png",
"profileUrl": "https://substack.com/@pragmaticengineer",
"isOwner": true,
"socialLinks": [
{ "platform": "twitter", "url": "https://x.com/GergelyOrosz", "title": "GergelyOrosz" },
{ "platform": "linkedin", "url": "https://www.linkedin.com/in/gergelyorosz/", "title": null },
{ "platform": "youtube", "url": "https://www.youtube.com/@pragmaticengineer", "title": null }
]
}
],
"recommendations": [
{
"id": 2935724,
"name": "charity.wtf",
"subdomain": "charitydotwtf",
"customDomain": "charity.wtf",
"url": "https://charity.wtf",
"hasPaidSubscriptions": false,
"description": null
}
],
"scrapedAt": "2026-10-07T16:37:56.734Z"
}

Tips

  • Start with the defaults to preview the data, then raise Max posts per publication for full archives.
  • For a lead list, use Categories: they return publication rows only. For your own list of newsletters without posts, set Max posts per publication to 0.
  • Want posts from newsletters you discovered? Copy their url values into Publications and run again.
  • Schedule weekly runs on your competitor list to track new posts and engagement over time.
  • Bare custom domains (example.com) are retried on www.example.com automatically.

FAQ

Is it legal to scrape Substack? This scraper only reads public data that any logged-out visitor can see, through the same public endpoints the Substack website uses. It never logs in and never bypasses a paywall. Publication and author details are what publishers choose to show publicly. You are responsible for how you use the data: respect authors' copyright (don't republish their posts), and check the laws that apply to you, such as GDPR, before contacting people.

What safeguards are built in?

  • Paywalled posts never include text. Full text is only returned for free, public posts. For paid, founding-member and subscriber-only posts you get the metadata (title, date, likes...) but never the body, even if Substack sends a preview.
  • No email addresses. Email links are dropped and anything that looks like an email address is replaced with [email removed] in every field.
  • Polite by default. A few requests per second at most, and it pauses automatically when Substack signals rate limiting.

Is there an official Substack API? Substack has no official public API for this data. This scraper gives you a stable, documented output format instead, and it is fixed quickly if Substack changes something.

Can I search newsletters by keyword? Not at the moment: Substack's keyword search does not return results to logged-out visitors. Use Categories to discover newsletters, and turn on recommendations to explore the network around the ones you find.

Why is subscriberCount empty for some newsletters? Some publishers hide their subscriber count. The scraper never guesses; it returns null.

The scraper returned fewer results than expected. Check that the publication or post opens in a normal browser without logging in. If the site changed, open an issue on the Issues tab and it will be fixed quickly.

Can I get other fields, such as comments? Open an issue on the Issues tab with the field you need.