Substack Scraper avatar

Substack Scraper

Pricing

from $2.50 / 1,000 results

Go to Apify Store
Substack Scraper

Substack Scraper

Scrape posts from any Substack newsletter, on substack.com or a custom domain: titles, dates, authors, likes, comments, restacks, podcast episodes, and the full text of free posts, with the publication's name and subscriber count. Paste a newsletter URL, get clean JSON. No login, no API key.

Pricing

from $2.50 / 1,000 results

Rating

0.0

(0)

Developer

Anyx Solutions

Anyx Solutions

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 hours ago

Last modified

Share

banner

Substack Scraper

Every post from any Substack newsletter — with likes, comments, authors, and the full text of free posts — as clean JSON.

Substack hosts tens of thousands of newsletters and podcasts, from Lenny's Newsletter and Simon Willison's Newsletter to the Dwarkesh Podcast, on substack.com addresses and on their own custom domains. This Actor reads any of them and returns their posts, newest first: title, subtitle, publish and update dates, authors, likes, comments, restacks, word count, cover image, podcast audio, and the post body as HTML and plain text. Free posts come in full; paid posts come with the preview Substack shows non-subscribers, and are flagged as such. Every row also carries the newsletter's name, URL, author and subscriber count. Paste a newsletter URL; there is no login, no API key, and no proxy to configure. Built for media monitoring, creator and sponsorship research, content analysis, and AI and search datasets.

⚡ Quick start

{
"startUrls": [{ "url": "https://www.lennysnewsletter.com/" }],
"maxItems": 5
}

🧩 Input

FieldTypeRequiredDefaultDescription
startUrlsarrayyes—Substack newsletter URLs (<name>.substack.com or the newsletter's own domain), archive pages (…/archive), single post URLs (…/p/<post>), or open.substack.com/pub/… links.
maxItemsintegerno—Maximum number of posts per start URL, newest first. The input form starts at 5; leave it empty to get the whole archive.
includeContentbooleannotrueRead each post's body as HTML and plain text. Adds one fast request per post; turn it off for quick archive listings.
proxyConfigurationobjectno{ "useApifyProxy": false }Proxy settings. Substack newsletters need no proxy.

Custom domains work. Many newsletters run on their own domain (for example www.lennysnewsletter.com). Paste it as it is: the Actor checks that the site is a Substack newsletter and says so in the log when it is not.

📤 Output

Each post is one dataset row, with the newsletter it belongs to.

Fields

FieldTypeDescription
idnumberSubstack post ID.
titlestringPost title.
subtitlestringPost subtitle.
slugstringThe post's name in its URL.
urlstringThe post's public page.
postDatestringWhen the post was published (ISO 8601).
updatedAtstringWhen the post was last edited (ISO 8601). Filled when includeContent is on.
typestringnewsletter, podcast or thread (a discussion thread).
audiencestringWho can read it: everyone for free posts, only_paid for subscriber-only posts.
isPaidbooleanWhether the post is for paying subscribers.
wordcountnumberWord count of the full post.
reactionCountnumberNumber of likes.
commentCountnumberNumber of comments.
restacksnumberNumber of restacks (Substack's reshares).
coverImagestringCover image URL.
sectionNamestringThe newsletter section the post belongs to, when it uses sections.
tagsarrayTag names.
languagestringLanguage of the post.
authorsarrayBylines: id, name, handle, photoUrl and bio.
podcastUrlstringAudio file of a podcast episode.
podcastDurationnumberEpisode length in seconds.
bodyHtmlstringPost body as HTML. null when includeContent is off.
bodyTextstringPost body as plain text. null when includeContent is off.
isContentTruncatedbooleantrue when the body is the paywall preview of a paid post, false when it is the full post, null when includeContent is off.
publicationNamestringThe newsletter's name.
publicationUrlstringThe newsletter's home page.
publicationobjectThe newsletter: id, name, url, subdomain, customDomain, description, authorName, authorHandle, logoUrl, subscriberCount (when the newsletter shows it), paidSubscriptions, firstPostDate and language.

💡 Use cases

  • Media monitoring — follow the newsletters in your industry and catch every new post, with its engagement.
  • Creator and sponsorship research — compare newsletters by subscribers, posting cadence, likes and comments before you pitch or sponsor.
  • Content analysis — collect full post text for topic tracking, sentiment, and trend research.
  • AI and search datasets — build clean, attributed corpora from free newsletter posts and podcast show notes.

❓ FAQ

  • Do I need a Substack account or an API key? No. The Actor reads the same public pages any visitor sees.
  • Can I get the full text of paid posts? No. Paid posts come with the preview Substack shows non-subscribers; isContentTruncated is true on those rows, and wordcount still gives the length of the full post.
  • Does it work with newsletters on their own domain? Yes. Paste the domain as it is. If the site is not a Substack newsletter, the log says so and the URL is skipped.
  • Can I scrape many newsletters at once? Yes. Add one URL per newsletter to startUrls; maxItems applies to each one separately.
  • Why is subscriberCount empty for some newsletters? Authors choose whether to show their subscriber count. When they hide it, the field is null.
  • Do I need a proxy? No. It runs without one by default.

🔗 More scrapers by Anyx

🤝 Anyx Solutions

We build custom scrapers and data-extraction pipelines.

🖼 Image credit

Image credit: substack.com