Substack Newsletter Monitor - New Posts Tracker
Pricing
from $1.50 / 1,000 posts
Substack Newsletter Monitor - New Posts Tracker
New posts from any Substack publication as structured data - title, author, date, word count, reactions, comments and restacks - with no repeats between runs. Watch hundreds of newsletters on one schedule for a fraction of a cent each. No browser or API key needed.
Pricing
from $1.50 / 1,000 posts
Rating
0.0
(0)
Developer
Technical Dost Solutions
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Substack Newsletter Monitor — New Posts Tracker
Follow any Substack publication and get its new posts as structured data — title, author, date, word count, reactions, comments and restacks — with no repeats.
Point it at one publication or two hundred, put it on a schedule, and each run returns only posts that appeared since the last one. Substack's own email is fine for reading; this is for pipelines, dashboards, competitor tracking and content research.
Reads Substack's public archive endpoint. No browser, no login, no API key — which is why it is one of the cheapest ways to run this kind of monitoring.
What you get
{"title": "The Pulse: Meta's self-inflicted resignation-wave","postUrl": "https://newsletter.pragmaticengineer.com/p/the-pulse-metas-self-inflicted-resignation","postDate": "2026-08-14T16:55:55.370Z","authors": ["Gergely Orosz"],"publicationUrl": "https://newsletter.pragmaticengineer.com","subtitle": "The social media giant is offering $1M+ retainer equity grants to staff who are leaving...","type": "newsletter","audience": "only_paid","isPaid": true,"wordCount": 3517,"reactionCount": 77,"commentCount": 12,"restackCount": 4,"reactions": { "❤": 77 },"coverImage": "https://substackcdn.com/image/fetch/...","podcastUrl": null,"podcastDurationSeconds": null,"sectionName": null,"slug": "the-pulse-metas-self-inflicted-resignation","postId": 211202149,"authorHandles": ["pragmaticengineer"],"scrapedAt": "2026-08-17T17:30:12.004Z"}
isPaid is derived from Substack's own audience field, so you can separate public posts from subscriber-only ones without guessing. reactionCount sums the emoji map into one comparable number while reactions keeps the original breakdown.
Main use cases
- Competitor and industry tracking. Watch every newsletter in your space and see what they publish, how long it is, and how much engagement it gets.
- Content research. Rank posts by reactions or comments to find what resonates in a niche.
- Newsletter aggregation. Feed several publications into one digest, a Slack channel or a website.
- Free-vs-paid analysis. See which topics a publication puts behind its paywall.
- Author tracking. Follow specific writers across multi-author publications.
- LLM and RAG pipelines. A clean, deduplicated feed of post metadata and URLs to fetch.
Quick start
Monitor two publications for new posts:
{"publications": ["https://newsletter.pragmaticengineer.com", "platformer"],"onlyNew": true,"maxPostsPerPublication": 20}
Public posts only, from this year:
{"publications": ["platformer"],"audience": "free","since": "2026-01-01","onlyNew": false}
Publication input is forgiving
All of these resolve to the same publication:
| You paste | Resolves to |
|---|---|
https://newsletter.pragmaticengineer.com | https://newsletter.pragmaticengineer.com |
newsletter.pragmaticengineer.com | https://newsletter.pragmaticengineer.com |
.../p/some-post-slug | https://newsletter.pragmaticengineer.com |
platformer | https://platformer.substack.com |
Custom domains work too — many established Substacks do not use a substack.com address.
Input reference
| Field | Type | Default | What it does |
|---|---|---|---|
publications | array | required | URLs, custom domains or bare handles. Up to 200. |
onlyNew | boolean | true | Skip posts returned by an earlier run. |
maxPostsPerPublication | integer | 20 | Newest-first cap per publication. |
maxPosts | integer | 500 | Hard cap on posts returned and charged this run. |
audience | select | any | any, free, or paid. |
since | string | — | YYYY-MM-DD. Stops paging back at this date. |
stateStoreName | string | substack-monitor-state | Named store holding the "already seen" list. |
Use since on large publications. Without it, a high maxPostsPerPublication will page back through years of archive. With it, the Actor stops as soon as it reaches an older post, which keeps scheduled runs fast.
Running it on a schedule
- Add your publications, save as a Task.
- Add a daily Schedule on that Task.
- Leave
onlyNewon.
The "already seen" list is keyed on Substack's own post ID and lives in a named Key-Value Store on your own account, so your history is private and persists between runs. Up to 50,000 post IDs are remembered.
Add a webhook to push new posts straight into Slack, Notion or a database.
Pricing
| Event | Price | When it happens |
|---|---|---|
| Post | $0.0015 | One post returned to you |
| Actor start | $0.001 | Once per run |
You are not charged for:
- posts you were already sent in an earlier run (with
onlyNewon) - posts filtered out by the
audiencesetting - publications that fail or are unreachable
- invalid publication URLs — reported and skipped before any work
- duplicate publications in your list
- anything after the maximum charge you set for the run
Worked example. A daily run over 20 publications producing ~15 new posts a day costs about (15 × $0.0015) + $0.001 = $0.0235 per run, roughly $0.71/month.
How this compares
| Actor | Price per post | Per run | New-only monitoring |
|---|---|---|---|
| This Actor | $0.0015 | $0.001 | yes |
easyapi/substack-posts-scraper | $0.00499 | $0.09 | — |
cryptosignals/substack-scraper | $0.005 | — | — |
memo23/substack-scraper | $0.003 | $0.005 | — |
easyapi/substack-leaderboard-scraper | $0.00299 | $0.09 | — |
sourabhbgp/substack-scraper | $0.0003 | $0.00005 | — |
Competitors' list prices as published on Apify Store on 2026-08-17; check current figures before relying on this table.
Be aware sourabhbgp/substack-scraper is cheaper per post. If you want a bulk one-off dump and nothing else, it will cost you less. This Actor is priced for the recurring case: the per-run fee is 1/90th of the two easyapi actors', and onlyNew means a daily schedule charges for a handful of new posts rather than re-charging for the whole archive every run. Over a month of daily runs that is usually the cheaper outcome — but compare against your own volumes.
Using the API
curl -X POST "https://api.apify.com/v2/acts/technicaldost~substack-newsletter-monitor/run-sync-get-dataset-items?token=<TOKEN>" \-H 'Content-Type: application/json' \-d '{ "publications": ["platformer"], "maxPostsPerPublication": 10, "onlyNew": false }'
JavaScript — build a digest of new free posts:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('technicaldost/substack-newsletter-monitor').call({publications: ['platformer', 'https://newsletter.pragmaticengineer.com'],audience: 'free',onlyNew: true,});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const p of items.sort((a, b) => (b.reactionCount ?? 0) - (a.reactionCount ?? 0))) {console.log(`${p.reactionCount ?? 0} ❤ ${p.title} — ${p.postUrl}`);}
Python:
from apify_client import ApifyClientclient = ApifyClient("<TOKEN>")run = client.actor("technicaldost/substack-newsletter-monitor").call(run_input={"publications": ["platformer"],"onlyNew": True,})for p in client.dataset(run["defaultDatasetId"]).iterate_items():print(p["postDate"], p["title"], p["wordCount"], p["reactionCount"])
Limitations
Stated plainly so there are no surprises:
- Metadata, not article bodies. The Actor returns each post's title, subtitle, description and public engagement counts plus its URL. It does not return the full article text. Paywalled content is never fetched —
isPaidtells you a post is subscriber-only, and that is where it stops. - No subscriber counts. Substack does not publish them, and this Actor does not estimate or invent them. Any tool claiming a subscriber number for an arbitrary publication is guessing.
- Engagement counts are a snapshot taken at
scrapedAt. Reactions and comments keep accruing after a post is published, so a post captured an hour after publication will show lower numbers than the same post captured a week later. Re-run withonlyNew: falseif you want refreshed counts. - No discovery or search. You supply the publications; the Actor does not find newsletters by topic or keyword.
- Substack publications only. Not Beehiiv, Ghost or Mailchimp.
restackCountand some fields are absent on older posts, because Substack added them later. Missing values arenull, never zero.
Related Actors
- RSS Feed Scraper — if you also follow blogs, news sites and podcasts, an RSS feed reader covers everything that publishes a feed. ★5.0
- SEC EDGAR Filing Monitor — the same new-only monitoring pattern for US public company filings.
- UK New Company Leads Monitor — daily feed of newly incorporated UK companies.
Data source and responsible use
Data comes from each publication's public archive endpoint — the same listing any visitor sees on the publication's archive page. No login, no cookies, no paywall circumvention. Requests are paced so that monitoring many publications stays courteous.
Post text remains the copyright of its author. Use the metadata and links for research, monitoring and aggregation; do not republish authors' content without permission.
Not affiliated with or endorsed by Substack.