Substack Publication, Post & Comment Monitor avatar

Substack Publication, Post & Comment Monitor

Pricing

from $0.53 / 1,000 post results

Go to Apify Store
Substack Publication, Post & Comment Monitor

Substack Publication, Post & Comment Monitor

Discover public Substack publications and posts, export publication, author, post and public-comment rows, and monitor compatible snapshots without AI interpretation.

Pricing

from $0.53 / 1,000 post results

Rating

0.0

(0)

Developer

Luka

Luka

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Official Substack source icon

Discover public Substack publications and posts by topic, export publication archives, collect exact public posts, or retrieve public comments and replies. Repeat a compatible run in Changes mode to receive factual before-and-after events without sentiment scoring, inferred subscriber data, login, or paywall bypass.

๐Ÿš€ Start in 60 seconds

Choose the smallest workflow that matches your job. This copy-paste example discovers public publications and posts for one topic and stops after 25 posts:

{
"workflow": "discover_topics",
"keywords": ["independent publishing"],
"maxPosts": 25,
"outputMode": "current"
}

Run it once, open the Dataset, and check the final coverage row. For monitoring, keep the same workflow, targets, filters, limits, and included data families, then switch outputMode to changes on later sequential runs.

๐ŸŽฏ Choose the right workflow

WorkflowUse it forRequired targetMain rows
Discover by topicFind public publications and posts around a subjectkeywordspublication, author, post, coverage
Publication archiveExport public publication histories by Substack URL, subdomain, or verified custom domainpublicationUrlspublication, author, post, optional comment, coverage
Exact postsOpen known public post URLs and record their public access statepostUrlspublication, author, post, optional comment, coverage
Public commentsBuild a public comment-and-reply table for known postspostUrlspublication, author, post, comment, coverage

Exact-post targets automatically request the public post body or preview. Public comments are returned only where Substack's public endpoint actually exposes them.

๐Ÿ“ฆ What you get

Every Dataset row has a stable recordType and target-scoped identity:

Record typeBuyer-useful fields
publicationpublic name, domain, description, logo, language/category, visible subscriber and pricing fields when exposed
authorpublic byline identity, handle, profile URL, avatar and bio when exposed
postcanonical URL, title, subtitle, type, access state, public body or preview, dates, tags, media and public counts
commentcomment/reply ID, post ID, public author ID, text, timestamp, reactions, parent ID and depth
changestable change ID, factual change type, changed fields and compatible before/after values
coveragerequested, observed and delivered counts, source shape, caps, duplicates, pages, bytes and field coverage

Substack publication post comment and coverage rows in the Actor Dataset

The screenshot shows a representative fixture rendered from the Actor's delivered output shape. Its identifiers and publication names are synthetic; no private account or paid content appears in it.

Representative fixture output:

{
"recordType": "post",
"stableId": "substack:post:fixture-9001",
"targetKey": "post:https://publication.example.com/p/example-public-post",
"canonicalUrl": "https://publication.example.com/p/example-public-post",
"title": "Representative public post",
"contentAccess": "full_public",
"publishedAt": "2026-08-29T10:00:00.000Z",
"reactionsCount": 10,
"commentsCount": 2,
"coverageState": "COMPLETE"
}

๐ŸŽ›๏ธ Input guide

Start here

  • workflow selects topic discovery, publication archive, exact posts, or public comments.
  • keywords accepts up to 10 topic phrases for public discovery.
  • publicationUrls accepts up to 1,000 public publication roots, Substack subdomains, or custom domains that prove Substack shape.
  • postUrls accepts up to 10,000 concrete public /p/ URLs.
  • maxPosts caps delivered post rows at 10,000. Start with 25 for discovery or 50 for one archive.
  • maxBuyerChargeUsd stops before source work if the projected event vector exceeds your chosen ceiling.

Filters and public access

  • dateFrom and dateTo apply inclusive YYYY-MM-DD publication-date filters.
  • contentTypes keeps selected public article, podcast, video, thread, or note records.
  • contentAccessFilter keeps one factual public-access class.
  • minimumEngagement filters by the sum of source-exposed reactions, comments, and restacks. It is not a quality score.

contentAccess is always one of full_public, free_preview, truncated, or paywalled_unavailable. The Actor never signs in, sends subscriber cookies, or reconstructs paid/private body text.

Optional output families

  • includeBody adds public post HTML/text where the official response exposes it.
  • includePublication and includeAuthors add linked public context rows.
  • includeComments requests public comments and replies for delivered posts.
  • includeRawSource adds a bounded raw object for debugging; leave it off for cleaner JSON, CSV, and Excel exports.
  • maxCommentsPerPost caps one post at 250 comments/replies, while maxTotalComments caps the run at 20,000.

Baseline and Changes

The first compatible Changes run seeds a baseline without producing a flood of false NEW events. Later runs can emit NEW, UPDATED, CONTENT_ACCESS_CHANGED, ENGAGEMENT_CHANGED, RANK_CHANGED, and optional free UNCHANGED audit rows.

REMOVED is deliberately strict: it requires two consecutive compatible EMPTY_CONFIRMED observations for the same exact-post target. Missing rows from topic search, archive windows, filters, caps, partial responses, or blocked responses are never treated as deletion proof.

Use monitorId to separate intentional monitor scopes. maxTrackedItems can cap persisted publication, post, and comment identities at 40,000. Run the same monitor scope sequentially so one baseline cannot race another.

๐Ÿ’ฐ Pricing and cost control

The run page shows the applicable pricing before execution. A run can include a start event plus delivered publication, post, comment, monitored-target, or factual-change events; coverage and contextual author rows are bundled.

The one-time useful-run event is $0.00425. On the Free plan, delivered publication, post, public comment/reply, Changes-scope, and factual-change events cost $0.000100480769, $0.001004807692, $0.000452163462, $0.0004, and $0.001004807692 respectively. Paid Apify membership tiers receive the lower prices shown on the run page; the Actor validates the exact active tier vector before source work.

Keep the first run inexpensive:

  • start with one target and a small row cap;
  • leave body and comments off unless the buyer job requires them;
  • use archive metadata for broad lists and request full public bodies deliberately;
  • inspect coverage before scheduling Changes runs;
  • set maxBuyerChargeUsd to a ceiling you accept.

The Actor stops before source work when the projected buyer charge exceeds that ceiling. Source, state, byte, request, and runtime safeguards keep deliberately large jobs bounded.

โœ… Coverage and reliability

StateMeaning
COMPLETEThe requested official public source scope was exhausted.
PARTIALUseful rows were returned, but a requested source component was not complete.
FILTEREDSource rows existed, but your filters removed every delivered result.
CAPPEDA row, request, byte, runtime, or state guard stopped the target before exhaustion.
BLOCKEDThe expected official public shape was not reached because access was blocked or challenged.
EMPTY_CONFIRMEDThe expected official public shape was reached and proved no result for that target.

The Actor uses first-party Substack web surfaces only: public search pages, publication archive and RSS, same-origin public archive/post JSON, exact public post pages and embedded public preload data, and same-origin public comments endpoints. Custom domains must first prove Substack shape; subsequent JSON calls remain same-origin. HTTP 401, 403, 429, and challenge pages become BLOCKED, never false empty results.

Stable IDs, target-scoped deduplication, bounded retries, explicit source-shape checks, and state commit only after confirmed delivery protect repeat workflows. A malformed response, origin mismatch, or unknown shape stops the run instead of inventing records.

๐Ÿ”Œ API and automation

Use the same JSON input through Apify Console, API, client libraries, or your own automation. Read rows from the default Dataset and the run summary from the default key-value store output.

For scheduled monitoring:

  1. verify one Current run and its coverage row;
  2. repeat the identical scope with outputMode: "changes";
  3. keep same-scope executions sequential;
  4. consume change rows using their stable IDs;
  5. alert separately on PARTIAL, CAPPED, or BLOCKED coverage.

No public Task or schedule is required; you control where and when automation runs.

โ“ FAQ and support

Does it bypass Substack paywalls?

No. It records only what official public responses expose. Restricted posts receive free_preview, truncated, or paywalled_unavailable instead of reconstructed paid text.

Why did a run return coverage but few content rows?

Open the target's coverage row. It distinguishes filters, caps, blocks, confirmed empty results, and incomplete public components.

Can I monitor a custom publication domain?

Yes, when the public root proves Substack shape. The Actor keeps later requests same-origin and fails closed if the domain no longer matches that contract.

How do I report a reproducible issue?

Include the workflow, a public URL, the coverage row, and the run ID. Never send subscriber cookies, paid article text, passwords, or private publication access.

Substack is a trademark of its owner. This independent public-data tool is not affiliated with or endorsed by Substack. The source icon is the unchanged official asset from https://substack.com/brand and https://substack.com/img/substack.png.