Search Inside a Substack Newsletter by Keyword
Query a publication's own search index and get matching posts as structured rows — scoped to one newsletter, not the whole web.

Site-search quality on newsletters is inconsistent — the API path is better. Thirdwatch's Substack Scraper reads each publication's own JSON API — titles, authors, dates, engagement, and full article bodies — with no login and no browser.
Skip the setup: Run this as a ready-to-go task on Apify — pre-loaded with the configuration from this guide.
Why search inside a newsletter
Finding 'every post a newsletter wrote about hiring' usually means Google site: queries with flaky coverage. Substack's own search index is the authoritative source, and the Actor exposes it directly.
Set search and the run returns matching posts with full metadata.
The scraper hits Substack's public archive and post endpoints, so an entire newsletter's output is one input away.
How does this compare to the alternatives?
| Approach | Cost model | Coverage | Effort |
|---|---|---|---|
| RSS reader export | Free | Recent posts only | Manual, no search |
| Manual copy-paste | Analyst hours | Whatever you collect | Doesn't scale |
| Thirdwatch Substack Scraper | Pay per post row | Full archive + full text | One input per publication |
Why this Actor
- Reads the publication's own JSON API — fast, stable, and cheap.
includeContentupgrades metadata rows to full article text.searchqueries the newsletter's archive index directly.- Every row carries engagement fields: reactions and comment counts.
- Multiple publications in one run — newsletter monitoring as a batch.
How to do it in 3 steps
Step 1: Configure the input
Set the inputs as shown below — publicationUrls takes the targets, search runs a keyword query inside each publication and includeContent expands rows to full article text.
Step 2: Run the Actor
Run it from the console, the API, or the linked saved task. One dataset row is written per post.
Step 3: Use the output
Each row carries title, subtitle, author, date, reactions, comment count, cover image — and the full body when includeContent is set.
{
"publicationUrls": [
"https://newsletter.pragmaticengineer.com"
],
"search": "hiring",
"maxPosts": 10
}Each dataset row looks like:
{
"title": "How to write a useful status update",
"subtitle": "And why most updates fail",
"slug": "status-update",
"url": "https://newsletter.pragmaticengineer.com/p/status-update",
"author": "Gergely Orosz",
"postDate": "2025-06-10T08:00:00.000Z",
"reactions": 412,
"commentCount": 89,
"publication": "Pragmatic Engineer",
"type": "post"
}What to watch for
Paywalled posts return metadata but not the locked body — expected, since the public API doesn't serve it. Very long archives take a run of proportional length; use maxPosts to bound the pull.
Related use cases
- Snapshot a Substack Publication's Full Archive
- Build a Full-Text Dataset from a Substack Newsletter
- Monitor Several Substack Newsletters in One Run
- Check a Substack's Latest Posts on a Schedule
- All Thirdwatch use-case guides
Run the Substack Scraper on Apify Store — pay per result, free to try, no credit card to test.
Frequently asked questions
Do paid posts come through?
Metadata yes — title, date, author, engagement. The paywalled body is not fetched; `includeContent` returns what a free subscriber would see.
Does it work on custom domains?
Yes — pass the publication's URL or subdomain and the Actor resolves the underlying API host.
How far back does the archive go?
The archive endpoint covers the publication's full post history; `maxPosts` bounds how much of it you pull per run.
Can I search inside a publication?
Yes — the `search` field queries that newsletter's own index, so results stay scoped to the publication.
What engagement data comes back?
Reaction count and comment count per post, plus cover image and podcast URL where present.
Is there rate limiting?
Substack's public endpoints are generous; the Actor still spaces requests politely across a multi-publication run.
Related
100 free credits, no credit card.
About 30 real searches. Add the MCP to Claude or Cursor in two minutes.