Substack Publication Post Exporter avatar

Substack Publication Post Exporter

Pricing

from $0.49 / 1,000 results

Go to Apify Store
Substack Publication Post Exporter

Substack Publication Post Exporter

Export posts from any Substack newsletter: title, author, publish date, body, categories and cover image, filtered by category, date or keyword. No login or proxy needed.

Pricing

from $0.49 / 1,000 results

Rating

0.0

(0)

Developer

vexaloom-labs

vexaloom-labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Turn a Substack publication's public archive into a clean dataset, or fetch individual posts you already know. Custom-domain newsletters work directly; publications that still live on *.substack.com are reported as a clear blocked_egress status row instead of a misleading empty result. Free posts arrive with full HTML, readable text and Markdown; paid posts arrive with metadata and a clearly flagged public teaser. No account, login or proxy setup.

What this actor does

  • Two modes: export a publication's archive (publicationPosts) or fetch specific post URLs (postUrls).
  • Full archive depth: walk a custom-domain publication from its newest post back through its history, 50 posts at a time.
  • Free posts in full: HTML, plain text and clean Markdown for every free post.
  • Paid posts, honestly: title, subtitle, author, date, cover, word count, reactions, comments count and the public teaser. The public preview body is optional and flagged with contentIsPreview.
  • Comments: nested public comment threads for free posts.
  • Publication details: name, domain, language, payment status, subscription plans and sections.
  • Filters: date range, keyword, tags, free/paid, post type and audio/video presence.
  • RSS fallback: non-Substack sites such as Platformer are read through their public feed (up to 20 recent items).
  • Blocked inputs are visible: substack.com, *.substack.com and share links produce a blocked_egress row that explains the limitation and the workaround.
  • Empty fields are omitted: a post without a subtitle, tag or video simply has no such key.

Output per post

  • id, slug, title, subtitle, url, guid — identity and canonical link
  • publishedAt, publishedAtRaw, updatedAt — ISO date plus the original source value
  • author, authors[] — primary byline and every byline with name, handle, bio, photo and Twitter
  • publication, publicationUrl, publicationInfo — newsletter name/link, plus plans and sections when enabled
  • audience, isPaid, contentAccess, contentIsPreview, shouldSendFreePreview, freeUnlockRequired — access state
  • bodyHtml, bodyText, bodyMarkdown — body in the requested formats; paid bodies are previews only
  • summary, truncatedBodyText, description — plain excerpt, source teaser and source description
  • wordCount (words in the delivered body), articleWordCount (full article count from the source), readingTimeMinutes
  • language, postType — language code and newsletter / podcast / thread
  • coverImage, audioUrl, podcastUrl, podcastDurationSec — image and audio
  • videoUrl, videoThumbnailUrl, videoDurationSec, videoWidth, videoHeight, videoIsPreview — video details
  • tags, tagSlugs, categories, sectionId, sectionName — taxonomy; categories is kept for older integrations
  • reactionCount, reactions, commentCount, childCommentCount, restacks — engagement
  • comments[] — nested public comments when enabled, with author, date, reactions and replies
  • dataSource, recordType (post), scrapedAt

Blocked input row

When an input is hosted on substack.com (a bare subdomain, a substack.com/@handle, or a share link), the actor emits one row with recordType: "blocked_egress", the original input, host, a plain-language message and a workaround. This is a limitation of this actor's cloud network, not an empty publication. Use the publication's custom domain or an RSS-capable site instead.

Input

FieldTypeDefaultDescription
modestringpublicationPostspublicationPosts or postUrls
publicationsarray["platformer.news"]Custom-domain publication URLs or RSS-capable sites (mode=publicationPosts)
postUrlsarray–Custom-domain post URLs (mode=postUrls)
sortBystringnewestnewest or top for publication posts
publishedAfterstring–Keep posts on or after YYYY-MM-DD
publishedBeforestring–Keep posts on or before YYYY-MM-DD
containsKeywordstring–Keep posts whose title, teaser or text contains this keyword
tagsAnyOfarray–Keep posts with at least one matching tag
audienceFilterstringallall, free or paid
postTypestringallall, newsletter, podcast or thread
mediaFilterstringanyany, audio, video or text
bodyFormatstringallnone, html, text, markdown or all
includePaidPreviewbooleantrueInclude the flagged public preview of paid posts
includeCommentsbooleanfalseInclude public comment threads for free posts
maxCommentsPerPostinteger20Comment cap per post, replies included; 0 means no limit
includePublicationInfobooleantrueAdd plans, sections and publication metadata
maxItemsinteger50Hard cap on records (1–10,000)
maxPostsPerPublicationinteger0Per-publication cap; 0 means no per-publication limit

Example: a custom-domain publication with full bodies

{
"mode": "publicationPosts",
"publications": ["https://www.slowboring.com"],
"maxItems": 25,
"bodyFormat": "all"
}

Example: paid and free posts in a date range

{
"mode": "publicationPosts",
"publications": ["https://www.noahpinion.blog"],
"publishedAfter": "2026-01-01",
"audienceFilter": "all",
"includePaidPreview": true,
"maxItems": 100
}

Example: specific custom-domain post URLs

{
"mode": "postUrls",
"postUrls": [
"https://www.noahpinion.blog/p/the-internet-breaks",
"https://www.slowboring.com/p/destroying-womens-sports-in-order"
],
"bodyFormat": "markdown",
"includeComments": true
}

Example: RSS fallback for a site that left Substack

{
"mode": "publicationPosts",
"publications": ["platformer.news"],
"maxItems": 10,
"bodyFormat": "text"
}

Use cases

  • Newsletter monitoring — follow competitor or industry publications without checking each site.
  • Research and NLP — export free-post text or Markdown for topic models, search indexes and RAG stores.
  • Content archives — keep a searchable copy of a public archive and its free comments.
  • Media analysis — track themes, posting cadence, reactions and discussion across newsletters.
  • Feed consolidation — merge several custom-domain publications, or an RSS site, into one dataset.

FAQ

Do I need a Substack account, cookies or a proxy? No. The actor reads public custom-domain pages and posts. There is no login step and no proxy setup.

Which publications work? Any publication served from its own custom domain, plus non-Substack sites with a public RSS feed. Bare *.substack.com addresses and substack.com share links do not work from this actor's cloud network.

What is a blocked_egress row? It is a status record that tells you the input is hosted on substack.com and cannot be read from this actor's cloud network. It includes the original input, the host, a plain-language message and a workaround. It is not an empty publication.

Can I download paid posts in full? No. Paid posts are protected. The actor returns their metadata, the public teaser and, when includePaidPreview is on, the public preview body with contentIsPreview: true. It never bypasses a paywall.

How far back does the archive go? As far as a custom-domain publication's public archive goes — not just the latest page. The RSS fallback returns up to 20 recent items.

Why are comments missing on some posts? Public comment threads are available for free posts. Comments on paid posts are members-only, so the actor returns the comment count but not the thread.

Can I get Markdown for AI or RAG pipelines? Yes. Choose markdown or all in bodyFormat. Free posts get clean Markdown with subscribe buttons, share widgets and image wrappers removed. Paid posts get the flagged public preview only.

Why is a field absent from some records? Empty values are omitted rather than written as null. A post without a subtitle, tag, video or public subscriber count simply does not include that key.

Do custom domains work the same as a .substack.com address? Use the custom domain itself, such as https://www.slowboring.com or https://www.noahpinion.blog. The .substack.com address is reported as blocked_egress.

Is this affiliated with Substack? No. This is an independent third-party actor that reads publicly available newsletter data. It is not affiliated with or endorsed by Substack.