Substack Public Mention Monitor avatar

Substack Public Mention Monitor

Pricing

from $1.80 / 1,000 saved observations

Go to Apify Store
Substack Public Mention Monitor

Substack Public Mention Monitor

Monitor public Substack RSS articles for brand aliases and linked domains. Save short evidence, source dates and confirmed changes with explicit recent-feed coverage.

Pricing

from $1.80 / 1,000 saved observations

Rating

0.0

(0)

Developer

Brandt May

Brandt May

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 hours ago

Last modified

Categories

Share

Watch selected Substack publications for brand names, aliases and linked domains. Get short, source-linked evidence and a saved record of what changed in the public RSS feed.

First useful result

Paste a public publication homepage or its /feed URL. The default returns five recent articles from Lenny’s Newsletter with no keyword filter. No account, API key, browser or proxy is needed. Open Saved observations to export the rows or Readable run report to review article previews, source coverage and limits.

{"publicationUrls":["https://www.lennysnewsletter.com"],"maxResults":5}

A monitoring workflow, with evidence

Use a newsletter watchlist for PR coverage, competitor research or a regular reading brief. Optional brands, aliases and outbound domains filter the articles already available in each public feed. All configured filters combine with OR. Matching a brand or link does not establish endorsement, sponsorship, sentiment, investment performance or the truth of an article’s claims.

What you needFields to use
Which publication mentioned a brand?publicationTitle, title, mentions, publishedAt, url
Where is the evidence?mentions[].matchedText, field and short excerpt
Which requested domains were linked?outboundMatches, requestedDomain and matchedHost
What changed since my saved check?comparisonStatus, changedFields, previousObservedAt
What was actually read?sourceUrl, sourceType, guid, observedAt, SUMMARY.sourceCoverage

Brands and phrases match case-insensitively after Unicode/whitespace normalization, with Unicode word boundaries. “AI” does not match “chair” or “AItools.” Matching is literal, not fuzzy or semantic. An alias label also matches itself. Occurrences in visible URL text count as text mentions; HTML link destinations are checked separately by the domain filter. Counts cover occurrences across the configured brand/alias terms and both title and body; overlapping aliases can count the same text separately.

Domain filters match the requested hostname and its subdomains, never suffix lookalikes. Output links omit query strings and fragments. A redirect/tracking link is not followed or decoded to guess its destination.

Three ready-to-run examples

Recent product and growth articles

{"publicationUrls":["https://www.lennysnewsletter.com"],"maxResults":3}

OpenAI and ChatGPT in One Useful Thing

{"publicationUrls":["https://www.oneusefulthing.org"],"keywords":["OpenAI"],"aliases":{"OpenAI":["ChatGPT"]},"maxResults":3}

OpenAI links and mentions in Not Boring

{"publicationUrls":["https://www.notboring.co"],"keywords":["OpenAI"],"outboundDomains":["openai.com"],"maxResults":3}

These selected feeds were tested locally on November 3, 2026. Publisher content and availability can change. They are examples, not a guarantee for every publication or hosting configuration.

Public feed coverage

Only the supplied publication’s public RSS document is fetched, after its robots file. Substack documents this public feed endpoint. Custom domains are accepted when the returned RSS identifies the Substack generator and its self URL and channel match the requested publication.

The three tested feeds each contained 20 recent articles. This Actor does not extend that window, search Substack globally or fetch article pages. Paid posts may contribute only a publisher-provided public preview. Every row says public_feed_text_may_be_preview. No private feed, subscriber session, paywall or credentials are accepted. The Actor does not return full article bodies, comments, subscriber counts or engagement analytics.

One row is one validated article observation. Publication timestamps come from RSS pubDate; observedAt is this run’s observation time. recordId combines the public feed URL and source GUID. A publication-domain or GUID change can establish a new identity. Up to five short mention excerpts and ten unique matching outbound links are returned per article; total counts and truncation flags show when additional evidence was omitted. The public text hash detects changes in normalized public feed text only.

SUMMARY records items in each feed, matching/filtered articles, saved rows, items not processed, source failures and unreached publications. A complete fetched feed is still not a complete archive. Feed order is the publisher’s order, not a promised chronological ranking.

Scheduled comparison

Enable comparePrevious and reuse the same publications, brand/alias filters, outbound domains and snapshotName. The first run has no baseline: matching articles become “new” only after their rows are confirmed saved. Later runs label each saved observation new, changed or unchanged. With onlyChanges enabled, unchanged articles do not create dataset rows; zero rows can be a correct successful result.

{"publicationUrls":["https://www.lennysnewsletter.com"],"comparePrevious":true,"onlyChanges":true,"snapshotName":"product-news-watch","maxResults":100}

Use a large enough result cap to establish the desired current feed baseline. Articles excluded by an earlier cap were never saved and can appear as new in a later comparison. Comparison is between your saved observations, not a historical archive of article edits. History records are never removed because an article rolls out of a feed, fails to load or stops matching a filter.

Run one writer per snapshot. A detected concurrent update is reported instead of overwriting newer history, but the storage has no atomic multi-run transaction. Use separate snapshot names for concurrent workflows. History retains at most 20,000 identities per scope; start a new snapshot after reaching that bound.

Limits and cost

  • At most five unique publications and two source requests per publication: robots.txt and /feed. Requests are spaced at least one second apart. No redirects, retries or alternate network routes.
  • Public HTTPS destinations only. DNS addresses are validated and pinned per request; private/reserved networks and credentialed URLs are rejected. The public feed path is fixed; private feed paths and query strings are rejected.
  • A feed response is capped at 4 MiB; robots at 256 KiB; feeds at 200 items. Malformed, ambiguous or non-Substack source documents fail visibly rather than become paid placeholder rows.
  • Requests have a 15-second timeout within the remaining run budget. The default budget is 60 seconds and the platform deadline can shorten it. Maximum saved articles is 1–100, default 5.
  • A result cap inside a successfully read feed is an intentionally bounded selection. A cap that prevents another requested publication from being reached produces partial coverage. Time, charge and source failures are also reported separately.
  • Base event pricing is $0.003 per saved article observation, with all of its mention arrays included, plus $0.00005 per run start. Store pricing and the run’s spending limit govern actual charges. Unchanged filtered-out articles, failed sources, SUMMARY and RUN_REPORT create no paid dataset rows. History advances only for confirmed saved output.

Robots exclusions are respected for this crawler. A missing robots file is recorded as missing; it is not a license or authorization assertion. Source access may still change or be limited.

Support

Open an Actor issue with the public publication URL, run ID and expected field. Do not send login cookies, private feed URLs or subscriber credentials. This is an independent monitoring tool, not an official Substack product.