Substack Publication Scraper — Posts, Authors & Stats
Pricing
from $1.50 / 1,000 publication looked ups
Substack Publication Scraper — Posts, Authors & Stats
Look up any Substack publication by handle or domain via Substack's own archive API. Get name, tagline, posting cadence, free-vs-paid mix, top keywords, and the last 10 posts with engagement counts — built for sponsor prospecting. No subscriber counts (Substack never exposes those).
Pricing
from $1.50 / 1,000 publication looked ups
Rating
0.0
(0)
Developer
Adrian Voss
Maintained by CommunityActor stats
1
Bookmarked
2
Total users
1
Monthly active users
17 hours ago
Last modified
Categories
Share
Substack Publication Lookup
Look up any Substack publication by handle or domain against
Substack's own archive API (<pub>.substack.com/api/v1/archive) — publication name and
tagline, estimated posting cadence, free-vs-paid content mix, top recurring keywords from
recent titles, and the last 10 posts with engagement counts. Built for sponsor prospecting
and newsletter research, not a raw post-by-post scrape.
Features
- Handle, subdomain, or custom-domain input. Paste a bare handle (
astralcodexten), a full<handle>.substack.comURL, or a custom domain the publication uses instead (www.astralcodexten.com) — all three resolve the same way. A custom domain that only routes itswww.subdomain to Substack is retried automatically. - Sponsor-ready summary, not a raw feed. One row per publication: name, tagline, estimated posts/week, paid-content ratio, and top keywords — the shape a media buyer or sponsor-outreach tool actually needs, not 30 separate post rows to aggregate yourself.
- Recent posts with engagement. The last 10 posts, each with its title, URL, publish date, audience gate (free/paid), like count, and comment count.
- Honest about its limits. No subscriber counts — Substack does not expose those publicly, and this actor does not guess. Cadence and keyword topics are both computed over the sampled window only (up to 30 recent posts), not a lifetime average or a real topic model — see FAQ.
- Pay only for hits. Handles that don't resolve to an active Substack publication cost nothing — see Pricing.
How to use Substack Publication Lookup
- In the Apify Console. Open the actor page and click Start — the
publicationsfield is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found. - Via the API. Call it directly with a POST request — no Console needed once you have an API token:
curl "https://api.apify.com/v2/acts/accountable_eel~substack-publication-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"publications":["astralcodexten"]}'
- On a schedule. Save this actor as an Apify Task with the input you want, then add a Schedule (hourly, daily, weekly) so it runs on its own — no server of your own required.
Input
{"publications": ["astralcodexten"]}
One per line. A Substack handle (e.g. stratechery), a full
{"publications": ["astralcodexten", "https://noahpinion.substack.com"],"testRun": false,"onlyFound": false,"columns": ["publicationName", "postingCadencePerWeek", "paidPostRatio", "topics", "recentPosts"],"maxConcurrency": 5,"proxyConfiguration": { "useApifyProxy": true }}
publications is a list of Substack handles, <pub>.substack.com URLs, or custom domains —
one per line. Turn on testRun to process only the first 5 items before running the full
list. onlyFound hides rows with no result (misses are always free). includeKeywords /
excludeKeywords filter by keyword, and maxResults stops the run early. columns picks
which fields appear in each row — all are included by default.
Output
One row per publication, for example:
| query | found | status | publicationName | description | platformUrl | postCount | firstPostDate | lastPostDate | postingCadencePerWeek | paidPostRatio | topics | recentPosts | scrapedAt |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| astralcodexten.substack.com | true | OK | Astral Codex Ten | P(A | B) = [P(A)*P(B | A)]/P(B), all the rest is commentary. Click to read Astral Codex Ten, by Scott Alexander, a Substack publication. | https://astralcodexten.substack.com/ | 23 | 2026-07-30T01:07:16.450Z | 2026-08-28T17:32:14.561Z | 5.42 | 0.09 | ["book","open","review","thread","contest","finalist","debate","hidden"] |
{"query": "astralcodexten.substack.com","found": true,"status": "OK","publicationName": "Astral Codex Ten","description": "P(A|B) = [P(A)*P(B|A)]/P(B), all the rest is commentary. Click to read Astral Codex Ten, by Scott Alexander, a Substack publication.","platformUrl": "https://astralcodexten.substack.com/","postCount": 30,"firstPostDate": "2026-08-05T12:00:00.000Z","lastPostDate": "2026-08-24T08:46:48.970Z","postingCadencePerWeek": 11.05,"paidPostRatio": 0.2,"topics": ["open", "thread", "review", "book", "links", "ai", "war", "meetup"],"recentPosts": [{"title": "Open Thread 448","url": "https://www.astralcodexten.com/p/open-thread-448","publishedAt": "2026-08-24T02:48:38.910Z","audience": "everyone","reactionCount": 55,"commentCount": 412}],"scrapedAt": "2026-08-24T15:00:00.000Z"}
A row is only marked found: true — and only then billed — once the handle resolves to an
active Substack publication with at least one post in its archive. A handle with no
matching publication comes back status: "NOT_FOUND" — found: false and never charged.
Use cases
- Qualify a list of newsletter handles for sponsor outreach by posting cadence and free-vs-paid mix before pitching.
- Pull recent post titles and top keywords to gauge whether a publication's beat still matches your brand or product.
- Track a competitor's or a partner's newsletter cadence over time by re-running the same handle on a schedule.
- Enrich a spreadsheet of newsletter handles or URLs with a one-row intelligence summary each, instead of opening every publication by hand.
- Feed publication metadata into a media-planning or CRM tool via the API or MCP, no manual copy-paste required.
Pricing
$3 per 1,000 Substack publications, plus a $0.00005 start fee. Misses (found:false) are never charged.
Use it from Clay, n8n, Make, or an AI agent
This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.
curl "https://api.apify.com/v2/acts/accountable_eel~substack-publication-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \-X POST \-H "Content-Type: application/json" \-d '{"publications":["astralcodexten"]}'
n8n. Add an HTTP Request node: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~substack-publication-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body Content Type JSON, JSON Body {"publications":["astralcodexten"]} (swap in an expression from an earlier node for a real value).
Clay. Add an "HTTP API" column: Method POST, URL https://api.apify.com/v2/acts/accountable_eel~substack-publication-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>, Body {"publications":["{{Substack publication}}"]}, mapping the row's Substack publication into the publications array.
MCP. In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Substack Publication Lookup | Apify" — the agent will find and run this actor.
FAQ
Does this return subscriber counts? No. Substack does not expose subscriber counts publicly anywhere — not in the archive API, not on the publication's own page. Any actor claiming to return exact subscriber numbers is guessing or scraping something Substack never intended to be public. This actor reports post volume, cadence, and engagement counts (likes, comments) instead, since those ARE genuinely public.
What does "posting cadence" actually measure? It's
(posts sampled / days between the oldest and newest sampled post) * 7What are "topics"? Simple word-frequency counting over the sampled posts' titles and subtitles, filtered for common stopwords. It is not a topic model or NLP classifier — think of it as "the words that keep showing up," a cheap and honest signal, not a guarantee of thematic accuracy.
Does it work with a custom domain? Yes, if the publication is still Substack-hosted on that domain — the same archive endpoint works there. If a bare custom domain 404s, the actor automatically retries with a "www." prefix, since several Substack custom domains only route their www subdomain to Substack's infrastructure. If a publication has migrated entirely off Substack (its own site, not Substack-hosted), no fallback can recover it.
Why might a well-known publication show a stale lastPostDate? A handful of
publications that left Substack for their own platform keep a frozen, no-longer-updated
archive on their old <handle>.substack.com subdomain — it still resolves and returns
data, just not current data. Check lastPostDate against what you expect before relying on
freshness.
Does it require a Substack API key or login? No — the archive endpoint is a free, public, unauthenticated JSON API that Substack's own publication pages use to render their post lists, so no key or login is needed.