Substack Posts Scraper π
Pricing
from $1.99 / 1,000 results
Substack Posts Scraper π
Substack Posts scraper extracts publicly available newsletter posts, titles, authors, publication dates, tags, post URLs, and metadata π°π Perfect for content research, trend analysis, competitive intelligence, and newsletter monitoring.
Pricing
from $1.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapers Hub
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Substack Keyword Search Scraper
An Apify actor that searches Substack posts by keyword and exports the full post objects returned by Substack's search API.
Input
{"keywords": ["hi", "apify.com"],"maxItems": 50,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
| Field | Type | Description |
|---|---|---|
keywords | string[] | Search terms matched against Substack publications. Required. |
maxItems | integer | Max posts per keyword. 0 = unlimited. Default 50. |
Proxy is handled internally (rotating US residential) and is not a user input.
Why residential proxies? From datacenter IPs, Substack silently returns an empty
resultsarray (a soft block). Residential IPs return real posts.
Output
Each dataset item is the full Substack post object from the search endpoint, plus two added fields:
keywordβ the search term that surfaced this post.scrapedAtβ ISO-8601 UTC timestamp of when it was scraped.body_textβ plain-text version ofbody_html(only whenbody_htmlis present).
Example (trimmed):
{"keyword": "hi","id": 204336086,"title": "Jagged Edge (1985) Tonight","canonical_url": "https://hinrg.substack.com/p/jagged-edge-1985-tonight","post_date": "2026-07-01T15:01:19.284Z","subtitle": "Let's talk about movies.","reaction_count": 7,"scrapedAt": "2026-07-06T05:54:23.716Z"}
How it works
- For each keyword, page through
https://substack.com/api/v1/post/search?query=<keyword>&page=<n>. - HTTP is done with
requests. If a response looks blocked (HTTP 403/429/503 or a Cloudflare challenge page), the request is retried throughcloudscraper. - HTML fragments are cleaned to plain text with
parsel+re. - Pagination stops when Substack reports
more: false, a page has no new posts, or the per-keywordmaxItemslimit is hit.
Run locally
pip install -r requirements.txtapify run # via the Apify CLI, or:python -m src # sets up the Actor from ./storage