Substack Publication Scraper — Posts, Authors & Stats avatar

Substack Publication Scraper — Posts, Authors & Stats

Pricing

from $1.50 / 1,000 publication looked ups

Go to Apify Store
Substack Publication Scraper — Posts, Authors & Stats

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

Adrian Voss

Maintained by Community

Actor stats

1

Bookmarked

2

Total users

1

Monthly active users

17 hours ago

Last modified

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.com URL, or a custom domain the publication uses instead (www.astralcodexten.com) — all three resolve the same way. A custom domain that only routes its www. 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

  1. In the Apify Console. Open the actor page and click Start — the publications field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
  2. 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"]}'
  3. 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:

queryfoundstatuspublicationNamedescriptionplatformUrlpostCountfirstPostDatelastPostDatepostingCadencePerWeekpaidPostRatiotopicsrecentPostsscrapedAt
astralcodexten.substack.comtrueOKAstral Codex TenP(AB) = [P(A)*P(BA)]/P(B), all the rest is commentary. Click to read Astral Codex Ten, by Scott Alexander, a Substack publication.https://astralcodexten.substack.com/232026-07-30T01:07:16.450Z2026-08-28T17:32:14.561Z5.420.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) * 7
, computed over up to the last 30 posts only — not the publication's lifetime average. A publication that recently changed its schedule will show its current pace, not its historical one.

What 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.