Substack Scraper: Posts, Likes, Comments & Free Post Text avatar

Substack Scraper: Posts, Likes, Comments & Free Post Text

Pricing

Pay per event

Go to Apify Store
Substack Scraper: Posts, Likes, Comments & Free Post Text

Substack Scraper: Posts, Likes, Comments & Free Post Text

Scrape any Substack newsletter: every post with date, authors, likes, comments, restacks, word count, paywall flag, plus free-post text. Fast JSON, no login.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Almandine Data

Almandine Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Scrape any Substack newsletter: every post with date, authors, likes, comments, restacks, word count, paywall flag, plus free-post text. Fast JSON, no login.

What it does

Reads each publication's public archive and returns posts newest-first with engagement metrics. Optional plain text of free posts.

Input

  • Publications (publications): Substack subdomains (e.g. 'astralcodexten'), *.substack.com URLs or custom-domain Substack URLs.
  • Max posts per publication (maxPostsPerPublication): Newest posts first. You are charged per post returned.
  • Published after (YYYY-MM-DD) (publishedAfter): Optional. Stop at posts older than this date.
  • Include free post text (includeContent): Adds the plain-text body of free posts (higher per-post price). Paywalled bodies are never returned.
  • Only new posts (onlyNew): On scheduled runs, return only posts not seen in earlier runs.

Output

One dataset row per result. Table view columns: coverImage, publicationUrl, title, postDate, authors, likes, comments, restacks, wordcount, isPaywalled, url. Full JSON in the dataset.

Pricing

Pay per result:

EventWhatPrice
post-resultPost scraped$0.002 ($2.00 / 1,000)
post-with-contentPost scraped with text$0.003 ($3.00 / 1,000)

Data and compliance

Free content only: paywalled post bodies are never returned. No subscriber data. Requests are rate-limited and go through Apify Proxy. Errors per input are stored in the run's ERRORS record and are not charged.

Example input

{
"publications": [
"astralcodexten"
],
"maxPostsPerPublication": 20
}