Substack Posts Scraper πŸ“š avatar

Substack Posts Scraper πŸ“š

Pricing

from $1.99 / 1,000 results

Go to Apify Store
Substack Posts Scraper πŸ“š

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

Scrapers Hub

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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"]
}
}
FieldTypeDescription
keywordsstring[]Search terms matched against Substack publications. Required.
maxItemsintegerMax 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 results array (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 of body_html (only when body_html is 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

  1. For each keyword, page through https://substack.com/api/v1/post/search?query=<keyword>&page=<n>.
  2. HTTP is done with requests. If a response looks blocked (HTTP 403/429/503 or a Cloudflare challenge page), the request is retried through cloudscraper.
  3. HTML fragments are cleaned to plain text with parsel + re.
  4. Pagination stops when Substack reports more: false, a page has no new posts, or the per-keyword maxItems limit is hit.

Run locally

pip install -r requirements.txt
apify run # via the Apify CLI, or:
python -m src # sets up the Actor from ./storage