Substack Scraper
Last updated October 29, 2026
Scrape Substack publications and posts: subscriber count, paid plan prices, author, and every post with date, paid flag, likes, comments, restacks, authors, and tags. Search Substack by keyword for posts or the newsletters behind them. Public data, no login. Clay ready.
Features
- Publication profile: author, subscriber count as Substack shows it, and the monthly, yearly, and founding plan prices.
- Every post as a row with date, paid flag, likes, comments, restacks, bylines, and tags.
- Keyword search across Substack, for posts or for the newsletters behind them.
- Custom domains, substack.com subdomains, profile links, or a bare name all work.
- Pay per event: Post row at $0.00115.
- Pay per event: Publication row at $0.002.
Input
publicationsarrayoptionalSubstack publications, one per line, up to 100: a URL (https://www.lennysnewsletter.com), a domain (lenny.substack.com), a profile (substack.com/@lenny), or a bare Substack name (lenny). Each one returns a publication row and its newest posts.
search_queriesarrayoptionalKeywords to search across Substack posts, one per line, up to 20. Each query returns matching posts, or the publications behind them when Search output is publications.
search_outputstringoptionalWhat a search query returns.
max_posts_per_publicationstringoptionalNewest posts returned per publication, 0 to 1000. 0 returns only the publication row.
max_search_resultsstringoptionalRows returned per search query, 1 to 1000.
since_daysstringoptionalOptional. Skip posts older than this many days. 0 or empty keeps every post up to the max.
include_publication_rowstringoptionaltrue to return one publication row per listed publication (name, author, subscribers, paid plan prices), billed as a publication row. false returns only post rows.
include_bodystringoptionaltrue to add the post text (up to 20,000 characters) to each post row of a listed publication. A paid post gives its free preview. Reads one more page per post; no extra charge.
max_charge_usdstringoptionalOptional. The run stops before it would charge more than this.
proxy_modestringoptionalHow pages are fetched.
Output schema
{
"row_type": "string",
"input_key": "string",
"search_query": "string",
"publication_name": "string",
"publication_url": "string",
"publication_host": "string",
"substack_subdomain": "string",
"author_name": "string",
"author_handle": "string",
"publication_description": "string",
"subscriber_count_text": "string",
"subscriber_count_min": "integer",
"subscriber_tier_text": "string",
"paid_subscriber_tier_text": "string",
"has_paid_plan": "boolean",
"monthly_price": "number",
"yearly_price": "number",
"founding_price": "number",
"price_currency": "string",
"first_post_date": "string",
"language": "string",
"post_title": "string",
"post_subtitle": "string",
"post_url": "string",
"post_date": "string",
"post_type": "string",
"audience": "string",
"is_paid": "boolean",
"wordcount": "integer",
"reaction_count": "integer",
"comment_count": "integer",
"restack_count": "integer",
"post_authors": "string",
"post_tags": "string",
"post_excerpt": "string",
"body_text": "string",
"row_status": "string",
"error_reason": "string",
"billable_events_json": "string",
"scraped_at": "string"
}Pricing
| Event | Free plan price |
|---|---|
| Post row | $0.00115 |
| Publication row | $0.002 |
| Actor Start | $0.001057 |
Pay per event on the Apify platform. Paid Apify plans pay less per event. No subscription, no seat license.
On the Apify free plan the actor stops at $1.50 of charges a month, about 1,304 post rows. Any paid Apify plan removes the cap.
Limits
- Subscriber counts are what Substack chooses to show: an exact homepage figure for some publications, a rounded figure (1.3K+) for others, and nothing for publications that hide it.
- Paid posts give only the free preview Substack shows to visitors.
- Substack search ranks by its own relevance and returns at most about 1,000 posts per query.
- Notes, comments text, and subscriber lists are not read.