Substack Publication Archive Scraper avatar

Substack Publication Archive Scraper

Pricing

$0.60 / 1,000 result records

Go to Apify Store
Substack Publication Archive Scraper

Substack Publication Archive Scraper

Export a Substack publication archive with post titles, dates, URLs, audience labels, reactions, comments and word counts.

Pricing

$0.60 / 1,000 result records

Rating

0.0

(0)

Developer

Hamza

Hamza

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 days ago

Last modified

Categories

Share

Collect public posts from a Substack publication archive, including custom-domain publications. Export titles, dates, authors, engagement, sections, previews and every nonempty field returned with archive results. No individual-post detail pages are fetched.

Start a run

Enter the publication's HTTPS root, such as https://on.substack.com, choose Maximum results and Maximum pages, then start.

{
"publicationUrl": "https://on.substack.com",
"maxItems": 100,
"maxPages": 20
}
InputMeaning
Publication URLPublic HTTPS publication root. Custom domains work when they serve a Substack archive. Post links, unrelated websites and private-network addresses are not valid publication roots.
Maximum resultsMaximum unique posts to save, from 1 to 10,000. Default 100.
Maximum pagesMaximum archive requests, from 1 to 100. Default 20.

An invalid URL or unavailable publication ends successfully with a clear explanation and the working example https://on.substack.com. Check the run summary if no posts were saved. An empty archive is also a valid successful outcome. A genuine service outage before any results or a storage failure can still fail the run.

What the results contain

FieldsContents
id, url, slugPost identifier and canonical post link.
title, subtitle, descriptionReturned headings and description. A description identical to the subtitle is omitted.
postDate, audience, type, wordcountPublication date, audience, content type and word count.
reactionCount, reactions, commentCount, childCommentCount, restacksEngagement totals and reaction breakdowns.
authorsComplete published-author information, including biography, avatar, publication links and returned account status.
coverImage, coverImagePaletteCover media and its returned color palette.
sectionId, sectionSlug, sectionNameSection information.
truncatedBodyText, bodyHtml, bodyJsonPreview text or body fields only when the archive actually provides them.
postTags, postCountryBlocks, audience, permission fieldsTags, visibility and access metadata.
Podcast, video and voiceover fieldsAvailable media URLs, upload objects, duration, episode information and flags.
Other archive fieldsEvery other nonempty field returned by the archive, including new fields.
scrapedAtCollection time in UTC.

Field names use readable camelCase, including nested author/media objects. Original record IDs keep their returned numeric or string type. Null values and empty strings are omitted; zero counts, false flags and arrays remain intact. Missing data is never estimated. Internal retrieval URLs are not added to datasets, summaries or logs.

Arrays and nested objects remain structured in JSON. CSV/Excel exports may represent them as JSON strings. Full article bodies are often absent from archive responses; this actor does not fetch post pages to fill those gaps or unlock paid content.

Pagination and progress

Posts are saved individually as they arrive, with a result event for each saved unique post. Duplicate IDs within the run do not create another result. Progress lines show received and saved counts per page. Short pages are not assumed to be the end: the next offset advances by the actual number returned.

The run stops at Maximum results, Maximum pages, an empty page or a repeated page with no new records. A later-page error retains already-saved posts and ends successfully with a partial-result message. The run summary includes counts, completed pages, request count and the outcome.